Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import androidx.compose.ui.res.stringResource
import com.wire.android.R
import com.wire.android.ui.common.bottomsheet.MenuBottomSheetItem
import com.wire.android.ui.common.bottomsheet.MenuItemIcon
import com.wire.android.util.supportsTrustedWireShareCaller

@Composable
fun ShareAssetMenuOption(onShareAsset: () -> Unit) {
Expand All @@ -37,6 +38,47 @@ fun ShareAssetMenuOption(onShareAsset: () -> Unit) {
)
}

fun shareAssetMenuOptions(
onShareAssetExternally: () -> Unit,
onShareAssetViaWire: () -> Unit
): List<@Composable () -> Unit> =
if (supportsTrustedWireShareCaller()) {
listOf({ ShareAssetMenuOption(onShareAssetExternally) })
} else {
listOf(
{ ShareAssetViaWireMenuOption(onShareAssetViaWire) },
{ ShareAssetExternallyMenuOption(onShareAssetExternally) }
)
}

@Composable
fun ShareAssetViaWireMenuOption(onShareAsset: () -> Unit) {
MenuBottomSheetItem(
leading = {
MenuItemIcon(
id = R.drawable.ic_share_file,
contentDescription = stringResource(R.string.content_description_share_the_file),
)
},
title = stringResource(R.string.label_share_via_wire),
onItemClick = onShareAsset
)
}

@Composable
fun ShareAssetExternallyMenuOption(onShareAsset: () -> Unit) {
MenuBottomSheetItem(
leading = {
MenuItemIcon(
id = R.drawable.ic_share_file,
contentDescription = stringResource(R.string.content_description_share_the_file),
)
},
title = stringResource(R.string.label_share_externally),
onItemClick = onShareAsset
)
}

