From eceed641bfc8e5bd5f68a8535df09cb908d7e7dd Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Tue, 31 Jan 2023 15:07:24 -0400 Subject: [PATCH] Fix leak in recording session. --- .../ConversationParentFragment.java | 19 ++++++++++++++++++- .../conversation/ConversationViewModel.java | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index cf3aad9805..ad0417f621 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -3376,6 +3376,8 @@ public class ConversationParentFragment extends Fragment voiceNoteMediaController.pausePlayback(); recordingSession = new RecordingSession(audioRecorder.startRecording()); + + disposables.add(recordingSession); } @Override @@ -3685,10 +3687,11 @@ public class ConversationParentFragment extends Fragment // Listeners - private class RecordingSession implements SingleObserver { + private class RecordingSession implements SingleObserver, Disposable { private boolean saveDraft = true; private boolean shouldSend = false; + private Disposable disposable = Disposable.empty(); RecordingSession(Single observable) { observable.observeOn(AndroidSchedulers.mainThread()).subscribe(this); @@ -3696,6 +3699,7 @@ public class ConversationParentFragment extends Fragment @Override public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { + this.disposable = d; } @Override @@ -3709,12 +3713,15 @@ public class ConversationParentFragment extends Fragment draftViewModel.saveEphemeralVoiceNoteDraft(draft.asDraft()); } } + + recordingSession.dispose(); recordingSession = null; } @Override public void onError(Throwable t) { Toast.makeText(requireContext(), R.string.ConversationActivity_unable_to_record_audio, Toast.LENGTH_LONG).show(); + recordingSession.dispose(); recordingSession = null; } @@ -3734,6 +3741,16 @@ public class ConversationParentFragment extends Fragment this.shouldSend = true; audioRecorder.stopRecording(); } + + @Override + public void dispose() { + disposable.dispose(); + } + + @Override + public boolean isDisposed() { + return disposable.isDisposed(); + } } private class QuickCameraToggleListener implements OnClickListener { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java index 4c8b657836..2369c76092 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java @@ -205,7 +205,7 @@ public class ConversationViewModel extends ViewModel { scheduledMessageCount = threadId .observeOn(Schedulers.io()) - .flatMap(scheduledMessagesRepository::getScheduledMessageCount); + .switchMap(scheduledMessagesRepository::getScheduledMessageCount); Observable liveRecipient = recipientId.distinctUntilChanged().switchMap(id -> Recipient.live(id).asObservable());