Skip to content

Commit 2723517

Browse files
committed
links in parent messages are not clickable
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
1 parent ea56e12 commit 2723517

2 files changed

Lines changed: 39 additions & 12 deletions

File tree

app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageScaffold.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ private fun shouldShowTimeNextToContent(
139139

140140
private val mentionChipTypes = setOf("user", "guest", "call", "user-group", "email", "circle")
141141

142+
private val parentMessageLinkRegex = Regex(
143+
"""https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[^\s)]*)?"""
144+
)
145+
142146
private fun ChatMessageUi.hasMentionChips(): Boolean =
143147
messageParameters.any { (key, parameter) ->
144148
message.contains("{$key}") && parameter["type"] in mentionChipTypes
@@ -674,9 +678,13 @@ fun CommonMessageQuote(message: ChatMessageUi) {
674678
fontSize = authorTextSize,
675679
color = colorResource(R.color.no_emphasis_text)
676680
)
681+
682+
val hasParentLink = parentMessageLinkRegex.containsMatchIn(message.message)
683+
677684
EnrichedText(
678685
message,
679-
Modifier.padding(start = 10.dp)
686+
Modifier.padding(start = 10.dp),
687+
!hasParentLink
680688
)
681689
}
682690
}
@@ -763,15 +771,16 @@ fun ThreadTitle(
763771
}
764772

765773
@Composable
766-
fun EnrichedText(message: ChatMessageUi, modifier: Modifier) {
774+
fun EnrichedText(message: ChatMessageUi, modifier: Modifier, enableLinks: Boolean = true) {
767775
MentionEnrichedText(
768776
message = message,
769777
modifier = modifier,
770778
textStyle = TextStyle(
771779
fontSize = regularTextSize,
772780
color = colorScheme.onSurface,
773781
lineHeight = regularTextSize * LINE_SPACING
774-
)
782+
),
783+
enableLinks = enableLinks
775784
)
776785
}
777786

app/src/main/java/com/nextcloud/talk/ui/chat/MentionEnrichedText.kt

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,25 @@ private data class MentionChipModel(
9090
private data class MentionRichText(val annotated: AnnotatedString, val inlineContent: Map<String, InlineTextContent>)
9191

9292
@Composable
93-
fun MentionEnrichedText(message: ChatMessageUi, modifier: Modifier = Modifier, textStyle: TextStyle) {
93+
fun MentionEnrichedText(
94+
message: ChatMessageUi,
95+
modifier: Modifier = Modifier,
96+
textStyle: TextStyle,
97+
enableLinks: Boolean = true
98+
) {
9499
var isMultilineLayout by remember(message.id, message.message) {
95100
mutableStateOf(message.message.contains("\n") || message.message.contains("\r"))
96101
}
97102
val linkColor = MaterialTheme.colorScheme.primary
98103
val codeBackground = MaterialTheme.colorScheme.surfaceVariant
99-
val richText = remember(message, isMultilineLayout, linkColor, codeBackground, textStyle) {
104+
val richText = remember(message, isMultilineLayout, linkColor, codeBackground, textStyle, enableLinks) {
100105
buildMentionRichText(
101106
message = message,
102107
linkColor = linkColor,
103108
codeBackground = codeBackground,
104109
textStyle = textStyle,
105-
isMultilineLayout = isMultilineLayout
110+
isMultilineLayout = isMultilineLayout,
111+
enableLinks = enableLinks
106112
)
107113
}
108114
val resolvedTextStyle = if (richText.inlineContent.isEmpty()) {
@@ -125,12 +131,14 @@ fun MentionEnrichedText(message: ChatMessageUi, modifier: Modifier = Modifier, t
125131
)
126132
}
127133

134+
@Suppress("LongParameterList")
128135
private fun buildMentionRichText(
129136
message: ChatMessageUi,
130137
linkColor: Color,
131138
codeBackground: Color,
132139
textStyle: TextStyle,
133-
isMultilineLayout: Boolean
140+
isMultilineLayout: Boolean,
141+
enableLinks: Boolean
134142
): MentionRichText {
135143
val inlineContent = linkedMapOf<String, InlineTextContent>()
136144
var mentionCounter = 0
@@ -177,10 +185,13 @@ private fun buildMentionRichText(
177185
token.startsWith("[") -> {
178186
val textPart = token.substringAfter("[").substringBefore("]")
179187
val url = token.substringAfter("(").substringBefore(")")
180-
appendLinkedToken(textPart, url, linkColor)
188+
appendLinkedToken(textPart, url, linkColor, enableLinks)
181189
}
182190

183-
token.startsWith("http") -> appendLinkedToken(token, token, linkColor)
191+
token.startsWith("http") -> appendLinkedToken(token, token, linkColor, enableLinks)
192+
token.matches(
193+
Regex("""https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[^\s)]*)?""")
194+
) -> appendLinkedToken(token, token, linkColor, enableLinks)
184195
}
185196

186197
lastIndex = range.last + 1
@@ -200,11 +211,18 @@ private fun AnnotatedString.Builder.appendStyledToken(text: String, style: SpanS
200211
addStyle(style, start, length)
201212
}
202213

203-
private fun AnnotatedString.Builder.appendLinkedToken(text: String, url: String, linkColor: Color) {
214+
private fun AnnotatedString.Builder.appendLinkedToken(
215+
text: String,
216+
url: String,
217+
linkColor: Color,
218+
enableLinks: Boolean
219+
) {
204220
val start = length
205221
append(text)
206-
addStyle(SpanStyle(color = linkColor, textDecoration = TextDecoration.Underline), start, length)
207-
addLink(LinkAnnotation.Url(url), start, length)
222+
if (enableLinks) {
223+
addStyle(SpanStyle(color = linkColor, textDecoration = TextDecoration.Underline), start, length)
224+
addLink(LinkAnnotation.Url(url), start, length)
225+
}
208226
}
209227

210228
private fun AnnotatedString.Builder.appendFallbackParameter(

0 commit comments

Comments
 (0)