From af34214d4fd1d7078e82c3405ee87f2f29b315ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=BBerko?= Date: Thu, 6 Jun 2024 15:34:23 +0200 Subject: [PATCH] fix: disable message options for gallery asset [WPB-9047] (#3084) --- .../home/conversations/ConversationScreen.kt | 8 ++-- .../conversations/edit/AssetEditMenuItems.kt | 41 ++++++++++++++----- .../edit/EditMessageMenuItems.kt | 6 ++- .../media/ConversationMediaScreen.kt | 9 ++-- .../ui/home/gallery/MediaGalleryNavArgs.kt | 3 +- .../ui/home/gallery/MediaGalleryScreen.kt | 20 ++++++--- .../ui/home/gallery/MediaGalleryViewModel.kt | 7 +++- .../ui/home/gallery/MediaGalleryViewState.kt | 3 +- .../home/gallery/MediaGalleryViewModelTest.kt | 3 +- 9 files changed, 71 insertions(+), 29 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationScreen.kt index 17329906d0a..e5313480fc8 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationScreen.kt @@ -125,7 +125,7 @@ import com.wire.android.ui.home.conversations.call.ConversationCallViewState import com.wire.android.ui.home.conversations.composer.MessageComposerViewModel import com.wire.android.ui.home.conversations.delete.DeleteMessageDialog import com.wire.android.ui.home.conversations.details.GroupConversationDetailsNavBackArgs -import com.wire.android.ui.home.conversations.edit.EditMessageMenuItems +import com.wire.android.ui.home.conversations.edit.editMessageMenuItems import com.wire.android.ui.home.conversations.info.ConversationDetailsData import com.wire.android.ui.home.conversations.info.ConversationInfoViewModel import com.wire.android.ui.home.conversations.info.ConversationInfoViewState @@ -399,7 +399,8 @@ fun ConversationScreen( conversationId = conversationId, messageId = message.header.messageId, isSelfAsset = isSelfMessage, - isEphemeral = message.header.messageStatus.expirationStatus is ExpirationStatus.Expirable + isEphemeral = message.header.messageStatus.expirationStatus is ExpirationStatus.Expirable, + messageOptionsEnabled = true ) ) ) @@ -751,8 +752,9 @@ private fun ConversationScreen( val menuItems = when (val menuType = conversationScreenState.bottomSheetMenuType) { is ConversationScreenState.BottomSheetMenuType.Edit -> { - EditMessageMenuItems( + editMessageMenuItems( message = menuType.selectedMessage, + messageOptionsEnabled = true, hideEditMessageMenu = conversationScreenState::hideContextMenu, onCopyClick = conversationScreenState::copyMessage, onDeleteClick = onDeleteMessage, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/AssetEditMenuItems.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/AssetEditMenuItems.kt index 2ad591a3230..328ed0705b2 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/AssetEditMenuItems.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/AssetEditMenuItems.kt @@ -26,26 +26,47 @@ import com.wire.android.ui.edit.ReactionOption import com.wire.android.ui.edit.ReplyMessageOption @Composable -fun AssetEditMenuItems( +fun assetEditMenuItems( isEphemeral: Boolean, - isUploading: Boolean = false, + messageOptionsEnabled: Boolean, onDeleteClick: () -> Unit, onDetailsClick: () -> Unit, onShareAsset: () -> Unit, onDownloadAsset: () -> Unit, onReplyClick: () -> Unit, onReactionClick: (String) -> Unit, + isUploading: Boolean = false, onOpenAsset: (() -> Unit)? = null ): List<@Composable () -> Unit> { return buildList { - if (!isUploading) { - if (!isEphemeral) add { ReactionOption(onReactionClick) } - add { MessageDetailsMenuOption(onDetailsClick) } - if (!isEphemeral) add { ReplyMessageOption(onReplyClick) } - add { DownloadAssetExternallyOption(onDownloadAsset) } - if (!isEphemeral) add { ShareAssetMenuOption(onShareAsset) } - if (onOpenAsset != null && !isEphemeral) add { OpenAssetExternallyOption(onOpenAsset) } + when { + isUploading -> { + add { DeleteItemMenuOption(onDeleteClick) } + } + + isEphemeral -> { + if (messageOptionsEnabled) { + add { MessageDetailsMenuOption(onDetailsClick) } + } + add { DownloadAssetExternallyOption(onDownloadAsset) } + add { DeleteItemMenuOption(onDeleteClick) } + } + + !messageOptionsEnabled -> { + add { DownloadAssetExternallyOption(onDownloadAsset) } + add { ShareAssetMenuOption(onShareAsset) } + add { DeleteItemMenuOption(onDeleteClick) } + } + + else -> { + add { ReactionOption(onReactionClick) } + add { MessageDetailsMenuOption(onDetailsClick) } + add { ReplyMessageOption(onReplyClick) } + add { DownloadAssetExternallyOption(onDownloadAsset) } + add { ShareAssetMenuOption(onShareAsset) } + if (onOpenAsset != null) add { OpenAssetExternallyOption(onOpenAsset) } + add { DeleteItemMenuOption(onDeleteClick) } + } } - add { DeleteItemMenuOption(onDeleteClick) } } } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/EditMessageMenuItems.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/EditMessageMenuItems.kt index 098313239ba..797d9994646 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/EditMessageMenuItems.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/edit/EditMessageMenuItems.kt @@ -33,8 +33,9 @@ import com.wire.android.util.ui.UIText import com.wire.kalium.logic.data.message.mention.MessageMention @Composable -fun EditMessageMenuItems( +fun editMessageMenuItems( message: UIMessage.Regular, + messageOptionsEnabled: Boolean, hideEditMessageMenu: (OnComplete) -> Unit, onCopyClick: (String) -> Unit, onDeleteClick: (messageId: String, Boolean) -> Unit, @@ -117,7 +118,8 @@ fun EditMessageMenuItems( } return if (message.isAssetMessage) { - AssetEditMenuItems( + assetEditMenuItems( + messageOptionsEnabled = messageOptionsEnabled, isEphemeral = message.header.messageStatus.expirationStatus is ExpirationStatus.Expirable, isUploading = message.isPending, onDeleteClick = onDeleteItemClick, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationMediaScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationMediaScreen.kt index 600a2f223fa..d034d082252 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationMediaScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationMediaScreen.kt @@ -98,7 +98,8 @@ fun ConversationMediaScreen( conversationId = conversationId, messageId = messageId, isSelfAsset = isSelfAsset, - isEphemeral = false + isEphemeral = false, + messageOptionsEnabled = false ) ) ) @@ -135,10 +136,10 @@ fun ConversationMediaScreen( @Composable private fun Content( state: ConversationAssetMessagesViewState, - onNavigationPressed: () -> Unit = {}, onImageFullScreenMode: (conversationId: ConversationId, messageId: String, isSelfAsset: Boolean) -> Unit, - audioMessagesState: PersistentMap = persistentMapOf(), onAudioItemClicked: (String) -> Unit, + onNavigationPressed: () -> Unit = {}, + audioMessagesState: PersistentMap = persistentMapOf(), onAssetItemClicked: (String) -> Unit ) { val scope = rememberCoroutineScope() @@ -211,7 +212,7 @@ enum class ConversationMediaScreenTabItem(@StringRes val titleResId: Int) : TabI @PreviewMultipleThemes @Composable -fun previewConversationMediaScreenEmptyContent() { +fun PreviewConversationMediaScreenEmptyContent() { WireTheme { Content( state = ConversationAssetMessagesViewState(), diff --git a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryNavArgs.kt b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryNavArgs.kt index 1ffaa9093cc..4c5c70ad2f8 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryNavArgs.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryNavArgs.kt @@ -25,7 +25,8 @@ data class MediaGalleryNavArgs( val conversationId: ConversationId, val messageId: String, val isSelfAsset: Boolean, - val isEphemeral: Boolean + val isEphemeral: Boolean, + val messageOptionsEnabled: Boolean ) @Parcelize diff --git a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryScreen.kt index 9f25f540f78..1a9beb09b98 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryScreen.kt @@ -46,7 +46,7 @@ import com.wire.android.ui.common.visbility.rememberVisibilityState import com.wire.android.ui.home.conversations.MediaGallerySnackbarMessages import com.wire.android.ui.home.conversations.PermissionPermanentlyDeniedDialogState import com.wire.android.ui.home.conversations.delete.DeleteMessageDialog -import com.wire.android.ui.home.conversations.edit.AssetEditMenuItems +import com.wire.android.ui.home.conversations.edit.assetEditMenuItems import com.wire.android.util.permission.rememberWriteStorageRequestFlow import com.wire.android.util.ui.openDownloadFolder @@ -58,8 +58,9 @@ import com.wire.android.util.ui.openDownloadFolder @Composable fun MediaGalleryScreen( navigator: Navigator, - mediaGalleryViewModel: MediaGalleryViewModel = hiltViewModel(), - resultNavigator: ResultBackNavigator + resultNavigator: ResultBackNavigator, + modifier: Modifier = Modifier, + mediaGalleryViewModel: MediaGalleryViewModel = hiltViewModel() ) { val permissionPermanentlyDeniedDialogState = rememberVisibilityState() @@ -91,6 +92,7 @@ fun MediaGalleryScreen( with(viewModelState) { WireScaffold( + modifier = modifier, topBar = { MediaGalleryScreenTopAppBar( title = screenTitle @@ -108,7 +110,8 @@ fun MediaGalleryScreen( MenuModalSheetLayout( sheetState = mediaGalleryScreenState.modalBottomSheetState, coroutineScope = scope, - menuItems = AssetEditMenuItems( + menuItems = assetEditMenuItems( + messageOptionsEnabled = viewModelState.messageBottomSheetOptionsEnabled, isEphemeral = viewModelState.isEphemeral, onDeleteClick = { mediaGalleryScreenState.showContextualMenu(false) @@ -158,7 +161,12 @@ fun MediaGalleryScreen( } @Composable -fun MediaGalleryContent(navigator: Navigator, viewModel: MediaGalleryViewModel, mediaGalleryScreenState: MediaGalleryScreenState) { +fun MediaGalleryContent( + navigator: Navigator, + viewModel: MediaGalleryViewModel, + mediaGalleryScreenState: MediaGalleryScreenState, + modifier: Modifier = Modifier +) { val context = LocalContext.current val uiState = viewModel.mediaGalleryViewState suspend fun showSnackbarMessage(message: String, actionLabel: String?, messageCode: MediaGallerySnackbarMessages) { @@ -180,7 +188,7 @@ fun MediaGalleryContent(navigator: Navigator, viewModel: MediaGalleryViewModel, } Box( - Modifier + modifier .fillMaxWidth() .fillMaxHeight() .background(colorsScheme().surface) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewModel.kt index b304007c046..9d10a6888d4 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewModel.kt @@ -76,7 +76,12 @@ class MediaGalleryViewModel @Inject constructor( private val messageId = imageAsset.messageId private val conversationId = imageAsset.conversationId - var mediaGalleryViewState by mutableStateOf(MediaGalleryViewState(isEphemeral = imageAsset.isEphemeral)) + var mediaGalleryViewState by mutableStateOf( + MediaGalleryViewState( + isEphemeral = imageAsset.isEphemeral, + messageBottomSheetOptionsEnabled = mediaGalleryNavArgs.messageOptionsEnabled + ) + ) private set val deleteMessageHelper = DeleteMessageDialogHelper( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewState.kt b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewState.kt index e7d4fb9a4f8..e6606099789 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewState.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewState.kt @@ -27,5 +27,6 @@ data class MediaGalleryViewState( val deleteMessageDialogsState: DeleteMessageDialogsState = DeleteMessageDialogsState.States( forYourself = DeleteMessageDialogActiveState.Hidden, forEveryone = DeleteMessageDialogActiveState.Hidden - ) + ), + val messageBottomSheetOptionsEnabled: Boolean ) diff --git a/app/src/test/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewModelTest.kt index 3664faedf50..d3c3ca6223a 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/gallery/MediaGalleryViewModelTest.kt @@ -217,7 +217,8 @@ class MediaGalleryViewModelTest { conversationId = dummyConversationId, messageId = dummyPrivateAsset, isSelfAsset = true, - isEphemeral = false + isEphemeral = false, + messageOptionsEnabled = true ) coEvery { deleteMessage(any(), any(), any()) } returns Either.Right(Unit)