diff --git a/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml b/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
index 3b50acc924c59..e586dbb7770c5 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"/>
-
+ android:orientation="vertical">
+
+
+
+
\ 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 87e8358617fed..990860ad32919 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"/>
-
+ android:orientation="vertical">
+
+
+
+
\ 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 0000000000000..9d5df126b84e0
--- /dev/null
+++ b/packages/SettingsLib/FooterPreference/res/values/strings.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ Learn more
+
\ 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 0000000000000..08dd35991f690
--- /dev/null
+++ b/packages/SettingsLib/FooterPreference/res/values/styles.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
\ 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 feb3b011fe638..33bf590cc2bb7 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 class FooterPreference extends Preference {
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 @@ public class FooterPreference extends Preference {
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 @@ public class FooterPreference extends Preference {
/**
* 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 @@ public class FooterPreference extends Preference {
private String mKey;
private CharSequence mTitle;
private CharSequence mContentDescription;
+ private CharSequence mLearnMoreContentDescription;
public Builder(@NonNull Context context) {
mContext = context;
@@ -167,6 +223,30 @@ public class FooterPreference extends Preference {
return this;
}
+ /**
+ * 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}.
*/
@@ -184,6 +264,10 @@ public class FooterPreference extends Preference {
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 4503669f59017..10ac829186d40 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 @@ public class FooterPreferenceTest {
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();
+ }
}