Removed emoji compat library, only use it for picker

This commit is contained in:
Sylvain Berfini 2024-03-11 11:53:08 +01:00
parent 3e6c856ee5
commit ddcd7d7dc1
6 changed files with 41 additions and 97 deletions

View file

@ -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

View file

@ -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)
}

View file

@ -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

View file

@ -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

View file

@ -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()
}
}
}
}
}
}

View file

@ -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()
}
}
}