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);