diff options
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. */ |