package com.s16.inputmethod.emoji; import com.s16.inputmethod.emoji.EmojiCategory; import com.s16.inputmethod.skeyboard.KeyboardBaseView; import com.s16.inputmethod.skeyboard.KeyboardSwitcher; import com.s16.inputmethod.skeyboard.KeyboardTheme; import com.s16.inputmethod.skeyboard.R; import com.s16.inputmethod.skeyboard.SoftKeyboard; import com.s16.inputmethod.skeyboard.SoftKeyboardView; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.preference.PreferenceManager; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.FrameLayout; import android.widget.GridView; public class EmojiInput { private KeyboardBaseView.OnKeyboardActionListener mKeyboardActionListener = new KeyboardBaseView.OnKeyboardActionListener() { @Override public void swipeUp() { } @Override public void swipeRight() { } @Override public void swipeLeft() { } @Override public void swipeDown() { } @Override public void onText(CharSequence text) { } @Override public void onRelease(int primaryCode) { } @Override public void onPress(int primaryCode) { } @Override public void onKey(int primaryCode, int[] keyCodes, int x, int y) { } @Override public void onCancel() { } }; private View.OnClickListener mEmojiClick = new View.OnClickListener() { @Override public void onClick(View v) { if (v instanceof EmojiIconTextView) { EmojiIconKey key = ((EmojiIconTextView)v).getIconKey(); onKey(key); } else { Object tag = v.getTag(); if (tag != null && mKeyboardActionListener != null) { EmojiIconKey key = (EmojiIconKey)tag; onKey(key); } } } }; private class EmojisPagerAdapter extends PagerAdapter implements EmojiIconsTabBar.IconTabProvider { private EmojiIconsAdapter[] mIconsAdapterList; public EmojisPagerAdapter() { mIconsAdapterList = new EmojiIconsAdapter[EmojiCategory.values().length]; } @Override public Object instantiateItem(ViewGroup container, int position) { EmojiCategory category = EmojiCategory.values()[position]; LayoutInflater inflater = LayoutInflater.from(getContext()); EmojiGridView gridView = (EmojiGridView)inflater.inflate(R.layout.emoji_icon_grid, container, false); EmojiIconsAdapter iconAdapter = mIconsAdapterList[category.getIndex()]; if (iconAdapter == null) { iconAdapter = new EmojiIconsAdapter(getContext(), category); mIconsAdapterList[category.getIndex()] = iconAdapter; } gridView.setAdapter(iconAdapter); ((ViewPager)container).addView(gridView, 0); return gridView; } @Override public int getCount() { return EmojiCategory.values().length; } @Override public boolean isViewFromObject(View view, Object object) { if (object instanceof View) { return (View)object == view; } return false; } @Override public void destroyItem(ViewGroup container, int position, Object view) { ((ViewPager)container).removeView((View)view); } public EmojiIconsAdapter getIconsAdapter(int position) { if (position > -1 && mIconsAdapterList.length > position) { return mIconsAdapterList[position]; } return null; } @Override public int getPageIcon(int position) { return EmojiCategory.values()[position].getIconCode(); } } private class EmojiIconsAdapter extends BaseAdapter { private final EmojiCategory mCategory; EmojiIconsAdapter(Context context, EmojiCategory category) { mCategory = category; if (mCategory != null) { mCategory.init(context); } } @Override public int getCount() { return mCategory.getCount(getContext()); } @Override public Object getItem(int position) { return mCategory.getItem(getContext(), position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { EmojiIconKey key = (EmojiIconKey)getItem(position); EmojiIconTextView textView = (EmojiIconTextView)convertView; if (textView == null) { textView = new EmojiIconTextView(getContext()); textView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize)); textView.setGravity(Gravity.CENTER); textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.emoji_icon_text_size)); textView.setTextColor(getResources().getColor(R.color.bright_foreground_holo_dark)); textView.setBackgroundResource(R.drawable.emoji_button); textView.setEmojiTypeface(KeyboardTheme.getEmojiTypeFace(getContext())); textView.setOnClickListener(mEmojiClick); } textView.setIconKey(key); return textView; } } private ViewPager.OnPageChangeListener mPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { setLastSelectedCategory(position); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }; private static final String PREFS_LAST_SELECTED_CATEGORY = "prefs_emoji_last_sel_category"; private Context mContext; private KeyboardSwitcher mKeyboardSwitcher; private ViewGroup mEmojiInputView; private FrameLayout mEmojiKeyboardView; private SoftKeyboard mBottomKeyboard; private SoftKeyboardView mBottomKeyboardView; private EmojisPagerAdapter mPagerAdapter; private int mIconSize; public EmojiInput(Context context, KeyboardSwitcher keyboardSwitcher) { mContext = context; mKeyboardSwitcher = keyboardSwitcher; mIconSize = (int)context.getResources().getDimension(R.dimen.emoji_icon_size); newView(); } protected Context getContext() { return mContext; } protected Resources getResources() { return mContext.getResources(); } protected int getLastSelectedCategory() { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); if (preferences != null) { return preferences.getInt(PREFS_LAST_SELECTED_CATEGORY, 0); } return 0; } protected void setLastSelectedCategory(int position) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); if (preferences != null) { SharedPreferences.Editor editor = preferences.edit(); editor.putInt(PREFS_LAST_SELECTED_CATEGORY, position); editor.commit(); } } @SuppressLint("InflateParams") public void newView() { LayoutInflater inflater = LayoutInflater.from(getContext()); mEmojiInputView = (ViewGroup)inflater.inflate(R.layout.emoji_icons_view, null, false); mEmojiKeyboardView = new FrameLayout(getContext()); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT); mEmojiKeyboardView.addView(mEmojiInputView, params); mBottomKeyboardView = (SoftKeyboardView)mEmojiInputView.findViewById(R.id.emojiBottomKeyboard); mBottomKeyboard = new SoftKeyboard(getContext(), R.xml.kbd_switch_bottom, KeyboardSwitcher.KEYBOARDMODE_SYMBOLS); mBottomKeyboardView.setKeyboard(mBottomKeyboard); mBottomKeyboardView.setOnKeyboardActionListener(mKeyboardActionListener); EmojiIconsTabBar tabBar = (EmojiIconsTabBar)mEmojiInputView.findViewById(R.id.emojis_tab); tabBar.setTabTypeface(KeyboardTheme.getZawgyiTypeFace(getContext())); tabBar.setTabSelectedTypeface(KeyboardTheme.getZawgyiTypeFace(getContext())); ViewPager viewPager = (ViewPager)mEmojiInputView.findViewById(R.id.emojis_pager); mPagerAdapter = new EmojisPagerAdapter(); viewPager.setAdapter(mPagerAdapter); tabBar.setViewPager(viewPager); tabBar.setSelectedIndex(getLastSelectedCategory()); tabBar.setOnPageChangeListener(mPageChangeListener); } private void updateKeyboardView() { if (mKeyboardSwitcher != null) { final SoftKeyboardView keyboardView = mKeyboardSwitcher.getInputView(); if (keyboardView != null) { int viewHeight = keyboardView.getMeasuredHeight(); if (viewHeight > 0) { FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, viewHeight); mEmojiKeyboardView.removeAllViews(); mEmojiKeyboardView.addView(mEmojiInputView, params); } if (mBottomKeyboard != null) { mBottomKeyboard.setLanguageSwitcher(mKeyboardSwitcher.getLanguageSwitcher(), mKeyboardSwitcher.isAutoCompletionActive(), keyboardView.getLanguagebarTextColor(), keyboardView.getLanguagebarShadowColor(), -1); } } if (mBottomKeyboardView != null) { mBottomKeyboardView.setStyle(mKeyboardSwitcher.getThemedContext(), mKeyboardSwitcher.getThemeResId()); } } } private void onKey(EmojiIconKey key) { if (key == null) return; if (mKeyboardActionListener != null) { if (key.outputText != null) { mKeyboardActionListener.onText(key.outputText); } else { mKeyboardActionListener.onText(key.label); } } EmojiCategory.RECENTS.updateKey(getContext(), key); EmojiIconsAdapter recentAdapter = mPagerAdapter.getIconsAdapter(EmojiCategory.RECENTS.getIndex()); if (recentAdapter != null) { recentAdapter.notifyDataSetChanged(); } } public void setOnKeyboardActionListener(KeyboardBaseView.OnKeyboardActionListener actionListener) { mKeyboardActionListener = actionListener; if (mBottomKeyboardView != null) { mBottomKeyboardView.setOnKeyboardActionListener(mKeyboardActionListener); } } public View getView() { updateKeyboardView(); return mEmojiKeyboardView; } public void setKeyboardSwitcher(KeyboardSwitcher keyboardSwitcher) { mKeyboardSwitcher = keyboardSwitcher; updateKeyboardView(); } public void onConfigurationChanged() { } }