Add a learn more text in footerprefernce
Add this new learn more text view so that
It would keep the implementation and styling centralized
in our widget library, ensuring consistency.
Test: Check the learn more link works well.
Fix: 188009297
Change-Id: If88cc4c4b03047c53e1fa8f7025583bdee592013
diff --git a/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml b/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
index 3b50acc..e586dbb 100644
--- a/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
+++ b/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
@@ -43,13 +43,27 @@
android:layout_height="wrap_content"/>
</LinearLayout>
- <com.android.settingslib.widget.LinkTextView
- android:id="@android:id/title"
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingBottom="16dp"
- android:paddingTop="16dp"
- android:textColor="?android:attr/textColorSecondary"
- android:ellipsize="marquee" />
+ android:orientation="vertical">
+ <com.android.settingslib.widget.LinkTextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="16dp"
+ android:paddingBottom="8dp"
+ android:textColor="?android:attr/textColorSecondary"
+ android:ellipsize="marquee" />
+
+ <com.android.settingslib.widget.LinkTextView
+ android:id="@+id/settingslib_learn_more"
+ android:text="@string/settingslib_learn_more_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ android:visibility="gone"
+ style="@style/TextAppearance.Footer.Title.SettingsLib"/>
+ </LinearLayout>
</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml b/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
index 87e8358..990860a 100644
--- a/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
+++ b/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
@@ -42,13 +42,27 @@
android:layout_height="wrap_content"/>
</LinearLayout>
- <com.android.settingslib.widget.LinkTextView
- android:id="@android:id/title"
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingBottom="16dp"
- android:paddingTop="16dp"
- android:textColor="?android:attr/textColorSecondary"
- android:ellipsize="marquee" />
+ android:orientation="vertical">
+ <com.android.settingslib.widget.LinkTextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="16dp"
+ android:paddingBottom="8dp"
+ android:textColor="?android:attr/textColorSecondary"
+ android:ellipsize="marquee" />
+
+ <com.android.settingslib.widget.LinkTextView
+ android:id="@+id/settingslib_learn_more"
+ android:text="@string/settingslib_learn_more_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ android:visibility="gone"
+ style="@style/TextAppearance.Footer.Title.SettingsLib"/>
+ </LinearLayout>
</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/FooterPreference/res/values/strings.xml b/packages/SettingsLib/FooterPreference/res/values/strings.xml
new file mode 100644
index 0000000..9d5df12
--- /dev/null
+++ b/packages/SettingsLib/FooterPreference/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 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.
+ -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- learn more text of footer preference [CHAR LIMIT=NONE] -->
+ <string name="settingslib_learn_more_text">Learn more</string>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/FooterPreference/res/values/styles.xml b/packages/SettingsLib/FooterPreference/res/values/styles.xml
new file mode 100644
index 0000000..08dd359
--- /dev/null
+++ b/packages/SettingsLib/FooterPreference/res/values/styles.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 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.
+ -->
+
+<resources>
+ <style name="TextAppearance.Footer.Title.SettingsLib"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ <item name="android:textSize">14sp</item>
+ <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
+ <item name="android:textColor">?android:attr/colorAccent</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/FooterPreference/src/com/android/settingslib/widget/FooterPreference.java b/packages/SettingsLib/FooterPreference/src/com/android/settingslib/widget/FooterPreference.java
index feb3b01..33bf590 100644
--- a/packages/SettingsLib/FooterPreference/src/com/android/settingslib/widget/FooterPreference.java
+++ b/packages/SettingsLib/FooterPreference/src/com/android/settingslib/widget/FooterPreference.java
@@ -17,13 +17,17 @@
package com.android.settingslib.widget;
import android.content.Context;
+import android.text.SpannableString;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
+import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
+import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
@@ -35,7 +39,10 @@
public static final String KEY_FOOTER = "footer_preference";
static final int ORDER_FOOTER = Integer.MAX_VALUE - 1;
+ @VisibleForTesting
+ View.OnClickListener mLearnMoreListener;
private CharSequence mContentDescription;
+ private CharSequence mLearnMoreContentDescription;
public FooterPreference(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.footerPreferenceStyle);
@@ -53,7 +60,23 @@
title.setMovementMethod(new LinkMovementMethod());
title.setClickable(false);
title.setLongClickable(false);
- title.setContentDescription(mContentDescription);
+ if (!TextUtils.isEmpty(mContentDescription)) {
+ title.setContentDescription(mContentDescription);
+ }
+
+ TextView learnMore = holder.itemView.findViewById(R.id.settingslib_learn_more);
+ if (learnMore != null && mLearnMoreListener != null) {
+ learnMore.setVisibility(View.VISIBLE);
+ learnMore.setOnClickListener(mLearnMoreListener);
+ SpannableString learnMoreText = new SpannableString(learnMore.getText());
+ learnMoreText.setSpan(new UnderlineSpan(), 0, learnMoreText.length(), 0);
+ learnMore.setText(learnMoreText);
+ if (!TextUtils.isEmpty(mLearnMoreContentDescription)) {
+ learnMore.setContentDescription(mLearnMoreContentDescription);
+ }
+ } else {
+ learnMore.setVisibility(View.GONE);
+ }
}
@Override
@@ -87,10 +110,42 @@
/**
* Return the content description of footer preference.
*/
- public CharSequence getContentDescription() {
+ @VisibleForTesting
+ CharSequence getContentDescription() {
return mContentDescription;
}
+ /**
+ * To set content description of the learn more text. This can use for talkback
+ * environment if developer wants to have a customization content.
+ *
+ * @param learnMoreContentDescription The resource id of the content description.
+ */
+ public void setLearnMoreContentDescription(CharSequence learnMoreContentDescription) {
+ if (!TextUtils.equals(mContentDescription, learnMoreContentDescription)) {
+ mLearnMoreContentDescription = learnMoreContentDescription;
+ notifyChanged();
+ }
+ }
+
+ /**
+ * Return the content description of learn more link.
+ */
+ @VisibleForTesting
+ CharSequence getLearnMoreContentDescription() {
+ return mLearnMoreContentDescription;
+ }
+
+ /**
+ * Assign an action for the learn more link.
+ */
+ public void setLearnMoreAction(View.OnClickListener listener) {
+ if (mLearnMoreListener != listener) {
+ mLearnMoreListener = listener;
+ notifyChanged();
+ }
+ }
+
private void init() {
setLayoutResource(R.layout.preference_footer);
if (getIcon() == null) {
@@ -110,6 +165,7 @@
private String mKey;
private CharSequence mTitle;
private CharSequence mContentDescription;
+ private CharSequence mLearnMoreContentDescription;
public Builder(@NonNull Context context) {
mContext = context;
@@ -168,6 +224,30 @@
}
/**
+ * To set content description of the learn more text. This can use for talkback
+ * environment if developer wants to have a customization content.
+ *
+ * @param learnMoreContentDescription The resource id of the content description.
+ */
+ public Builder setLearnMoreContentDescription(CharSequence learnMoreContentDescription) {
+ mLearnMoreContentDescription = learnMoreContentDescription;
+ return this;
+ }
+
+ /**
+ * To set content description of the {@link FooterPreference}. This can use for talkback
+ * environment if developer wants to have a customization content.
+ *
+ * @param learnMoreContentDescriptionResId The resource id of the content description.
+ */
+ public Builder setLearnMoreContentDescription(
+ @StringRes int learnMoreContentDescriptionResId) {
+ mLearnMoreContentDescription = mContext.getText(learnMoreContentDescriptionResId);
+ return this;
+ }
+
+
+ /**
* To generate the {@link FooterPreference}.
*/
public FooterPreference build() {
@@ -184,6 +264,10 @@
if (!TextUtils.isEmpty(mContentDescription)) {
footerPreference.setContentDescription(mContentDescription);
}
+
+ if (!TextUtils.isEmpty(mLearnMoreContentDescription)) {
+ footerPreference.setLearnMoreContentDescription(mLearnMoreContentDescription);
+ }
return footerPreference;
}
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
index 4503669..10ac829 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
@@ -69,4 +69,19 @@
assertThat(mFooterPreference.getContentDescription()).isEqualTo("test");
}
+
+ @Test
+ public void setLearnMoreContentDescription_contentSet_shouldGetSameContentDescription() {
+ mFooterPreference.setLearnMoreContentDescription("test");
+
+ assertThat(mFooterPreference.getLearnMoreContentDescription()).isEqualTo("test");
+ }
+
+ @Test
+ public void setLearnMoreAction_actionSet_shouldGetAction() {
+ mFooterPreference.setLearnMoreAction(v -> {
+ });
+
+ assertThat(mFooterPreference.mLearnMoreListener).isNotNull();
+ }
}