@@ -7,15 +7,11 @@ import android.text.Spannable
77import android.text.SpannableString
88import android.text.Spanned
99import android.text.style.ImageSpan
10- import android.util.Log
1110import com.bumptech.glide.Glide
1211import com.bumptech.glide.load.engine.DiskCacheStrategy
1312import com.bumptech.glide.load.resource.gif.GifDrawable
1413import com.bumptech.glide.request.RequestOptions
15- import kotlinx.coroutines.Deferred
16- import kotlinx.coroutines.Dispatchers
17- import kotlinx.coroutines.GlobalScope
18- import kotlinx.coroutines.async
14+ import timber.log.Timber
1915
2016class EmojiParser {
2117
@@ -31,7 +27,11 @@ class EmojiParser {
3127 * @param factory Optional. A [Spannable.Factory] instance to reuse when creating [Spannable].
3228 * @return A rendered Spannable containing any supported emoji.
3329 */
34- fun parse (context : Context , text : CharSequence , factory : Spannable .Factory ? = null): CharSequence {
30+ fun parse (
31+ context : Context ,
32+ text : CharSequence ,
33+ factory : Spannable .Factory ? = null
34+ ): CharSequence {
3535 val unicodedText = EmojiRepository .shortnameToUnicode(text)
3636 val spannable = factory?.newSpannable(unicodedText)
3737 ? : SpannableString .valueOf(unicodedText)
@@ -64,16 +64,20 @@ class EmojiParser {
6464 inEmoji = true
6565 } else {
6666 if (inEmoji) {
67- spannable.setSpan(EmojiTypefaceSpan (" sans-serif" , typeface),
68- emojiStart, offset, Spanned .SPAN_EXCLUSIVE_EXCLUSIVE )
67+ spannable.setSpan(
68+ EmojiTypefaceSpan (" sans-serif" , typeface),
69+ emojiStart, offset, Spanned .SPAN_EXCLUSIVE_EXCLUSIVE
70+ )
6971 }
7072 inEmoji = false
7173 }
7274
7375 offset + = count
7476 if (offset >= length && inEmoji) {
75- spannable.setSpan(EmojiTypefaceSpan (" sans-serif" , typeface),
76- emojiStart, offset, Spanned .SPAN_EXCLUSIVE_EXCLUSIVE )
77+ spannable.setSpan(
78+ EmojiTypefaceSpan (" sans-serif" , typeface),
79+ emojiStart, offset, Spanned .SPAN_EXCLUSIVE_EXCLUSIVE
80+ )
7781 }
7882 }
7983
@@ -83,7 +87,7 @@ class EmojiParser {
8387
8488 return spannable.also { sp ->
8589 regex.findAll(spannable).iterator().forEach { match ->
86- customEmojis.find { it.shortname.toLowerCase() == match.value.toLowerCase( ) }?.let { emoji ->
90+ customEmojis.find { matchEmoji(it, match.value) }?.let { emoji ->
8791 emoji.url?.let { url ->
8892 try {
8993 val glideRequest = if (url.endsWith(" gif" , true )) {
@@ -100,29 +104,43 @@ class EmojiParser {
100104 val range = match.range
101105 futureTarget.get()?.let { image ->
102106 if (image is Bitmap ) {
103- spannable.setSpan(ImageSpan (context, image), range.start,
104- range.endInclusive + 1 , Spanned .SPAN_EXCLUSIVE_EXCLUSIVE )
107+ spannable.setSpan(
108+ ImageSpan (context, image), range.start,
109+ range.endInclusive + 1 , Spanned .SPAN_EXCLUSIVE_EXCLUSIVE
110+ )
105111 } else if (image is GifDrawable ) {
106- image.setBounds(0 , 0 , image.intrinsicWidth, image.intrinsicHeight)
107- spannable.setSpan(ImageSpan (image), range.start,
108- range.endInclusive + 1 , Spanned .SPAN_EXCLUSIVE_EXCLUSIVE )
112+ image.setBounds(
113+ 0 ,
114+ 0 ,
115+ image.intrinsicWidth,
116+ image.intrinsicHeight
117+ )
118+ spannable.setSpan(
119+ ImageSpan (image), range.start,
120+ range.endInclusive + 1 , Spanned .SPAN_EXCLUSIVE_EXCLUSIVE
121+ )
109122 }
110123 }
111124 } catch (ex: Throwable ) {
112- Log .e(" EmojiParser " , " " , ex)
125+ Timber .e(ex)
113126 }
114127 }
115128 }
116129 }
117130 }
118131 }
119132
120- fun parseAsync (
121- context : Context ,
122- text : CharSequence ,
123- factory : Spannable .Factory ? = null
124- ): Deferred <CharSequence > {
125- return GlobalScope .async(Dispatchers .IO ) { parse(context, text, factory) }
133+ private fun matchEmoji (it : Emoji , text : String ): Boolean {
134+ if (it.shortname == text) {
135+ return true
136+ } else {
137+ it.shortnameAlternates.forEach {
138+ if (" :$it :" == text) {
139+ return true
140+ }
141+ }
142+ return false
143+ }
126144 }
127145 }
128146}
0 commit comments