Skip to content
This repository was archived by the owner on Jun 7, 2020. It is now read-only.

Commit d0c0907

Browse files
committed
Merge branch 'develop' of github.com:RocketChat/Rocket.Chat.Android into issue-2027
2 parents 1b3b7b4 + dd93808 commit d0c0907

2 files changed

Lines changed: 45 additions & 24 deletions

File tree

emoji/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ android {
1111
minSdkVersion versions.minSdk
1212
targetSdkVersion versions.targetSdk
1313
versionCode 1
14-
versionName "0.1"
14+
versionName "1.0.0"
1515
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1616

1717
javaCompileOptions {
@@ -40,6 +40,9 @@ dependencies {
4040
implementation libraries.androidKtx
4141

4242
implementation libraries.material
43+
implementation libraries.glide
44+
45+
implementation libraries.timber
4346

4447
implementation libraries.room
4548
kapt libraries.roomProcessor

emoji/src/main/java/chat/rocket/android/emoji/EmojiParser.kt

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,11 @@ import android.text.Spannable
77
import android.text.SpannableString
88
import android.text.Spanned
99
import android.text.style.ImageSpan
10-
import android.util.Log
1110
import com.bumptech.glide.Glide
1211
import com.bumptech.glide.load.engine.DiskCacheStrategy
1312
import com.bumptech.glide.load.resource.gif.GifDrawable
1413
import 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

2016
class 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

Comments
 (0)