/* * Copyright 2014 Ankush Sachdeva * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package im.actor.sdk.view.emoji.keyboard.emoji; import android.animation.ObjectAnimator; import android.app.Activity; import android.support.v4.view.ViewPager; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.LinearLayout; import im.actor.core.entity.Peer; import im.actor.core.entity.Sticker; import im.actor.sdk.R; import im.actor.sdk.view.emoji.SmileProcessor; import im.actor.sdk.view.emoji.keyboard.BaseKeyboard; import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnBackspaceClickListener; import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnSmileClickListener; import im.actor.sdk.view.emoji.keyboard.emoji.smiles.RepeatListener; import im.actor.sdk.view.emoji.keyboard.emoji.smiles.SmilePagerAdapter; import im.actor.sdk.util.Screen; import im.actor.sdk.view.MaterialInterpolator; import im.actor.sdk.view.PagerSlidingTabStrip; import im.actor.sdk.view.emoji.smiles.SmilesPack; import static im.actor.sdk.util.ActorSDKMessenger.messenger; public class EmojiKeyboard extends BaseKeyboard implements OnSmileClickListener, OnBackspaceClickListener { private static final String TAG = "EmojiKeyboard"; private static final long BINDING_DELAY = 150; private OnStickerClickListener onStickerClickListener; private View stickerIndicatorContainer; private View stickerSwitchContainer; private SmilePagerAdapter mEmojisAdapter; public EmojiKeyboard(Activity activity, EditText messageBody) { super(activity, messageBody); } @Override public void onEmojiClicked(String smile) { if (messageBody == null) { return; } int selectionEnd = messageBody.getSelectionEnd(); if (selectionEnd < 0) { selectionEnd = messageBody.getText().length(); } CharSequence appendString = SmileProcessor.emoji().processEmojiMutable(smile, SmileProcessor.CONFIGURATION_BUBBLES); messageBody.getText().insert(selectionEnd, appendString); } @Override public void onBackspaceClick(View v) { if (messageBody == null) { return; } KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL); messageBody.dispatchKeyEvent(event); } @Override protected View createView() { final View emojiPagerView = LayoutInflater.from(activity).inflate(R.layout.emoji_smiles_pager, null); final ViewPager emojiPager = (ViewPager) emojiPagerView.findViewById(R.id.emoji_pager); final PagerSlidingTabStrip emojiPagerIndicator = (PagerSlidingTabStrip) emojiPagerView.findViewById(R.id.emoji_pager_indicator); View backspace = emojiPagerView.findViewById(R.id.backspace); final View backToSmiles = emojiPagerView.findViewById(R.id.back_to_smiles); final View indicatorContainer = emojiPagerView.findViewById(R.id.indicator_container); stickerIndicatorContainer = emojiPagerView.findViewById(R.id.sticker_indicator_container); stickerSwitchContainer = emojiPagerView.findViewById(R.id.sticker_switch_container); emojiPagerIndicator.setTabBackground(R.drawable.clickable_background); emojiPagerIndicator.setIndicatorColorResource(R.color.primary); emojiPagerIndicator.setIndicatorHeight(Screen.dp(2)); emojiPagerIndicator.setDividerColor(0x00000000); emojiPagerIndicator.setUnderlineHeight(0); emojiPagerIndicator.setTabLayoutParams(new LinearLayout.LayoutParams(Screen.dp(48), Screen.dp(48))); backspace.setOnTouchListener(new RepeatListener(500, 100, new OnClickListener() { @Override public void onClick(View v) { onBackspaceClick(v); } })); mEmojisAdapter = new SmilePagerAdapter(this); mEmojisAdapter.setTabs(emojiPagerIndicator); emojiPager.setAdapter(mEmojisAdapter); emojiPagerIndicator.setViewPager(emojiPager); backToSmiles.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { emojiPager.setCurrentItem(3, false); ObjectAnimator oa = ObjectAnimator.ofFloat(indicatorContainer, "translationX", 0, 0); oa.setDuration(0); oa.start(); if (stickerIndicatorContainer.getVisibility() == View.INVISIBLE) { stickerIndicatorContainer.setVisibility(View.VISIBLE); } ObjectAnimator oas = ObjectAnimator.ofFloat(stickerIndicatorContainer, "translationX", Screen.getWidth(), Screen.getWidth()); oas.setDuration(0); oas.start(); emojiPager.setCurrentItem(1, true); } }); final FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) stickerIndicatorContainer.getLayoutParams(); emojiPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == 4) { ObjectAnimator oa = ObjectAnimator.ofFloat(indicatorContainer, "translationX", indicatorContainer.getX(), -positionOffsetPixels); oa.setDuration(0); oa.start(); if (stickerIndicatorContainer.getVisibility() == View.INVISIBLE) { stickerIndicatorContainer.setVisibility(View.VISIBLE); } ObjectAnimator oas = ObjectAnimator.ofFloat(stickerIndicatorContainer, "translationX", stickerIndicatorContainer.getX() + Screen.getWidth(), -positionOffsetPixels + Screen.getWidth()); oas.setDuration(0); oas.start(); } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); //emojiPagerIndicator.setLayoutParams(new RelativeLayout.LayoutParams(Screen.dp(58 * mEmojisAdapter.getCount()), Screen.dp(48))); // emojiPager.postDelayed(new Runnable() { // @Override // public void run() { // emojiPager.setAlpha(0f); // emojiPagerIndicator.setAlpha(0f); // animateView(emojiPager); // animateView(emojiPagerIndicator); // emojiPager.setAdapter(mEmojisAdapter); // emojiPagerIndicator.setViewPager(emojiPager); // } // }, BINDING_DELAY); if (SmilesPack.getRecent().size() == 0) { emojiPager.setCurrentItem(1); } return emojiPagerView; } @Override protected void onDismiss() { SmileProcessor.emoji().getRecentController().saveRecents(); } void animateView(View view) { view.animate() .setInterpolator(MaterialInterpolator.getInstance()) .alpha(150) .setDuration(300) .start(); } public void onStickerClicked(Sticker sticker) { if (onStickerClickListener != null) { onStickerClickListener.onStickerClicked(sticker); } } public OnStickerClickListener getOnStickerClickListener() { return onStickerClickListener; } public void setOnStickerClickListener(OnStickerClickListener onStickerClickListener) { this.onStickerClickListener = onStickerClickListener; } public LinearLayout getStickerIndicatorContainer() { return (LinearLayout) stickerSwitchContainer; } public void release() { if (mEmojisAdapter != null) { mEmojisAdapter.release(); } } }