From ddcd7d7dc17bb0368525fd124728acb13f4a5b4d Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 11 Mar 2024 11:53:08 +0100 Subject: [PATCH] Removed emoji compat library, only use it for picker --- app/build.gradle | 1 - .../java/org/linphone/core/CoreContext.kt | 7 --- .../viewmodel/ContactsListViewModel.kt | 22 ------- .../main/viewmodel/AbstractTopBarViewModel.kt | 24 -------- .../ui/main/viewmodel/DrawerMenuViewModel.kt | 24 -------- .../java/org/linphone/utils/AndroidUtils.kt | 60 +++++++++++++------ 6 files changed, 41 insertions(+), 97 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 60d878550..82767b7e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -147,7 +147,6 @@ dependencies { implementation "androidx.navigation:navigation-ui-ktx:$nav_version" def emoji_version = "1.4.0" - implementation "androidx.emoji2:emoji2:$emoji_version" implementation "androidx.emoji2:emoji2-emojipicker:$emoji_version" // https://github.com/google/flexbox-layout/blob/main/LICENSE Apache v2.0 diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 51a0dcf04..74be178cd 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -32,10 +32,8 @@ import android.os.Looper import androidx.annotation.AnyThread import androidx.annotation.UiThread import androidx.annotation.WorkerThread -import androidx.emoji2.text.EmojiCompat import androidx.lifecycle.MutableLiveData import com.google.firebase.crashlytics.FirebaseCrashlytics -import java.util.* import org.linphone.BuildConfig import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.contacts.ContactsManager @@ -55,8 +53,6 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C lateinit var core: Core - val emojiCompat: EmojiCompat - val contactsManager = ContactsManager() val notificationsManager = NotificationsManager(context) @@ -208,9 +204,6 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C } init { - EmojiCompat.init(context) - emojiCompat = EmojiCompat.get() - (context as Application).registerActivityLifecycleCallbacks(activityMonitor) } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt index f12deb287..bc76c8335 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt @@ -21,17 +21,13 @@ package org.linphone.ui.main.contacts.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread -import androidx.emoji2.text.EmojiCompat import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import java.io.File import java.text.Collator import java.util.ArrayList import java.util.Locale -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.contacts.ContactsManager.ContactsListener @@ -105,24 +101,6 @@ class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() } applyFilter(currentFilter) - - val emojiCompat = coreContext.emojiCompat - viewModelScope.launch { - withContext(Dispatchers.IO) { - // Wait for emoji compat library to have been loaded - if (emojiCompat.loadState != EmojiCompat.LOAD_STATE_SUCCEEDED) { - Log.i("$TAG Waiting for emoji compat library to have been loaded") - while (emojiCompat.loadState == EmojiCompat.LOAD_STATE_DEFAULT || emojiCompat.loadState == EmojiCompat.LOAD_STATE_LOADING) { - delay(50) - } - - coreContext.postOnCoreThread { - Log.i("$TAG Emoji compat library loaded, update contacts list") - processMagicSearchResults(magicSearch.lastSearch) - } - } - } - } } @UiThread diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt index 6026b8516..f50110ecf 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt @@ -21,14 +21,8 @@ package org.linphone.ui.main.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread -import androidx.emoji2.text.EmojiCompat import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.core.Account @@ -157,24 +151,6 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { } searchBarVisible.value = false - - val emojiCompat = coreContext.emojiCompat - viewModelScope.launch { - withContext(Dispatchers.IO) { - // Wait for emoji compat library to have been loaded - if (emojiCompat.loadState != EmojiCompat.LOAD_STATE_SUCCEEDED) { - Log.i("$TAG Waiting for emoji compat library to have been loaded") - while (emojiCompat.loadState == EmojiCompat.LOAD_STATE_DEFAULT || emojiCompat.loadState == EmojiCompat.LOAD_STATE_LOADING) { - delay(50) - } - - coreContext.postOnCoreThread { - Log.i("$TAG Emoji compat library loaded, update account") - configure() - } - } - } - } } @UiThread diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt index aeec447d0..7f6024865 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt @@ -22,14 +22,8 @@ package org.linphone.ui.main.viewmodel import android.view.View import androidx.annotation.UiThread import androidx.annotation.WorkerThread -import androidx.emoji2.text.EmojiCompat import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.Account import org.linphone.core.Core @@ -103,24 +97,6 @@ class DrawerMenuViewModel @UiThread constructor() : ViewModel() { core.addListener(coreListener) computeAccountsList() - - val emojiCompat = coreContext.emojiCompat - viewModelScope.launch { - withContext(Dispatchers.IO) { - // Wait for emoji compat library to have been loaded - if (emojiCompat.loadState != EmojiCompat.LOAD_STATE_SUCCEEDED) { - Log.i("$TAG Waiting for emoji compat library to have been loaded") - while (emojiCompat.loadState == EmojiCompat.LOAD_STATE_DEFAULT || emojiCompat.loadState == EmojiCompat.LOAD_STATE_LOADING) { - delay(50) - } - - coreContext.postOnCoreThread { - Log.i("$TAG Emoji compat library loaded, update accounts list") - computeAccountsList() - } - } - } - } } } diff --git a/app/src/main/java/org/linphone/utils/AndroidUtils.kt b/app/src/main/java/org/linphone/utils/AndroidUtils.kt index d40938cbe..dfda8bf9f 100644 --- a/app/src/main/java/org/linphone/utils/AndroidUtils.kt +++ b/app/src/main/java/org/linphone/utils/AndroidUtils.kt @@ -33,7 +33,6 @@ import androidx.annotation.PluralsRes import androidx.annotation.StringRes import androidx.annotation.UiThread import androidx.core.view.SoftwareKeyboardControllerCompat -import androidx.emoji2.text.EmojiCompat import java.util.Locale import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.tools.Log @@ -128,28 +127,19 @@ class AppUtils { val split = displayName.uppercase(Locale.getDefault()).split(" ") var initials = "" var characters = 0 - val emoji = coreContext.emojiCompat for (i in split.indices) { - if (split[i].isNotEmpty()) { + val split = split[i] + if (split.isNotEmpty()) { try { - if (emoji.loadState == EmojiCompat.LOAD_STATE_SUCCEEDED && emoji.hasEmojiGlyph( - split[i] - ) - ) { - val glyph = emoji.process(split[i]) - if (characters > 0) { // Limit initial to 1 emoji only - Log.d("$TAG We limit initials to one emoji only") - initials = "" - } - initials += glyph - break // Limit initial to 1 emoji only - } else { - initials += split[i][0] + val symbol = extractFirstSymbol(split) + initials += symbol + if (symbol.length > 1) { + break } - } catch (ise: IllegalStateException) { - Log.e("$TAG Can't call hasEmojiGlyph: $ise") - initials += split[i][0] + } catch (e: Exception) { + Log.e("$TAG Failed to extract first symbol if any: $e") + initials += split[0] } characters += 1 @@ -176,5 +166,37 @@ class AppUtils { } return name } + + @AnyThread + private fun extractFirstSymbol(text: String): String { + val sequence = StringBuilder(text.length) + var isInJoin = false + var codePoint: Int + + var i = 0 + while (i < text.length) { + codePoint = text.codePointAt(i) + if (codePoint == 0x200D) { + isInJoin = true + if (sequence.isEmpty()) { + i = text.offsetByCodePoints(i, 1) + continue + } + } else { + if (sequence.isNotEmpty() && !isInJoin) break + isInJoin = false + } + sequence.appendCodePoint(codePoint) + i = text.offsetByCodePoints(i, 1) + } + + if (isInJoin) { + for (i in sequence.length - 1 downTo 0) { + if (sequence[i].code == 0x200D) sequence.deleteCharAt(i) else break + } + } + + return sequence.toString() + } } }