Html clickable text: re-enable long click
This commit is contained in:
parent
1435428c7f
commit
275005f598
3 changed files with 65 additions and 27 deletions
|
|
@ -406,7 +406,8 @@ fun MessageEventRow(
|
||||||
content = messageEvent.content,
|
content = messageEvent.content,
|
||||||
interactionSource = interactionSource,
|
interactionSource = interactionSource,
|
||||||
modifier = contentModifier,
|
modifier = contentModifier,
|
||||||
onTextClicked = onClick
|
onTextClicked = onClick,
|
||||||
|
onTextLongClicked = onLongClick
|
||||||
)
|
)
|
||||||
is MessagesTimelineItemUnknownContent -> MessagesTimelineItemUnknownView(
|
is MessagesTimelineItemUnknownContent -> MessagesTimelineItemUnknownView(
|
||||||
content = messageEvent.content,
|
content = messageEvent.content,
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ fun MessagesTimelineItemTextView(
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val htmlDocument = content.htmlDocument
|
val htmlDocument = content.htmlDocument
|
||||||
if (htmlDocument != null) {
|
if (htmlDocument != null) {
|
||||||
|
|
@ -21,6 +22,7 @@ fun MessagesTimelineItemTextView(
|
||||||
document = htmlDocument,
|
document = htmlDocument,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
@file:OptIn(ExperimentalMaterialApi::class)
|
|
||||||
|
|
||||||
package io.element.android.x.features.messages.components.html
|
package io.element.android.x.features.messages.components.html
|
||||||
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
|
|
@ -15,7 +13,6 @@ import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.drawBehind
|
import androidx.compose.ui.draw.drawBehind
|
||||||
import androidx.compose.ui.geometry.Offset
|
import androidx.compose.ui.geometry.Offset
|
||||||
|
|
@ -32,7 +29,6 @@ import androidx.compose.ui.unit.sp
|
||||||
import com.google.accompanist.flowlayout.FlowRow
|
import com.google.accompanist.flowlayout.FlowRow
|
||||||
import io.element.android.x.matrix.permalink.PermalinkData
|
import io.element.android.x.matrix.permalink.PermalinkData
|
||||||
import io.element.android.x.matrix.permalink.PermalinkParser
|
import io.element.android.x.matrix.permalink.PermalinkParser
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import org.jsoup.nodes.Node
|
import org.jsoup.nodes.Node
|
||||||
|
|
@ -45,12 +41,14 @@ fun HtmlDocument(
|
||||||
document: Document,
|
document: Document,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
HtmlBody(
|
HtmlBody(
|
||||||
body = document.body(),
|
body = document.body(),
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -60,6 +58,7 @@ private fun HtmlBody(
|
||||||
body: Element,
|
body: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
@ -67,6 +66,7 @@ private fun HtmlBody(
|
||||||
fun NodesFlowRode(
|
fun NodesFlowRode(
|
||||||
nodes: Iterator<Node>,
|
nodes: Iterator<Node>,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) = FlowRow(
|
) = FlowRow(
|
||||||
mainAxisSpacing = 2.dp,
|
mainAxisSpacing = 2.dp,
|
||||||
|
|
@ -85,12 +85,14 @@ private fun HtmlBody(
|
||||||
HtmlInline(
|
HtmlInline(
|
||||||
node,
|
node,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
HtmlBlock(
|
HtmlBlock(
|
||||||
element = node,
|
element = node,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
sameRow = false
|
sameRow = false
|
||||||
|
|
@ -107,6 +109,7 @@ private fun HtmlBody(
|
||||||
NodesFlowRode(
|
NodesFlowRode(
|
||||||
nodes = nodesIterator,
|
nodes = nodesIterator,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -126,6 +129,7 @@ private fun HtmlBlock(
|
||||||
element: Element,
|
element: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
val blockModifier = modifier
|
val blockModifier = modifier
|
||||||
|
|
@ -135,30 +139,35 @@ private fun HtmlBlock(
|
||||||
paragraph = element,
|
paragraph = element,
|
||||||
modifier = blockModifier,
|
modifier = blockModifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
"h1", "h2", "h3", "h4", "h5", "h6" -> HtmlHeading(
|
"h1", "h2", "h3", "h4", "h5", "h6" -> HtmlHeading(
|
||||||
heading = element,
|
heading = element,
|
||||||
modifier = blockModifier,
|
modifier = blockModifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
"ol" -> HtmlOrderedList(
|
"ol" -> HtmlOrderedList(
|
||||||
orderedList = element,
|
orderedList = element,
|
||||||
modifier = blockModifier,
|
modifier = blockModifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
"ul" -> HtmlUnorderedList(
|
"ul" -> HtmlUnorderedList(
|
||||||
unorderedList = element,
|
unorderedList = element,
|
||||||
modifier = blockModifier,
|
modifier = blockModifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
"blockquote" -> HtmlBlockquote(
|
"blockquote" -> HtmlBlockquote(
|
||||||
blockquote = element,
|
blockquote = element,
|
||||||
modifier = blockModifier,
|
modifier = blockModifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
"pre" -> HtmlPreformatted(element, blockModifier)
|
"pre" -> HtmlPreformatted(element, blockModifier)
|
||||||
|
|
@ -166,6 +175,7 @@ private fun HtmlBlock(
|
||||||
mxReply = element,
|
mxReply = element,
|
||||||
modifier = blockModifier,
|
modifier = blockModifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
else -> return
|
else -> return
|
||||||
|
|
@ -177,13 +187,19 @@ private fun HtmlInline(
|
||||||
element: Element,
|
element: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
Box(modifier) {
|
Box(modifier) {
|
||||||
val styledText = buildAnnotatedString {
|
val styledText = buildAnnotatedString {
|
||||||
appendInlineElement(element, MaterialTheme.colorScheme)
|
appendInlineElement(element, MaterialTheme.colorScheme)
|
||||||
}
|
}
|
||||||
HtmlText(text = styledText, onClick = onTextClicked, interactionSource = interactionSource)
|
HtmlText(
|
||||||
|
text = styledText,
|
||||||
|
onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked,
|
||||||
|
interactionSource = interactionSource
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -208,14 +224,17 @@ private fun HtmlPreformatted(pre: Element, modifier: Modifier = Modifier) {
|
||||||
private fun HtmlParagraph(
|
private fun HtmlParagraph(
|
||||||
paragraph: Element,
|
paragraph: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit, onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
Box(modifier) {
|
Box(modifier) {
|
||||||
val styledText = buildAnnotatedString {
|
val styledText = buildAnnotatedString {
|
||||||
appendInlineChildrenElements(paragraph.childNodes(), MaterialTheme.colorScheme)
|
appendInlineChildrenElements(paragraph.childNodes(), MaterialTheme.colorScheme)
|
||||||
}
|
}
|
||||||
HtmlText(text = styledText, onClick = onTextClicked, interactionSource = interactionSource)
|
HtmlText(
|
||||||
|
text = styledText, onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked, interactionSource = interactionSource
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -223,7 +242,7 @@ private fun HtmlParagraph(
|
||||||
private fun HtmlBlockquote(
|
private fun HtmlBlockquote(
|
||||||
blockquote: Element,
|
blockquote: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit, onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
val color = MaterialTheme.colorScheme.onBackground
|
val color = MaterialTheme.colorScheme.onBackground
|
||||||
|
|
@ -244,7 +263,10 @@ private fun HtmlBlockquote(
|
||||||
appendInlineChildrenElements(blockquote.childNodes(), MaterialTheme.colorScheme)
|
appendInlineChildrenElements(blockquote.childNodes(), MaterialTheme.colorScheme)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HtmlText(text = text, onClick = onTextClicked, interactionSource = interactionSource)
|
HtmlText(
|
||||||
|
text = text, onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked, interactionSource = interactionSource
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -253,7 +275,7 @@ private fun HtmlBlockquote(
|
||||||
private fun HtmlHeading(
|
private fun HtmlHeading(
|
||||||
heading: Element,
|
heading: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit, onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
val style = when (heading.normalName()) {
|
val style = when (heading.normalName()) {
|
||||||
|
|
@ -275,6 +297,7 @@ private fun HtmlHeading(
|
||||||
text = text,
|
text = text,
|
||||||
style = style,
|
style = style,
|
||||||
onClick = onTextClicked,
|
onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -284,7 +307,7 @@ private fun HtmlHeading(
|
||||||
private fun HtmlMxReply(
|
private fun HtmlMxReply(
|
||||||
mxReply: Element,
|
mxReply: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit, onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
val blockquote = mxReply.childNodes().firstOrNull() ?: return
|
val blockquote = mxReply.childNodes().firstOrNull() ?: return
|
||||||
|
|
@ -326,6 +349,7 @@ private fun HtmlMxReply(
|
||||||
text = text,
|
text = text,
|
||||||
modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp),
|
modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp),
|
||||||
onClick = onTextClicked,
|
onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -335,7 +359,7 @@ private fun HtmlMxReply(
|
||||||
private fun HtmlOrderedList(
|
private fun HtmlOrderedList(
|
||||||
orderedList: Element,
|
orderedList: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit, onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
var number = 1
|
var number = 1
|
||||||
|
|
@ -343,13 +367,16 @@ private fun HtmlOrderedList(
|
||||||
HtmlListItems(
|
HtmlListItems(
|
||||||
list = orderedList,
|
list = orderedList,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
) {
|
) {
|
||||||
val text = buildAnnotatedString {
|
val text = buildAnnotatedString {
|
||||||
append("${number++}$delimiter ${it.text()}")
|
append("${number++}$delimiter ${it.text()}")
|
||||||
}
|
}
|
||||||
HtmlText(text = text, onClick = onTextClicked, interactionSource = interactionSource)
|
HtmlText(
|
||||||
|
text = text, onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked, interactionSource = interactionSource
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -357,20 +384,23 @@ private fun HtmlOrderedList(
|
||||||
private fun HtmlUnorderedList(
|
private fun HtmlUnorderedList(
|
||||||
unorderedList: Element,
|
unorderedList: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit, onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
val marker = "・"
|
val marker = "・"
|
||||||
HtmlListItems(
|
HtmlListItems(
|
||||||
list = unorderedList,
|
list = unorderedList,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
) {
|
) {
|
||||||
val text = buildAnnotatedString {
|
val text = buildAnnotatedString {
|
||||||
append("$marker ${it.text()}")
|
append("$marker ${it.text()}")
|
||||||
}
|
}
|
||||||
HtmlText(text = text, onClick = onTextClicked, interactionSource = interactionSource)
|
HtmlText(
|
||||||
|
text = text, onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked, interactionSource = interactionSource
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -379,7 +409,7 @@ private fun HtmlUnorderedList(
|
||||||
private fun HtmlListItems(
|
private fun HtmlListItems(
|
||||||
list: Element,
|
list: Element,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit,
|
onTextClicked: () -> Unit, onTextLongClicked: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
content: @Composable (node: TextNode) -> Unit
|
content: @Composable (node: TextNode) -> Unit
|
||||||
) {
|
) {
|
||||||
|
|
@ -393,7 +423,7 @@ private fun HtmlListItems(
|
||||||
is Element -> HtmlBlock(
|
is Element -> HtmlBlock(
|
||||||
element = innerNode,
|
element = innerNode,
|
||||||
modifier = modifier.padding(start = 4.dp),
|
modifier = modifier.padding(start = 4.dp),
|
||||||
onTextClicked = onTextClicked,
|
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -496,23 +526,28 @@ private fun HtmlText(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
style: TextStyle = LocalTextStyle.current,
|
style: TextStyle = LocalTextStyle.current,
|
||||||
onClick: () -> Unit,
|
onClick: () -> Unit,
|
||||||
|
onLongClick: () -> Unit,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
) {
|
) {
|
||||||
val coroutineScope = rememberCoroutineScope()
|
|
||||||
val uriHandler = LocalUriHandler.current
|
val uriHandler = LocalUriHandler.current
|
||||||
val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
|
val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
|
||||||
val pressIndicator = Modifier.pointerInput(onClick) {
|
val pressIndicator = Modifier.pointerInput(onClick) {
|
||||||
detectTapGestures { offset ->
|
detectTapGestures(
|
||||||
|
onPress = { offset: Offset ->
|
||||||
|
val pressInteraction = PressInteraction.Press(offset)
|
||||||
|
interactionSource.emit(pressInteraction)
|
||||||
|
awaitRelease()
|
||||||
|
interactionSource.emit(PressInteraction.Release(pressInteraction))
|
||||||
|
},
|
||||||
|
onLongPress = { _ ->
|
||||||
|
onLongClick()
|
||||||
|
}
|
||||||
|
) { offset ->
|
||||||
layoutResult.value?.let { layoutResult ->
|
layoutResult.value?.let { layoutResult ->
|
||||||
val position = layoutResult.getOffsetForPosition(offset)
|
val position = layoutResult.getOffsetForPosition(offset)
|
||||||
val linkAnnotations = text.getStringAnnotations("link", position, position)
|
val linkAnnotations = text.getStringAnnotations("link", position, position)
|
||||||
if (linkAnnotations.isEmpty()) {
|
if (linkAnnotations.isEmpty()) {
|
||||||
onClick()
|
onClick()
|
||||||
coroutineScope.launch {
|
|
||||||
val pressInteraction = PressInteraction.Press(offset)
|
|
||||||
interactionSource.emit(pressInteraction)
|
|
||||||
interactionSource.emit(PressInteraction.Release(pressInteraction))
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
uriHandler.openUri(linkAnnotations.first().item)
|
uriHandler.openUri(linkAnnotations.first().item)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue