From b66a40fa413b036221d1ece33e38beb691d12da8 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 16 Nov 2023 12:41:43 +0100 Subject: [PATCH] Fixed contacts list issue when changing filter --- .../org/linphone/contacts/ContactsManager.kt | 23 +++++++++++++++++++ .../viewmodel/ContactsListViewModel.kt | 8 ++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.kt b/app/src/main/java/org/linphone/contacts/ContactsManager.kt index f71a263e1..f5fd1ee3a 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.kt @@ -218,6 +218,29 @@ class ContactsManager @UiThread constructor(context: Context) { return avatar } + @WorkerThread + fun getContactAvatarModelForFriend(friend: Friend?): ContactAvatarModel { + if (friend == null) { + val fakeFriend = coreContext.core.createFriend() + return ContactAvatarModel(fakeFriend) + } + + val address = friend.address ?: friend.addresses.firstOrNull() + ?: return ContactAvatarModel(friend) + + val clone = address.clone() + clone.clean() + val key = clone.asStringUriOnly() + + val foundInMap = if (avatarsMap.keys.contains(key)) avatarsMap[key] else null + if (foundInMap != null) return foundInMap + + val avatar = ContactAvatarModel(friend) + avatarsMap[key] = avatar + + return avatar + } + @WorkerThread fun getContactAvatarModelForConferenceInfo(conferenceInfo: ConferenceInfo): ContactAvatarModel { // Do not clean parameters! 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 079bd3863..4e9c87874 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 @@ -106,7 +106,6 @@ class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() coreContext.postOnCoreThread { magicSearch.removeListener(magicSearchListener) coreContext.contactsManager.removeListener(contactsListener) - contactsList.value.orEmpty().forEach(ContactAvatarModel::destroy) } super.onCleared() } @@ -139,7 +138,6 @@ class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() @WorkerThread fun processMagicSearchResults(results: Array) { Log.i("$TAG Processing [${results.size}] results") - contactsList.value.orEmpty().forEach(ContactAvatarModel::destroy) val list = arrayListOf() val favouritesList = arrayListOf() @@ -149,7 +147,11 @@ class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() for (result in results) { val friend = result.friend - val model = coreContext.contactsManager.getContactAvatarModelForAddress(result.address) + val model = if (friend != null) { + coreContext.contactsManager.getContactAvatarModelForFriend(friend) + } else { + coreContext.contactsManager.getContactAvatarModelForAddress(result.address) + } val currentLetter = model.friend.name?.get(0).toString() val displayLetter = previousLetter.isEmpty() || currentLetter != previousLetter