Fix not able to get to archived conversations when all archived.
This commit is contained in:
parent
a77997a4de
commit
80f9e1f4f1
3 changed files with 52 additions and 30 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue