/*
* 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;
/**
* @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);
}
}
}
}