From bbb09eb7a0bf4e92653ebe0f20974735c1e41ba7 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 10 Jun 2026 23:54:55 -0400 Subject: [PATCH] Debounce search queries on conversation list. --- .../securesms/ContactSelectionListFragment.java | 3 ++- .../contacts/paged/ContactSearchViewModel.kt | 14 ++++++++++---- .../conversationlist/ConversationListFragment.java | 3 ++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index 855454bcf8..39929e5477 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -281,7 +281,8 @@ public final class ContactSelectionListFragment extends LoggingFragment { new ContactSelectionListAdapter.ArbitraryRepository(), new SearchRepository(requireContext().getString(R.string.note_to_self)), new ContactSearchPagedDataSourceRepository(requireContext()), - fixedContacts + fixedContacts, + false ) ).get(ContactSearchViewModel.class); diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel.kt index 49c9ad8658..b8af6c2f21 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel.kt @@ -20,6 +20,7 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf @@ -63,11 +64,13 @@ class ContactSearchViewModel( val arbitraryRepository: ArbitraryRepository?, private val searchRepository: SearchRepository, private val contactSearchPagedDataSourceRepository: ContactSearchPagedDataSourceRepository, - val fixedContacts: Set = emptySet() + val fixedContacts: Set = emptySet(), + private val debounceSearch: Boolean = false ) : ViewModel() { companion object { private const val QUERY = "query" + private const val SEARCH_DEBOUNCE_MILLIS = 300L } private val safetyNumberRepository: SafetyNumberRepository by lazy { SafetyNumberRepository() } @@ -97,7 +100,8 @@ class ContactSearchViewModel( init { viewModelScope.launch { - rawQuery.drop(1).collect { query -> + val querySource = if (debounceSearch) rawQuery.drop(1).debounce(SEARCH_DEBOUNCE_MILLIS) else rawQuery.drop(1) + querySource.collect { query -> savedStateHandle[QUERY] = query internalConfigurationState.update { it.copy(query = query) } } @@ -266,7 +270,8 @@ class ContactSearchViewModel( private val arbitraryRepository: ArbitraryRepository?, private val searchRepository: SearchRepository, private val contactSearchPagedDataSourceRepository: ContactSearchPagedDataSourceRepository, - private val fixedContacts: Set = emptySet() + private val fixedContacts: Set = emptySet(), + private val debounceSearch: Boolean = false ) : AbstractSavedStateViewModelFactory() { override fun create(key: String, modelClass: Class, handle: SavedStateHandle): T { return modelClass.cast( @@ -279,7 +284,8 @@ class ContactSearchViewModel( arbitraryRepository = arbitraryRepository, searchRepository = searchRepository, contactSearchPagedDataSourceRepository = contactSearchPagedDataSourceRepository, - fixedContacts = fixedContacts + fixedContacts = fixedContacts, + debounceSearch = debounceSearch ) ) as T } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index f112538975..df4c0d1665 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -331,7 +331,8 @@ public class ConversationListFragment extends MainFragment implements Conversati new ConversationListSearchAdapter.ChatFilterRepository(), new SearchRepository(requireContext().getString(R.string.note_to_self)), new ContactSearchPagedDataSourceRepository(requireContext()), - Collections.emptySet() + Collections.emptySet(), + true )).get(ContactSearchViewModel.class); searchAdapter = new ConversationListSearchAdapter(