From bad2f999686160543e97a302d9548212d6997577 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 4 Nov 2021 13:56:42 -0400 Subject: [PATCH] Ensure store is properly cleaned up in conversation settings. --- .../ConversationSettingsViewModel.kt | 6 ++---- .../securesms/util/livedata/Store.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt index 075789e504..48c807a27b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt @@ -103,10 +103,8 @@ sealed class ConversationSettingsViewModel( override fun onCleared() { cleared = true - store.update { state -> - openedMediaCursors.forEach { it.ensureClosed() } - state.copy(sharedMedia = null) - } + openedMediaCursors.forEach { it.ensureClosed() } + store.clear() } private fun Cursor?.ensureClosed() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/livedata/Store.java b/app/src/main/java/org/thoughtcrime/securesms/util/livedata/Store.java index 885609c870..320978eb29 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/livedata/Store.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/livedata/Store.java @@ -11,6 +11,8 @@ import com.annimon.stream.function.Function; import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.util.concurrent.SerialExecutor; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.Executor; /** @@ -44,12 +46,21 @@ public class Store { liveStore.update(source, action); } + @MainThread + public void clear() { + liveStore.clear(); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) private final class LiveDataStore extends MediatorLiveData { private State state; private final Executor stateUpdater; + private final Set sources; + LiveDataStore(@NonNull State state) { this.stateUpdater = new SerialExecutor(SignalExecutors.BOUNDED); + this.sources = new HashSet<>(); setState(state); } @@ -63,12 +74,20 @@ public class Store { } void update(@NonNull LiveData source, @NonNull Action action) { + sources.add(source); addSource(source, input -> stateUpdater.execute(() -> setState(action.apply(input, getState())))); } void update(@NonNull Function updater) { stateUpdater.execute(() -> setState(updater.apply(getState()))); } + + void clear() { + for (LiveData source : sources) { + removeSource(source); + } + sources.clear(); + } } public interface Action {