diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java index c882750ba3..8930cbcb27 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java @@ -30,14 +30,12 @@ import androidx.annotation.WorkerThread; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.Toolbar; -import androidx.paging.PagedList; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.snackbar.Snackbar; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionButton; -import org.thoughtcrime.securesms.conversationlist.model.Conversation; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.util.task.SnackbarAsyncTask; @@ -78,9 +76,7 @@ public class ConversationListArchiveFragment extends ConversationListFragment im } @Override - protected void onSubmitList(@NonNull PagedList conversations) { - super.onSubmitList(conversations); - + protected void onPostSubmitList() { list.setVisibility(View.VISIBLE); emptyState.setVisibility(View.GONE); } 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 cd93cbb611..db75d55926 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -58,7 +58,6 @@ import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ProcessLifecycleOwner; import androidx.lifecycle.ViewModelProviders; -import androidx.paging.PagedList; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -115,7 +114,6 @@ import org.thoughtcrime.securesms.service.KeyCachingService; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.storage.StorageSyncHelper; import org.thoughtcrime.securesms.util.AvatarUtil; -import org.thoughtcrime.securesms.util.CachedInflater; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.SnapToTopDataObserver; import org.thoughtcrime.securesms.util.StickyHeaderDecoration; @@ -509,7 +507,6 @@ public class ConversationListFragment extends MainFragment implements ActionMode viewModel.getSearchResult().observe(this, this::onSearchResultChanged); viewModel.getMegaphone().observe(this, this::onMegaphoneChanged); viewModel.getConversationList().observe(this, this::onSubmitList); - viewModel.getArchivedCount().observe(this, defaultAdapter::updateArchived); ProcessLifecycleOwner.get().getLifecycle().addObserver(new DefaultLifecycleObserver() { @Override @@ -756,8 +753,8 @@ public class ConversationListFragment extends MainFragment implements ActionMode getNavigator().goToConversation(recipient.getId(), threadId, distributionType, -1); } - protected void onSubmitList(@NonNull PagedList pagedList) { - if (pagedList.size() == 0) { + private void onSubmitList(@NonNull ConversationListViewModel.ConversationList conversationList) { + if (conversationList.isEmpty()) { list.setVisibility(View.INVISIBLE); emptyState.setVisibility(View.VISIBLE); emptyImage.setImageResource(EMPTY_IMAGES[(int) (Math.random() * EMPTY_IMAGES.length)]); @@ -770,7 +767,13 @@ public class ConversationListFragment extends MainFragment implements ActionMode cameraFab.stopPulse(); } - defaultAdapter.submitList(pagedList); + defaultAdapter.submitList(conversationList.getConversations()); + defaultAdapter.updateArchived(conversationList.getArchivedCount()); + + onPostSubmitList(); + } + + protected void onPostSubmitList() { } @Override 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 b4666e23e9..1e21310446 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListViewModel.java @@ -26,20 +26,21 @@ import org.thoughtcrime.securesms.search.SearchRepository; import org.thoughtcrime.securesms.util.Debouncer; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; +import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import org.thoughtcrime.securesms.util.paging.Invalidator; class ConversationListViewModel extends ViewModel { - private final Application application; - private final MutableLiveData megaphone; - private final MutableLiveData searchResult; - private final LiveData> conversationList; - private final MutableLiveData archivedCount; - private final SearchRepository searchRepository; - private final MegaphoneRepository megaphoneRepository; - private final Debouncer debouncer; - private final ContentObserver observer; - private final Invalidator invalidator; + private final Application application; + private final MutableLiveData megaphone; + private final MutableLiveData searchResult; + private final MutableLiveData archivedCount; + private final LiveData conversationList; + private final SearchRepository searchRepository; + private final MegaphoneRepository megaphoneRepository; + private final Debouncer debouncer; + private final ContentObserver observer; + private final Invalidator invalidator; private String lastQuery; @@ -72,15 +73,19 @@ class ConversationListViewModel extends ViewModel { .setEnablePlaceholders(true) .build(); - this.conversationList = new LivePagedListBuilder<>(factory, config).setFetchExecutor(ConversationListDataSource.EXECUTOR) - .setInitialLoadKey(0) - .build(); + LiveData> conversationList = new LivePagedListBuilder<>(factory, config).setFetchExecutor(ConversationListDataSource.EXECUTOR) + .setInitialLoadKey(0) + .build(); - if (!isArchived) { + if (isArchived) { + this.archivedCount.setValue(0); + } else { updateArchivedCount(); } application.getContentResolver().registerContentObserver(DatabaseContentProviders.ConversationList.CONTENT_URI, true, observer); + + this.conversationList = LiveDataUtil.combineLatest(conversationList, this.archivedCount, ConversationList::new); } @NonNull LiveData getSearchResult() { @@ -91,14 +96,10 @@ class ConversationListViewModel extends ViewModel { return megaphone; } - @NonNull LiveData> getConversationList() { + @NonNull LiveData getConversationList() { return conversationList; } - @NonNull LiveData getArchivedCount() { - return archivedCount; - } - void onVisible() { megaphoneRepository.getNextMegaphone(megaphone::postValue); } @@ -159,4 +160,26 @@ class ConversationListViewModel extends ViewModel { return modelClass.cast(new ConversationListViewModel(ApplicationDependencies.getApplication(), new SearchRepository(), isArchived)); } } + + final static class ConversationList { + private final PagedList conversations; + private final int archivedCount; + + ConversationList(PagedList conversations, int archivedCount) { + this.conversations = conversations; + this.archivedCount = archivedCount; + } + + PagedList getConversations() { + return conversations; + } + + int getArchivedCount() { + return archivedCount; + } + + boolean isEmpty() { + return conversations.isEmpty() && archivedCount == 0; + } + } }