Merge "Add a learn more text in footerprefernce" into sc-dev

This commit is contained in:
Tsung-Mao Fang
2021-05-22 01:41:11 +00:00
committed by Android (Google) Code Review
6 changed files with 188 additions and 14 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
}
}

View File

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