package com.s16.inputmethod.emoji; import com.s16.inputmethod.skeyboard.R; import android.content.Context; import android.graphics.Typeface; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; public class EmojiIconsTabBar extends LinearLayout { private ViewPager mPager; private ViewPager.OnPageChangeListener mDelegatePageListener; private int mSelectedIndex; private int mTextColor; private int mSelectedTextColor; private Typeface mTabTypeface = Typeface.DEFAULT; private Typeface mTabSelectedTypeface = Typeface.DEFAULT_BOLD; public interface IconTabProvider { public int getPageIcon(int position); } private ViewPager.OnPageChangeListener mPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { mSelectedIndex = position; onSelectedIndexChanged(); if (mDelegatePageListener != null) { mDelegatePageListener.onPageSelected(position); } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (mDelegatePageListener != null) { mDelegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); } } @Override public void onPageScrollStateChanged(int state) { if (mDelegatePageListener != null) { mDelegatePageListener.onPageScrollStateChanged(state); } } }; private View.OnClickListener mItemClickListener = new View.OnClickListener() { @Override public void onClick(View v) { setSelectedItem(v); } }; public EmojiIconsTabBar(Context context) { super(context); init(context); } public EmojiIconsTabBar(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public EmojiIconsTabBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } private void init(Context context) { if (isInEditMode()) { return; } mTextColor = context.getResources().getColor(R.color.dim_foreground_holo_dark); mSelectedTextColor = context.getResources().getColor(R.color.bright_foreground_holo_dark); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); updateIcons(); } protected void updateIcons() { if (mPager != null && mPager.getAdapter() != null && mPager.getAdapter() instanceof IconTabProvider) { IconTabProvider iconTabProvider = (IconTabProvider)mPager.getAdapter(); for(int i=0; i<getChildCount(); i++) { if (getChildAt(i) instanceof TextView) { TextView child = (TextView)getChildAt(i); int codePoint = iconTabProvider.getPageIcon(i); String text = child.getText() == null ? "" : child.getText().toString(); if (Character.charCount(codePoint) == 1) { text = String.valueOf((char)codePoint); } else { text = new String(Character.toChars(codePoint)); } child.setText(text); } } } } protected void onSelectedIndexChanged() { for(int i=0; i<getChildCount(); i++) { getChildAt(i).setSelected((i == mSelectedIndex)); if (getChildAt(i) instanceof TextView) { TextView child = (TextView)getChildAt(i); if (i != mSelectedIndex) { child.setTextColor(mTextColor); child.setTypeface(mTabTypeface); } else { child.setTextColor(mSelectedTextColor); child.setTypeface(mTabSelectedTypeface); } child.invalidate(); } } if (mPager != null && mPager.getCurrentItem() != mSelectedIndex) { mPager.setCurrentItem(mSelectedIndex); } } protected View getSelectChild() { int childCount = getChildCount(); if (childCount > 0 && mSelectedIndex > -1 && mSelectedIndex < childCount) { View child = getChildAt(mSelectedIndex); return child; } return null; } private void setSelectedItem(View v) { if (v != null) { for(int i=0; i<getChildCount(); i++) { if (getChildAt(i).equals(v)) { setSelectedIndex(i); break; } } } } public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { mDelegatePageListener = listener; } public void setSelectedIndex(int index) { mSelectedIndex = index; onSelectedIndexChanged(); } public int getSelectedIndex() { return mSelectedIndex; } public void setTabTypeface(Typeface typeface) { mTabTypeface = typeface; } public void setTabSelectedTypeface(Typeface typeface) { mTabSelectedTypeface = typeface; } public void setViewPager(ViewPager pager) { mPager = pager; if (pager.getAdapter() == null) { throw new IllegalStateException("ViewPager does not have adapter instance."); } mPager.setOnPageChangeListener(mPageChangeListener); notifyDataSetChanged(); } public void notifyDataSetChanged() { int childCount = getChildCount(); if (childCount > 0) { for(int i=0; i<childCount; i++) { getChildAt(i).setOnClickListener(mItemClickListener); } } } }