From 7dcaf15e6865c5a4c6a51c5843a66cb1b5a16850 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 22 Jul 2025 15:13:11 +0200 Subject: [PATCH] Prevent favourites contacts from missing due to magic search limit --- .../contacts/fragment/ContactsListFragment.kt | 2 +- .../viewmodel/ContactsListViewModel.kt | 52 +++++++++++++------ .../layout-land/contacts_list_fragment.xml | 6 +-- .../res/layout/contacts_list_fragment.xml | 6 +-- 4 files changed, 44 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt index 4f28a3b48..efa53caed 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt @@ -148,7 +148,7 @@ class ContactsListFragment : AbstractMainFragment() { listViewModel.fetchInProgress.value = false } - listViewModel.favourites.observe( + listViewModel.favouritesList.observe( viewLifecycleOwner ) { favouritesAdapter.submitList(it) 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 f0e9b5915..57597293f 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 @@ -51,7 +51,7 @@ class ContactsListViewModel val contactsList = MutableLiveData>() - val favourites = MutableLiveData>() + val favouritesList = MutableLiveData>() val fetchInProgress = MutableLiveData() @@ -76,13 +76,23 @@ class ContactsListViewModel private lateinit var magicSearch: MagicSearch + private lateinit var favouritesMagicSearch: MagicSearch + private var firstLoad = true private val magicSearchListener = object : MagicSearchListenerStub() { @WorkerThread override fun onSearchResultsReceived(magicSearch: MagicSearch) { Log.i("$TAG Magic search contacts available") - processMagicSearchResults(magicSearch.lastSearch) + processMagicSearchResults(magicSearch.lastSearch, favourites = false) + } + } + + private val favouritesMagicSearchListener = object : MagicSearchListenerStub() { + @WorkerThread + override fun onSearchResultsReceived(magicSearch: MagicSearch) { + Log.i("$TAG Magic search favourites contacts available") + processMagicSearchResults(magicSearch.lastSearch, favourites = true) } } @@ -91,6 +101,7 @@ class ContactsListViewModel override fun onContactsLoaded() { Log.i("$TAG Contacts have been (re)loaded, updating list") magicSearch.resetSearchCache() + favouritesMagicSearch.resetSearchCache() applyFilter( currentFilter, @@ -118,6 +129,10 @@ class ContactsListViewModel magicSearch.searchLimit = corePreferences.magicSearchResultsLimit magicSearch.addListener(magicSearchListener) + favouritesMagicSearch = core.createMagicSearch() + favouritesMagicSearch.limitedSearch = false + favouritesMagicSearch.addListener(favouritesMagicSearchListener) + coreContext.postOnMainThread { applyFilter(currentFilter) } @@ -128,6 +143,7 @@ class ContactsListViewModel override fun onCleared() { coreContext.postOnCoreThread { magicSearch.removeListener(magicSearchListener) + favouritesMagicSearch.removeListener(favouritesMagicSearchListener) coreContext.contactsManager.removeListener(contactsListener) } super.onCleared() @@ -259,6 +275,16 @@ class ContactsListViewModel "$TAG Asking Magic search for contacts matching filter [$filter], domain [$domain] and in sources Friends/LDAP/CardDAV" ) searchInProgress.postValue(filter.isNotEmpty()) + + if (filter.isEmpty()) { + favouritesMagicSearch.getContactsListAsync( + filter, + domain, + MagicSearch.Source.FavoriteFriends.toInt(), + MagicSearch.Aggregation.Friend + ) + } + magicSearch.getContactsListAsync( filter, domain, @@ -268,12 +294,11 @@ class ContactsListViewModel } @WorkerThread - private fun processMagicSearchResults(results: Array) { + private fun processMagicSearchResults(results: Array, favourites: Boolean) { // Do not call destroy() on previous list items as they are cached and will be re-used - Log.i("$TAG Processing [${results.size}] results") + Log.i("$TAG Processing [${results.size}] results, favourites is [$favourites]") val list = arrayListOf() - val favouritesList = arrayListOf() var count = 0 for (result in results) { @@ -303,29 +328,26 @@ class ContactsListViewModel val starred = friend?.starred == true model.isFavourite.postValue(starred) - if (starred) { - favouritesList.add(model) - } - if (firstLoad && count == 20) { + if (!favourites && firstLoad && count == 20) { contactsList.postValue(list) } } val collator = Collator.getInstance(Locale.getDefault()) - favouritesList.sortWith { model1, model2 -> - collator.compare(model1.friend.name, model2.friend.name) - } list.sortWith { model1, model2 -> collator.compare(model1.friend.name, model2.friend.name) } searchInProgress.postValue(false) - favourites.postValue(favouritesList) - contactsList.postValue(list) + if (favourites) { + favouritesList.postValue(list) + } else { + contactsList.postValue(list) + firstLoad = false + } Log.i("$TAG Processed [${results.size}] results into [${list.size} contacts]") - firstLoad = false } @WorkerThread diff --git a/app/src/main/res/layout-land/contacts_list_fragment.xml b/app/src/main/res/layout-land/contacts_list_fragment.xml index de9a6d2c7..b29e9d9d9 100644 --- a/app/src/main/res/layout-land/contacts_list_fragment.xml +++ b/app/src/main/res/layout-land/contacts_list_fragment.xml @@ -74,7 +74,7 @@ @@ -95,7 +95,7 @@ @@ -95,7 +95,7 @@