Merge "PanelSlicesAdapter: load slice label safely" into udc-qpr-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c0a160b..252e3d8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -12165,6 +12165,8 @@
     <string name="user_aspect_ratio_3_2">3:2</string>
     <!-- [CHAR LIMIT=NONE] 4:3 aspect ratio entry -->
     <string name="user_aspect_ratio_4_3">4:3</string>
+    <!-- [CHAR LIMIT=NONE] Aspect ratio a11y message announced to replace colon in aspect ratio entry e.g. 3 by 2 -->
+    <string name="user_aspect_ratio_option_a11y"><xliff:g id="numerator">%1$s</xliff:g> by <xliff:g id="denominator">%2$s</xliff:g></string>
     <!-- [CHAR LIMIT=NONE] Warning description for app info aspect ratio page -->
     <string name="app_aspect_ratio_footer">The app will restart when you change aspect ratio. You may lose unsaved changes. Some apps may not be optimized for certain aspect ratios.</string>
 
diff --git a/res/xml/user_aspect_ratio_details.xml b/res/xml/user_aspect_ratio_details.xml
index 07c8b6f..ec76caa 100644
--- a/res/xml/user_aspect_ratio_details.xml
+++ b/res/xml/user_aspect_ratio_details.xml
@@ -45,17 +45,14 @@
 
     <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="16_9_pref"
-        android:title="@string/user_aspect_ratio_16_9"
         android:icon="@drawable/ic_app_aspect_ratio_16_9"/>
 
     <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="4_3_pref"
-        android:title="@string/user_aspect_ratio_4_3"
         android:icon="@drawable/ic_app_aspect_ratio_4_3"/>
 
     <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="3_2_pref"
-        android:title="@string/user_aspect_ratio_3_2"
         android:icon="@drawable/ic_app_aspect_ratio_3_2"/>
 
     <com.android.settingslib.widget.FooterPreference
diff --git a/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java b/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
index 7542f3f..81741b7 100644
--- a/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
+++ b/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
@@ -227,8 +227,7 @@
             pref.setVisible(false);
             return;
         }
-        pref.setTitle(mUserAspectRatioManager.getUserMinAspectRatioEntry(aspectRatio,
-                mPackageName));
+        pref.setTitle(mUserAspectRatioManager.getAccessibleEntry(aspectRatio, mPackageName));
         pref.setOnClickListener(this);
         mAspectRatioPreferences.add(pref);
     }
diff --git a/src/com/android/settings/applications/appcompat/UserAspectRatioManager.java b/src/com/android/settings/applications/appcompat/UserAspectRatioManager.java
index 6bc9658..2c157c4 100644
--- a/src/com/android/settings/applications/appcompat/UserAspectRatioManager.java
+++ b/src/com/android/settings/applications/appcompat/UserAspectRatioManager.java
@@ -36,6 +36,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 
 import com.google.common.annotations.VisibleForTesting;
 
@@ -64,12 +65,14 @@
     /** Apps that have launcher entry defined in manifest */
     private final List<ResolveInfo> mInfoHasLauncherEntryList;
     private final Map<Integer, String> mUserAspectRatioMap;
+    private final Map<Integer, CharSequence> mUserAspectRatioA11yMap;
 
     public UserAspectRatioManager(@NonNull Context context) {
         mContext = context;
         mIPm = AppGlobals.getPackageManager();
         mInfoHasLauncherEntryList = mContext.getPackageManager().queryIntentActivities(
                 UserAspectRatioManager.LAUNCHER_ENTRY_INTENT, PackageManager.GET_META_DATA);
+        mUserAspectRatioA11yMap = new ArrayMap<>();
         mUserAspectRatioMap = getUserMinAspectRatioMapping();
     }
 
@@ -107,6 +110,16 @@
     }
 
     /**
+     * @return corresponding accessible string for {@link PackageManager.UserMinAspectRatio} value
+     */
+    @NonNull
+    public CharSequence getAccessibleEntry(@PackageManager.UserMinAspectRatio int aspectRatio,
+            String packageName) {
+        return mUserAspectRatioA11yMap.getOrDefault(aspectRatio,
+                getUserMinAspectRatioEntry(aspectRatio, packageName));
+    }
+
+    /**
      * @return corresponding aspect ratio string for package name and user
      */
     @NonNull
