Revert^2 "Allow update the max lines on the title"
Revert "Revert "Allow update the max lines on the title"
Revert submission 28661116-revert-28616239-356726764-dont-truncate-color-correction-options-LCBEOTEYHE
Reason for revert: Attempt to re-land b/356726764 with a fix to add `sdk_verion: system_current` to the SelectorWithWidgetPreference aconfig
Reverted changes: /q/submissionid:28661116-revert-28616239-356726764-dont-truncate-color-correction-options-LCBEOTEYHE
Change-Id: Iaf8c1e24632e4db56631bf0de81c1d9bf47b83ed
diff --git a/packages/SettingsLib/SelectorWithWidgetPreference/Android.bp b/packages/SettingsLib/SelectorWithWidgetPreference/Android.bp
index 2fe446d..155ee83 100644
--- a/packages/SettingsLib/SelectorWithWidgetPreference/Android.bp
+++ b/packages/SettingsLib/SelectorWithWidgetPreference/Android.bp
@@ -20,6 +20,7 @@
static_libs: [
"androidx.preference_preference",
"SettingsLibSettingsTheme",
+ "settingslib_selectorwithwidgetpreference_flags_lib",
],
sdk_version: "system_current",
@@ -30,3 +31,25 @@
"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",
+ sdk_version: "system_current",
+ 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 0000000..70cda47
--- /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 0000000..7ffde25
--- /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 f2ce8a9..34de5c4 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 @@
* 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 @@
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 @@
* 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 SelectorWithWidgetPreference(Context context, AttributeSet attrs) {
super(context, attrs);
- init();
+ init(context, attrs, /* defStyleAttr= */ 0, /* defStyleRes= */ 0);
}
/**
@@ -100,7 +111,7 @@
public SelectorWithWidgetPreference(Context context, boolean isCheckbox) {
super(context, null);
mIsCheckBox = isCheckbox;
- init();
+ init(context, /* attrs= */ null, /* defStyleAttr= */ 0, /* defStyleRes= */ 0);
}
/**
@@ -161,6 +172,11 @@
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 @@
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 @@
}
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 75c40bf..f380e7f 100644
--- a/packages/SettingsLib/tests/robotests/Android.bp
+++ b/packages/SettingsLib/tests/robotests/Android.bp
@@ -56,6 +56,7 @@
"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 60885f1..243ce85 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.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 @@
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = ApplicationProvider.getApplicationContext();
mPreference = new SelectorWithWidgetPreference(mContext);
View view = LayoutInflater.from(mContext)
@@ -121,6 +130,60 @@
}
@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);