From 7c0f9585e746cc80f5f36afe3c6955f80d050d19 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 8 Aug 2023 13:38:34 +0200 Subject: [PATCH] Improved emoji compat use for contacts --- .../java/org/linphone/core/CoreContext.kt | 16 ++++++++ .../main/java/org/linphone/ui/MainActivity.kt | 38 ++++++++++++++++--- .../java/org/linphone/utils/LinphoneUtils.kt | 16 +------- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 15677d280..d0bdd4c49 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -24,6 +24,7 @@ import android.content.Context import android.os.Handler import android.os.HandlerThread import android.os.Looper +import androidx.emoji2.text.EmojiCompat import java.util.* import org.linphone.BuildConfig import org.linphone.LinphoneApplication.Companion.corePreferences @@ -33,8 +34,12 @@ import org.linphone.core.tools.Log class CoreContext(val context: Context) : HandlerThread("Core Thread") { lateinit var core: Core + lateinit var emojiCompat: EmojiCompat + val contactsManager = ContactsManager() + private val mainThread = Handler(Looper.getMainLooper()) + @SuppressLint("HandlerLeak") private lateinit var coreThread: Handler @@ -44,6 +49,11 @@ class CoreContext(val context: Context) : HandlerThread("Core Thread") { } } + init { + EmojiCompat.init(context) + emojiCompat = EmojiCompat.get() + } + override fun run() { Looper.prepare() @@ -93,6 +103,12 @@ class CoreContext(val context: Context) : HandlerThread("Core Thread") { } } + fun postOnMainThread(lambda: () -> Unit) { + mainThread.post { + lambda.invoke() + } + } + private fun computeUserAgent() { // TODO FIXME val deviceName: String = "Linphone6" diff --git a/app/src/main/java/org/linphone/ui/MainActivity.kt b/app/src/main/java/org/linphone/ui/MainActivity.kt index 6adf6f160..1a64c43b0 100644 --- a/app/src/main/java/org/linphone/ui/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/MainActivity.kt @@ -27,8 +27,15 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat import androidx.databinding.DataBindingUtil +import androidx.emoji2.text.EmojiCompat +import androidx.lifecycle.lifecycleScope +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.R +import org.linphone.core.tools.Log import org.linphone.databinding.MainActivityBinding class MainActivity : AppCompatActivity() { @@ -47,14 +54,14 @@ class MainActivity : AppCompatActivity() { R.color.primary_color ) - if (checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { - coreContext.contactsManager.loadContacts(this) - } - while (!coreContext.isReady()) { Thread.sleep(20) } + if (checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + loadContacts() + } + binding = DataBindingUtil.setContentView(this, R.layout.main_activity) binding.lifecycleOwner = this } @@ -76,7 +83,7 @@ class MainActivity : AppCompatActivity() { grantResults: IntArray ) { if (requestCode == CONTACTS_PERMISSION_REQUEST && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - coreContext.contactsManager.loadContacts(this) + loadContacts() } super.onRequestPermissionsResult(requestCode, permissions, grantResults) @@ -89,4 +96,25 @@ class MainActivity : AppCompatActivity() { binding.sideMenu.openDrawer(binding.sideMenuContent, true) } } + + private fun loadContacts() { + val emojiCompat = coreContext.emojiCompat + lifecycleScope.launch { + withContext(Dispatchers.IO) { + // Wait for emoji compat library to have been loaded + Log.i("[Main Activity] Waiting for emoji compat library to have been loaded") + while (emojiCompat.loadState == EmojiCompat.LOAD_STATE_DEFAULT || emojiCompat.loadState == EmojiCompat.LOAD_STATE_LOADING) { + delay(100) + } + + Log.i( + "[Main Activity] Emoji compat library loading status is ${emojiCompat.loadState}, loading contacts" + ) + coreContext.postOnMainThread { + // Contacts loading must be started from UI thread + coreContext.contactsManager.loadContacts(this@MainActivity) + } + } + } + } } diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt index 8c077a6b7..9f9430d21 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt @@ -33,20 +33,6 @@ import org.linphone.core.tools.Log class LinphoneUtils { companion object { - private val emojiCompat: EmojiCompat? - get() = initEmojiCompat() - - private fun initEmojiCompat(): EmojiCompat? { - return try { - EmojiCompat.get() - } catch (ise: IllegalStateException) { - Log.w( - "[App Utils] EmojiCompat.get() triggered IllegalStateException [$ise], trying manual init" - ) - EmojiCompat.init(coreContext.context) - } - } - fun getFirstLetter(displayName: String): String { return getInitials(displayName, 1) } @@ -57,7 +43,7 @@ class LinphoneUtils { val split = displayName.uppercase(Locale.getDefault()).split(" ") var initials = "" var characters = 0 - val emoji = emojiCompat + val emoji = coreContext.emojiCompat for (i in split.indices) { if (split[i].isNotEmpty()) {