From cc7617a302d22e6041d397c3cb033e0c6b9f13e8 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 22 Feb 2021 11:47:57 -0500 Subject: [PATCH] Throttle conversation list update frequency. Reduces the load on the database (and UI jankiness) while processing a large message backlog. --- .../ConversationListViewModel.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.java index 234133ff7..71f7628ab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.java @@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.megaphone.Megaphones; import org.thoughtcrime.securesms.net.PipeConnectivityListener; import org.thoughtcrime.securesms.search.SearchRepository; import org.thoughtcrime.securesms.util.Debouncer; +import org.thoughtcrime.securesms.util.ThrottledDebouncer; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import org.thoughtcrime.securesms.util.paging.Invalidator; @@ -42,7 +43,8 @@ class ConversationListViewModel extends ViewModel { private final LiveData hasNoConversations; private final SearchRepository searchRepository; private final MegaphoneRepository megaphoneRepository; - private final Debouncer debouncer; + private final Debouncer searchDebouncer; + private final ThrottledDebouncer updateDebouncer; private final DatabaseObserver.Observer observer; private final Invalidator invalidator; @@ -54,7 +56,8 @@ class ConversationListViewModel extends ViewModel { this.searchResult = new MutableLiveData<>(); this.searchRepository = searchRepository; this.megaphoneRepository = ApplicationDependencies.getMegaphoneRepository(); - this.debouncer = new Debouncer(300); + this.searchDebouncer = new Debouncer(300); + this.updateDebouncer = new ThrottledDebouncer(500); this.invalidator = new Invalidator(); this.pagedData = PagedData.create(ConversationListDataSource.create(application, isArchived), new PagingConfig.Builder() @@ -62,10 +65,12 @@ class ConversationListViewModel extends ViewModel { .setBufferPages(2) .build()); this.observer = () -> { - if (!TextUtils.isEmpty(getLastQuery())) { - searchRepository.query(getLastQuery(), searchResult::postValue); - } - pagedData.getController().onDataInvalidated(); + updateDebouncer.publish(() -> { + if (!TextUtils.isEmpty(getLastQuery())) { + searchRepository.query(getLastQuery(), searchResult::postValue); + } + pagedData.getController().onDataInvalidated(); + }); }; this.hasNoConversations = LiveDataUtil.mapAsync(pagedData.getData(), conversations -> { @@ -135,7 +140,7 @@ class ConversationListViewModel extends ViewModel { void updateQuery(String query) { lastQuery = query; - debouncer.publish(() -> searchRepository.query(query, result -> { + searchDebouncer.publish(() -> searchRepository.query(query, result -> { Util.runOnMain(() -> { if (query.equals(lastQuery)) { searchResult.setValue(result); @@ -151,7 +156,8 @@ class ConversationListViewModel extends ViewModel { @Override protected void onCleared() { invalidator.invalidate(); - debouncer.clear(); + searchDebouncer.clear(); + updateDebouncer.clear(); ApplicationDependencies.getDatabaseObserver().unregisterObserver(observer); }