diff options
author | 2024-08-01 22:42:01 +0000 | |
---|---|---|
committer | 2024-08-02 23:33:03 +0000 | |
commit | f1a0f1132bda1dda684e7617d47aef8fde7895c8 (patch) | |
tree | a3a025bbd30061ae7bfcb57fb84dfbcb08876e89 | |
parent | 856f2751094311cd19021e9fc97ba67c05a81730 (diff) |
Allow update the max lines on the title
Bug: 356726764
Test: manually tested the color correction screen in Deutsch and verify
text are not truncated
Test: verify the Wifi Hotspot sceurity screen is not affected by this
change (still have 2 as the max lines of the title)
Test: atest SelectorWithWidgetPreferenceTest
Flag: com.android.settingslib.widget.selectorwithwidgetpreference.flags.allow_set_title_max_lines
Change-Id: I0066a94362f06280b5e9e7ed627e4b3f6b5f5360
6 files changed, 156 insertions, 7 deletions
diff --git a/packages/SettingsLib/SelectorWithWidgetPreference/Android.bp b/packages/SettingsLib/SelectorWithWidgetPreference/Android.bp index 2fe446d24b34..f9fe03e06cb0 100644 --- a/packages/SettingsLib/SelectorWithWidgetPreference/Android.bp +++ b/packages/SettingsLib/SelectorWithWidgetPreference/Android.bp @@ -20,6 +20,7 @@ android_library { static_libs: [ "androidx.preference_preference", "SettingsLibSettingsTheme", + "settingslib_selectorwithwidgetpreference_flags_lib", ], sdk_version: "system_current", @@ -30,3 +31,24 @@ android_library { "com.android.mediaprovider", ], } + +aconfig_declarations { + name: "settingslib_selectorwithwidgetpreference_flags", + package: "com.android.settingslib.widget.selectorwithwidgetpreference.flags", + container: "system", + srcs: [ + "aconfig/selectorwithwidgetpreference.aconfig", + ], +} + +java_aconfig_library { + name: "settingslib_selectorwithwidgetpreference_flags_lib", + aconfig_declarations: "settingslib_selectorwithwidgetpreference_flags", + + min_sdk_version: "30", + apex_available: [ + "//apex_available:platform", + "com.android.permission", + "com.android.mediaprovider", + ], +} diff --git a/packages/SettingsLib/SelectorWithWidgetPreference/aconfig/selectorwithwidgetpreference.aconfig b/packages/SettingsLib/SelectorWithWidgetPreference/aconfig/selectorwithwidgetpreference.aconfig new file mode 100644 index 000000000000..70cda476bff6 --- /dev/null +++ b/packages/SettingsLib/SelectorWithWidgetPreference/aconfig/selectorwithwidgetpreference.aconfig @@ -0,0 +1,13 @@ +package: "com.android.settingslib.widget.selectorwithwidgetpreference.flags" +container: "system" + +flag { + name: "allow_set_title_max_lines" + namespace: "accessibility" + description: "Allow changes to the title max lines so it's not always fixed to 2" + bug: "356726764" + metadata { + purpose: PURPOSE_BUGFIX + } +} + diff --git a/packages/SettingsLib/SelectorWithWidgetPreference/res/values/attrs.xml b/packages/SettingsLib/SelectorWithWidgetPreference/res/values/attrs.xml new file mode 100644 index 000000000000..7ffde2578cc1 --- /dev/null +++ b/packages/SettingsLib/SelectorWithWidgetPreference/res/values/attrs.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ 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. + --> + +<resources> + <declare-styleable name="SelectorWithWidgetPreference"> + <!-- The maximum number of lines for rendering the title. --> + <attr name="titleMaxLines" format="integer" /> + </declare-styleable> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SelectorWithWidgetPreference/src/com/android/settingslib/widget/SelectorWithWidgetPreference.java b/packages/SettingsLib/SelectorWithWidgetPreference/src/com/android/settingslib/widget/SelectorWithWidgetPreference.java index f2ce8a965dfa..34de5c4a5d75 100644 --- a/packages/SettingsLib/SelectorWithWidgetPreference/src/com/android/settingslib/widget/SelectorWithWidgetPreference.java +++ b/packages/SettingsLib/SelectorWithWidgetPreference/src/com/android/settingslib/widget/SelectorWithWidgetPreference.java @@ -17,15 +17,21 @@ package com.android.settingslib.widget; import android.content.Context; +import android.content.res.TypedArray; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import androidx.preference.CheckBoxPreference; import androidx.preference.PreferenceViewHolder; import com.android.settingslib.widget.preference.selector.R; +import com.android.settingslib.widget.selectorwithwidgetpreference.flags.Flags; /** * Selector preference (checkbox or radio button) with an optional additional widget. @@ -41,6 +47,8 @@ import com.android.settingslib.widget.preference.selector.R; * on the right side that can open another page. */ public class SelectorWithWidgetPreference extends CheckBoxPreference { + @VisibleForTesting + static final int DEFAULT_MAX_LINES = 2; /** * Interface definition for a callback to be invoked when the preference is clicked. @@ -63,6 +71,8 @@ public class SelectorWithWidgetPreference extends CheckBoxPreference { private boolean mIsCheckBox = false; // whether to display this button as a checkbox private View.OnClickListener mExtraWidgetOnClickListener; + private int mTitleMaxLines; + /** * Perform inflation from XML and apply a class-specific base style. @@ -74,9 +84,10 @@ public class SelectorWithWidgetPreference extends CheckBoxPreference { * resource that supplies default values for the view. Can be 0 to not * look for defaults. */ - public SelectorWithWidgetPreference(Context context, AttributeSet attrs, int defStyle) { + public SelectorWithWidgetPreference(@NonNull Context context, @Nullable AttributeSet attrs, + int defStyle) { super(context, attrs, defStyle); - init(); + init(context, attrs, defStyle, /* defStyleRes= */ 0); } /** @@ -88,7 +99,7 @@ public class SelectorWithWidgetPreference extends CheckBoxPreference { */ public SelectorWithWidgetPreference(Context context, AttributeSet attrs) { super(context, attrs); - init(); + init(context, attrs, /* defStyleAttr= */ 0, /* defStyleRes= */ 0); } /** @@ -100,7 +111,7 @@ public class SelectorWithWidgetPreference extends CheckBoxPreference { public SelectorWithWidgetPreference(Context context, boolean isCheckbox) { super(context, null); mIsCheckBox = isCheckbox; - init(); + init(context, /* attrs= */ null, /* defStyleAttr= */ 0, /* defStyleRes= */ 0); } /** @@ -161,6 +172,11 @@ public class SelectorWithWidgetPreference extends CheckBoxPreference { mExtraWidgetContainer = holder.findViewById(R.id.selector_extra_widget_container); setExtraWidgetOnClickListener(mExtraWidgetOnClickListener); + + if (Flags.allowSetTitleMaxLines()) { + TextView title = (TextView) holder.findViewById(android.R.id.title); + title.setMaxLines(mTitleMaxLines); + } } /** @@ -200,7 +216,8 @@ public class SelectorWithWidgetPreference extends CheckBoxPreference { return mIsCheckBox; } - private void init() { + private void init(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, + int defStyleRes) { if (mIsCheckBox) { setWidgetLayoutResource(R.layout.preference_widget_checkbox); } else { @@ -208,5 +225,16 @@ public class SelectorWithWidgetPreference extends CheckBoxPreference { } setLayoutResource(R.layout.preference_selector_with_widget); setIconSpaceReserved(false); + + if (Flags.allowSetTitleMaxLines()) { + final TypedArray a = + context.obtainStyledAttributes( + attrs, R.styleable.SelectorWithWidgetPreference, defStyleAttr, + defStyleRes); + mTitleMaxLines = + a.getInt(R.styleable.SelectorWithWidgetPreference_titleMaxLines, + DEFAULT_MAX_LINES); + a.recycle(); + } } } diff --git a/packages/SettingsLib/tests/robotests/Android.bp b/packages/SettingsLib/tests/robotests/Android.bp index 75c40bfa8b60..f380e7f7e7a6 100644 --- a/packages/SettingsLib/tests/robotests/Android.bp +++ b/packages/SettingsLib/tests/robotests/Android.bp @@ -56,6 +56,7 @@ android_robolectric_test { "flag-junit", "settingslib_media_flags_lib", "settingslib_illustrationpreference_flags_lib", + "settingslib_selectorwithwidgetpreference_flags_lib", "testng", // TODO: remove once JUnit on Android provides assertThrows ], java_resource_dirs: ["config"], diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SelectorWithWidgetPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SelectorWithWidgetPreferenceTest.java index 60885f1079d3..243ce85bd579 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SelectorWithWidgetPreferenceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SelectorWithWidgetPreferenceTest.java @@ -23,22 +23,31 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.app.Application; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; +import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; +import android.widget.TextView; import androidx.preference.PreferenceViewHolder; +import androidx.test.core.app.ApplicationProvider; import com.android.settingslib.widget.preference.selector.R; +import com.android.settingslib.widget.selectorwithwidgetpreference.flags.Flags; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) public class SelectorWithWidgetPreferenceTest { + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private Application mContext; private SelectorWithWidgetPreference mPreference; @@ -55,7 +64,7 @@ public class SelectorWithWidgetPreferenceTest { @Before public void setUp() { - mContext = RuntimeEnvironment.application; + mContext = ApplicationProvider.getApplicationContext(); mPreference = new SelectorWithWidgetPreference(mContext); View view = LayoutInflater.from(mContext) @@ -121,6 +130,60 @@ public class SelectorWithWidgetPreferenceTest { } @Test + @DisableFlags(Flags.FLAG_ALLOW_SET_TITLE_MAX_LINES) + public void onBindViewHolder_titleMaxLinesSet_flagOff_titleMaxLinesMatchesDefault() { + final int titleMaxLines = 5; + AttributeSet attributeSet = Robolectric.buildAttributeSet() + .addAttribute(R.attr.titleMaxLines, String.valueOf(titleMaxLines)) + .build(); + mPreference = new SelectorWithWidgetPreference(mContext, attributeSet); + View view = LayoutInflater.from(mContext) + .inflate(mPreference.getLayoutResource(), null /* root */); + PreferenceViewHolder preferenceViewHolder = + PreferenceViewHolder.createInstanceForTests(view); + + mPreference.onBindViewHolder(preferenceViewHolder); + + TextView title = (TextView) preferenceViewHolder.findViewById(android.R.id.title); + assertThat(title.getMaxLines()).isEqualTo(SelectorWithWidgetPreference.DEFAULT_MAX_LINES); + } + + @Test + @EnableFlags(Flags.FLAG_ALLOW_SET_TITLE_MAX_LINES) + public void onBindViewHolder_noTitleMaxLinesSet_titleMaxLinesMatchesDefault() { + AttributeSet attributeSet = Robolectric.buildAttributeSet().build(); + mPreference = new SelectorWithWidgetPreference(mContext, attributeSet); + View view = LayoutInflater.from(mContext) + .inflate(mPreference.getLayoutResource(), null /* root */); + PreferenceViewHolder preferenceViewHolder = + PreferenceViewHolder.createInstanceForTests(view); + + mPreference.onBindViewHolder(preferenceViewHolder); + + TextView title = (TextView) preferenceViewHolder.findViewById(android.R.id.title); + assertThat(title.getMaxLines()).isEqualTo(SelectorWithWidgetPreference.DEFAULT_MAX_LINES); + } + + @Test + @EnableFlags(Flags.FLAG_ALLOW_SET_TITLE_MAX_LINES) + public void onBindViewHolder_titleMaxLinesSet_titleMaxLinesUpdated() { + final int titleMaxLines = 5; + AttributeSet attributeSet = Robolectric.buildAttributeSet() + .addAttribute(R.attr.titleMaxLines, String.valueOf(titleMaxLines)) + .build(); + mPreference = new SelectorWithWidgetPreference(mContext, attributeSet); + View view = LayoutInflater.from(mContext) + .inflate(mPreference.getLayoutResource(), null /* root */); + PreferenceViewHolder preferenceViewHolder = + PreferenceViewHolder.createInstanceForTests(view); + + mPreference.onBindViewHolder(preferenceViewHolder); + + TextView title = (TextView) preferenceViewHolder.findViewById(android.R.id.title); + assertThat(title.getMaxLines()).isEqualTo(titleMaxLines); + } + + @Test public void nullSummary_containerShouldBeGone() { mPreference.setSummary(null); View summaryContainer = new View(mContext); |