Skip to content

Commit 2f7b6e2

Browse files
committed
make entire quoted text clickable
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
1 parent acf6468 commit 2f7b6e2

3 files changed

Lines changed: 45 additions & 21 deletions

File tree

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import androidx.compose.material3.Surface
3535
import androidx.compose.material3.Text
3636
import androidx.compose.runtime.Composable
3737
import androidx.compose.runtime.compositionLocalOf
38-
import androidx.compose.runtime.getValue
3938
import androidx.compose.runtime.remember
4039
import androidx.compose.foundation.rememberScrollState
4140
import androidx.compose.ui.Alignment
@@ -712,14 +711,14 @@ fun CommonMessageQuote(message: ChatMessageUi) {
712711
iconRes = R.drawable.baseline_location_pin_24,
713712
label = c.name
714713
)
715-
else -> QuoteTextContent(message)
714+
else -> QuoteTextContent(message, onClick = {onQuotedMessageClick(message.id)} )
716715
}
717716
}
718717
}
719718

720719
@Composable
721-
private fun QuoteTextContent(message: ChatMessageUi) {
722-
Column {
720+
private fun QuoteTextContent(message: ChatMessageUi, onClick: () -> Unit) {
721+
Column ( modifier = Modifier.combinedClickable(onClick = onClick)){
723722
Text(
724723
message.actorDisplayName,
725724
fontSize = authorTextSize,
@@ -740,7 +739,9 @@ private fun QuoteTextContent(message: ChatMessageUi) {
740739
color = colorScheme.onSurface,
741740
lineHeight = fontSize * LINE_SPACING
742741
),
743-
maxLines = 4
742+
maxLines = 4,
743+
enableMentionClicks = false,
744+
onDisabledMentionClick = onClick
744745
)
745746
}
746747
}

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

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.runtime.Composable
2525
import androidx.compose.runtime.remember
2626
import androidx.compose.ui.Alignment
2727
import androidx.compose.ui.Modifier
28+
import androidx.compose.ui.draw.clip
2829
import androidx.compose.ui.graphics.Color
2930
import androidx.compose.ui.platform.LocalContext
3031
import androidx.compose.ui.platform.LocalDensity
@@ -34,7 +35,6 @@ import androidx.compose.ui.res.stringResource
3435
import androidx.compose.ui.semantics.Role
3536
import androidx.compose.ui.semantics.contentDescription
3637
import androidx.compose.ui.semantics.role
37-
import androidx.compose.ui.draw.clip
3838
import androidx.compose.ui.semantics.semantics
3939
import androidx.compose.ui.text.AnnotatedString
4040
import androidx.compose.ui.text.Placeholder
@@ -88,7 +88,8 @@ fun parseMentionChipModel(
8888
messageParameters: Map<String, Map<String, String>>,
8989
activeUserId: String?,
9090
activeUserBaseUrl: String?,
91-
roomToken: String?
91+
roomToken: String?,
92+
enableMentionClicks: Boolean = true
9293
): MentionChipModel? =
9394
messageParameters[key]
9495
?.takeIf { it["type"] in mentionParameterTypes }
@@ -117,7 +118,7 @@ fun parseMentionChipModel(
117118
type = type,
118119
isFederated = isFederated,
119120
isSelfMention = isSelfMention,
120-
isClickableUserMention = type == "user" && !isSelfMention && !isFederated,
121+
isClickableUserMention = enableMentionClicks && type == "user" && !isSelfMention && !isFederated,
121122
avatarUrl = avatarUrl
122123
)
123124
}
@@ -170,7 +171,8 @@ fun estimateMentionChipWidthInEm(label: String, fontSizeSp: Float): Float {
170171
fun buildMentionInlineContent(
171172
mention: MentionChipModel,
172173
textStyle: TextStyle,
173-
isMultilineLayout: Boolean
174+
isMultilineLayout: Boolean,
175+
onDisabledMentionClick: (() -> Unit)? = null
174176
): InlineTextContent {
175177
val fontSizeSp = if (textStyle.fontSize.isSpecified) textStyle.fontSize.value else CHIP_FALLBACK_FONT_SIZE_SP
176178
val width = estimateMentionChipWidthInEm(mention.name, fontSizeSp)
@@ -192,7 +194,8 @@ fun buildMentionInlineContent(
192194
MentionChip(
193195
mention = mention,
194196
textStyle = textStyle,
195-
isMultilineLayout = isMultilineLayout
197+
isMultilineLayout = isMultilineLayout,
198+
onDisabledMentionClick = onDisabledMentionClick
196199
)
197200
}
198201
}
@@ -203,9 +206,10 @@ fun AnnotatedString.Builder.appendMentionChip(
203206
mention: MentionChipModel,
204207
inlineContent: MutableMap<String, InlineTextContent>,
205208
textStyle: TextStyle,
206-
isMultilineLayout: Boolean
209+
isMultilineLayout: Boolean,
210+
onDisabledMentionClick: (() -> Unit)? = null
207211
) {
208-
inlineContent[inlineId] = buildMentionInlineContent(mention, textStyle, isMultilineLayout)
212+
inlineContent[inlineId] = buildMentionInlineContent(mention, textStyle, isMultilineLayout, onDisabledMentionClick)
209213
appendInlineContent(inlineId, "@${mention.name}")
210214
}
211215

@@ -215,8 +219,9 @@ fun AnnotatedString.Builder.appendBoldToken(text: String) {
215219
addStyle(SpanStyle(fontWeight = FontWeight.Bold), start, length)
216220
}
217221

222+
218223
@Composable
219-
fun MentionChip(mention: MentionChipModel, textStyle: TextStyle, isMultilineLayout: Boolean) {
224+
fun MentionChip(mention: MentionChipModel, textStyle: TextStyle, isMultilineLayout: Boolean, onDisabledMentionClick: (() -> Unit)? = null) {
220225
val context = LocalContext.current
221226
val viewThemeUtils = LocalViewThemeUtils.current
222227
val density = LocalDensity.current
@@ -246,6 +251,19 @@ fun MentionChip(mention: MentionChipModel, textStyle: TextStyle, isMultilineLayo
246251
mention.name
247252
}
248253

254+
255+
val clickModifier = when {
256+
mention.isClickableUserMention -> Modifier.clickable {
257+
EventBus.getDefault().post(UserMentionClickEvent(mention.id))
258+
}
259+
260+
onDisabledMentionClick != null -> Modifier.clickable {
261+
onDisabledMentionClick()
262+
}
263+
264+
else -> Modifier
265+
}
266+
249267
Row(
250268
modifier = Modifier
251269
.semantics {
@@ -254,9 +272,7 @@ fun MentionChip(mention: MentionChipModel, textStyle: TextStyle, isMultilineLayo
254272
}
255273
.clip(RoundedCornerShape(chipCornerRadius))
256274
.background(backgroundColor)
257-
.clickable(enabled = mention.isClickableUserMention) {
258-
EventBus.getDefault().post(UserMentionClickEvent(mention.id))
259-
}
275+
.then(clickModifier)
260276
.padding(start = verticalPadding, top = verticalPadding, end = 4.dp, bottom = verticalPadding),
261277
verticalAlignment = Alignment.CenterVertically,
262278
horizontalArrangement = Arrangement.spacedBy(4.dp)

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ fun MentionEnrichedText(
3939
modifier: Modifier = Modifier,
4040
textStyle: TextStyle,
4141
maxLines: Int = Int.MAX_VALUE,
42-
highlightSearchTerm: String? = null
42+
highlightSearchTerm: String? = null,
43+
enableMentionClicks: Boolean = true,
44+
onDisabledMentionClick: (() -> Unit)? = null
4345
) {
4446
var isMultilineLayout by remember(message.id, message.message) {
4547
mutableStateOf(message.message.contains("\n") || message.message.contains("\r"))
@@ -58,7 +60,9 @@ fun MentionEnrichedText(
5860
linkColor = linkColor,
5961
codeBackground = codeBackground,
6062
textStyle = textStyle,
61-
isMultilineLayout = isMultilineLayout
63+
isMultilineLayout = isMultilineLayout,
64+
enableMentionClicks = enableMentionClicks,
65+
onDisabledMentionClick = onDisabledMentionClick
6266
)
6367
}
6468
val highlightedText = remember(richText.annotated, highlightSearchTerm) {
@@ -91,7 +95,9 @@ private fun buildMentionRichText(
9195
linkColor: Color,
9296
codeBackground: Color,
9397
textStyle: TextStyle,
94-
isMultilineLayout: Boolean
98+
isMultilineLayout: Boolean,
99+
enableMentionClicks: Boolean,
100+
onDisabledMentionClick: (() -> Unit)?
95101
): MentionRichText {
96102
val inlineContent = linkedMapOf<String, InlineTextContent>()
97103
var mentionCounter = 0
@@ -113,14 +119,15 @@ private fun buildMentionRichText(
113119
messageParameters = message.messageParameters,
114120
activeUserId = message.activeUserId,
115121
activeUserBaseUrl = message.activeUserBaseUrl,
116-
roomToken = message.roomToken
122+
roomToken = message.roomToken,
123+
enableMentionClicks = enableMentionClicks
117124
)
118125
if (mention == null) {
119126
appendFallbackParameter(token, message.messageParameters)
120127
} else {
121128
val inlineId = "mention-${message.id}-$mentionCounter"
122129
mentionCounter += 1
123-
appendMentionChip(inlineId, mention, inlineContent, textStyle, isMultilineLayout)
130+
appendMentionChip(inlineId, mention, inlineContent, textStyle, isMultilineLayout, onDisabledMentionClick)
124131
}
125132
}
126133

0 commit comments

Comments
 (0)