summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mill Chen <millchen@google.com> 2024-09-24 07:45:01 +0000
committer Mill Chen <millchen@google.com> 2024-09-30 09:21:24 +0000
commit54d324e782d293d7945c8cd38e1707218ce9a75f (patch)
tree41de7c303297fe22f661b9160ce9f18417d17dce
parentb503c936d52679bb5406bfb8783c32c75697ea89 (diff)
[Expressive design] support learn more
Bug: 367394720 Test: visual Flag: EXEMPT bug fix Change-Id: I45efd9a94bb3b6bae67ee2146fb9ee935291c2a6
-rw-r--r--packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml13
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml6
-rw-r--r--packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt58
-rw-r--r--packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt41
-rw-r--r--packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt32
5 files changed, 149 insertions, 1 deletions
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml
index 245d3682636b..4cc3c89dadb5 100644
--- a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml
+++ b/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_collapsable_textview.xml
@@ -41,9 +41,20 @@
android:ellipsize="end"
android:textAppearance="@style/TextAppearance.TopIntroText"/>
+ <com.android.settingslib.widget.LinkableTextView
+ android:id="@+id/settingslib_expressive_learn_more"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_constraintTop_toBottomOf="@android:id/title"
+ app:layout_constraintStart_toStartOf="parent"
+ android:textAlignment="viewStart"
+ android:clickable="true"
+ android:visibility="gone"
+ style="@style/SettingslibTextAppearance.LinkableTextStyle.Expressive"/>
+
<com.google.android.material.button.MaterialButton
android:id="@+id/collapse_button"
- app:layout_constraintTop_toBottomOf="@android:id/title"
+ app:layout_constraintTop_toBottomOf="@id/settingslib_expressive_learn_more"
app:layout_constraintStart_toStartOf="parent"
android:text="@string/settingslib_expressive_text_expand"
app:icon="@drawable/settingslib_expressive_icon_expand"
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
index 9c659050b15e..88f7eb8737a2 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
@@ -329,4 +329,10 @@
<item name="android:textDirection">locale</item>
<item name="android:textAppearance">@style/TextAppearance.EntityHeaderTitle</item>
</style>
+
+ <style name="SettingslibTextAppearance.LinkableTextStyle.Expressive"
+ parent="@android:style/TextAppearance.DeviceDefault.WindowTitle">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textColor">?android:attr/colorAccent</item>
+ </style>
</resources> \ No newline at end of file
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 127f21a540ab..7797a0d6dcde 100644
--- a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
+++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
@@ -18,6 +18,9 @@ package com.android.settingslib.widget
import android.content.Context
import android.graphics.drawable.Drawable
+import android.text.SpannableString
+import android.text.TextUtils
+import android.text.style.URLSpan
import android.util.AttributeSet
import android.view.Gravity
import android.view.LayoutInflater
@@ -40,12 +43,18 @@ class CollapsableTextView @JvmOverloads constructor(
private val titleTextView: TextView
private val collapseButton: MaterialButton
private val collapseButtonResources: CollapseButtonResources
+ private var learnMoreListener: View.OnClickListener? = null
+ private var learnMoreText: CharSequence? = null
+ private var learnMoreSpan: LearnMoreSpan? = null
+ val learnMoreTextView: LinkableTextView
+ var isLearnMoreEnabled: Boolean = false
init {
LayoutInflater.from(context)
.inflate(R.layout.settingslib_expressive_collapsable_textview, this)
titleTextView = findViewById(android.R.id.title)
collapseButton = findViewById(R.id.collapse_button)
+ learnMoreTextView = findViewById(R.id.settingslib_expressive_learn_more)
collapseButtonResources = CollapseButtonResources(
context.getDrawable(R.drawable.settingslib_expressive_icon_collapse)!!,
@@ -111,6 +120,45 @@ class CollapsableTextView @JvmOverloads constructor(
updateView()
}
+ /**
+ * Sets the action when clicking on the learn more view.
+ * @param listener The click listener for learn more.
+ */
+ fun setLearnMoreAction(listener: View.OnClickListener?) {
+ if (learnMoreListener != listener) {
+ learnMoreListener = listener
+ formatLearnMoreText()
+ }
+ }
+
+ /**
+ * Sets the text of learn more view.
+ * @param text The text of learn more.
+ */
+ fun setLearnMoreText(text: CharSequence?) {
+ if (!TextUtils.equals(learnMoreText, text)) {
+ learnMoreText = text
+ formatLearnMoreText()
+ }
+ }
+
+ private fun formatLearnMoreText() {
+ if (learnMoreListener == null || TextUtils.isEmpty(learnMoreText)) {
+ learnMoreTextView.visibility = GONE
+ isLearnMoreEnabled = false
+ return
+ }
+ val spannableLearnMoreText = SpannableString(learnMoreText)
+ if (learnMoreSpan != null) {
+ spannableLearnMoreText.removeSpan(learnMoreSpan)
+ }
+ learnMoreSpan = LearnMoreSpan(clickListener = learnMoreListener!!)
+ spannableLearnMoreText.setSpan(learnMoreSpan, 0, learnMoreText!!.length, 0)
+ learnMoreTextView.setText(spannableLearnMoreText)
+ learnMoreTextView.visibility = VISIBLE
+ isLearnMoreEnabled = true
+ }
+
private fun updateView() {
when {
isCollapsed -> {
@@ -130,6 +178,7 @@ class CollapsableTextView @JvmOverloads constructor(
}
}
collapseButton.visibility = if (isCollapsable) VISIBLE else GONE
+ learnMoreTextView.visibility = if (isLearnMoreEnabled && !isCollapsed) VISIBLE else GONE
}
private data class CollapseButtonResources(
@@ -148,3 +197,12 @@ class CollapsableTextView @JvmOverloads constructor(
}
}
+internal class LearnMoreSpan(
+ val url: String = "",
+ val clickListener: View.OnClickListener) : URLSpan(url) {
+ override fun onClick(widget: View) {
+ if (clickListener != null) {
+ clickListener.onClick(widget)
+ }
+ }
+}
diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt
new file mode 100644
index 000000000000..94a2d448bc6e
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/LinkableTextView.kt
@@ -0,0 +1,41 @@
+/*
+* Copyright (C) 2024 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package com.android.settingslib.widget
+
+import android.content.Context
+import android.text.Spanned
+import android.text.method.LinkMovementMethod
+import android.text.style.ClickableSpan
+import android.util.AttributeSet
+import android.widget.TextView
+
+class LinkableTextView @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : TextView(context, attrs, defStyleAttr) {
+
+ override fun setText(text: CharSequence, type: BufferType?) {
+ super.setText(text, type)
+ if (text is Spanned) {
+ val spans = text.getSpans(0, text.length, ClickableSpan::class.java)
+ if (spans.size > 0) {
+ movementMethod = LinkMovementMethod.getInstance()
+ }
+ }
+ }
+} \ No newline at end of file
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 afced0c8d638..1c5cd2aeaeb6 100644
--- a/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt
+++ b/packages/SettingsLib/TopIntroPreference/src/com/android/settingslib/widget/TopIntroPreference.kt
@@ -18,7 +18,9 @@ package com.android.settingslib.widget
import android.content.Context
import android.os.Build
+import android.text.TextUtils
import android.util.AttributeSet
+import android.view.View
import androidx.annotation.RequiresApi
import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
@@ -33,6 +35,8 @@ open class TopIntroPreference @JvmOverloads constructor(
private var isCollapsable: Boolean = false
private var minLines: Int = 2
+ private var learnMoreListener: View.OnClickListener? = null
+ private var learnMoreText: CharSequence? = null
init {
if (SettingsThemeHelper.isExpressiveTheme(context)) {
@@ -71,6 +75,10 @@ open class TopIntroPreference @JvmOverloads constructor(
setCollapsable(isCollapsable)
setMinLines(minLines)
setText(title.toString())
+ if (learnMoreListener != null) {
+ setLearnMoreText(learnMoreText)
+ setLearnMoreAction(learnMoreListener)
+ }
}
}
@@ -94,6 +102,30 @@ open class TopIntroPreference @JvmOverloads constructor(
notifyChanged()
}
+ /**
+ * Sets the action when clicking on the learn more view.
+ * @param listener The click listener for learn more.
+ */
+ @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ fun setLearnMoreAction(listener: View.OnClickListener) {
+ if (learnMoreListener != listener) {
+ learnMoreListener = listener
+ notifyChanged()
+ }
+ }
+
+ /**
+ * Sets the text of learn more view.
+ * @param text The text of learn more.
+ */
+ @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ fun setLearnMoreText(text: CharSequence) {
+ if (!TextUtils.equals(learnMoreText, text)) {
+ learnMoreText = text
+ notifyChanged()
+ }
+ }
+
companion object {
private const val DEFAULT_MAX_LINES = 10
private const val DEFAULT_MIN_LINES = 2