From 71a2140dbd136e9b4e0d778c94e51ddd0c4c1c85 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 11 Mar 2022 15:42:23 +0100 Subject: [PATCH] Fixed ContactsSelectionViewModel used for chat room & conferences participant selection to use same MagicSearch APIs --- .../fragments/ChatRoomCreationFragment.kt | 2 +- ...renceSchedulingParticipantsListFragment.kt | 2 +- .../ConferenceAddParticipantsFragment.kt | 2 +- .../contact/ContactsSelectionViewModel.kt | 71 +++++++++++++++---- .../layout/chat_room_creation_fragment.xml | 2 +- 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt index 069d90a24..9f41cd785 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt @@ -107,7 +107,7 @@ class ChatRoomCreationFragment : SecureFragment viewModel.sipContactsSelected.observe( viewLifecycleOwner ) { - viewModel.updateContactsList() + viewModel.applyFilter() } viewModel.selectedAddresses.observe( diff --git a/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceSchedulingParticipantsListFragment.kt b/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceSchedulingParticipantsListFragment.kt index 6f565c116..abc2f8d65 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceSchedulingParticipantsListFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceSchedulingParticipantsListFragment.kt @@ -74,7 +74,7 @@ class ConferenceSchedulingParticipantsListFragment : GenericFragment>() @@ -34,12 +37,32 @@ open class ContactsSelectionViewModel : MessageNotifierViewModel() { val selectedAddresses = MutableLiveData>() val filter = MutableLiveData() - private var previousFilter = "" + private var previousFilter = "NotSet" + + val fetchInProgress = MutableLiveData() + private var searchResultsPending: Boolean = false + private var fastFetchJob: Job? = null + + val moreResultsAvailableEvent: MutableLiveData> by lazy { + MutableLiveData>() + } private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() { override fun onContactsUpdated() { Log.i("[Contacts Selection] Contacts have changed") - updateContactsList() + applyFilter() + } + } + + private val magicSearchListener = object : MagicSearchListenerStub() { + override fun onSearchResultsReceived(magicSearch: MagicSearch) { + searchResultsPending = false + processMagicSearchResults(magicSearch.lastSearch) + fetchInProgress.value = false + } + + override fun onLdapHaveMoreResults(magicSearch: MagicSearch, ldap: Ldap) { + moreResultsAvailableEvent.value = Event(true) } } @@ -49,9 +72,11 @@ open class ContactsSelectionViewModel : MessageNotifierViewModel() { selectedAddresses.value = arrayListOf() coreContext.contactsManager.addListener(contactsUpdatedListener) + coreContext.contactsManager.magicSearch.addListener(magicSearchListener) } override fun onCleared() { + coreContext.contactsManager.magicSearch.removeListener(magicSearchListener) coreContext.contactsManager.removeListener(contactsUpdatedListener) super.onCleared() @@ -59,25 +84,32 @@ open class ContactsSelectionViewModel : MessageNotifierViewModel() { fun applyFilter() { val filterValue = filter.value.orEmpty() - if (previousFilter == filterValue) return - if (previousFilter.isNotEmpty() && previousFilter.length > filterValue.length) { + if (previousFilter.isNotEmpty() && ( + previousFilter.length > filterValue.length || + (previousFilter.length == filterValue.length && previousFilter != filterValue) + ) + ) { coreContext.contactsManager.magicSearch.resetSearchCache() } previousFilter = filterValue - updateContactsList() - } - - fun updateContactsList() { val domain = if (sipContactsSelected.value == true) coreContext.core.defaultAccount?.params?.domain ?: "" else "" - val results = coreContext.contactsManager.magicSearch.getContactListFromFilter(filter.value.orEmpty(), domain) + searchResultsPending = true + fastFetchJob?.cancel() + coreContext.contactsManager.magicSearch.getContactsAsync(filter.value.orEmpty(), domain, MagicSearchSource.All.toInt()) - val list = arrayListOf() - for (result in results) { - list.add(result) + val spinnerDelay = corePreferences.delayBeforeShowingContactsSearchSpinner.toLong() + fastFetchJob = viewModelScope.launch { + withContext(Dispatchers.IO) { + delay(spinnerDelay) + withContext(Dispatchers.Main) { + if (searchResultsPending) { + fetchInProgress.value = true + } + } + } } - contactsList.value = list } fun toggleSelectionForSearchResult(searchResult: SearchResult) { @@ -110,4 +142,13 @@ open class ContactsSelectionViewModel : MessageNotifierViewModel() { selectedAddresses.value = list } + + private fun processMagicSearchResults(results: Array) { + Log.i("[Contacts Selection] Processing ${results.size} results") + val list = arrayListOf() + for (result in results) { + list.add(result) + } + contactsList.postValue(list) + } } diff --git a/app/src/main/res/layout/chat_room_creation_fragment.xml b/app/src/main/res/layout/chat_room_creation_fragment.xml index 895f96c98..3bf2f63a4 100644 --- a/app/src/main/res/layout/chat_room_creation_fragment.xml +++ b/app/src/main/res/layout/chat_room_creation_fragment.xml @@ -216,7 +216,7 @@ + bind:visibility="@{viewModel.waitForChatRoomCreation || viewModel.fetchInProgress}"/>