summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Bryce Lee <brycelee@google.com> 2024-05-14 19:28:11 +0000
committer Anvesh Renikindi <renikindi@google.com> 2024-07-16 14:46:53 +0000
commit12f0aa6898514562b71355e37e1436d55788ef56 (patch)
tree47e29c74f6b162ba5cd57d43443af6a22e8d0f95
parente55df48813fd97213c302ab9448657fc33cffd76 (diff)
Update ClickableText usage.
ClickableText has been deprecated. This change moves usage to BasicText, which supports click through the usage of annotated text. Test: N/A Bug: 340603757 LOW_COVERAGE_REASON=OTHER_FORM_FACTOR Change-Id: I885115db53dd0e3c9964c610cd9579eb4fa6f04f
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AnnotatedText.kt35
1 files changed, 19 insertions, 16 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AnnotatedText.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AnnotatedText.kt
index aca39b497..bcdf3b661 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AnnotatedText.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AnnotatedText.kt
@@ -19,12 +19,14 @@ package com.android.permissioncontroller.permission.ui.wear.elements
import android.text.Spanned
import android.text.style.ClickableSpan
import android.view.View
-import androidx.compose.foundation.text.ClickableText
+import androidx.compose.foundation.text.BasicText
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.LinkAnnotation
+import androidx.compose.ui.text.LinkInteractionListener
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.buildAnnotatedString
@@ -36,24 +38,24 @@ const val CLICKABLE_SPAN_TAG = "CLICKABLE_SPAN_TAG"
@Composable
fun AnnotatedText(text: CharSequence, style: TextStyle, modifier: Modifier = Modifier) {
val onClickCallbacks = mutableMapOf<String, (View) -> Unit>()
- val annotatedString = spannableStringToAnnotatedString(text, onClickCallbacks)
val context = LocalContext.current
- ClickableText(text = annotatedString, style = style, modifier = modifier) { offset ->
- // Fires the onClickCallback at the clicked position.
- // It's tricky to send an empty view over the parameter, but no way to get the proper one.
- // Need to improve to use it in common.
- annotatedString
- .getStringAnnotations(CLICKABLE_SPAN_TAG, offset, offset)
- .firstOrNull()
- ?.let { onClickCallbacks.get(it.item)?.invoke(View(context)) }
+ val listener = LinkInteractionListener {
+ if (it is LinkAnnotation.Clickable) {
+ onClickCallbacks.get(it.tag)?.invoke(View(context))
+ }
}
+
+ val annotatedString =
+ spannableStringToAnnotatedString(text, onClickCallbacks, listener = listener)
+ BasicText(text = annotatedString, style = style, modifier = modifier)
}
@Composable
private fun spannableStringToAnnotatedString(
text: CharSequence,
onClickCallbacks: MutableMap<String, (View) -> Unit>,
- spanColor: Color = MaterialTheme.colors.primary
+ spanColor: Color = MaterialTheme.colors.primary,
+ listener: LinkInteractionListener
) =
if (text is Spanned) {
buildAnnotatedString {
@@ -63,7 +65,7 @@ private fun spannableStringToAnnotatedString(
val end = text.getSpanEnd(span)
when (span) {
is ClickableSpan ->
- addClickableSpan(span, spanColor, start, end, onClickCallbacks)
+ addClickableSpan(span, spanColor, start, end, onClickCallbacks, listener)
else -> addStyle(SpanStyle(), start, end)
}
}
@@ -77,14 +79,15 @@ private fun AnnotatedString.Builder.addClickableSpan(
spanColor: Color,
start: Int,
end: Int,
- onClickCallbacks: MutableMap<String, (View) -> Unit>
+ onClickCallbacks: MutableMap<String, (View) -> Unit>,
+ listener: LinkInteractionListener
) {
+ val key = "${CLICKABLE_SPAN_TAG}:$start:$end"
+ onClickCallbacks[key] = span::onClick
+ addLink(LinkAnnotation.Clickable(key, linkInteractionListener = listener), start, end)
addStyle(
SpanStyle(color = spanColor, textDecoration = TextDecoration.Underline),
start,
end,
)
- val key = "${CLICKABLE_SPAN_TAG}:$start:$end"
- onClickCallbacks[key] = span::onClick
- addStringAnnotation(CLICKABLE_SPAN_TAG, key, start, end)
}