@Composable
fun SharePublicLinkMenuOption(onShareAsset: () -> Unit) {
MenuBottomSheetItem(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ import androidx.paging.compose.itemKey
import com.ramcosta.composedestinations.generated.app.destinations.ConversationScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.GroupConversationDetailsScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.ImagesPreviewScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.ImportMediaScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.MediaGalleryScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.MessageDetailsScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.OtherUserProfileScreenDestination
Expand Down Expand Up @@ -186,12 +187,14 @@ import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireTypography
import com.wire.android.ui.userprofile.service.ServiceDetailsNavArgs
import com.wire.android.util.DateAndTimeParsers
import com.wire.android.util.fileShareUri
import com.wire.android.util.normalizeLink
import com.wire.android.util.openDownloadFolder
import com.wire.android.util.serverDate
import com.wire.android.util.ui.PreviewMultipleThemes
import com.wire.android.util.ui.UIText
import com.wire.android.util.ui.collectAsLazyPagingItemsWithLifecycle
import com.wire.android.ui.sharing.ImportMediaNavArgs
import com.wire.kalium.logic.data.conversation.Conversation.TypingIndicatorMode
import com.wire.kalium.logic.data.conversation.InteractionAvailability
import com.wire.kalium.logic.data.id.ConversationId
Expand Down Expand Up @@ -253,7 +256,8 @@ fun ConversationScreen(
) {
val coroutineScope = rememberCoroutineScope()
val uriHandler = LocalUriHandler.current
val resources = LocalContext.current.resources
val context = LocalContext.current
val resources = context.resources
val showDialog = remember { mutableStateOf(ConversationScreenDialogType.NONE) }
val messageComposerViewState = messageComposerViewModel.messageComposerViewState
val messageComposerStateHolder = rememberMessageComposerStateHolder(
Expand Down Expand Up @@ -535,7 +539,19 @@ fun ConversationScreen(
},
composerMessages = sendMessageViewModel.infoMessage,
conversationMessages = conversationMessagesViewModel.infoMessage,
shareAsset = conversationMessagesViewModel::shareAsset,
shareAssetExternally = conversationMessagesViewModel::shareAsset,
shareAssetViaWire = { messageId ->
conversationMessagesViewModel.shareAssetViaWire(messageId) { path, assetName ->
navigator.navigate(
NavigationCommand(
ImportMediaScreenDestination(
ImportMediaNavArgs(arrayListOf(context.fileShareUri(path, assetName)))
),
BackStackMode.UPDATE_EXISTED
)
)
}
},
onDownloadAssetClick = conversationMessagesViewModel::openOrFetchAsset,
onOpenAssetClick = conversationMessagesViewModel::downloadAndOpenAsset,
onNavigateToReplyOriginalMessage = conversationMessagesViewModel::navigateToReplyOriginalMessage,
Expand Down Expand Up @@ -800,7 +816,8 @@ private fun ConversationScreen(
onBackButtonClick: () -> Unit,
composerMessages: SharedFlow<SnackBarMessage>,
conversationMessages: SharedFlow<SnackBarMessage>,
shareAsset: (Context, messageId: String) -> Unit,
shareAssetExternally: (Context, messageId: String) -> Unit,
shareAssetViaWire: (messageId: String) -> Unit,
onDownloadAssetClick: (messageId: String) -> Unit,
onOpenAssetClick: (messageId: String) -> Unit,
onNavigateToReplyOriginalMessage: (UIMessage) -> Unit,
Expand Down Expand Up @@ -943,7 +960,8 @@ private fun ConversationScreen(
onDetailsClick = onMessageDetailsClick,
onReplyClick = messageComposerStateHolder::toReply,
onEditClick = messageComposerStateHolder::toEdit,
onShareAssetClick = { shareAsset(context, it) },
onShareAssetExternallyClick = { shareAssetExternally(context, it) },
onShareAssetViaWireClick = shareAssetViaWire,
onDownloadAssetClick = onDownloadAssetClick,
onOpenAssetClick = onOpenAssetClick,
)
Expand Down Expand Up @@ -1810,7 +1828,8 @@ fun PreviewConversationScreen() = WireTheme {
onBackButtonClick = {},
composerMessages = MutableStateFlow(ConversationSnackbarMessages.ErrorDownloadingAsset),
conversationMessages = MutableStateFlow(ConversationSnackbarMessages.ErrorDownloadingAsset),
shareAsset = { _, _ -> },
shareAssetExternally = { _, _ -> },
shareAssetViaWire = {},
onOpenAssetClick = {},
onDownloadAssetClick = {},
onNavigateToReplyOriginalMessage = {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import com.wire.android.ui.edit.MessageDetailsMenuOption
import com.wire.android.ui.edit.OpenAssetExternallyOption
import com.wire.android.ui.edit.ReactionOption
import com.wire.android.ui.edit.ReplyMessageOption
import com.wire.android.ui.edit.ShareAssetMenuOption
import com.wire.android.ui.edit.shareAssetMenuOptions

// menu items with both asset options enabled (like share, download, etc.) and message options enabled (like reply, reaction, etc.)
@Composable
Expand All @@ -33,7 +33,8 @@ fun assetMessageOptionsMenuItems(
ownReactions: Set<String>,
onDeleteClick: () -> Unit,
onDetailsClick: () -> Unit,
onShareAsset: () -> Unit,
onShareAssetExternally: () -> Unit,
onShareAssetViaWire: () -> Unit,
onDownloadAsset: () -> Unit,
onReplyClick: () -> Unit,
onReactionClick: (emoji: String) -> Unit,
Expand All @@ -59,7 +60,7 @@ fun assetMessageOptionsMenuItems(
add { MessageDetailsMenuOption(onDetailsClick) }
add { ReplyMessageOption(onReplyClick) }
add { DownloadAssetExternallyOption(onDownloadAsset) }
add { ShareAssetMenuOption(onShareAsset) }
addAll(shareAssetMenuOptions(onShareAssetExternally, onShareAssetViaWire))
if (isOpenable) add { OpenAssetExternallyOption(onOpenAsset) }
add { DeleteItemMenuOption(onDeleteClick) }
}
Expand All @@ -72,15 +73,18 @@ fun assetMessageOptionsMenuItems(
fun assetOptionsMenuItems(
isEphemeral: Boolean,
onDeleteClick: () -> Unit,
onShareAsset: () -> Unit,
onShareAssetExternally: () -> Unit,
onShareAssetViaWire: () -> Unit,
onDownloadAsset: () -> Unit,
isOpenable: Boolean = false,
onOpenAsset: () -> Unit = {},
isUploading: Boolean = false,
): List<@Composable () -> Unit> = buildList {
if (!isUploading) {
add { DownloadAssetExternallyOption(onDownloadAsset) }
if (!isEphemeral) add { ShareAssetMenuOption(onShareAsset) }
if (!isEphemeral) {
addAll(shareAssetMenuOptions(onShareAssetExternally, onShareAssetViaWire))
}
if (isOpenable) add { OpenAssetExternallyOption(onOpenAsset) }
}
add { DeleteItemMenuOption(onDeleteClick) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ fun messageOptionsMenuItems(
onDetailsClick: () -> Unit,
onReplyClick: () -> Unit,
onEditClick: () -> Unit,
onShareAssetClick: () -> Unit,
onShareAssetExternallyClick: () -> Unit,
onShareAssetViaWireClick: () -> Unit,
onDownloadAssetClick: () -> Unit,
onOpenAssetClick: () -> Unit
): List<@Composable () -> Unit> {
Expand All @@ -48,7 +49,8 @@ fun messageOptionsMenuItems(
isOpenable = isOpenable,
onDeleteClick = onDeleteClick,
onDetailsClick = onDetailsClick,
onShareAsset = onShareAssetClick,
onShareAssetExternally = onShareAssetExternallyClick,
onShareAssetViaWire = onShareAssetViaWireClick,
onDownloadAsset = onDownloadAssetClick,
onReplyClick = onReplyClick,
onReactionClick = onReactionClick,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ fun MessageOptionsModalSheetLayout(
onDetailsClick: (messageId: String, isSelfMessage: Boolean) -> Unit,
onReplyClick: (UIMessage.Regular) -> Unit,
onEditClick: (messageId: String, messageBody: String, mentions: List<MessageMention>, isMultipart: Boolean) -> Unit,
onShareAssetClick: (messageId: String) -> Unit,
onShareAssetExternallyClick: (messageId: String) -> Unit,
onShareAssetViaWireClick: (messageId: String) -> Unit,
onDownloadAssetClick: (messageId: String) -> Unit,
onOpenAssetClick: (messageId: String) -> Unit,
viewModel: MessageOptionsMenuViewModel =
Expand All @@ -84,7 +85,8 @@ fun MessageOptionsModalSheetLayout(
onDetailsClick = onDetailsClick,
onReplyClick = onReplyClick,
onEditClick = onEditClick,
onShareAssetClick = onShareAssetClick,
onShareAssetExternallyClick = onShareAssetExternallyClick,
onShareAssetViaWireClick = onShareAssetViaWireClick,
onDownloadAssetClick = onDownloadAssetClick,
onOpenAssetClick = onOpenAssetClick
).also {
Expand Down Expand Up @@ -118,7 +120,8 @@ private fun MessageOptionsModalContent(
onDetailsClick: (messageId: String, isSelfMessage: Boolean) -> Unit,
onReplyClick: (UIMessage.Regular) -> Unit,
onEditClick: (messageId: String, messageBody: String, mentions: List<MessageMention>, isMultipart: Boolean) -> Unit,
onShareAssetClick: (messageId: String) -> Unit,
onShareAssetExternallyClick: (messageId: String) -> Unit,
onShareAssetViaWireClick: (messageId: String) -> Unit,
onDownloadAssetClick: (messageId: String) -> Unit,
onOpenAssetClick: (messageId: String) -> Unit,
) {
Expand Down Expand Up @@ -214,10 +217,17 @@ private fun MessageOptionsModalContent(
}
}
},
onShareAssetClick = remember(message.header.messageId) {
onShareAssetExternallyClick = remember(message.header.messageId) {
{
sheetState.hide {
onShareAssetClick(message.header.messageId)
onShareAssetExternallyClick(message.header.messageId)
}
}
},
onShareAssetViaWireClick = remember(message.header.messageId) {
{
sheetState.hide {
onShareAssetViaWireClick(message.header.messageId)
}
}
},
Expand Down Expand Up @@ -284,7 +294,8 @@ fun PreviewMessageOptionsModalSheetLayout() = WireTheme {
onDetailsClick = { _, _ -> },
onReplyClick = { },
onEditClick = { _, _, _, _ -> },
onShareAssetClick = { },
onShareAssetExternallyClick = { },
onShareAssetViaWireClick = { },
onDownloadAssetClick = { },
onOpenAssetClick = { }
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import com.wire.android.ui.common.topappbar.NavigationIconType
import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.wire.android.ui.common.visbility.rememberVisibilityState
import com.ramcosta.composedestinations.generated.app.destinations.MediaGalleryScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.ImportMediaScreenDestination
import com.wire.android.ui.home.conversations.ConversationSnackbarMessages
import com.wire.android.ui.home.conversations.DownloadedAssetDialog
import com.wire.android.ui.home.conversations.PermissionPermanentlyDeniedDialogState
Expand All @@ -72,8 +73,10 @@ import com.wire.android.ui.home.conversations.delete.DeleteMessageDialog
import com.wire.android.ui.home.conversations.delete.DeleteMessageDialogState
import com.wire.android.ui.home.conversations.edit.assetOptionsMenuItems
import com.wire.android.ui.home.conversations.messages.ConversationMessagesViewModel
import com.wire.android.ui.sharing.ImportMediaNavArgs
import com.wire.android.ui.theme.WireTheme
import com.wire.android.ui.theme.wireDimensions
import com.wire.android.util.fileShareUri
import com.wire.android.util.ui.PreviewMultipleThemes
import com.wire.android.util.ui.SnackBarMessageHandler
import com.wire.android.util.ui.UIText
Expand Down Expand Up @@ -127,7 +130,18 @@ fun ConversationMediaScreen(
conversationMessagesViewModel.deleteMessageDialogState
.show(DeleteMessageDialogState(deleteForEveryone, messageId, conversationMessagesViewModel.conversationId))
},
shareAsset = remember { { conversationMessagesViewModel.shareAsset(context, it) } },
shareAssetExternally = { conversationMessagesViewModel.shareAsset(context, it) },
shareAssetViaWire = { messageId ->
conversationMessagesViewModel.shareAssetViaWire(messageId) { path, assetName ->
navigator.navigate(
NavigationCommand(
ImportMediaScreenDestination(
ImportMediaNavArgs(arrayListOf(context.fileShareUri(path, assetName)))
)
)
)
}
},
downloadAsset = conversationMessagesViewModel::openOrFetchAsset,
)

Expand Down Expand Up @@ -248,7 +262,8 @@ private fun Content(
private fun AssetOptionsModalSheetLayout(
sheetState: WireModalSheetState<AssetOptionsData>,
deleteAsset: (messageId: String, isMyMessage: Boolean) -> Unit,
shareAsset: (messageId: String) -> Unit,
shareAssetExternally: (messageId: String) -> Unit,
shareAssetViaWire: (messageId: String) -> Unit,
downloadAsset: (messageId: String) -> Unit,
) {
WireModalSheetLayout(
Expand All @@ -259,7 +274,8 @@ private fun AssetOptionsModalSheetLayout(
isUploading = false, // only uploaded assets
isEphemeral = false, // only non-self-deleting assets
onDeleteClick = remember { { sheetState.hide { deleteAsset(messageId, isMyMessage) } } },
onShareAsset = remember { { sheetState.hide { shareAsset(messageId) } } },
onShareAssetExternally = remember { { sheetState.hide { shareAssetExternally(messageId) } } },
onShareAssetViaWire = remember { { sheetState.hide { shareAssetViaWire(messageId) } } },
onDownloadAsset = remember { { sheetState.hide { downloadAsset(messageId) } } },
)
)
Expand Down Expand Up @@ -321,7 +337,8 @@ fun PreviewAssetOptionsModalSheetLayout() = WireTheme {
)
),
deleteAsset = { _, _ -> },
shareAsset = { },
shareAssetExternally = { },
shareAssetViaWire = { },
downloadAsset = { }
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,14 @@ class ConversationMessagesViewModel(
}
}

fun shareAssetViaWire(messageId: String, onAssetReady: (Path, String) -> Unit) {
viewModelScope.launch {
assetDataPath(conversationId, messageId)?.run {
onAssetReady(first, second)
}
}
}

private suspend fun assetDataPath(conversationId: QualifiedID, messageId: String): Pair<Path, String>? =
getMessageAsset(conversationId, messageId).await().run {
return when (this) {
Expand Down
Loading
Loading