Fix not able to get to archived conversations when all archived.

This commit is contained in:
Alan Evans 2020-06-18 12:23:20 -03:00 committed by GitHub
parent a77997a4de
commit 80f9e1f4f1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 30 deletions

View file

@ -30,14 +30,12 @@ import androidx.annotation.WorkerThread;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ActionMode; import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.paging.PagedList;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionButton; import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionButton;
import org.thoughtcrime.securesms.conversationlist.model.Conversation;
import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.util.task.SnackbarAsyncTask; import org.thoughtcrime.securesms.util.task.SnackbarAsyncTask;
@ -78,9 +76,7 @@ public class ConversationListArchiveFragment extends ConversationListFragment im
} }
@Override @Override
protected void onSubmitList(@NonNull PagedList<Conversation> conversations) { protected void onPostSubmitList() {
super.onSubmitList(conversations);
list.setVisibility(View.VISIBLE); list.setVisibility(View.VISIBLE);
emptyState.setVisibility(View.GONE); emptyState.setVisibility(View.GONE);
} }

View file

@ -58,7 +58,6 @@ import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner; import androidx.lifecycle.ProcessLifecycleOwner;
import androidx.lifecycle.ViewModelProviders; import androidx.lifecycle.ViewModelProviders;
import androidx.paging.PagedList;
import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; 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.sms.MessageSender;
import org.thoughtcrime.securesms.storage.StorageSyncHelper; import org.thoughtcrime.securesms.storage.StorageSyncHelper;
import org.thoughtcrime.securesms.util.AvatarUtil; import org.thoughtcrime.securesms.util.AvatarUtil;
import org.thoughtcrime.securesms.util.CachedInflater;
import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.SnapToTopDataObserver; import org.thoughtcrime.securesms.util.SnapToTopDataObserver;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration; import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
@ -509,7 +507,6 @@ public class ConversationListFragment extends MainFragment implements ActionMode
viewModel.getSearchResult().observe(this, this::onSearchResultChanged); viewModel.getSearchResult().observe(this, this::onSearchResultChanged);
viewModel.getMegaphone().observe(this, this::onMegaphoneChanged); viewModel.getMegaphone().observe(this, this::onMegaphoneChanged);
viewModel.getConversationList().observe(this, this::onSubmitList); viewModel.getConversationList().observe(this, this::onSubmitList);
viewModel.getArchivedCount().observe(this, defaultAdapter::updateArchived);
ProcessLifecycleOwner.get().getLifecycle().addObserver(new DefaultLifecycleObserver() { ProcessLifecycleOwner.get().getLifecycle().addObserver(new DefaultLifecycleObserver() {
@Override @Override
@ -756,8 +753,8 @@ public class ConversationListFragment extends MainFragment implements ActionMode
getNavigator().goToConversation(recipient.getId(), threadId, distributionType, -1); getNavigator().goToConversation(recipient.getId(), threadId, distributionType, -1);
} }
protected void onSubmitList(@NonNull PagedList<Conversation> pagedList) { private void onSubmitList(@NonNull ConversationListViewModel.ConversationList conversationList) {
if (pagedList.size() == 0) { if (conversationList.isEmpty()) {
list.setVisibility(View.INVISIBLE); list.setVisibility(View.INVISIBLE);
emptyState.setVisibility(View.VISIBLE); emptyState.setVisibility(View.VISIBLE);
emptyImage.setImageResource(EMPTY_IMAGES[(int) (Math.random() * EMPTY_IMAGES.length)]); emptyImage.setImageResource(EMPTY_IMAGES[(int) (Math.random() * EMPTY_IMAGES.length)]);
@ -770,7 +767,13 @@ public class ConversationListFragment extends MainFragment implements ActionMode
cameraFab.stopPulse(); cameraFab.stopPulse();
} }
defaultAdapter.submitList(pagedList); defaultAdapter.submitList(conversationList.getConversations());
defaultAdapter.updateArchived(conversationList.getArchivedCount());
onPostSubmitList();
}
protected void onPostSubmitList() {
} }
@Override @Override

View file

@ -26,20 +26,21 @@ import org.thoughtcrime.securesms.search.SearchRepository;
import org.thoughtcrime.securesms.util.Debouncer; import org.thoughtcrime.securesms.util.Debouncer;
import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.thoughtcrime.securesms.util.paging.Invalidator; import org.thoughtcrime.securesms.util.paging.Invalidator;
class ConversationListViewModel extends ViewModel { class ConversationListViewModel extends ViewModel {
private final Application application; private final Application application;
private final MutableLiveData<Megaphone> megaphone; private final MutableLiveData<Megaphone> megaphone;
private final MutableLiveData<SearchResult> searchResult; private final MutableLiveData<SearchResult> searchResult;
private final LiveData<PagedList<Conversation>> conversationList; private final MutableLiveData<Integer> archivedCount;
private final MutableLiveData<Integer> archivedCount; private final LiveData<ConversationList> conversationList;
private final SearchRepository searchRepository; private final SearchRepository searchRepository;
private final MegaphoneRepository megaphoneRepository; private final MegaphoneRepository megaphoneRepository;
private final Debouncer debouncer; private final Debouncer debouncer;
private final ContentObserver observer; private final ContentObserver observer;
private final Invalidator invalidator; private final Invalidator invalidator;
private String lastQuery; private String lastQuery;
@ -72,15 +73,19 @@ class ConversationListViewModel extends ViewModel {
.setEnablePlaceholders(true) .setEnablePlaceholders(true)
.build(); .build();
this.conversationList = new LivePagedListBuilder<>(factory, config).setFetchExecutor(ConversationListDataSource.EXECUTOR) LiveData<PagedList<Conversation>> conversationList = new LivePagedListBuilder<>(factory, config).setFetchExecutor(ConversationListDataSource.EXECUTOR)
.setInitialLoadKey(0) .setInitialLoadKey(0)
.build(); .build();
if (!isArchived) { if (isArchived) {
this.archivedCount.setValue(0);
} else {
updateArchivedCount(); updateArchivedCount();
} }
application.getContentResolver().registerContentObserver(DatabaseContentProviders.ConversationList.CONTENT_URI, true, observer); application.getContentResolver().registerContentObserver(DatabaseContentProviders.ConversationList.CONTENT_URI, true, observer);
this.conversationList = LiveDataUtil.combineLatest(conversationList, this.archivedCount, ConversationList::new);
} }
@NonNull LiveData<SearchResult> getSearchResult() { @NonNull LiveData<SearchResult> getSearchResult() {
@ -91,14 +96,10 @@ class ConversationListViewModel extends ViewModel {
return megaphone; return megaphone;
} }
@NonNull LiveData<PagedList<Conversation>> getConversationList() { @NonNull LiveData<ConversationList> getConversationList() {
return conversationList; return conversationList;
} }
@NonNull LiveData<Integer> getArchivedCount() {
return archivedCount;
}
void onVisible() { void onVisible() {
megaphoneRepository.getNextMegaphone(megaphone::postValue); megaphoneRepository.getNextMegaphone(megaphone::postValue);
} }
@ -159,4 +160,26 @@ class ConversationListViewModel extends ViewModel {
return modelClass.cast(new ConversationListViewModel(ApplicationDependencies.getApplication(), new SearchRepository(), isArchived)); return modelClass.cast(new ConversationListViewModel(ApplicationDependencies.getApplication(), new SearchRepository(), isArchived));
} }
} }
final static class ConversationList {
private final PagedList<Conversation> conversations;
private final int archivedCount;
ConversationList(PagedList<Conversation> conversations, int archivedCount) {
this.conversations = conversations;
this.archivedCount = archivedCount;
}
PagedList<Conversation> getConversations() {
return conversations;
}
int getArchivedCount() {
return archivedCount;
}
boolean isEmpty() {
return conversations.isEmpty() && archivedCount == 0;
}
}
} }