package com.xhsemoticonskeyboard.common;
import android.content.Context;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import com.sj.emoji.DefEmoticons;
import com.sj.emoji.EmojiBean;
import com.sj.emoji.EmojiDisplay;
import com.testemticon.DefXhsEmoticons;
import com.xhsemoticonskeyboard.R;
import com.xhsemoticonskeyboard.common.adapter.emoticonadapter.BigEmoticonsAdapter;
import com.xhsemoticonskeyboard.common.adapter.emoticonadapter.BigEmoticonsAndTitleAdapter;
import com.xhsemoticonskeyboard.common.adapter.emoticonadapter.TextEmoticonsAdapter;
import com.xhsemoticonskeyboard.common.filter.EmojiFilter;
import com.xhsemoticonskeyboard.common.filter.XhsFilter;
import com.xhsemoticonskeyboard.common.utils.FileUtils;
import com.xhsemoticonskeyboard.common.utils.ParseDataUtils;
import com.xhsemoticonskeyboard.common.widget.SimpleAppsGridView;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collections;
import sj.keyboard.adpater.EmoticonsAdapter;
import sj.keyboard.adpater.PageSetAdapter;
import sj.keyboard.data.EmoticonEntity;
import sj.keyboard.data.EmoticonPageEntity;
import sj.keyboard.data.EmoticonPageSetEntity;
import sj.keyboard.data.PageEntity;
import sj.keyboard.data.PageSetEntity;
import sj.keyboard.interfaces.EmoticonClickListener;
import sj.keyboard.interfaces.EmoticonDisplayListener;
import sj.keyboard.interfaces.PageViewInstantiateListener;
import sj.keyboard.utils.EmoticonsKeyboardUtils;
import sj.keyboard.utils.imageloader.ImageBase;
import sj.keyboard.utils.imageloader.ImageLoader;
import sj.keyboard.widget.EmoticonPageView;
import sj.keyboard.widget.EmoticonsEditText;
public class SimpleCommonUtils {
public static void initEmoticonsEditText(EmoticonsEditText etContent) {
etContent.addEmoticonFilter(new EmojiFilter());
etContent.addEmoticonFilter(new XhsFilter());
}
public static EmoticonClickListener getCommonEmoticonClickListener(final EditText editText) {
return new EmoticonClickListener() {
@Override
public void onEmoticonClick(Object o, int actionType, boolean isDelBtn) {
if (isDelBtn) {
SimpleCommonUtils.delClick(editText);
} else {
if (o == null) {
return;
}
if (actionType == Constants.EMOTICON_CLICK_TEXT) {
String content = null;
if (o instanceof EmojiBean) {
content = ((EmojiBean) o).emoji;
} else if (o instanceof EmoticonEntity) {
content = ((EmoticonEntity) o).getContent();
}
if (TextUtils.isEmpty(content)) {
return;
}
int index = editText.getSelectionStart();
Editable editable = editText.getText();
editable.insert(index, content);
}
}
}
};
}
public static PageSetAdapter sCommonPageSetAdapter;
public static PageSetAdapter getCommonAdapter(Context context, EmoticonClickListener emoticonClickListener) {
if(sCommonPageSetAdapter != null){
return sCommonPageSetAdapter;
}
PageSetAdapter pageSetAdapter = new PageSetAdapter();
addEmojiPageSetEntity(pageSetAdapter, context, emoticonClickListener);
addXhsPageSetEntity(pageSetAdapter, context, emoticonClickListener);
addWechatPageSetEntity(pageSetAdapter, context, emoticonClickListener);
addGoodGoodStudyPageSetEntity(pageSetAdapter, context, emoticonClickListener);
addKaomojiPageSetEntity(pageSetAdapter, context, emoticonClickListener);
addTestPageSetEntity(pageSetAdapter, context);
return pageSetAdapter;
}
/**
* 插入emoji表情集
*
* @param pageSetAdapter
* @param context
* @param emoticonClickListener
*/
public static void addEmojiPageSetEntity(PageSetAdapter pageSetAdapter, Context context, final EmoticonClickListener emoticonClickListener) {
ArrayList<EmojiBean> emojiArray = new ArrayList<>();
Collections.addAll(emojiArray, DefEmoticons.sEmojiArray);
EmoticonPageSetEntity emojiPageSetEntity
= new EmoticonPageSetEntity.Builder()
.setLine(3)
.setRow(7)
.setEmoticonList(emojiArray)
.setIPageViewInstantiateItem(getDefaultEmoticonPageViewInstantiateItem(new EmoticonDisplayListener<Object>() {
@Override
public void onBindView(int position, ViewGroup parent, EmoticonsAdapter.ViewHolder viewHolder, Object object, final boolean isDelBtn) {
final EmojiBean emojiBean = (EmojiBean) object;
if (emojiBean == null && !isDelBtn) {
return;
}
viewHolder.ly_root.setBackgroundResource(com.keyboard.view.R.drawable.bg_emoticon);
if (isDelBtn) {
viewHolder.iv_emoticon.setImageResource(R.mipmap.icon_del);
} else {
viewHolder.iv_emoticon.setImageResource(emojiBean.icon);
}
viewHolder.rootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (emoticonClickListener != null) {
emoticonClickListener.onEmoticonClick(emojiBean, Constants.EMOTICON_CLICK_TEXT, isDelBtn);
}
}
});
}
}))
.setShowDelBtn(EmoticonPageEntity.DelBtnStatus.LAST)
.setIconUri(ImageBase.Scheme.DRAWABLE.toUri("icon_emoji"))
.build();
pageSetAdapter.add(emojiPageSetEntity);
}
/**
* 插入xhs表情集
*
* @param pageSetAdapter
* @param context
* @param emoticonClickListener
*/
public static void addXhsPageSetEntity(PageSetAdapter pageSetAdapter, Context context, EmoticonClickListener emoticonClickListener) {
EmoticonPageSetEntity xhsPageSetEntity
= new EmoticonPageSetEntity.Builder()
.setLine(3)
.setRow(7)
.setEmoticonList(ParseDataUtils.ParseXhsData(DefXhsEmoticons.xhsEmoticonArray, ImageBase.Scheme.ASSETS))
.setIPageViewInstantiateItem(getDefaultEmoticonPageViewInstantiateItem(getCommonEmoticonDisplayListener(emoticonClickListener, Constants.EMOTICON_CLICK_TEXT)))
.setShowDelBtn(EmoticonPageEntity.DelBtnStatus.LAST)
.setIconUri(ImageBase.Scheme.ASSETS.toUri("xhsemoji_19.png"))
.build();
pageSetAdapter.add(xhsPageSetEntity);
}
/**
* 插入微信表情集
*
* @param pageSetAdapter
* @param context
* @param emoticonClickListener
*/
public static void addWechatPageSetEntity(PageSetAdapter pageSetAdapter, Context context, EmoticonClickListener emoticonClickListener) {
String filePath = FileUtils.getFolderPath("wxemoticons");
EmoticonPageSetEntity<EmoticonEntity> emoticonPageSetEntity = ParseDataUtils.parseDataFromFile(context, filePath, "wxemoticons.zip", "wxemoticons.xml");
if (emoticonPageSetEntity == null) {
return;
}
EmoticonPageSetEntity pageSetEntity
= new EmoticonPageSetEntity.Builder()
.setLine(emoticonPageSetEntity.getLine())
.setRow(emoticonPageSetEntity.getRow())
.setEmoticonList(emoticonPageSetEntity.getEmoticonList())
.setIPageViewInstantiateItem(getEmoticonPageViewInstantiateItem(BigEmoticonsAdapter.class, emoticonClickListener))
.setIconUri(ImageBase.Scheme.FILE.toUri(filePath + "/" + emoticonPageSetEntity.getIconUri()))
.build();
pageSetAdapter.add(pageSetEntity);
}
/**
* 插入我们爱学习表情集
*
* @param pageSetAdapter
* @param context
* @param emoticonClickListener
*/
public static void addGoodGoodStudyPageSetEntity(PageSetAdapter pageSetAdapter, Context context, EmoticonClickListener emoticonClickListener) {
String filePath = FileUtils.getFolderPath("goodgoodstudy");
EmoticonPageSetEntity<EmoticonEntity> emoticonPageSetEntity = ParseDataUtils.parseDataFromFile(context, filePath, "goodgoodstudy.zip", "goodgoodstudy.xml");
if (emoticonPageSetEntity == null) {
return;
}
EmoticonPageSetEntity pageSetEntity
= new EmoticonPageSetEntity.Builder()
.setLine(emoticonPageSetEntity.getLine())
.setRow(emoticonPageSetEntity.getRow())
.setEmoticonList(emoticonPageSetEntity.getEmoticonList())
.setIPageViewInstantiateItem(getEmoticonPageViewInstantiateItem(BigEmoticonsAndTitleAdapter.class, emoticonClickListener))
.setIconUri(ImageBase.Scheme.FILE.toUri(filePath + "/" + emoticonPageSetEntity.getIconUri()))
.build();
pageSetAdapter.add(pageSetEntity);
}
/**
* 插入颜文字表情集
*
* @param pageSetAdapter
* @param context
* @param emoticonClickListener
*/
public static void addKaomojiPageSetEntity(PageSetAdapter pageSetAdapter, Context context, EmoticonClickListener emoticonClickListener) {
EmoticonPageSetEntity kaomojiPageSetEntity
= new EmoticonPageSetEntity.Builder()
.setLine(3)
.setRow(3)
.setEmoticonList(ParseDataUtils.parseKaomojiData(context))
.setIPageViewInstantiateItem(getEmoticonPageViewInstantiateItem(TextEmoticonsAdapter.class, emoticonClickListener))
.setIconUri(ImageBase.Scheme.DRAWABLE.toUri("icon_kaomoji"))
.build();
pageSetAdapter.add(kaomojiPageSetEntity);
}
/**
* 测试页集
*
* @param pageSetAdapter
* @param context
*/
public static void addTestPageSetEntity(PageSetAdapter pageSetAdapter, Context context) {
PageSetEntity pageSetEntity = new PageSetEntity.Builder()
.addPageEntity(new PageEntity(new SimpleAppsGridView(context)))
.setIconUri(ImageBase.Scheme.DRAWABLE.toUri("icon_kaomoji"))
.setShowIndicator(false)
.build();
pageSetAdapter.add(pageSetEntity);
}
@SuppressWarnings("unchecked")
public static Object newInstance(Class _Class, Object... args) throws Exception {
return newInstance(_Class, 0, args);
}
@SuppressWarnings("unchecked")
public static Object newInstance(Class _Class, int constructorIndex, Object... args) throws Exception {
Constructor cons = _Class.getConstructors()[constructorIndex];
return cons.newInstance(args);
}
public static PageViewInstantiateListener<EmoticonPageEntity> getDefaultEmoticonPageViewInstantiateItem(final EmoticonDisplayListener<Object> emoticonDisplayListener) {
return getEmoticonPageViewInstantiateItem(EmoticonsAdapter.class, null, emoticonDisplayListener);
}
public static PageViewInstantiateListener<EmoticonPageEntity> getEmoticonPageViewInstantiateItem(final Class _class, EmoticonClickListener onEmoticonClickListener) {
return getEmoticonPageViewInstantiateItem(_class, onEmoticonClickListener, null);
}
public static PageViewInstantiateListener<EmoticonPageEntity> getEmoticonPageViewInstantiateItem(final Class _class, final EmoticonClickListener onEmoticonClickListener, final EmoticonDisplayListener<Object> emoticonDisplayListener) {
return new PageViewInstantiateListener<EmoticonPageEntity>() {
@Override
public View instantiateItem(ViewGroup container, int position, EmoticonPageEntity pageEntity) {
if (pageEntity.getRootView() == null) {
EmoticonPageView pageView = new EmoticonPageView(container.getContext());
pageView.setNumColumns(pageEntity.getRow());
pageEntity.setRootView(pageView);
try {
EmoticonsAdapter adapter = (EmoticonsAdapter) newInstance(_class, container.getContext(), pageEntity, onEmoticonClickListener);
if (emoticonDisplayListener != null) {
adapter.setOnDisPlayListener(emoticonDisplayListener);
}
pageView.getEmoticonsGridView().setAdapter(adapter);
} catch (Exception e) {
e.printStackTrace();
}
}
return pageEntity.getRootView();
}
};
}
public static EmoticonDisplayListener<Object> getCommonEmoticonDisplayListener(final EmoticonClickListener onEmoticonClickListener, final int type) {
return new EmoticonDisplayListener<Object>() {
@Override
public void onBindView(int position, ViewGroup parent, EmoticonsAdapter.ViewHolder viewHolder, Object object, final boolean isDelBtn) {
final EmoticonEntity emoticonEntity = (EmoticonEntity) object;
if (emoticonEntity == null && !isDelBtn) {
return;
}
viewHolder.ly_root.setBackgroundResource(com.keyboard.view.R.drawable.bg_emoticon);
if (isDelBtn) {
viewHolder.iv_emoticon.setImageResource(R.mipmap.icon_del);
} else {
try {
ImageLoader.getInstance(viewHolder.iv_emoticon.getContext()).displayImage(emoticonEntity.getIconUri(), viewHolder.iv_emoticon);
} catch (IOException e) {
e.printStackTrace();
}
}
viewHolder.rootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onEmoticonClickListener != null) {
onEmoticonClickListener.onEmoticonClick(emoticonEntity, type, isDelBtn);
}
}
});
}
};
}
public static void delClick(EditText editText) {
int action = KeyEvent.ACTION_DOWN;
int code = KeyEvent.KEYCODE_DEL;
KeyEvent event = new KeyEvent(action, code);
editText.onKeyDown(KeyEvent.KEYCODE_DEL, event);
}
public static void spannableEmoticonFilter(TextView tv_content, String content) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(content);
Spannable spannable = EmojiDisplay.spannableFilter(tv_content.getContext(),
spannableStringBuilder,
content,
EmoticonsKeyboardUtils.getFontHeight(tv_content));
spannable = XhsFilter.spannableFilter(tv_content.getContext(),
spannable,
content,
EmoticonsKeyboardUtils.getFontHeight(tv_content),
null);
tv_content.setText(spannable);
}
}