diff options
Diffstat (limited to '')
-rw-r--r-- | libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java | 101 | ||||
-rw-r--r-- | libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconImageSpan.java | 14 | ||||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_angel.png (renamed from src/main/res/drawable/emo_im_angel.png) | bin | 3592 -> 3592 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_cool.png (renamed from src/main/res/drawable/emo_im_cool.png) | bin | 3466 -> 3466 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_crying.png (renamed from src/main/res/drawable/emo_im_crying.png) | bin | 3558 -> 3558 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_embarrassed.png (renamed from src/main/res/drawable/emo_im_embarrassed.png) | bin | 3619 -> 3619 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_foot_in_mouth.png (renamed from src/main/res/drawable/emo_im_foot_in_mouth.png) | bin | 3603 -> 3603 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_happy.png (renamed from src/main/res/drawable/emo_im_happy.png) | bin | 3591 -> 3591 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_heart.png (renamed from src/main/res/drawable/emo_im_heart.png) | bin | 684 -> 684 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_kissing.png (renamed from src/main/res/drawable/emo_im_kissing.png) | bin | 3492 -> 3492 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_laughing.png (renamed from src/main/res/drawable/emo_im_laughing.png) | bin | 3624 -> 3624 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_lips_are_sealed.png (renamed from src/main/res/drawable/emo_im_lips_are_sealed.png) | bin | 3670 -> 3670 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_money_mouth.png (renamed from src/main/res/drawable/emo_im_money_mouth.png) | bin | 3649 -> 3649 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_sad.png (renamed from src/main/res/drawable/emo_im_sad.png) | bin | 3572 -> 3572 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_surprised.png (renamed from src/main/res/drawable/emo_im_surprised.png) | bin | 3490 -> 3490 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_tongue_sticking_out.png (renamed from src/main/res/drawable/emo_im_tongue_sticking_out.png) | bin | 3653 -> 3653 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_undecided.png (renamed from src/main/res/drawable/emo_im_undecided.png) | bin | 3552 -> 3552 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_winking.png (renamed from src/main/res/drawable/emo_im_winking.png) | bin | 3568 -> 3568 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_wtf.png (renamed from src/main/res/drawable/emo_im_wtf.png) | bin | 3591 -> 3591 bytes | |||
-rw-r--r-- | libs/emojicon/src/main/res/drawable/emo_im_yelling.png (renamed from src/main/res/drawable/emo_im_yelling.png) | bin | 3575 -> 3575 bytes | |||
-rw-r--r-- | src/main/java/eu/siacs/conversations/ui/SettingsActivity.java | 8 | ||||
-rw-r--r-- | src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java | 3 | ||||
-rw-r--r-- | src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 5 | ||||
-rw-r--r-- | src/main/java/eu/siacs/conversations/utils/UIHelper.java | 129 |
24 files changed, 123 insertions, 137 deletions
diff --git a/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java index c84bebb8..0df62b57 100644 --- a/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java +++ b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java @@ -19,8 +19,14 @@ import github.ankushsachdeva.emojicon.R; import android.content.Context; import android.text.Spannable; +import android.text.style.ImageSpan; import android.util.SparseIntArray; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * @author Hieu Rocker (rockerhieu@gmail.com) */ @@ -28,6 +34,16 @@ public final class EmojiconHandler { private EmojiconHandler() { } + public static boolean isParseEmoticons() { + return bParseEmoticons; + } + + public static void setParseEmoticons(boolean bParseEmoticons) { + EmojiconHandler.bParseEmoticons = bParseEmoticons; + } + + private static boolean bParseEmoticons = true; + private static final SparseIntArray sEmojisMap = new SparseIntArray(846); private static final SparseIntArray sSoftbanksMap = new SparseIntArray(471); @@ -1384,6 +1400,88 @@ public final class EmojiconHandler { addEmojis(context, text, emojiSize, 0, -1); } + public static final Map<Pattern, Integer> ANDROID_EMOTICONS = new HashMap<Pattern, Integer>(); + + private static final Spannable.Factory spannableFactory = Spannable.Factory + .getInstance(); + + static { + addPattern(ANDROID_EMOTICONS, ":)", R.drawable.emo_im_happy); + addPattern(ANDROID_EMOTICONS, ":-)", R.drawable.emo_im_happy); + addPattern(ANDROID_EMOTICONS, ":(", R.drawable.emo_im_sad); + addPattern(ANDROID_EMOTICONS, ":-(", R.drawable.emo_im_sad); + addPattern(ANDROID_EMOTICONS, ";)", R.drawable.emo_im_winking); + addPattern(ANDROID_EMOTICONS, ";-)", R.drawable.emo_im_winking); + addPattern(ANDROID_EMOTICONS, ":P", + R.drawable.emo_im_tongue_sticking_out); + addPattern(ANDROID_EMOTICONS, ":-P", + R.drawable.emo_im_tongue_sticking_out); + addPattern(ANDROID_EMOTICONS, "=-O", R.drawable.emo_im_surprised); + addPattern(ANDROID_EMOTICONS, ":*", R.drawable.emo_im_kissing); + addPattern(ANDROID_EMOTICONS, ":-*", R.drawable.emo_im_kissing); + addPattern(ANDROID_EMOTICONS, ":O", R.drawable.emo_im_wtf); + addPattern(ANDROID_EMOTICONS, ":-O", R.drawable.emo_im_wtf); + addPattern(ANDROID_EMOTICONS, "B)", R.drawable.emo_im_cool); + addPattern(ANDROID_EMOTICONS, "B-)", R.drawable.emo_im_cool); + addPattern(ANDROID_EMOTICONS, "8)", R.drawable.emo_im_cool); + addPattern(ANDROID_EMOTICONS, "8-)", R.drawable.emo_im_cool); + addPattern(ANDROID_EMOTICONS, ":$", R.drawable.emo_im_money_mouth); + addPattern(ANDROID_EMOTICONS, ":-$", R.drawable.emo_im_money_mouth); + addPattern(ANDROID_EMOTICONS, ":-!", R.drawable.emo_im_foot_in_mouth); + addPattern(ANDROID_EMOTICONS, ":-[", R.drawable.emo_im_embarrassed); + addPattern(ANDROID_EMOTICONS, "O:)", R.drawable.emo_im_angel); + addPattern(ANDROID_EMOTICONS, "O:-)", R.drawable.emo_im_angel); + addPattern(ANDROID_EMOTICONS, ":\\", R.drawable.emo_im_undecided); + addPattern(ANDROID_EMOTICONS, ":-\\", R.drawable.emo_im_undecided); + addPattern(ANDROID_EMOTICONS, ":'(", R.drawable.emo_im_crying); + addPattern(ANDROID_EMOTICONS, ":D", R.drawable.emo_im_laughing); + addPattern(ANDROID_EMOTICONS, ":-D", R.drawable.emo_im_laughing); + addPattern(ANDROID_EMOTICONS, "O_o", R.drawable.emo_im_wtf); + addPattern(ANDROID_EMOTICONS, "o_O", R.drawable.emo_im_wtf); + addPattern(ANDROID_EMOTICONS, ">:O", R.drawable.emo_im_yelling); + addPattern(ANDROID_EMOTICONS, ">:0", R.drawable.emo_im_yelling); + addPattern(ANDROID_EMOTICONS, ":S", R.drawable.emo_im_lips_are_sealed); + addPattern(ANDROID_EMOTICONS, ":-S", R.drawable.emo_im_lips_are_sealed); + addPattern(ANDROID_EMOTICONS, "<3", R.drawable.emo_im_heart); + } + + private static void addPattern(Map<Pattern, Integer> map, String smile, + int resource) { + map.put(Pattern.compile(Pattern.quote(smile)), resource); + } + + private static boolean getSmiledText(Context context, Spannable spannable) { + // remove spans throughout all text + ImageSpan[] oldSpans = spannable.getSpans(0, spannable.length(), EmojiconImageSpan.class); + for (int i = 0; i < oldSpans.length; i++) { + spannable.removeSpan(oldSpans[i]); + } + boolean hasChanges = false; + Map<Pattern, Integer> emoticons = ANDROID_EMOTICONS; + for (Map.Entry<Pattern, Integer> entry : emoticons.entrySet()) { + Matcher matcher = entry.getKey().matcher(spannable); + while (matcher.find()) { + boolean set = true; + for (EmojiconImageSpan span : spannable.getSpans(matcher.start(), + matcher.end(), EmojiconImageSpan.class)) + if (spannable.getSpanStart(span) >= matcher.start() + && spannable.getSpanEnd(span) <= matcher.end()) + spannable.removeSpan(span); + else { + set = false; + break; + } + if (set) { + spannable.setSpan(new EmojiconImageSpan(context, entry.getValue()), + matcher.start(), matcher.end(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + hasChanges = true; + } + } + } + return hasChanges; + } + /** * Convert emoji characters of the given Spannable to the according emojicon. * @@ -1394,6 +1492,9 @@ public final class EmojiconHandler { * @param length */ public static void addEmojis(Context context, Spannable text, int emojiSize, int index, int length) { + if (isParseEmoticons()) { + getSmiledText(context, text); + } int textLength = text.length(); int textLengthToProcessMax = textLength - index; int textLengthToProcess = length < 0 || length >= textLengthToProcessMax ? textLength : (length+index); diff --git a/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconImageSpan.java b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconImageSpan.java new file mode 100644 index 00000000..8ad8fbb5 --- /dev/null +++ b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconImageSpan.java @@ -0,0 +1,14 @@ +package github.ankushsachdeva.emojicon; + +import android.content.Context; +import android.text.style.ImageSpan; + +/** + * Created by lookshe on 16.08.2015. + */ +public class EmojiconImageSpan extends ImageSpan { + + EmojiconImageSpan(Context context, int resourceId) { + super(context, resourceId); + } +} diff --git a/src/main/res/drawable/emo_im_angel.png b/libs/emojicon/src/main/res/drawable/emo_im_angel.png Binary files differindex c34dfa69..c34dfa69 100644 --- a/src/main/res/drawable/emo_im_angel.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_angel.png diff --git a/src/main/res/drawable/emo_im_cool.png b/libs/emojicon/src/main/res/drawable/emo_im_cool.png Binary files differindex d8eeb34e..d8eeb34e 100644 --- a/src/main/res/drawable/emo_im_cool.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_cool.png diff --git a/src/main/res/drawable/emo_im_crying.png b/libs/emojicon/src/main/res/drawable/emo_im_crying.png Binary files differindex 1cafdb32..1cafdb32 100644 --- a/src/main/res/drawable/emo_im_crying.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_crying.png diff --git a/src/main/res/drawable/emo_im_embarrassed.png b/libs/emojicon/src/main/res/drawable/emo_im_embarrassed.png Binary files differindex e4db9634..e4db9634 100644 --- a/src/main/res/drawable/emo_im_embarrassed.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_embarrassed.png diff --git a/src/main/res/drawable/emo_im_foot_in_mouth.png b/libs/emojicon/src/main/res/drawable/emo_im_foot_in_mouth.png Binary files differindex 09d1fba6..09d1fba6 100644 --- a/src/main/res/drawable/emo_im_foot_in_mouth.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_foot_in_mouth.png diff --git a/src/main/res/drawable/emo_im_happy.png b/libs/emojicon/src/main/res/drawable/emo_im_happy.png Binary files differindex b86602ae..b86602ae 100644 --- a/src/main/res/drawable/emo_im_happy.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_happy.png diff --git a/src/main/res/drawable/emo_im_heart.png b/libs/emojicon/src/main/res/drawable/emo_im_heart.png Binary files differindex d88bcccd..d88bcccd 100644 --- a/src/main/res/drawable/emo_im_heart.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_heart.png diff --git a/src/main/res/drawable/emo_im_kissing.png b/libs/emojicon/src/main/res/drawable/emo_im_kissing.png Binary files differindex 56378f6a..56378f6a 100644 --- a/src/main/res/drawable/emo_im_kissing.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_kissing.png diff --git a/src/main/res/drawable/emo_im_laughing.png b/libs/emojicon/src/main/res/drawable/emo_im_laughing.png Binary files differindex 980bf281..980bf281 100644 --- a/src/main/res/drawable/emo_im_laughing.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_laughing.png diff --git a/src/main/res/drawable/emo_im_lips_are_sealed.png b/libs/emojicon/src/main/res/drawable/emo_im_lips_are_sealed.png Binary files differindex f2de993b..f2de993b 100644 --- a/src/main/res/drawable/emo_im_lips_are_sealed.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_lips_are_sealed.png diff --git a/src/main/res/drawable/emo_im_money_mouth.png b/libs/emojicon/src/main/res/drawable/emo_im_money_mouth.png Binary files differindex 08c53fd6..08c53fd6 100644 --- a/src/main/res/drawable/emo_im_money_mouth.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_money_mouth.png diff --git a/src/main/res/drawable/emo_im_sad.png b/libs/emojicon/src/main/res/drawable/emo_im_sad.png Binary files differindex 31c08d06..31c08d06 100644 --- a/src/main/res/drawable/emo_im_sad.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_sad.png diff --git a/src/main/res/drawable/emo_im_surprised.png b/libs/emojicon/src/main/res/drawable/emo_im_surprised.png Binary files differindex abe8c7ad..abe8c7ad 100644 --- a/src/main/res/drawable/emo_im_surprised.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_surprised.png diff --git a/src/main/res/drawable/emo_im_tongue_sticking_out.png b/libs/emojicon/src/main/res/drawable/emo_im_tongue_sticking_out.png Binary files differindex 6f0f47b0..6f0f47b0 100644 --- a/src/main/res/drawable/emo_im_tongue_sticking_out.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_tongue_sticking_out.png diff --git a/src/main/res/drawable/emo_im_undecided.png b/libs/emojicon/src/main/res/drawable/emo_im_undecided.png Binary files differindex eb4f8c5b..eb4f8c5b 100644 --- a/src/main/res/drawable/emo_im_undecided.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_undecided.png diff --git a/src/main/res/drawable/emo_im_winking.png b/libs/emojicon/src/main/res/drawable/emo_im_winking.png Binary files differindex 568562ad..568562ad 100644 --- a/src/main/res/drawable/emo_im_winking.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_winking.png diff --git a/src/main/res/drawable/emo_im_wtf.png b/libs/emojicon/src/main/res/drawable/emo_im_wtf.png Binary files differindex 41dd47fc..41dd47fc 100644 --- a/src/main/res/drawable/emo_im_wtf.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_wtf.png diff --git a/src/main/res/drawable/emo_im_yelling.png b/libs/emojicon/src/main/res/drawable/emo_im_yelling.png Binary files differindex c3c8612b..c3c8612b 100644 --- a/src/main/res/drawable/emo_im_yelling.png +++ b/libs/emojicon/src/main/res/drawable/emo_im_yelling.png diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index f3d5d8bd..df2933c9 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -12,6 +12,7 @@ import de.duenndns.ssl.MemorizingTrustManager; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.xmpp.XmppConnection; +import github.ankushsachdeva.emojicon.EmojiconHandler; import android.app.AlertDialog; import android.app.Fragment; @@ -165,8 +166,11 @@ public class SettingsActivity extends XmppActivity implements } break; case "dont_trust_system_cas": - xmppConnectionService.updateMemorizingTrustmanager(); - reconnectAccounts(); + xmppConnectionService.updateMemorizingTrustmanager(); + reconnectAccounts(); + break; + case "parse_emoticons": + EmojiconHandler.setParseEmoticons(Settings.PARSE_EMOTICONS); break; } } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java index c42dd305..7443c0cb 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java @@ -119,8 +119,7 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> { Pair<String,Boolean> preview = UIHelper.getMessagePreview(activity,message); mLastMessage.setVisibility(View.VISIBLE); imagePreview.setVisibility(View.GONE); - boolean parseEmoticons = Settings.PARSE_EMOTICONS; - CharSequence msgText = parseEmoticons ? UIHelper.transformAsciiEmoticons(getContext(), preview.first) : preview.first; + CharSequence msgText = preview.first; mLastMessage.setText(msgText); if (preview.second) { if (conversation.isRead()) { diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 9699f7d4..b6979cc6 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -252,10 +252,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); viewHolder.messageBody.setText(span); } else { - boolean parseEmoticons = Settings.PARSE_EMOTICONS; - viewHolder.messageBody.setText(parseEmoticons ? UIHelper - .transformAsciiEmoticons(getContext(), message.getMergedBody()) - : formattedBody); + viewHolder.messageBody.setText(formattedBody); } } else { String privateMarker; diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java index 1e3d1caf..76f48037 100644 --- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java @@ -142,135 +142,6 @@ public class UIHelper { } } - public static final Map<Pattern, Integer> ANDROID_EMOTICONS = new HashMap<Pattern, Integer>(); - - private static final Factory spannableFactory = Spannable.Factory - .getInstance(); - - static { - addPattern(ANDROID_EMOTICONS, ":)", R.drawable.emo_im_happy); - addPattern(ANDROID_EMOTICONS, ":-)", R.drawable.emo_im_happy); - addPattern(ANDROID_EMOTICONS, ":(", R.drawable.emo_im_sad); - addPattern(ANDROID_EMOTICONS, ":-(", R.drawable.emo_im_sad); - addPattern(ANDROID_EMOTICONS, ";)", R.drawable.emo_im_winking); - addPattern(ANDROID_EMOTICONS, ";-)", R.drawable.emo_im_winking); - addPattern(ANDROID_EMOTICONS, ":P", - R.drawable.emo_im_tongue_sticking_out); - addPattern(ANDROID_EMOTICONS, ":-P", - R.drawable.emo_im_tongue_sticking_out); - addPattern(ANDROID_EMOTICONS, "=-O", R.drawable.emo_im_surprised); - addPattern(ANDROID_EMOTICONS, ":*", R.drawable.emo_im_kissing); - addPattern(ANDROID_EMOTICONS, ":-*", R.drawable.emo_im_kissing); - addPattern(ANDROID_EMOTICONS, ":O", R.drawable.emo_im_wtf); - addPattern(ANDROID_EMOTICONS, ":-O", R.drawable.emo_im_wtf); - addPattern(ANDROID_EMOTICONS, "B)", R.drawable.emo_im_cool); - addPattern(ANDROID_EMOTICONS, "B-)", R.drawable.emo_im_cool); - addPattern(ANDROID_EMOTICONS, "8)", R.drawable.emo_im_cool); - addPattern(ANDROID_EMOTICONS, "8-)", R.drawable.emo_im_cool); - addPattern(ANDROID_EMOTICONS, ":$", R.drawable.emo_im_money_mouth); - addPattern(ANDROID_EMOTICONS, ":-$", R.drawable.emo_im_money_mouth); - addPattern(ANDROID_EMOTICONS, ":-!", R.drawable.emo_im_foot_in_mouth); - addPattern(ANDROID_EMOTICONS, ":-[", R.drawable.emo_im_embarrassed); - addPattern(ANDROID_EMOTICONS, "O:)", R.drawable.emo_im_angel); - addPattern(ANDROID_EMOTICONS, "O:-)", R.drawable.emo_im_angel); - addPattern(ANDROID_EMOTICONS, ":\\", R.drawable.emo_im_undecided); - addPattern(ANDROID_EMOTICONS, ":-\\", R.drawable.emo_im_undecided); - addPattern(ANDROID_EMOTICONS, ":'(", R.drawable.emo_im_crying); - addPattern(ANDROID_EMOTICONS, ":D", R.drawable.emo_im_laughing); - addPattern(ANDROID_EMOTICONS, ":-D", R.drawable.emo_im_laughing); - addPattern(ANDROID_EMOTICONS, "O_o", R.drawable.emo_im_wtf); - addPattern(ANDROID_EMOTICONS, "o_O", R.drawable.emo_im_wtf); - addPattern(ANDROID_EMOTICONS, ">:O", R.drawable.emo_im_yelling); - addPattern(ANDROID_EMOTICONS, ">:0", R.drawable.emo_im_yelling); - addPattern(ANDROID_EMOTICONS, ":S", R.drawable.emo_im_lips_are_sealed); - addPattern(ANDROID_EMOTICONS, ":-S", R.drawable.emo_im_lips_are_sealed); - addPattern(ANDROID_EMOTICONS, "<3", R.drawable.emo_im_heart); - } - - private static void addPattern(Map<Pattern, Integer> map, String smile, - int resource) { - map.put(Pattern.compile(Pattern.quote(smile)), resource); - } - - private static boolean getSmiledText(Context context, Spannable spannable) { - boolean hasChanges = false; - Map<Pattern, Integer> emoticons = ANDROID_EMOTICONS; - 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) { - spannable.setSpan(new ImageSpan(context, entry.getValue()), - matcher.start(), matcher.end(), - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - hasChanges = true; - } - } - } - return hasChanges; - } - - private final static class EmoticonPattern { - Pattern pattern; - String replacement; - - EmoticonPattern(String ascii, int unicode) { - this.pattern = Pattern.compile("(?<=(^|\\s))" + ascii - + "(?=(\\s|$))"); - this.replacement = new String(new int[] { unicode, }, 0, 1); - } - - String replaceAll(String body) { - return pattern.matcher(body).replaceAll(replacement); - } - } - - private static final EmoticonPattern[] patterns = new EmoticonPattern[] { - new EmoticonPattern(":-?D", 0x1f600), - new EmoticonPattern("\\^\\^", 0x1f601), - new EmoticonPattern(":'D", 0x1f602), - new EmoticonPattern("\\]-?D", 0x1f608), - new EmoticonPattern(";-?\\)", 0x1f609), - new EmoticonPattern(":-?\\)", 0x1f60a), - new EmoticonPattern("[B8]-?\\)", 0x1f60e), - new EmoticonPattern(":-?\\|", 0x1f610), - new EmoticonPattern(":-?[/\\\\]", 0x1f615), - new EmoticonPattern(":-?\\*", 0x1f617), - new EmoticonPattern(":-?[Ppb]", 0x1f61b), - new EmoticonPattern(":-?\\(", 0x1f61e), - new EmoticonPattern(":-?[0Oo]", 0x1f62e), - new EmoticonPattern("\\\\o/", 0x1F631), }; - - public static String transformAsciiEmoticonsToUtf8(String body) { - if (body != null) { - for (EmoticonPattern p : patterns) { - body = p.replaceAll(body); - } - } - return body; - } - - public static Spannable transformAsciiEmoticons(Context context, String body) { - Spannable spannable; - if (Config.UTF8_EMOTICONS) { - spannable = spannableFactory.newSpannable(transformAsciiEmoticonsToUtf8(body)); - } - else { - spannable = spannableFactory.newSpannable(body); - getSmiledText(context, spannable); - } - return spannable; - } - public static int getColorForName(String name) { if (name.isEmpty()) { return 0xFF202020; |