diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/MessageItem.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/MessageItem.kt index 12437d9818..36ccf8c7a5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/MessageItem.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/MessageItem.kt @@ -24,6 +24,7 @@ import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -107,6 +108,7 @@ fun MessageItem( onFailedMessageRetryClicked: (String) -> Unit = {}, onFailedMessageCancelClicked: (String) -> Unit = {}, onLinkClick: (String) -> Unit = {}, + isContentClickable: Boolean = false, onMessageClick: (messageId: String) -> Unit = {}, defaultBackgroundColor: Color = Color.Transparent, shouldDisplayMessageStatus: Boolean = true, @@ -140,17 +142,26 @@ fun MessageItem( Modifier.background(defaultBackgroundColor) } - Box(backgroundColorModifier) { + Box( + backgroundColorModifier + .clickable(enabled = isContentClickable, onClick = { + onMessageClick(message.header.messageId) + }) + ) { // padding needed to have same top padding for avatar and rest composables in message item val fullAvatarOuterPadding = dimensions().avatarClickablePadding + dimensions().avatarStatusBorderSize Row( Modifier .fillMaxWidth() - .combinedClickable( - enabled = message.isAvailable, - onClick = { onMessageClick(message.header.messageId) }, - onLongClick = remember(message) { { onLongClicked(message) } } - ) + .apply { + if (!isContentClickable) { + combinedClickable( + enabled = message.isAvailable, + onClick = { }, + onLongClick = remember(message) { { onLongClicked(message) } } + ) + } + } .padding( end = dimensions().messageItemHorizontalPadding, top = dimensions().messageItemVerticalPadding - fullAvatarOuterPadding, @@ -174,7 +185,7 @@ fun MessageItem( // because avatar takes start padding we don't need to add padding to message item UserProfileAvatar( avatarData = message.userAvatarData, - clickable = avatarClickable + clickable = if (isContentClickable) null else avatarClickable ) } else { // imitating width of space that avatar takes @@ -216,7 +227,7 @@ fun MessageItem( } val currentOnImageClick = remember(message) { - Clickable(enabled = isAvailable, onClick = { + Clickable(enabled = isAvailable && !isContentClickable, onClick = { onImageMessageClicked( message, source == MessageSource.Self @@ -225,7 +236,7 @@ fun MessageItem( onLongClicked(message) }) } - val onLongClick: (() -> Unit)? = remember(message) { + val onLongClick: (() -> Unit)? = if (isContentClickable) null else remember(message) { if (isAvailable) { { onLongClicked(message) } } else { @@ -245,7 +256,8 @@ fun MessageItem( onImageClick = currentOnImageClick, onLongClick = onLongClick, onOpenProfile = onOpenProfile, - onLinkClick = onLinkClick + onLinkClick = onLinkClick, + clickable = !isContentClickable ) } if (isMyMessage && shouldDisplayMessageStatus) { @@ -473,7 +485,8 @@ private fun MessageContent( onChangeAudioPosition: (String, Int) -> Unit, onLongClick: (() -> Unit)? = null, onOpenProfile: (String) -> Unit, - onLinkClick: (String) -> Unit + onLinkClick: (String) -> Unit, + clickable: Boolean ) { when (messageContent) { is UIMessageContent.ImageMessage -> { @@ -507,7 +520,8 @@ private fun MessageContent( onOpenProfile = onOpenProfile, buttonList = null, messageId = message.header.messageId, - onLinkClick = onLinkClick + onLinkClick = onLinkClick, + clickable = clickable ) PartialDeliveryInformation(messageContent.deliveryStatus) } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/MessageTypes.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/MessageTypes.kt index 27291d1299..b1be7d1697 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/MessageTypes.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/MessageTypes.kt @@ -83,7 +83,8 @@ internal fun MessageBody( onLongClick: (() -> Unit)? = null, onOpenProfile: (String) -> Unit, buttonList: List?, - onLinkClick: (String) -> Unit + onLinkClick: (String) -> Unit, + clickable: Boolean = true ) { val (displayMentions, text) = messageBody?.message?.let { mapToDisplayMentions(it, LocalContext.current.resources) @@ -107,7 +108,11 @@ internal fun MessageBody( TablesExtension.create() ) text?.also { - MarkdownDocument(Parser.builder().extensions(extensions).build().parse(it) as Document, nodeData) + MarkdownDocument( + Parser.builder().extensions(extensions).build().parse(it) as Document, + nodeData, + clickable + ) } buttonList?.also { MessageButtonsContent( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/search/messages/SearchConversationMessagesResultsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/search/messages/SearchConversationMessagesResultsScreen.kt index 4723dbeb0a..91af91e261 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/search/messages/SearchConversationMessagesResultsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/search/messages/SearchConversationMessagesResultsScreen.kt @@ -55,6 +55,7 @@ fun SearchConversationMessagesResultsScreen( defaultBackgroundColor = colorsScheme().backgroundVariant, shouldDisplayMessageStatus = false, shouldDisplayFooter = false, + isContentClickable = true, onMessageClick = onMessageClick ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/markdown/MarkdownComposer.kt b/app/src/main/kotlin/com/wire/android/ui/markdown/MarkdownComposer.kt index e22872d0b5..73deb9ab34 100644 --- a/app/src/main/kotlin/com/wire/android/ui/markdown/MarkdownComposer.kt +++ b/app/src/main/kotlin/com/wire/android/ui/markdown/MarkdownComposer.kt @@ -59,12 +59,24 @@ import kotlin.math.min import org.commonmark.node.Text as nodeText @Composable -fun MarkdownDocument(document: Document, nodeData: NodeData) { - MarkdownBlockChildren(document, nodeData) +fun MarkdownDocument( + document: Document, + nodeData: NodeData, + clickable: Boolean +) { + MarkdownBlockChildren( + document, + nodeData, + clickable + ) } @Composable -fun MarkdownBlockChildren(parent: Node, nodeData: NodeData) { +fun MarkdownBlockChildren( + parent: Node, + nodeData: NodeData, + clickable: Boolean = true +) { var child = parent.firstChild var updateMentions = nodeData.mentions @@ -72,11 +84,11 @@ fun MarkdownBlockChildren(parent: Node, nodeData: NodeData) { while (child != null) { val updatedNodeData = nodeData.copy(mentions = updateMentions) when (child) { - is Document -> MarkdownDocument(child, updatedNodeData) + is Document -> MarkdownDocument(child, updatedNodeData, clickable) is BlockQuote -> MarkdownBlockQuote(child, updatedNodeData) is ThematicBreak -> MarkdownThematicBreak() is Heading -> MarkdownHeading(child, updatedNodeData) - is Paragraph -> MarkdownParagraph(child, updatedNodeData) { + is Paragraph -> MarkdownParagraph(child, updatedNodeData, clickable) { updateMentions = it } diff --git a/app/src/main/kotlin/com/wire/android/ui/markdown/MarkdownParagraph.kt b/app/src/main/kotlin/com/wire/android/ui/markdown/MarkdownParagraph.kt index 8338a71d1c..4ad9c0627e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/markdown/MarkdownParagraph.kt +++ b/app/src/main/kotlin/com/wire/android/ui/markdown/MarkdownParagraph.kt @@ -29,7 +29,12 @@ import org.commonmark.node.Document import org.commonmark.node.Paragraph @Composable -fun MarkdownParagraph(paragraph: Paragraph, nodeData: NodeData, onMentionsUpdate: (List) -> Unit) { +fun MarkdownParagraph( + paragraph: Paragraph, + nodeData: NodeData, + clickable: Boolean, + onMentionsUpdate: (List) -> Unit +) { val padding = if (paragraph.parent is Document) dimensions().spacing8x else dimensions().spacing0x Box(modifier = Modifier.padding(bottom = padding)) { val annotatedString = buildAnnotatedString { @@ -43,7 +48,8 @@ fun MarkdownParagraph(paragraph: Paragraph, nodeData: NodeData, onMentionsUpdate style = nodeData.style, onLongClick = nodeData.onLongClick, onOpenProfile = nodeData.onOpenProfile, - onClickLink = nodeData.onLinkClick + onClickLink = nodeData.onLinkClick, + clickable = clickable ) } }