summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mill Chen <millchen@google.com> 2024-09-25 08:25:04 +0000
committer Mill Chen <millchen@google.com> 2024-09-30 09:22:48 +0000
commit3ca6e05adaa6fbfcd082cf9e66059f4cb9a45372 (patch)
tree8ec0bfe90b6b83077ca1d266563afd8f501dd143
parent54d324e782d293d7945c8cd38e1707218ce9a75f (diff)
[Expressive design] support hyperlink
Bug: 367394720 Test: visual Flag: EXEMPT bug fix Change-Id: I7e3c974186d71ddf3c27ce25432d8de763ef33cf
-rw-r--r--packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt47
-rw-r--r--packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt16
2 files changed, 63 insertions, 0 deletions
diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
index 7797a0d6dcde..f1cc4e952b99 100644
--- a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
+++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
@@ -18,8 +18,12 @@ package com.android.settingslib.widget
import android.content.Context
import android.graphics.drawable.Drawable
+import android.text.Spannable
import android.text.SpannableString
+import android.text.TextPaint
import android.text.TextUtils
+import android.text.method.LinkMovementMethod
+import android.text.style.ClickableSpan
import android.text.style.URLSpan
import android.util.AttributeSet
import android.view.Gravity
@@ -43,6 +47,7 @@ class CollapsableTextView @JvmOverloads constructor(
private val titleTextView: TextView
private val collapseButton: MaterialButton
private val collapseButtonResources: CollapseButtonResources
+ private var hyperlinkListener: View.OnClickListener? = null
private var learnMoreListener: View.OnClickListener? = null
private var learnMoreText: CharSequence? = null
private var learnMoreSpan: LearnMoreSpan? = null
@@ -142,6 +147,45 @@ class CollapsableTextView @JvmOverloads constructor(
}
}
+ fun setHyperlinkListener(listener: View.OnClickListener?) {
+ if (hyperlinkListener != listener) {
+ hyperlinkListener = listener
+ linkifyTitle()
+ }
+ }
+
+ private fun linkifyTitle() {
+ var text = titleTextView.text.toString()
+ val beginIndex = text.indexOf(LINK_BEGIN_MARKER)
+ text = text.replace(LINK_BEGIN_MARKER, "")
+ val endIndex = text.indexOf(LINK_END_MARKER)
+ text = text.replace(LINK_END_MARKER, "")
+ titleTextView.text = text
+ if (beginIndex == -1 || endIndex == -1 || beginIndex >= endIndex) {
+ return
+ }
+
+ titleTextView.setText(text, TextView.BufferType.SPANNABLE)
+ titleTextView.movementMethod = LinkMovementMethod.getInstance()
+ val spannableContent = titleTextView.getText() as Spannable
+ val spannableLink = object : ClickableSpan() {
+ override fun onClick(widget: View) {
+ hyperlinkListener?.onClick(widget)
+ }
+
+ override fun updateDrawState(ds: TextPaint) {
+ super.updateDrawState(ds)
+ ds.isUnderlineText = true
+ }
+ }
+ spannableContent.setSpan(
+ spannableLink,
+ beginIndex,
+ endIndex,
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ }
+
private fun formatLearnMoreText() {
if (learnMoreListener == null || TextUtils.isEmpty(learnMoreText)) {
learnMoreTextView.visibility = GONE
@@ -192,6 +236,9 @@ class CollapsableTextView @JvmOverloads constructor(
private const val DEFAULT_MAX_LINES = 10
private const val DEFAULT_MIN_LINES = 2
+ private const val LINK_BEGIN_MARKER = "LINK_BEGIN"
+ private const val LINK_END_MARKER = "LINK_END"
+
private val Attrs = R.styleable.CollapsableTextView
private val GravityAttr = R.styleable.CollapsableTextView_android_gravity
}
diff --git a/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt b/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt
index 1c5cd2aeaeb6..5be56f8ebc86 100644
--- a/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt
+++ b/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt
@@ -35,6 +35,7 @@ open class TopIntroPreference @JvmOverloads constructor(
private var isCollapsable: Boolean = false
private var minLines: Int = 2
+ private var hyperlinkListener: View.OnClickListener? = null
private var learnMoreListener: View.OnClickListener? = null
private var learnMoreText: CharSequence? = null
@@ -75,6 +76,9 @@ open class TopIntroPreference @JvmOverloads constructor(
setCollapsable(isCollapsable)
setMinLines(minLines)
setText(title.toString())
+ if (hyperlinkListener != null) {
+ setHyperlinkListener(hyperlinkListener)
+ }
if (learnMoreListener != null) {
setLearnMoreText(learnMoreText)
setLearnMoreAction(learnMoreListener)
@@ -103,6 +107,18 @@ open class TopIntroPreference @JvmOverloads constructor(
}
/**
+ * Sets the action when clicking on the hyperlink in the text.
+ * @param listener The click listener for hyperlink.
+ */
+ @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ fun setHyperlinkListener(listener: View.OnClickListener) {
+ if (hyperlinkListener != listener) {
+ hyperlinkListener = listener
+ notifyChanged()
+ }
+ }
+
+ /**
* Sets the action when clicking on the learn more view.
* @param listener The click listener for learn more.
*/