From bcc384ecefd4009fbdffef6c6a1e68572b960adb Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 4 Aug 2025 14:41:45 +0200 Subject: [PATCH] Quick workaround to fix missing favorites from address selection fragment --- .../viewmodel/AddressSelectionViewModel.kt | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt index 734e9b64d..1e5d7c882 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt @@ -71,6 +71,8 @@ abstract class AddressSelectionViewModel private lateinit var magicSearch: MagicSearch + private lateinit var favouritesMagicSearch: MagicSearch + private val magicSearchListener = object : MagicSearchListenerStub() { @WorkerThread override fun onSearchResultsReceived(magicSearch: MagicSearch) { @@ -83,6 +85,9 @@ abstract class AddressSelectionViewModel @WorkerThread override fun onContactsLoaded() { Log.i("$TAG Contacts have been (re)loaded, updating list") + magicSearch.resetSearchCache() + favouritesMagicSearch.resetSearchCache() + applyFilter( currentFilter, magicSearchSourceFlags @@ -103,6 +108,9 @@ abstract class AddressSelectionViewModel magicSearch.limitedSearch = true magicSearch.searchLimit = corePreferences.magicSearchResultsLimit magicSearch.addListener(magicSearchListener) + + favouritesMagicSearch = core.createMagicSearch() + favouritesMagicSearch.limitedSearch = false } applyFilter(currentFilter) @@ -260,6 +268,30 @@ abstract class AddressSelectionViewModel } val favoritesList = arrayListOf() + val domain = corePreferences.contactsFilter + // Make a quick synchronous search for favorites (in case of total results exceed magic search limit to prevent missing ones) + // TODO FIXME: to improve like it's done in ContactsListViewModel but will require UI changes + val favorites = favouritesMagicSearch.getContactsList(currentFilter, domain, MagicSearch.Source.FavoriteFriends.toInt(), MagicSearch.Aggregation.Friend) + for (result in favorites) { + val address = result.address + val friend = result.friend ?: continue + + val found = favoritesList.find { it.friend == friend } + if (found != null) continue + + val mainAddress = address ?: LinphoneUtils.getFirstAvailableAddressForFriend(friend) + if (mainAddress != null) { + val model = ConversationContactOrSuggestionModel(mainAddress, friend = friend) + val avatarModel = coreContext.contactsManager.getContactAvatarModelForFriend( + friend + ) + model.avatarModel.postValue(avatarModel) + favoritesList.add(model) + } else { + Log.w("$TAG Found favorite friend [${friend.name}] in search results but no Address could be found, skipping it") + } + } + val contactsList = arrayListOf() val suggestionsList = arrayListOf() @@ -267,6 +299,9 @@ abstract class AddressSelectionViewModel val address = result.address val friend = result.friend if (friend != null) { + // Starred friends are processed separately to prevent missing some due to magic search limit + if (friend.starred) continue + val found = contactsList.find { it.friend == friend } if (found != null) continue @@ -277,12 +312,7 @@ abstract class AddressSelectionViewModel friend ) model.avatarModel.postValue(avatarModel) - - if (friend.starred) { - favoritesList.add(model) - } else { - contactsList.add(model) - } + contactsList.add(model) } else { Log.w("$TAG Found friend [${friend.name}] in search results but no Address could be found, skipping it") }