diff options
author | 2024-05-14 19:28:11 +0000 | |
---|---|---|
committer | 2024-07-16 14:46:53 +0000 | |
commit | 12f0aa6898514562b71355e37e1436d55788ef56 (patch) | |
tree | 47e29c74f6b162ba5cd57d43443af6a22e8d0f95 | |
parent | e55df48813fd97213c302ab9448657fc33cffd76 (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.kt | 35 |
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) } |