From 4a0327a62bd7175ef1b6babe5072a0c812c9f79b Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 27 Jan 2021 14:30:13 -0300 Subject: [PATCH] thread list: fix redundant load and dissolved dialog showing again after screen rotation --- .../privategroup/conversation/GroupActivity.java | 4 ++-- .../conversation/GroupViewModel.java | 16 +++++++++------- .../android/threaded/ThreadListViewModel.java | 9 +++++++-- .../briar/android/viewmodel/LiveEvent.java | 11 +++++++++++ 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java index 93b9cbd23..47e4cb476 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java @@ -79,7 +79,7 @@ public class GroupActivity extends // start with group disabled and enable when not dissolved setGroupEnabled(false); - viewModel.isDissolved().observe(this, dissolved -> { + viewModel.isDissolved().observeEvent(this, dissolved -> { setGroupEnabled(!dissolved); if (dissolved) onGroupDissolved(); }); @@ -153,7 +153,7 @@ public class GroupActivity extends @Override public void onReplyClick(GroupMessageItem item) { - Boolean isDissolved = viewModel.isDissolved().getValue(); + Boolean isDissolved = viewModel.isDissolved().getLastValue(); if (isDissolved != null && !isDissolved) super.onReplyClick(item); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java index b64dad46a..9020efe1b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java @@ -22,6 +22,8 @@ import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.android.sharing.SharingController; import org.briarproject.briar.android.threaded.ThreadListViewModel; +import org.briarproject.briar.android.viewmodel.LiveEvent; +import org.briarproject.briar.android.viewmodel.MutableLiveEvent; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker.GroupCount; @@ -70,8 +72,8 @@ class GroupViewModel extends ThreadListViewModel { private final MutableLiveData privateGroup = new MutableLiveData<>(); private final MutableLiveData isCreator = new MutableLiveData<>(); - private final MutableLiveData isDissolved = - new MutableLiveData<>(); + private final MutableLiveEvent isDissolved = + new MutableLiveEvent<>(); @Inject GroupViewModel(Application application, @@ -128,7 +130,7 @@ class GroupViewModel extends ThreadListViewModel { } else if (e instanceof GroupDissolvedEvent) { GroupDissolvedEvent g = (GroupDissolvedEvent) e; if (g.getGroupId().equals(groupId)) { - isDissolved.setValue(true); + isDissolved.setEvent(true); } } else { super.eventOccurred(e); @@ -136,8 +138,8 @@ class GroupViewModel extends ThreadListViewModel { } @Override - public void setGroupId(GroupId groupId) { - super.setGroupId(groupId); + protected void performInitialLoad() { + super.performInitialLoad(); loadPrivateGroup(groupId); } @@ -163,7 +165,7 @@ class GroupViewModel extends ThreadListViewModel { loadList(txn -> { // check first if group is dissolved isDissolved - .postValue(privateGroupManager.isDissolved(txn, groupId)); + .postEvent(privateGroupManager.isDissolved(txn, groupId)); // now continue to load the items long start = now(); List headers = @@ -275,7 +277,7 @@ class GroupViewModel extends ThreadListViewModel { return isCreator; } - LiveData isDissolved() { + LiveEvent isDissolved() { return isDissolved; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java index a655dc605..c28847107 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java @@ -115,9 +115,14 @@ public abstract class ThreadListViewModel * Needs to be called right after initialization, * before calling any other methods. */ - @CallSuper - public void setGroupId(GroupId groupId) { + public final void setGroupId(GroupId groupId) { + boolean needsInitialLoad = this.groupId == null; this.groupId = groupId; + if (needsInitialLoad) performInitialLoad(); + } + + @CallSuper + protected void performInitialLoad() { loadStoredMessageId(); loadItems(); loadSharingContacts(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/viewmodel/LiveEvent.java b/briar-android/src/main/java/org/briarproject/briar/android/viewmodel/LiveEvent.java index 15eb83e8e..e4e8e8308 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/viewmodel/LiveEvent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/viewmodel/LiveEvent.java @@ -39,6 +39,17 @@ public class LiveEvent extends LiveData> { super.observeForever(observer); } + /** + * Returns the last value of the event (even if already consumed) + * or null if there hasn't been any value so far. + */ + @Nullable + public T getLastValue() { + ConsumableEvent event = getValue(); + if (event == null) return null; + return event.content; + } + static class ConsumableEvent { private final T content;