/* * Copyright 2014 Hieu Rocker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.rockerhieu.emojicon; import android.content.Context; import android.text.Spannable; import android.util.SparseIntArray; import com.withiter.quhao.R; /** * @author Hieu Rocker (rockerhieu@gmail.com) */ public final class EmojiconHandler { private EmojiconHandler() { } private static final SparseIntArray sEmojisMap = new SparseIntArray(846); private static final SparseIntArray sSoftbanksMap = new SparseIntArray(471); static { // People sEmojisMap.put(0x1f604, R.drawable.emoji_1f604); sEmojisMap.put(0x1f603, R.drawable.emoji_1f603); sEmojisMap.put(0x1f600, R.drawable.emoji_1f600); sEmojisMap.put(0x1f60a, R.drawable.emoji_1f60a); sEmojisMap.put(0x263a, R.drawable.emoji_263a); sEmojisMap.put(0x1f609, R.drawable.emoji_1f609); sEmojisMap.put(0x1f60d, R.drawable.emoji_1f60d); sEmojisMap.put(0x1f618, R.drawable.emoji_1f618); sEmojisMap.put(0x1f61a, R.drawable.emoji_1f61a); sEmojisMap.put(0x1f617, R.drawable.emoji_1f617); sEmojisMap.put(0x1f619, R.drawable.emoji_1f619); sEmojisMap.put(0x1f61c, R.drawable.emoji_1f61c); sEmojisMap.put(0x1f61d, R.drawable.emoji_1f61d); sEmojisMap.put(0x1f61b, R.drawable.emoji_1f61b); sEmojisMap.put(0x1f633, R.drawable.emoji_1f633); sEmojisMap.put(0x1f601, R.drawable.emoji_1f601); sEmojisMap.put(0x1f614, R.drawable.emoji_1f614); sEmojisMap.put(0x1f60c, R.drawable.emoji_1f60c); sEmojisMap.put(0x1f612, R.drawable.emoji_1f612); sEmojisMap.put(0x1f61e, R.drawable.emoji_1f61e); sEmojisMap.put(0x1f623, R.drawable.emoji_1f623); sEmojisMap.put(0x1f622, R.drawable.emoji_1f622); sEmojisMap.put(0x1f602, R.drawable.emoji_1f602); sEmojisMap.put(0x1f62d, R.drawable.emoji_1f62d); sEmojisMap.put(0x1f62a, R.drawable.emoji_1f62a); sEmojisMap.put(0x1f625, R.drawable.emoji_1f625); sEmojisMap.put(0x1f630, R.drawable.emoji_1f630); sEmojisMap.put(0x1f605, R.drawable.emoji_1f605); sEmojisMap.put(0x1f613, R.drawable.emoji_1f613); sEmojisMap.put(0x1f629, R.drawable.emoji_1f629); sEmojisMap.put(0x1f62b, R.drawable.emoji_1f62b); sEmojisMap.put(0x1f628, R.drawable.emoji_1f628); sEmojisMap.put(0x1f631, R.drawable.emoji_1f631); sEmojisMap.put(0x1f620, R.drawable.emoji_1f620); sEmojisMap.put(0x1f621, R.drawable.emoji_1f621); sEmojisMap.put(0x1f624, R.drawable.emoji_1f624); sEmojisMap.put(0x1f616, R.drawable.emoji_1f616); sEmojisMap.put(0x1f606, R.drawable.emoji_1f606); sEmojisMap.put(0x1f60b, R.drawable.emoji_1f60b); sEmojisMap.put(0x1f637, R.drawable.emoji_1f637); sEmojisMap.put(0x1f60e, R.drawable.emoji_1f60e); sEmojisMap.put(0x1f634, R.drawable.emoji_1f634); sEmojisMap.put(0x1f635, R.drawable.emoji_1f635); sEmojisMap.put(0x1f632, R.drawable.emoji_1f632); sEmojisMap.put(0x1f61f, R.drawable.emoji_1f61f); sEmojisMap.put(0x1f626, R.drawable.emoji_1f626); sEmojisMap.put(0x1f627, R.drawable.emoji_1f627); sEmojisMap.put(0x1f608, R.drawable.emoji_1f608); sEmojisMap.put(0x1f47f, R.drawable.emoji_1f47f); sEmojisMap.put(0x1f62e, R.drawable.emoji_1f62e); sEmojisMap.put(0x1f62c, R.drawable.emoji_1f62c); sEmojisMap.put(0x1f610, R.drawable.emoji_1f610); sEmojisMap.put(0x1f615, R.drawable.emoji_1f615); sEmojisMap.put(0x1f62f, R.drawable.emoji_1f62f); sEmojisMap.put(0x1f636, R.drawable.emoji_1f636); sEmojisMap.put(0x1f607, R.drawable.emoji_1f607); sEmojisMap.put(0x1f60f, R.drawable.emoji_1f60f); sEmojisMap.put(0x1f611, R.drawable.emoji_1f611); sEmojisMap.put(0x1f472, R.drawable.emoji_1f472); sEmojisMap.put(0x1f473, R.drawable.emoji_1f473); sEmojisMap.put(0x1f46e, R.drawable.emoji_1f46e); sEmojisMap.put(0x1f477, R.drawable.emoji_1f477); sEmojisMap.put(0x1f482, R.drawable.emoji_1f482); sEmojisMap.put(0x1f476, R.drawable.emoji_1f476); sEmojisMap.put(0x1f466, R.drawable.emoji_1f466); sEmojisMap.put(0x1f467, R.drawable.emoji_1f467); sEmojisMap.put(0x1f468, R.drawable.emoji_1f468); sEmojisMap.put(0x1f469, R.drawable.emoji_1f469); sEmojisMap.put(0x1f474, R.drawable.emoji_1f474); sEmojisMap.put(0x1f475, R.drawable.emoji_1f475); sEmojisMap.put(0x1f471, R.drawable.emoji_1f471); sEmojisMap.put(0x1f47c, R.drawable.emoji_1f47c); sEmojisMap.put(0x1f478, R.drawable.emoji_1f478); sEmojisMap.put(0x1f63a, R.drawable.emoji_1f63a); sEmojisMap.put(0x1f638, R.drawable.emoji_1f638); sEmojisMap.put(0x1f63b, R.drawable.emoji_1f63b); sEmojisMap.put(0x1f63d, R.drawable.emoji_1f63d); sEmojisMap.put(0x1f63c, R.drawable.emoji_1f63c); sEmojisMap.put(0x1f640, R.drawable.emoji_1f640); sEmojisMap.put(0x1f63f, R.drawable.emoji_1f63f); sEmojisMap.put(0x1f639, R.drawable.emoji_1f639); sEmojisMap.put(0x1f63e, R.drawable.emoji_1f63e); sEmojisMap.put(0x1f479, R.drawable.emoji_1f479); sEmojisMap.put(0x1f47a, R.drawable.emoji_1f47a); sEmojisMap.put(0x1f648, R.drawable.emoji_1f648); sEmojisMap.put(0x1f649, R.drawable.emoji_1f649); sEmojisMap.put(0x1f64a, R.drawable.emoji_1f64a); sEmojisMap.put(0x1f480, R.drawable.emoji_1f480); sEmojisMap.put(0x1f47d, R.drawable.emoji_1f47d); sEmojisMap.put(0x1f4a9, R.drawable.emoji_1f4a9); sEmojisMap.put(0x1f525, R.drawable.emoji_1f525); sEmojisMap.put(0x2728, R.drawable.emoji_2728); sEmojisMap.put(0x1f31f, R.drawable.emoji_1f31f); sEmojisMap.put(0x1f4ab, R.drawable.emoji_1f4ab); sEmojisMap.put(0x1f4a5, R.drawable.emoji_1f4a5); sEmojisMap.put(0x1f4a2, R.drawable.emoji_1f4a2); sEmojisMap.put(0x1f4a6, R.drawable.emoji_1f4a6); sEmojisMap.put(0x1f4a7, R.drawable.emoji_1f4a7); sEmojisMap.put(0x1f4a4, R.drawable.emoji_1f4a4); sEmojisMap.put(0x1f4a8, R.drawable.emoji_1f4a8); sEmojisMap.put(0x1f442, R.drawable.emoji_1f442); sEmojisMap.put(0x1f440, R.drawable.emoji_1f440); sEmojisMap.put(0x1f443, R.drawable.emoji_1f443); sEmojisMap.put(0x1f445, R.drawable.emoji_1f445); sEmojisMap.put(0x1f444, R.drawable.emoji_1f444); sEmojisMap.put(0x1f44d, R.drawable.emoji_1f44d); sEmojisMap.put(0x1f44e, R.drawable.emoji_1f44e); sEmojisMap.put(0x1f44c, R.drawable.emoji_1f44c); sEmojisMap.put(0x1f44a, R.drawable.emoji_1f44a); sEmojisMap.put(0x270a, R.drawable.emoji_270a); sEmojisMap.put(0x270c, R.drawable.emoji_270c); sEmojisMap.put(0x1f44b, R.drawable.emoji_1f44b); sEmojisMap.put(0x270b, R.drawable.emoji_270b); sEmojisMap.put(0x1f450, R.drawable.emoji_1f450); sEmojisMap.put(0x1f446, R.drawable.emoji_1f446); sEmojisMap.put(0x1f447, R.drawable.emoji_1f447); sEmojisMap.put(0x1f449, R.drawable.emoji_1f449); sEmojisMap.put(0x1f448, R.drawable.emoji_1f448); sEmojisMap.put(0x1f64c, R.drawable.emoji_1f64c); sEmojisMap.put(0x1f64f, R.drawable.emoji_1f64f); sEmojisMap.put(0x261d, R.drawable.emoji_261d); sEmojisMap.put(0x1f44f, R.drawable.emoji_1f44f); sEmojisMap.put(0x1f4aa, R.drawable.emoji_1f4aa); sEmojisMap.put(0x1f6b6, R.drawable.emoji_1f6b6); sEmojisMap.put(0x1f3c3, R.drawable.emoji_1f3c3); sEmojisMap.put(0x1f483, R.drawable.emoji_1f483); sEmojisMap.put(0x1f46b, R.drawable.emoji_1f46b); sEmojisMap.put(0x1f46a, R.drawable.emoji_1f46a); sEmojisMap.put(0x1f46c, R.drawable.emoji_1f46c); sEmojisMap.put(0x1f46d, R.drawable.emoji_1f46d); sEmojisMap.put(0x1f48f, R.drawable.emoji_1f48f); sEmojisMap.put(0x1f491, R.drawable.emoji_1f491); sEmojisMap.put(0x1f46f, R.drawable.emoji_1f46f); sEmojisMap.put(0x1f646, R.drawable.emoji_1f646); sEmojisMap.put(0x1f645, R.drawable.emoji_1f645); sEmojisMap.put(0x1f481, R.drawable.emoji_1f481); sEmojisMap.put(0x1f64b, R.drawable.emoji_1f64b); sEmojisMap.put(0x1f486, R.drawable.emoji_1f486); sEmojisMap.put(0x1f487, R.drawable.emoji_1f487); sEmojisMap.put(0x1f485, R.drawable.emoji_1f485); sEmojisMap.put(0x1f470, R.drawable.emoji_1f470); sEmojisMap.put(0x1f64e, R.drawable.emoji_1f64e); sEmojisMap.put(0x1f64d, R.drawable.emoji_1f64d); sEmojisMap.put(0x1f647, R.drawable.emoji_1f647); sEmojisMap.put(0x1f3a9, R.drawable.emoji_1f3a9); sEmojisMap.put(0x1f451, R.drawable.emoji_1f451); sEmojisMap.put(0x1f452, R.drawable.emoji_1f452); sEmojisMap.put(0x1f45f, R.drawable.emoji_1f45f); sEmojisMap.put(0x1f45e, R.drawable.emoji_1f45e); sEmojisMap.put(0x1f461, R.drawable.emoji_1f461); sEmojisMap.put(0x1f460, R.drawable.emoji_1f460); sEmojisMap.put(0x1f462, R.drawable.emoji_1f462); sEmojisMap.put(0x1f455, R.drawable.emoji_1f455); sEmojisMap.put(0x1f454, R.drawable.emoji_1f454); sEmojisMap.put(0x1f45a, R.drawable.emoji_1f45a); sEmojisMap.put(0x1f457, R.drawable.emoji_1f457); sEmojisMap.put(0x1f3bd, R.drawable.emoji_1f3bd); sEmojisMap.put(0x1f456, R.drawable.emoji_1f456); sEmojisMap.put(0x1f458, R.drawable.emoji_1f458); sEmojisMap.put(0x1f459, R.drawable.emoji_1f459); sEmojisMap.put(0x1f4bc, R.drawable.emoji_1f4bc); sEmojisMap.put(0x1f45c, R.drawable.emoji_1f45c); sEmojisMap.put(0x1f45d, R.drawable.emoji_1f45d); sEmojisMap.put(0x1f45b, R.drawable.emoji_1f45b); sEmojisMap.put(0x1f453, R.drawable.emoji_1f453); sEmojisMap.put(0x1f380, R.drawable.emoji_1f380); sEmojisMap.put(0x1f302, R.drawable.emoji_1f302); sEmojisMap.put(0x1f484, R.drawable.emoji_1f484); sEmojisMap.put(0x1f49b, R.drawable.emoji_1f49b); sEmojisMap.put(0x1f499, R.drawable.emoji_1f499); sEmojisMap.put(0x1f49c, R.drawable.emoji_1f49c); sEmojisMap.put(0x1f49a, R.drawable.emoji_1f49a); sEmojisMap.put(0x2764, R.drawable.emoji_2764); sEmojisMap.put(0x1f494, R.drawable.emoji_1f494); sEmojisMap.put(0x1f497, R.drawable.emoji_1f497); sEmojisMap.put(0x1f493, R.drawable.emoji_1f493); sEmojisMap.put(0x1f495, R.drawable.emoji_1f495); sEmojisMap.put(0x1f496, R.drawable.emoji_1f496); sEmojisMap.put(0x1f49e, R.drawable.emoji_1f49e); sEmojisMap.put(0x1f498, R.drawable.emoji_1f498); sEmojisMap.put(0x1f48c, R.drawable.emoji_1f48c); sEmojisMap.put(0x1f48b, R.drawable.emoji_1f48b); sEmojisMap.put(0x1f48d, R.drawable.emoji_1f48d); sEmojisMap.put(0x1f48e, R.drawable.emoji_1f48e); sEmojisMap.put(0x1f464, R.drawable.emoji_1f464); sEmojisMap.put(0x1f465, R.drawable.emoji_1f465); sEmojisMap.put(0x1f4ac, R.drawable.emoji_1f4ac); sEmojisMap.put(0x1f463, R.drawable.emoji_1f463); sEmojisMap.put(0x1f4ad, R.drawable.emoji_1f4ad); } private static boolean isSoftBankEmoji(char c) { return ((c >> 12) == 0xe); } private static int getEmojiResource(Context context, int codePoint) { return sEmojisMap.get(codePoint); } private static int getSoftbankEmojiResource(char c) { return sSoftbanksMap.get(c); } /** * Convert emoji characters of the given Spannable to the according emojicon. * * @param context * @param text * @param emojiSize */ public static void addEmojis(Context context, Spannable text, int emojiSize) { int length = text.length(); EmojiconSpan[] oldSpans = text.getSpans(0, length, EmojiconSpan.class); for (int i = 0; i < oldSpans.length; i++) { text.removeSpan(oldSpans[i]); } int skip; for (int i = 0; i < length; i += skip) { skip = 0; int icon = 0; char c = text.charAt(i); if (isSoftBankEmoji(c)) { icon = getSoftbankEmojiResource(c); skip = icon == 0 ? 0 : 1; } if (icon == 0) { int unicode = Character.codePointAt(text, i); skip = Character.charCount(unicode); if (unicode > 0xff) { icon = getEmojiResource(context, unicode); } if (icon == 0 && i + skip < length) { int followUnicode = Character.codePointAt(text, i + skip); if (followUnicode == 0x20e3) { int followSkip = Character.charCount(followUnicode); switch (unicode) { default: followSkip = 0; break; } skip += followSkip; } else { int followSkip = Character.charCount(followUnicode); switch (unicode) { default: followSkip = 0; break; } skip += followSkip; } } } if (icon > 0) { text.setSpan(new EmojiconSpan(context, icon, emojiSize), i, i + skip, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } }