From 7a2d408ca2dfe19418be3ca4b8901c5c4d4c6889 Mon Sep 17 00:00:00 2001 From: Nicholas Tinsley Date: Tue, 16 Apr 2024 14:50:37 -0400 Subject: [PATCH] Stop voice memo playback if the current item is deleted. Fixes #13502. --- .../voice/VoiceNotePlaybackService.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java index bdf5851508..a628098137 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java @@ -34,12 +34,15 @@ import com.google.common.util.concurrent.ListenableFuture; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; +import org.thoughtcrime.securesms.attachments.DatabaseAttachment; +import org.thoughtcrime.securesms.database.DatabaseObserver; import org.thoughtcrime.securesms.database.MessageTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.model.MessageId; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobs.MultiDeviceViewedUpdateJob; import org.thoughtcrime.securesms.jobs.SendViewedReceiptJob; +import org.thoughtcrime.securesms.mms.PartUriParser; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.service.KeyCachingService; @@ -64,6 +67,8 @@ public class VoiceNotePlaybackService extends MediaSessionService { private KeyClearedReceiver keyClearedReceiver; private VoiceNotePlayerCallback voiceNotePlayerCallback; + private final DatabaseObserver.Observer attachmentDeletionObserver = this::onAttachmentDeleted; + @Override public void onCreate() { super.onCreate(); @@ -83,6 +88,7 @@ public class VoiceNotePlaybackService extends MediaSessionService { setMediaNotificationProvider(new VoiceNoteMediaNotificationProvider(this)); setListener(new MediaSessionServiceListener()); + ApplicationDependencies.getDatabaseObserver().registerAttachmentObserver(attachmentDeletionObserver); } @Override @@ -95,6 +101,7 @@ public class VoiceNotePlaybackService extends MediaSessionService { @Override public void onDestroy() { + ApplicationDependencies.getDatabaseObserver().unregisterObserver(attachmentDeletionObserver); player.release(); mediaSession.release(); mediaSession = null; @@ -191,6 +198,28 @@ public class VoiceNotePlaybackService extends MediaSessionService { } } + private void onAttachmentDeleted() { + Log.d(TAG, "Database attachment observer invoked."); + ContextCompat.getMainExecutor(getApplicationContext()).execute(() -> { + if (player != null) { + final MediaItem currentItem = player.getCurrentMediaItem(); + if (currentItem == null || currentItem.playbackProperties == null) { + Log.d(TAG, "Current item is null or playback properties are null."); + return; + } + final Uri currentUi = currentItem.playbackProperties.uri; + final DatabaseAttachment attachment = SignalDatabase.attachments().getAttachment(new PartUriParser(currentUi).getPartId()); + if (attachment == null) { + player.stop(); + int playingIndex = player.getCurrentMediaItemIndex(); + player.removeMediaItem(playingIndex); + Log.d(TAG, "Currently playing item removed."); + } else { + Log.d(TAG, "Attachment was not null, therefore not deleted, therefore no action taken."); + } + } + }); + } /** * Some devices, such as the ASUS Zenfone 8, erroneously report multiple broadcast receivers for {@value Intent#ACTION_MEDIA_BUTTON} in the package manager. * This triggers a failure within the {@link MediaSession} initialization and throws an {@link IllegalStateException}.