package com.netease.nim.uikit.session.emoji;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.netease.nim.uikit.R;
import com.netease.nim.uikit.common.ui.imageview.CheckedImageButton;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nim.uikit.common.util.media.BitmapDecoder;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* 贴图表情选择控件
*/
public class EmoticonPickerView extends LinearLayout implements IEmoticonCategoryChanged {
private Context context;
private IEmoticonSelectedListener listener;
private boolean loaded = false;
private boolean withSticker;
private EmoticonView gifView;
private ViewPager currentEmojiPage;
private LinearLayout pageNumberLayout;//页面布局
private HorizontalScrollView scrollView;
private LinearLayout tabView;
private int categoryIndex;
private Handler uiHandler;
public EmoticonPickerView(Context context) {
super(context);
init(context);
}
public EmoticonPickerView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public EmoticonPickerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
this.context = context;
this.uiHandler = new Handler(context.getMainLooper());
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.nim_emoji_layout, this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
setupEmojView();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
}
public void show(IEmoticonSelectedListener listener) {
setListener(listener);
if (loaded)
return;
loadStickers();
loaded = true;
show();
}
public void setListener(IEmoticonSelectedListener listener) {
if (listener != null) {
this.listener = listener;
} else {
LogUtil.i("sticker", "listener is null");
}
}
protected void setupEmojView() {
currentEmojiPage = (ViewPager) findViewById(R.id.scrPlugin);
pageNumberLayout = (LinearLayout) findViewById(R.id.layout_scr_bottom);
tabView = (LinearLayout) findViewById(R.id.emoj_tab_view);
scrollView = (HorizontalScrollView) findViewById(R.id.emoj_tab_view_container);
findViewById(R.id.top_divider_line).setVisibility(View.VISIBLE);
}
// 添加各个tab按钮
OnClickListener tabCheckListener = new OnClickListener() {
@Override
public void onClick(View v) {
onEmoticonBtnChecked(v.getId());
}
};
private void loadStickers() {
if (!withSticker) {
scrollView.setVisibility(View.GONE);
return;
}
final StickerManager manager = StickerManager.getInstance();
tabView.removeAllViews();
int index = 0;
// emoji表情
CheckedImageButton btn = addEmoticonTabBtn(index++, tabCheckListener);
btn.setNormalImageId(R.drawable.nim_emoji_icon_inactive);
btn.setCheckedImageId(R.drawable.nim_emoji_icon);
// 贴图
List<StickerCategory> categories = manager.getCategories();
for (StickerCategory category : categories) {
btn = addEmoticonTabBtn(index++, tabCheckListener);
setCheckedButtomImage(btn, category);
}
}
private CheckedImageButton addEmoticonTabBtn(int index, OnClickListener listener) {
CheckedImageButton emotBtn = new CheckedImageButton(context);
emotBtn.setNormalBkResId(R.drawable.nim_sticker_button_background_normal_layer_list);
emotBtn.setCheckedBkResId(R.drawable.nim_sticker_button_background_pressed_layer_list);
emotBtn.setId(index);
emotBtn.setOnClickListener(listener);
emotBtn.setScaleType(ImageView.ScaleType.FIT_CENTER);
emotBtn.setPaddingValue(ScreenUtil.dip2px(7));
final int emojiBtnWidth = ScreenUtil.dip2px(50);
final int emojiBtnHeight = ScreenUtil.dip2px(44);
tabView.addView(emotBtn);
ViewGroup.LayoutParams emojBtnLayoutParams = emotBtn.getLayoutParams();
emojBtnLayoutParams.width = emojiBtnWidth;
emojBtnLayoutParams.height = emojiBtnHeight;
emotBtn.setLayoutParams(emojBtnLayoutParams);
return emotBtn;
}
private void setCheckedButtomImage(CheckedImageButton btn, StickerCategory category) {
try {
InputStream is = category.getCoverNormalInputStream(context);
if (is != null) {
Bitmap bmp = BitmapDecoder.decode(is);
btn.setNormalImage(bmp);
is.close();
}
is = category.getCoverPressedInputStream(context);
if (is != null) {
Bitmap bmp = BitmapDecoder.decode(is);
btn.setCheckedImage(bmp);
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void onEmoticonBtnChecked(int index) {
updateTabButton(index);
showEmotPager(index);
}
private void updateTabButton(int index) {
for (int i = 0; i < tabView.getChildCount(); ++i) {
View child = tabView.getChildAt(i);
if (child instanceof FrameLayout) {
child = ((FrameLayout) child).getChildAt(0);
}
if (child != null && child instanceof CheckedImageButton) {
CheckedImageButton tabButton = (CheckedImageButton) child;
if (tabButton.isChecked() && i != index) {
tabButton.setChecked(false);
} else if (!tabButton.isChecked() && i == index) {
tabButton.setChecked(true);
}
}
}
}
private void showEmotPager(int index) {
if (gifView == null) {
gifView = new EmoticonView(context, listener, currentEmojiPage, pageNumberLayout);
gifView.setCategoryChangCheckedCallback(this);
}
gifView.showStickers(index);
}
private void showEmojiView() {
if (gifView == null) {
gifView = new EmoticonView(context, listener, currentEmojiPage, pageNumberLayout);
}
gifView.showEmojis();
}
private void show() {
if (listener == null) {
LogUtil.i("sticker", "show picker view when listener is null");
}
if (!withSticker) {
showEmojiView();
} else {
onEmoticonBtnChecked(0);
setSelectedVisible(0);
}
}
private void setSelectedVisible(final int index) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
if (scrollView.getChildAt(0).getWidth() == 0) {
uiHandler.postDelayed(this, 100);
}
int x = -1;
View child = tabView.getChildAt(index);
if (child != null) {
if (child.getRight() > scrollView.getWidth()) {
x = child.getRight() - scrollView.getWidth();
}
}
if (x != -1) {
scrollView.smoothScrollTo(x, 0);
}
}
};
uiHandler.postDelayed(runnable, 100);
}
@Override
public void onCategoryChanged(int index) {
if (categoryIndex == index) {
return;
}
categoryIndex = index;
updateTabButton(index);
}
public void setWithSticker(boolean withSticker) {
this.withSticker = withSticker;
}
}