@@ -185,6 +198,7 @@
             final int aspectRatioVal = userMinAspectRatioValues[i];
             final String aspectRatioString = getAspectRatioStringOrDefault(
                     userMinAspectRatioStrings[i], aspectRatioVal);
+            boolean containsColon = aspectRatioString.contains(":");
             switch (aspectRatioVal) {
                 // Only map known values of UserMinAspectRatio and ignore unknown entries
                 case PackageManager.USER_MIN_ASPECT_RATIO_FULLSCREEN:
@@ -194,6 +208,14 @@
                 case PackageManager.USER_MIN_ASPECT_RATIO_4_3:
                 case PackageManager.USER_MIN_ASPECT_RATIO_16_9:
                 case PackageManager.USER_MIN_ASPECT_RATIO_3_2:
+                    if (containsColon) {
+                        String[] aspectRatioDigits = aspectRatioString.split(":");
+                        String accessibleString = getAccessibleOption(aspectRatioDigits[0],
+                                aspectRatioDigits[1]);
+                        final CharSequence accessibleSequence = Utils.createAccessibleSequence(
+                                aspectRatioString, accessibleString);
+                        mUserAspectRatioA11yMap.put(aspectRatioVal, accessibleSequence);
+                    }
                     userMinAspectRatioMap.put(aspectRatioVal, aspectRatioString);
             }
         }
@@ -205,6 +227,12 @@
     }
 
     @NonNull
+    private String getAccessibleOption(String numerator, String denominator) {
+        return mContext.getResources().getString(R.string.user_aspect_ratio_option_a11y,
+                numerator, denominator);
+    }
+
+    @NonNull
     private String getAspectRatioStringOrDefault(@Nullable String aspectRatioString,
             @PackageManager.UserMinAspectRatio int aspectRatioVal) {
         if (aspectRatioString != null) {
diff --git a/src/com/android/settings/core/SettingsUIDeviceConfig.java b/src/com/android/settings/core/SettingsUIDeviceConfig.java
index 2401ff5..404b0b4 100644
--- a/src/com/android/settings/core/SettingsUIDeviceConfig.java
+++ b/src/com/android/settings/core/SettingsUIDeviceConfig.java
@@ -47,14 +47,4 @@
      */
     public static final String BT_LE_AUDIO_DEVICE_DETAIL_ENABLED =
             "bt_le_audio_device_detail_enabled";
-    /**
-     * {@code true} if press and hold nav handle to search is enabled.
-     */
-    public static final String PRESS_HOLD_NAV_HANDLE_TO_SEARCH =
-            "press_hold_nav_handle_to_search";
-    /**
-     * {@code true} if long press home button to search is enabled.
-     */
-    public static final String LONG_PRESS_HOME_BUTTON_TO_SEARCH =
-            "long_press_home_button_to_search";
 }
diff --git a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
index 1884599..069be01 100644
--- a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
+++ b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
@@ -116,7 +116,8 @@
                 override val resId = R.raw.user_aspect_ratio_education
                 override val resourceType = ResourceType.LOTTIE
             })
-        }
+        },
+        noMoreOptions = true,
     )
 }
 
diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
index d601934..0647a77 100644
--- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
@@ -451,8 +451,6 @@
         ImageView iconView = headerPref.findViewById(R.id.entity_header_icon);
 
         iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
-
-        mEntityHeaderController.setLabel(mWifiEntry.getTitle());
     }
 
     private String getExpiryTimeSummary() {
@@ -491,6 +489,7 @@
             mSummaryHeaderController.updateState(mDataUsageSummaryPref);
         } else {
             mEntityHeaderController
+                    .setLabel(mWifiEntry.getTitle())
                     .setSummary(mWifiEntry.getSummary())
                     .setSecondSummary(getExpiryTimeSummary())
                     .setRecyclerView(mFragment.getListView(), mLifecycle)
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
index 88fa55f..406e0c3 100644
--- a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
@@ -305,6 +305,8 @@
 
         ShadowEntityHeaderController.setUseMock(mMockHeaderController);
         // builder pattern
+        when(mMockHeaderController.setLabel(any(CharSequence.class)))
+                .thenReturn(mMockHeaderController);
         when(mMockHeaderController.setRecyclerView(mMockFragment.getListView(), mLifecycle))
                 .thenReturn(mMockHeaderController);
         when(mMockHeaderController.setSummary(nullable(String.class)))