/** * Convert emoji characters of the given Spannable to the according emojicon. * * @param context * @param text * @param emojiSize * @param index * @param length */ public static void AddEmojis(Context context, ISpannable text, int emojiSize, int index, int length) { int textLength = text.Length(); int textLengthToProcessMax = textLength - index; int textLengthToProcess = length < 0 || length >= textLengthToProcessMax ? textLength : (length+index); // remove spans throughout all text //EmojiconSpan[] var oldSpans = text.GetSpans(0, textLength,Java.Lang.Class.FromType(typeof(EmojiconSpan))); for (int i = 0; i < oldSpans.Length; i++) { text.RemoveSpan(oldSpans[i]); } int skip; for (int i = index; i < textLengthToProcess; 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 < textLengthToProcess) { int followUnicode = Character.CodePointAt(text, i + skip); if (followUnicode == 0x20e3) { int followSkip = Character.CharCount(followUnicode); switch (unicode) { case 0x0031: icon = Resource.Drawable.emoji_0031; break; case 0x0032: icon = Resource.Drawable.emoji_0032; break; case 0x0033: icon = Resource.Drawable.emoji_0033; break; case 0x0034: icon = Resource.Drawable.emoji_0034; break; case 0x0035: icon = Resource.Drawable.emoji_0035; break; case 0x0036: icon = Resource.Drawable.emoji_0036; break; case 0x0037: icon = Resource.Drawable.emoji_0037; break; case 0x0038: icon = Resource.Drawable.emoji_0038; break; case 0x0039: icon = Resource.Drawable.emoji_0039; break; case 0x0030: icon = Resource.Drawable.emoji_0030; break; case 0x0023: icon = Resource.Drawable.emoji_0023; break; default: followSkip = 0; break; } skip += followSkip; } else { int followSkip = Character.CharCount(followUnicode); switch (unicode) { case 0x1f1ef: icon = (followUnicode == 0x1f1f5) ? Resource.Drawable.emoji_1f1ef_1f1f5 : 0; break; case 0x1f1fa: icon = (followUnicode == 0x1f1f8) ? Resource.Drawable.emoji_1f1fa_1f1f8 : 0; break; case 0x1f1eb: icon = (followUnicode == 0x1f1f7) ? Resource.Drawable.emoji_1f1eb_1f1f7 : 0; break; case 0x1f1e9: icon = (followUnicode == 0x1f1ea) ? Resource.Drawable.emoji_1f1e9_1f1ea : 0; break; case 0x1f1ee: icon = (followUnicode == 0x1f1f9) ? Resource.Drawable.emoji_1f1ee_1f1f9 : 0; break; case 0x1f1ec: icon = (followUnicode == 0x1f1e7) ? Resource.Drawable.emoji_1f1ec_1f1e7 : 0; break; case 0x1f1ea: icon = (followUnicode == 0x1f1f8) ? Resource.Drawable.emoji_1f1ea_1f1f8 : 0; break; case 0x1f1f7: icon = (followUnicode == 0x1f1fa) ? Resource.Drawable.emoji_1f1f7_1f1fa : 0; break; case 0x1f1e8: icon = (followUnicode == 0x1f1f3) ? Resource.Drawable.emoji_1f1e8_1f1f3 : 0; break; case 0x1f1f0: icon = (followUnicode == 0x1f1f7) ? Resource.Drawable.emoji_1f1f0_1f1f7 : 0; break; default: followSkip = 0; break; } skip += followSkip; } } } if (icon > 0) { text.SetSpan(new EmojiconSpan(context, icon, emojiSize), i, i + skip, SpanTypes.ExclusiveExclusive); } } }