List of usage examples for android.text Spannable charAt
char charAt(int index);
From source file:mobisocial.musubi.ui.util.EmojiSpannableFactory.java
public void updateSpannable(Spannable span) { Spannable source = span; for (int i = 0; i < source.length(); i++) { char high = source.charAt(i); if (high <= 127) { // fast exit ascii continue; }/*from w w w .j a va 2 s .c o m*/ // Block until we're initialized waitForEmoji(); long codePoint = high; if (Character.isHighSurrogate(high)) { char low = source.charAt(++i); codePoint = Character.toCodePoint(high, low); if (Character.isSurrogatePair(high, low)) { // from BMP if (!mEmojiMap.containsKey(codePoint)) { if (i >= source.length() - 2) { continue; } high = source.charAt(++i); if (!Character.isHighSurrogate(high)) { Log.w(TAG, "bad unicode character? " + high); continue; } low = source.charAt(++i); if (!Character.isSurrogatePair(high, low)) { Log.d(TAG, "Bogus unicode surrogate " + high + ", " + low); continue; } int codePoint2 = Character.toCodePoint(high, low); //String label = String.format("U+%X U+%X", codePoint, codePoint2); codePoint = ((long) codePoint << 16) | codePoint2; } } else { Log.d(TAG, "Bogus unicode"); } } if (mEmojiMap.containsKey(codePoint)) { Bitmap b = mStickerCache.get(codePoint); if (b != null) { DynamicDrawableSpan im = createStickerSpan(b); span.setSpan(im, i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } else { Log.d(TAG, "failed to decode bitmap for codepoints: " + codePoint); } } } }