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 c050cb2a6..f12deb287 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,13 +21,17 @@ 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 @@ -101,6 +105,24 @@ 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 @@ -207,6 +229,7 @@ class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() @WorkerThread private fun processMagicSearchResults(results: Array) { + // Do not call destroy() on previous list items as they are cached and will be re-used Log.i("$TAG Processing [${results.size}] results") val list = arrayListOf() 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 0e5bb82a6..bc32f6c97 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 @@ -153,23 +153,28 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { init { coreContext.postOnCoreThread { core -> core.addListener(coreListener) + configure() } + searchBarVisible.value = false + val emojiCompat = coreContext.emojiCompat viewModelScope.launch { withContext(Dispatchers.IO) { // Wait for emoji compat library to have been loaded - 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 { - configure() + 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() + } } } } - - searchBarVisible.value = false } @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 7f6024865..aeec447d0 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,8 +22,14 @@ 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 @@ -97,6 +103,24 @@ 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() + } + } + } + } } }