From bf8f603dcf2c4eeb71c482719c354195b731e25c Mon Sep 17 00:00:00 2001 From: Jeffrey Starke Date: Thu, 20 Mar 2025 15:49:30 -0400 Subject: [PATCH] Pause story playback while saving media. Story playback was previously paused when the context menu is opened, but resumed while saving the media. With this change, playback will remain paused while saving media, so the user doesn't potentially miss any stories while clicking through the dialogs to save media to their device storage. --- .../stories/viewer/page/StoryViewerPageFragment.kt | 2 ++ .../stories/viewer/page/StoryViewerPageViewModel.kt | 4 ++++ .../stories/viewer/page/StoryViewerPlaybackState.kt | 6 ++++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index 24451894f6..4c6489a0df 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -1198,10 +1198,12 @@ class StoryViewerPageFragment : }, onSave = { lifecycleScope.launch { + viewModel.setIsSavingMedia(true) StoryContextMenu.save( host = AttachmentSaver.FragmentHost(this@StoryViewerPageFragment), messageRecord = it.conversationMessage.messageRecord ) + viewModel.setIsSavingMedia(false) } }, onDelete = { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt index 76b3e522b7..80defd90bf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageViewModel.kt @@ -299,6 +299,10 @@ class StoryViewerPageViewModel( storyViewerPlaybackStore.update { it.copy(isDisplayingPartialSendDialog = isDisplayingPartialSendDialog) } } + fun setIsSavingMedia(isSavingMedia: Boolean) { + storyViewerPlaybackStore.update { it.copy(isSavingMedia = isSavingMedia) } + } + private fun resolveSwipeToReplyState(state: StoryViewerPageState, index: Int): StoryViewerPageState.ReplyState { if (index !in state.posts.indices) { return StoryViewerPageState.ReplyState.NONE diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt index 4c0d0d09ed..1b5534dd3f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPlaybackState.kt @@ -23,7 +23,8 @@ data class StoryViewerPlaybackState( val isUserScrollingChild: Boolean = false, val isUserScaling: Boolean = false, val isDisplayingPartialSendDialog: Boolean = false, - val isDisplayingRecipientBottomSheet: Boolean = false + val isDisplayingRecipientBottomSheet: Boolean = false, + val isSavingMedia: Boolean = false ) { val hideChromeImmediate: Boolean = isRunningSharedElementAnimation || isDisplayingFirstTimeNavigation @@ -53,5 +54,6 @@ data class StoryViewerPlaybackState( isUserScaling || isDisplayingHideDialog || isDisplayingPartialSendDialog || - isDisplayingRecipientBottomSheet + isDisplayingRecipientBottomSheet || + isSavingMedia }