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(); + } }