package com.ladjzero.uzlee.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.style.ImageSpan;
import android.util.TypedValue;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by ladjzero on 2015/1/25.
*/
public class EmojiUtils {
public static final HashMap<String, String> icons = new HashMap<String, String>();
public static final Set<String> iconKeys;
public static final Collection<String> iconValues;
static Context context;
static {
icons.put("images/smilies/default/smile.gif", ":)");
icons.put("images/smilies/default/sweat.gif", ":sweat:");
icons.put("images/smilies/default/huffy.gif", ":huffy:");
icons.put("images/smilies/default/cry.gif", ":cry:");
icons.put("images/smilies/default/titter.gif", ":titter:");
icons.put("images/smilies/default/handshake.gif", ":handshake:");
icons.put("images/smilies/default/victory.gif", ":victory:");
icons.put("images/smilies/default/curse.gif", ":curse:");
icons.put("images/smilies/default/dizzy.gif", ":dizzy:");
icons.put("images/smilies/default/shutup.gif", ":shutup:");
icons.put("images/smilies/default/funk.gif", ":funk:");
icons.put("images/smilies/default/loveliness.gif", ":loveliness:");
icons.put("images/smilies/default/sad.gif", ":(");
icons.put("images/smilies/default/biggrin.gif", ":D");
icons.put("images/smilies/default/cool.gif", ":cool:");
icons.put("images/smilies/default/mad.gif", ":mad:");
icons.put("images/smilies/default/shocked.gif", ":o");
icons.put("images/smilies/default/tongue.gif", ":P");
icons.put("images/smilies/default/lol.gif", ":lol:");
icons.put("images/smilies/default/shy.gif", ":shy:");
icons.put("images/smilies/default/sleepy.gif", ":sleepy:");
icons.put("images/smilies/coolmonkey/01.gif", "{:2_41:}");
icons.put("images/smilies/coolmonkey/02.gif", "{:2_42:}");
icons.put("images/smilies/coolmonkey/03.gif", "{:2_43:}");
icons.put("images/smilies/coolmonkey/04.gif", "{:2_44:}");
icons.put("images/smilies/coolmonkey/05.gif", "{:2_45:}");
icons.put("images/smilies/coolmonkey/06.gif", "{:2_46:}");
icons.put("images/smilies/coolmonkey/07.gif", "{:2_47:}");
icons.put("images/smilies/coolmonkey/08.gif", "{:2_48:}");
icons.put("images/smilies/coolmonkey/09.gif", "{:2_49:}");
icons.put("images/smilies/coolmonkey/10.gif", "{:2_50:}");
icons.put("images/smilies/coolmonkey/11.gif", "{:2_51:}");
icons.put("images/smilies/coolmonkey/12.gif", "{:2_52:}");
icons.put("images/smilies/coolmonkey/13.gif", "{:2_53:}");
icons.put("images/smilies/coolmonkey/14.gif", "{:2_54:}");
icons.put("images/smilies/coolmonkey/15.gif", "{:2_55:}");
icons.put("images/smilies/coolmonkey/16.gif", "{:2_56:}");
icons.put("images/smilies/grapeman/01.gif", "{:3_57:}");
icons.put("images/smilies/grapeman/02.gif", "{:3_58:}");
icons.put("images/smilies/grapeman/03.gif", "{:3_59:}");
icons.put("images/smilies/grapeman/04.gif", "{:3_60:}");
icons.put("images/smilies/grapeman/05.gif", "{:3_61:}");
icons.put("images/smilies/grapeman/06.gif", "{:3_62:}");
icons.put("images/smilies/grapeman/07.gif", "{:3_63:}");
icons.put("images/smilies/grapeman/08.gif", "{:3_64:}");
icons.put("images/smilies/grapeman/09.gif", "{:3_65:}");
icons.put("images/smilies/grapeman/10.gif", "{:3_66:}");
icons.put("images/smilies/grapeman/11.gif", "{:3_67:}");
icons.put("images/smilies/grapeman/12.gif", "{:3_68:}");
icons.put("images/smilies/grapeman/13.gif", "{:3_69:}");
icons.put("images/smilies/grapeman/14.gif", "{:3_70:}");
icons.put("images/smilies/grapeman/15.gif", "{:3_71:}");
icons.put("images/smilies/grapeman/16.gif", "{:3_72:}");
icons.put("images/smilies/grapeman/17.gif", "{:3_73:}");
icons.put("images/smilies/grapeman/18.gif", "{:3_74:}");
icons.put("images/smilies/grapeman/19.gif", "{:3_75:}");
icons.put("images/smilies/grapeman/20.gif", "{:3_76:}");
icons.put("images/smilies/grapeman/21.gif", "{:3_77:}");
icons.put("images/smilies/grapeman/22.gif", "{:3_78:}");
icons.put("images/smilies/grapeman/23.gif", "{:3_79:}");
icons.put("images/smilies/grapeman/24.gif", "{:3_80:}");
iconKeys = icons.keySet();
iconValues = icons.values();
}
private final Spannable.Factory spannableFactory = Spannable.Factory.getInstance();
private final Map<Pattern, Integer> emoticons = new HashMap<Pattern, Integer>();
int px;
public EmojiUtils(Context context) {
EmojiUtils.context = context;
px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 26, context.getResources().getDisplayMetrics());
for (String iconKey : iconKeys) {
addPattern(emoticons, icons.get(iconKey), getEmojiResId(iconKey));
}
}
public static int getResId(Context context, String variableName, Class<?> c) {
return context.getResources().getIdentifier(variableName, "drawable", "com.ladjzero.uzlee");
}
private static void addPattern(Map<Pattern, Integer> map, String smile, int resource) {
map.put(Pattern.compile(Pattern.quote(smile)), resource);
}
public int getEmojiResId(String iconKey) {
String[] splits = iconKey.split("/");
int len = splits.length;
String s_2 = splits[len - 2],
s_1 = splits[len - 1];
if (s_2.equals("default")) {
return getResId(context, s_1.substring(0, s_1.length() - 4), Drawable.class);
} else {
String s = s_2 + s_1;
return getResId(context, s.substring(0, s.length() - 4), Drawable.class);
}
}
public boolean addSmiles(Context context, Spannable spannable) {
boolean hasChanges = false;
for (Entry<Pattern, Integer> entry : emoticons.entrySet()) {
Matcher matcher = entry.getKey().matcher(spannable);
while (matcher.find()) {
boolean set = true;
for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) {
if (spannable.getSpanStart(span) >= matcher.start()
&& spannable.getSpanEnd(span) <= matcher.end())
spannable.removeSpan(span);
else {
set = false;
break;
}
}
if (set) {
hasChanges = true;
Bitmap icon = BitmapFactory.decodeResource(context.getResources(), entry.getValue());
spannable
.setSpan(new ImageSpan(context, Bitmap.createScaledBitmap(icon, px, px, true), ImageSpan.ALIGN_BASELINE),
matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
return hasChanges;
}
public Spannable getSmiledText(Context context, CharSequence text) {
Spannable spannable = spannableFactory.newSpannable(text);
addSmiles(context, spannable);
return spannable;
}
}