Merge "Fix: policy enforcement for location wifi scanning"
diff --git a/Android.bp b/Android.bp
index 619a390..5bf5514 100644
--- a/Android.bp
+++ b/Android.bp
@@ -35,6 +35,15 @@
     ],
 }
 
+java_library {
+    name: "Settings-change-ids",
+    srcs: ["src/com/android/settings/ChangeIds.java"],
+    libs: [
+        "app-compat-annotations",
+    ],
+}
+
+
 // Build the Settings APK
 android_library {
     name: "Settings-core",
@@ -77,18 +86,18 @@
         "lottie",
         "WifiTrackerLib",
         "SettingsLibActivityEmbedding",
+        "Settings-change-ids",
     ],
 
     libs: [
         "telephony-common",
         "ims-common",
-        "app-compat-annotations",
     ],
 }
 
 platform_compat_config {
     name: "settings-platform-compat-config",
-    src: ":Settings-core",
+    src: ":Settings-change-ids",
     system_ext_specific: true,
 }
 
@@ -126,7 +135,7 @@
 // over all the sources together.
 filegroup {
     name: "Settings_srcs",
-    srcs: ["src/**/*.java"],
+    srcs: ["src/**/*.java", "src/**/*.kt"],
 }
 
 filegroup {
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 321e535..3212d2f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1108,10 +1108,6 @@
                   android:label="@string/wallpaper_settings_fragment_title"
                   android:icon="@drawable/ic_wallpaper"
                   android:exported="true">
-            <intent-filter>
-                <action android:name="android.settings.WALLPAPER_SETTINGS"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-            </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.wallpaper.WallpaperTypeSettings" />
             <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
@@ -1124,15 +1120,19 @@
                   android:exported="true"
                   android:theme="@android:style/Theme.NoDisplay">
             <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.android.settings.suggested.category.FIRST_IMPRESSION" />
+                <action android:name="android.settings.WALLPAPER_SETTINGS"/>
+                <category android:name="android.intent.category.DEFAULT"/>
             </intent-filter>
             <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.android.settings.suggested.category.PERSONALIZE" />
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.android.settings.suggested.category.FIRST_IMPRESSION"/>
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.android.settings.suggested.category.PERSONALIZE"/>
             </intent-filter>
             <meta-data android:name="com.android.settings.title"
-                       android:resource="@string/wallpaper_suggestion_title" />
+                       android:resource="@string/wallpaper_suggestion_title"/>
             <meta-data android:name="com.android.settings.summary"
                        android:resource="@string/wallpaper_suggestion_summary" />
             <meta-data android:name="com.android.settings.dismiss"
diff --git a/OWNERS b/OWNERS
index e199efb..c2ff692 100644
--- a/OWNERS
+++ b/OWNERS
@@ -3,6 +3,7 @@
 
 # People who can approve changes for submission
 arcwang@google.com
+chaohuiw@google.com
 chiujason@google.com
 edgarwang@google.com
 emilychuang@google.com
diff --git a/res/layout/accessibility_launch_activity_preference.xml b/res/layout/accessibility_launch_activity_preference.xml
index 772bb84..0e3e225 100644
--- a/res/layout/accessibility_launch_activity_preference.xml
+++ b/res/layout/accessibility_launch_activity_preference.xml
@@ -33,5 +33,6 @@
         android:layout_gravity="center_vertical"
         android:ellipsize="end"
         android:textAppearance="?android:attr/textAppearanceListItem"
+        android:hyphenationFrequency="normalFast"
         style="@style/MainSwitchText.Settingslib" />
 </LinearLayout>
diff --git a/res/layout/accessibility_shortcut_secondary_action.xml b/res/layout/accessibility_shortcut_secondary_action.xml
index bdb129f..ddbadb5 100644
--- a/res/layout/accessibility_shortcut_secondary_action.xml
+++ b/res/layout/accessibility_shortcut_secondary_action.xml
@@ -59,6 +59,7 @@
                 android:layout_height="wrap_content"
                 android:singleLine="true"
                 android:textAppearance="?android:attr/textAppearanceListItem"
+                android:hyphenationFrequency="normalFast"
                 android:ellipsize="marquee" />
 
             <TextView
@@ -69,6 +70,7 @@
                 android:layout_alignStart="@android:id/title"
                 android:textAppearance="?android:attr/textAppearanceListItemSecondary"
                 android:textColor="?android:attr/textColorSecondary"
+                android:hyphenationFrequency="normalFast"
                 android:maxLines="10" />
 
         </RelativeLayout>
diff --git a/res/layout/apn_preference_layout.xml b/res/layout/apn_preference_layout.xml
index 4d98443..2c453aa 100644
--- a/res/layout/apn_preference_layout.xml
+++ b/res/layout/apn_preference_layout.xml
@@ -51,6 +51,7 @@
             android:textAppearance="?android:attr/textAppearanceListItemSecondary"
             android:textColor="?android:attr/textColorSecondary"
             android:focusable="false"
+            android:hyphenationFrequency="normalFast"
             android:maxLines="2" />
 
     </RelativeLayout>
diff --git a/res/layout/app_preference_item.xml b/res/layout/app_preference_item.xml
index 85d6bb0..c685760 100755
--- a/res/layout/app_preference_item.xml
+++ b/res/layout/app_preference_item.xml
@@ -56,6 +56,7 @@
             android:paddingEnd="7dip"
             android:ellipsize="marquee"
             android:duplicateParentState="true"
+            android:hyphenationFrequency="normalFast"
             />
         <TextView
             android:id="@android:id/summary"
@@ -67,6 +68,7 @@
             android:ellipsize="marquee"
             android:visibility="gone"
             android:duplicateParentState="true"
+            android:hyphenationFrequency="normalFast"
             />
     </LinearLayout>
     <TextView
diff --git a/res/layout/battery_active_view.xml b/res/layout/battery_active_view.xml
index bdc0328..1583b95 100644
--- a/res/layout/battery_active_view.xml
+++ b/res/layout/battery_active_view.xml
@@ -28,6 +28,7 @@
         android:layout_height="wrap_content"
         android:textAlignment="viewStart"
         android:textAppearance="?android:attr/textAppearanceMedium"
+        android:hyphenationFrequency="normalFast"
         android:textColor="?android:attr/textColorSecondary" />
 
     <com.android.settings.fuelgauge.BatteryActiveView
diff --git a/res/layout/homepage_preference.xml b/res/layout/homepage_preference.xml
index 59dc7c4..97557b0 100644
--- a/res/layout/homepage_preference.xml
+++ b/res/layout/homepage_preference.xml
@@ -62,6 +62,7 @@
             android:layout_height="wrap_content"
             android:singleLine="true"
             android:textAppearance="?android:attr/textAppearanceListItem"
+            android:hyphenationFrequency="normalFast"
             android:ellipsize="marquee"/>
 
         <TextView
@@ -75,6 +76,7 @@
             android:textAppearance="?android:attr/textAppearanceSmall"
             android:textColor="?android:attr/textColorSecondary"
             android:maxLines="4"
+            android:hyphenationFrequency="normalFast"
             style="@style/PreferenceSummaryTextStyle"/>
     </RelativeLayout>
 </LinearLayout>
diff --git a/res/layout/horizontal_preference.xml b/res/layout/horizontal_preference.xml
index e50fc3f..d87963c 100644
--- a/res/layout/horizontal_preference.xml
+++ b/res/layout/horizontal_preference.xml
@@ -30,6 +30,7 @@
         android:textAppearance="?android:attr/textAppearanceListItem"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
+        android:hyphenationFrequency="normalFast"
         android:layout_weight="1" />
 
     <TextView
@@ -39,6 +40,7 @@
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:layout_weight="1"
+        android:hyphenationFrequency="normalFast"
         android:gravity="end|bottom" />
 
 </LinearLayout>
diff --git a/res/layout/notification_app.xml b/res/layout/notification_app.xml
index 54060c1..2d17c8d 100644
--- a/res/layout/notification_app.xml
+++ b/res/layout/notification_app.xml
@@ -38,6 +38,7 @@
         android:ellipsize="end"
         android:singleLine="true"
         android:textAlignment="viewStart"
+        android:hyphenationFrequency="normalFast"
         android:textAppearance="?android:attr/textAppearanceMedium" />
 
     <TextView
@@ -50,6 +51,7 @@
         android:singleLine="true"
         android:textAlignment="viewStart"
         android:textColor="?android:attr/textColorSecondary"
+        android:hyphenationFrequency="normalFast"
         android:textAppearance="?android:attr/textAppearanceSmall" />
 
     <View
diff --git a/res/layout/preference_app_restrictions.xml b/res/layout/preference_app_restrictions.xml
index 698f1ed..f92f683 100644
--- a/res/layout/preference_app_restrictions.xml
+++ b/res/layout/preference_app_restrictions.xml
@@ -61,6 +61,7 @@
                 android:singleLine="true"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:ellipsize="marquee"
+                android:hyphenationFrequency="normalFast"
                 android:fadingEdge="horizontal"/>
             <TextView
                 android:id="@android:id/summary"
@@ -74,6 +75,7 @@
                 android:textSize="13sp"
                 android:textColor="?android:attr/textColorSecondary"
                 android:focusable="false"
+                android:hyphenationFrequency="normalFast"
                 android:maxLines="4" />
         </RelativeLayout>
     </LinearLayout>
diff --git a/res/layout/preference_balance_slider.xml b/res/layout/preference_balance_slider.xml
index 7f1e809..3f1c4ed 100644
--- a/res/layout/preference_balance_slider.xml
+++ b/res/layout/preference_balance_slider.xml
@@ -45,6 +45,7 @@
                 android:textAppearance="?android:attr/textAppearanceListItem"
                 android:textColor="?android:attr/textColorPrimary"
                 android:ellipsize="marquee"
+                android:hyphenationFrequency="normalFast"
                 android:fadingEdge="horizontal"/>
             <LinearLayout
                 android:id="@android:id/widget_frame"
diff --git a/res/layout/preference_icon.xml b/res/layout/preference_icon.xml
index 590a05a..1312979 100644
--- a/res/layout/preference_icon.xml
+++ b/res/layout/preference_icon.xml
@@ -57,6 +57,7 @@
             android:layout_below="@android:id/title"
             android:layout_alignStart="@android:id/title"
             android:textAppearance="?android:attr/textAppearanceSmall"
+            android:hyphenationFrequency="normalFast"
             android:maxLines="2" />
 
     </RelativeLayout>
diff --git a/res/layout/preference_labeled_slider.xml b/res/layout/preference_labeled_slider.xml
index 294b979..610b79f 100644
--- a/res/layout/preference_labeled_slider.xml
+++ b/res/layout/preference_labeled_slider.xml
@@ -35,6 +35,7 @@
         android:fadingEdge="horizontal"
         android:singleLine="true"
         android:textAppearance="?android:attr/textAppearanceListItem"
+        android:hyphenationFrequency="normalFast"
         android:textColor="?android:attr/textColorPrimary" />
 
     <TextView
@@ -44,6 +45,7 @@
         android:layout_below="@android:id/title"
         android:textAppearance="?android:attr/textAppearanceSmall"
         android:textAlignment="viewStart"
+        android:hyphenationFrequency="normalFast"
         android:textColor="?android:attr/textColorSecondary" />
 
     <include
diff --git a/res/layout/preference_multiline_title.xml b/res/layout/preference_multiline_title.xml
index f64b27f..d68e8c1 100644
--- a/res/layout/preference_multiline_title.xml
+++ b/res/layout/preference_multiline_title.xml
@@ -38,6 +38,7 @@
             android:textColor="?android:attr/textColorPrimary"
             android:textAlignment="center"
             android:ellipsize="marquee"
+            android:hyphenationFrequency="normalFast"
             android:fadingEdge="horizontal" />
 
         <TextView
@@ -50,6 +51,7 @@
             android:textAlignment="viewStart"
             android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorSecondary"
+            android:hyphenationFrequency="normalFast"
             android:maxLines="10" />
 
     </RelativeLayout>
diff --git a/res/layout/preference_progress_category.xml b/res/layout/preference_progress_category.xml
index 9a22c54..9e33c5d 100644
--- a/res/layout/preference_progress_category.xml
+++ b/res/layout/preference_progress_category.xml
@@ -47,6 +47,7 @@
         android:layout_weight="1"
         android:layout_gravity="start|center"
         android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"
+        android:hyphenationFrequency="normalFast"
         android:textColor="?android:attr/colorAccent"/>
 
     <ProgressBar
diff --git a/res/layout/preference_radio_with_extra_widget.xml b/res/layout/preference_radio_with_extra_widget.xml
index c3470c0..a03f556 100644
--- a/res/layout/preference_radio_with_extra_widget.xml
+++ b/res/layout/preference_radio_with_extra_widget.xml
@@ -75,6 +75,7 @@
                   android:layout_weight="1"
                   android:textAppearance="?android:attr/textAppearanceSmall"
                   android:textAlignment="viewStart"
+                  android:hyphenationFrequency="normalFast"
                   android:textColor="?android:attr/textColorSecondary" />
     </LinearLayout>
     <LinearLayout
diff --git a/res/layout/preference_single_target.xml b/res/layout/preference_single_target.xml
index 27c33ba..ae40fd3 100644
--- a/res/layout/preference_single_target.xml
+++ b/res/layout/preference_single_target.xml
@@ -76,6 +76,7 @@
                 android:layout_alignStart="@android:id/title"
                 android:textAppearance="?android:attr/textAppearanceListItemSecondary"
                 android:textColor="?android:attr/textColorSecondary"
+                android:hyphenationFrequency="normalFast"
                 android:maxLines="10" />
 
         </RelativeLayout>
diff --git a/res/layout/preference_two_target_radio.xml b/res/layout/preference_two_target_radio.xml
index dc97f1d..e5e6d4a 100644
--- a/res/layout/preference_two_target_radio.xml
+++ b/res/layout/preference_two_target_radio.xml
@@ -73,6 +73,7 @@
                 android:layout_alignStart="@android:id/title"
                 android:textAppearance="?android:attr/textAppearanceListItemSecondary"
                 android:textColor="?android:attr/textColorSecondary"
+                android:hyphenationFrequency="normalFast"
                 android:maxLines="10" />
 
         </RelativeLayout>
diff --git a/res/layout/radio_with_summary.xml b/res/layout/radio_with_summary.xml
index 5b89591..2f39e67 100644
--- a/res/layout/radio_with_summary.xml
+++ b/res/layout/radio_with_summary.xml
@@ -33,6 +33,7 @@
         android:gravity="center_vertical"
         android:paddingStart="20dp"
         android:drawableStart="?android:attr/listChoiceIndicatorSingle"
+        android:hyphenationFrequency="normalFast"
         android:ellipsize="marquee" />
 
 
@@ -43,6 +44,7 @@
         android:paddingStart="52dp"
         android:textAppearance="?android:attr/textAppearanceListItemSecondary"
         android:textColor="?android:attr/textColorSecondary"
+        android:hyphenationFrequency="normalFast"
         android:maxLines="10" />
 
 </com.android.settings.CheckableLinearLayout>
diff --git a/res/layout/running_services_app_item.xml b/res/layout/running_services_app_item.xml
index 705d714..f258530 100644
--- a/res/layout/running_services_app_item.xml
+++ b/res/layout/running_services_app_item.xml
@@ -55,6 +55,7 @@
             android:ellipsize="marquee"
             android:fadingEdge="horizontal"
             android:maxLines="2"
+            android:hyphenationFrequency="normalFast"
             android:textAppearance="?android:attr/textAppearanceListItem"/>
 
         <TextView
@@ -63,6 +64,7 @@
             android:layout_height="wrap_content"
             android:textDirection="locale"
             android:textAppearance="?android:attr/textAppearanceSmall"
+            android:hyphenationFrequency="normalFast"
             android:textColor="?android:attr/textColorSecondary"/>
 
     </LinearLayout>
diff --git a/res/layout/settings_summary_preference.xml b/res/layout/settings_summary_preference.xml
index 61f27ca..2f899e1 100644
--- a/res/layout/settings_summary_preference.xml
+++ b/res/layout/settings_summary_preference.xml
@@ -32,6 +32,7 @@
         android:paddingTop="0dp"
         android:textColor="?android:attr/textColorPrimary"
         android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
+        android:hyphenationFrequency="normalFast"
         />
 
     <TextView android:id="@android:id/summary"
@@ -40,6 +41,7 @@
         android:textAppearance="?android:attr/textAppearanceListItemSecondary"
         android:textColor="?android:attr/textColorSecondary"
         android:paddingBottom="5dp"
+        android:hyphenationFrequency="normalFast"
         android:maxLines="10" />
 
     <ProgressBar
diff --git a/res/values-night/themes_suw.xml b/res/values-night/themes_suw.xml
index dea7b1a..527918b 100644
--- a/res/values-night/themes_suw.xml
+++ b/res/values-night/themes_suw.xml
@@ -21,6 +21,7 @@
     <style name="GlifTheme.DayNight" parent="GlifTheme" />
     <style name="GlifV2Theme.DayNight" parent="GlifV2Theme" />
     <style name="GlifV3Theme.DayNight" parent="GlifV3Theme" />
+    <style name="GlifV4Theme.DayNight" parent="GlifV4Theme" />
     <style name="GlifV3Theme.DayNight.NoActionBar" parent="GlifV3Theme.NoActionBar" />
     <style name="GlifV2Theme.DayNight.Transparent" parent="GlifV2Theme.Transparent" />
     <style name="GlifV3Theme.DayNight.Transparent" parent="GlifV3Theme.Transparent" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9693707..4b163a0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2967,7 +2967,7 @@
     <!-- Display settings screen, "QHD+" screen resolution summary [CHAR LIMIT=NONE] -->
     <string name="screen_resolution_summary_highest">1440p QHD+</string>
     <!-- The footer message for switch screen resolution [CHAR LIMIT=NONE] -->
-    <string name="screen_resolution_footer">Full resolution uses more of your battery. Switching to full resolution may cause some apps to restart.</string>
+    <string name="screen_resolution_footer">Full resolution uses more of your battery. Switching your resolution may cause some apps to restart.</string>
 
     <!-- Display settings screen, Color mode settings title [CHAR LIMIT=30] -->
     <string name="color_mode_title">Colors</string>
@@ -5329,7 +5329,9 @@
     <!-- Title for the confirm dialog of reset settings. [CHAR LIMIT=NONE] -->
     <string name="accessibility_text_reading_confirm_dialog_title">Reset display size and text?</string>
     <!-- Message for the confirm dialog of reset settings. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_text_reading_confirm_dialog_message">Your display size and text preferences will reset to the phone\u2019s original settings</string>
+    <string name="accessibility_text_reading_confirm_dialog_message" product="default">Your display size and text preferences will reset to the phone\u2019s original settings</string>
+    <!-- Message for the confirm dialog of reset settings. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_text_reading_confirm_dialog_message" product="tablet">Your display size and text preferences will reset to the tablet\u2019s original settings</string>
     <!-- Title for the reset button of the confirm dialog of reset settings. [CHAR LIMIT=25] -->
     <string name="accessibility_text_reading_confirm_dialog_reset_button">Reset</string>
     <!-- Conversation message for the messaging app preview screen. [CHAR LIMIT=NONE] -->
diff --git a/res/values/themes_suw.xml b/res/values/themes_suw.xml
index 79adbd8..07232a3 100644
--- a/res/values/themes_suw.xml
+++ b/res/values/themes_suw.xml
@@ -133,6 +133,43 @@
         <item name="*android:lockPatternStyle">@style/LockPatternStyle</item>
     </style>
 
+    <style name="GlifV4Theme" parent="SudThemeGlifV4.DayNight">
+        <!-- For all AndroidX Alert Dialogs -->
+        <item name="alertDialogTheme">@style/GlifV2ThemeAlertDialog</item>
+        <item name="android:windowBackground">?android:attr/colorBackground</item>
+        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
+        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
+        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
+        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
+        <item name="side_margin">0dip</item>
+        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifi_friction">@drawable/wifi_friction</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
+        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
+
+        <!-- LockPatternView colors -->
+        <item name="*android:lockPatternStyle">@style/LockPatternStyle</item>
+    </style>
+
+    <style name="GlifV4Theme.Light" parent="SudThemeGlifV4.Light">
+        <!-- For all AndroidX Alert Dialogs -->
+        <item name="alertDialogTheme">@style/GlifV2ThemeAlertDialog.Light</item>
+        <item name="android:windowBackground">?android:attr/colorBackground</item>
+        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
+        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
+        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
+        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
+        <item name="side_margin">0dip</item>
+        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifi_friction">@drawable/wifi_friction</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
+        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
+
+        <item name="*android:lockPatternStyle">@style/LockPatternStyle</item>
+    </style>
+
     <style name="GlifV3Theme.Light.NoActionBar" parent="GlifV3Theme.Light">
         <item name="android:windowActionBar">false</item>
     </style>
@@ -238,6 +275,7 @@
     <style name="GlifTheme.DayNight" parent="GlifTheme.Light" />
     <style name="GlifV2Theme.DayNight" parent="GlifV2Theme.Light" />
     <style name="GlifV3Theme.DayNight" parent="GlifV3Theme.Light" />
+    <style name="GlifV4Theme.DayNight" parent="GlifV4Theme.Light" />
     <style name="GlifV3Theme.DayNight.NoActionBar" parent="GlifV3Theme.Light.NoActionBar" />
     <style name="GlifV2Theme.DayNight.Transparent" parent="GlifV2Theme.Light.Transparent" />
     <style name="GlifV3Theme.DayNight.Transparent" parent="GlifV3Theme.Light.Transparent" />
diff --git a/src/com/android/settings/ChangeIds.java b/src/com/android/settings/ChangeIds.java
new file mode 100644
index 0000000..1f77201
--- /dev/null
+++ b/src/com/android/settings/ChangeIds.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+
+package com.android.settings;
+
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.LoggingOnly;
+
+/**
+ * All the {@link ChangeId} used for Settings App.
+ */
+public class ChangeIds {
+    /**
+     * Intents with action {@code android.settings.MANAGE_APP_OVERLAY_PERMISSION}
+     * and data URI scheme {@code package} don't go to the app-specific screen for managing the
+     * permission anymore. Instead, they redirect to this screen for managing all the apps that have
+     * requested such permission.
+     */
+    @ChangeId
+    @LoggingOnly
+    public static final long CHANGE_RESTRICT_SAW_INTENT = 135920175L;
+}
diff --git a/src/com/android/settings/DefaultRingtonePreference.java b/src/com/android/settings/DefaultRingtonePreference.java
index 824a5a0..9bf626c 100644
--- a/src/com/android/settings/DefaultRingtonePreference.java
+++ b/src/com/android/settings/DefaultRingtonePreference.java
@@ -51,7 +51,7 @@
             return;
         }
 
-        String mimeType = getContext().getContentResolver().getType(ringtoneUri);
+        String mimeType = mUserContext.getContentResolver().getType(ringtoneUri);
         if (mimeType == null) {
             Log.e(TAG, "onSaveRingtone for URI:" + ringtoneUri
                     + " ignored: failure to find mimeType (no access from this context?)");
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index bb217a0..1a9bdc7 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -466,6 +466,15 @@
             return false;
         }
 
+        // If the activity's launch mode is "singleInstance", it can't be embedded in Settings since
+        // it will be created in a new task.
+        ActivityInfo info = intent.resolveActivityInfo(getPackageManager(),
+                PackageManager.MATCH_DEFAULT_ONLY);
+        if (info.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
+            Log.w(LOG_TAG, "launchMode: singleInstance");
+            return false;
+        }
+
         if (intent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) {
             // Slice deep link starts the Intent using SubSettingLauncher. Returns true to show
             // 2-pane deep link.
diff --git a/src/com/android/settings/SetupWizardUtils.java b/src/com/android/settings/SetupWizardUtils.java
index e0e9073..25e9159 100644
--- a/src/com/android/settings/SetupWizardUtils.java
+++ b/src/com/android/settings/SetupWizardUtils.java
@@ -48,9 +48,9 @@
             if (WizardManagerHelper.isAnySetupWizard(intent)) {
                 if (ThemeHelper.isSetupWizardDayNightEnabled(context)) {
                     switch (theme) {
-                        // TODO(b/233032365): Create glif v4 theme for this case.
                         case ThemeHelper.THEME_GLIF_V4_LIGHT:
                         case ThemeHelper.THEME_GLIF_V4:
+                            return R.style.GlifV4Theme_DayNight;
                         case ThemeHelper.THEME_GLIF_V3_LIGHT:
                         case ThemeHelper.THEME_GLIF_V3:
                             return R.style.GlifV3Theme_DayNight;
@@ -63,11 +63,12 @@
                     }
                 } else {
                     switch (theme) {
-                        // TODO(b/233032365): Create glif v4 theme for this case.
                         case ThemeHelper.THEME_GLIF_V4_LIGHT:
+                            return R.style.GlifV4Theme_Light;
+                        case ThemeHelper.THEME_GLIF_V4:
+                            return R.style.GlifV4Theme;
                         case ThemeHelper.THEME_GLIF_V3_LIGHT:
                             return R.style.GlifV3Theme_Light;
-                        case ThemeHelper.THEME_GLIF_V4:
                         case ThemeHelper.THEME_GLIF_V3:
                             return R.style.GlifV3Theme;
                         case ThemeHelper.THEME_GLIF_V2_LIGHT:
@@ -82,9 +83,9 @@
                 }
             } else {
                 switch (theme) {
-                    // TODO(b/233032365): Create glif v4 theme for this case.
                     case ThemeHelper.THEME_GLIF_V4_LIGHT:
                     case ThemeHelper.THEME_GLIF_V4:
+                        return R.style.GlifV4Theme;
                     case ThemeHelper.THEME_GLIF_V3_LIGHT:
                     case ThemeHelper.THEME_GLIF_V3:
                         return R.style.GlifV3Theme;
diff --git a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java
index f0b3329..e3c577b 100644
--- a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java
@@ -33,13 +33,9 @@
 import android.content.pm.PackageManager;
 import android.permission.PermissionControllerManager;
 import android.provider.DeviceConfig;
-import android.text.TextUtils;
 import android.util.Slog;
 
 import androidx.annotation.NonNull;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
 
@@ -49,8 +45,7 @@
  * A PreferenceController handling the logic for exempting hibernation of app
  */
 public final class HibernationSwitchPreferenceController extends AppInfoPreferenceControllerBase
-        implements LifecycleObserver, AppOpsManager.OnOpChangedListener,
-        Preference.OnPreferenceChangeListener {
+        implements Preference.OnPreferenceChangeListener {
     private static final String TAG = "HibernationSwitchPrefController";
     private String mPackageName;
     private final AppOpsManager mAppOpsManager;
@@ -69,19 +64,6 @@
         mPermissionControllerManager = context.getSystemService(PermissionControllerManager.class);
     }
 
-    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
-    public void onResume() {
-        if (mIsPackageSet) {
-            mAppOpsManager.startWatchingMode(
-                    OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, mPackageName, this);
-        }
-    }
-
-    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
-    public void onPause() {
-        mAppOpsManager.stopWatchingMode(this);
-    }
-
     @Override
     public int getAvailabilityStatus() {
         return isHibernationEnabled() && mIsPackageSet ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
@@ -149,14 +131,6 @@
     }
 
     @Override
-    public void onOpChanged(String op, String packageName) {
-        if (OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED.equals(op)
-                && TextUtils.equals(mPackageName, packageName)) {
-            updateState(mPreference);
-        }
-    }
-
-    @Override
     public boolean onPreferenceChange(Preference preference, Object isChecked) {
         try {
             final boolean checked = (boolean) isChecked;
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index ead9840..e12bc1c 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -18,6 +18,7 @@
 
 import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE;
 
+import static com.android.settings.ChangeIds.CHANGE_RESTRICT_SAW_INTENT;
 import static com.android.settings.applications.manageapplications.AppFilterRegistry.FILTER_APPS_ALL;
 import static com.android.settings.applications.manageapplications.AppFilterRegistry.FILTER_APPS_BLOCKED;
 import static com.android.settings.applications.manageapplications.AppFilterRegistry.FILTER_APPS_DISABLED;
@@ -37,8 +38,6 @@
 import android.app.ActivityManager;
 import android.app.settings.SettingsEnums;
 import android.app.usage.IUsageStatsManager;
-import android.compat.annotation.ChangeId;
-import android.compat.annotation.LoggingOnly;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
@@ -190,16 +189,6 @@
     public static final int STORAGE_TYPE_DEFAULT = 0; // Show all apps that are not categorized.
     public static final int STORAGE_TYPE_LEGACY = 1;  // Show apps even if they can be categorized.
 
-    /**
-     * Intents with action {@code android.settings.MANAGE_APP_OVERLAY_PERMISSION}
-     * and data URI scheme {@code package} don't go to the app-specific screen for managing the
-     * permission anymore. Instead, they redirect to this screen for managing all the apps that have
-     * requested such permission.
-     */
-    @ChangeId
-    @LoggingOnly
-    private static final long CHANGE_RESTRICT_SAW_INTENT = 135920175L;
-
     // sort order
     @VisibleForTesting
     int mSortOrder = R.id.sort_order_alpha;
diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java
index 322b971..9c24a23 100644
--- a/src/com/android/settings/core/SettingsBaseActivity.java
+++ b/src/com/android/settings/core/SettingsBaseActivity.java
@@ -15,6 +15,8 @@
  */
 package com.android.settings.core;
 
+import static android.text.Layout.HYPHENATION_FREQUENCY_NORMAL_FAST;
+
 import android.annotation.LayoutRes;
 import android.app.ActivityManager;
 import android.content.ComponentName;
@@ -106,6 +108,7 @@
             mAppBarLayout = findViewById(R.id.app_bar);
             if (mCollapsingToolbarLayout != null) {
                 mCollapsingToolbarLayout.setLineSpacingMultiplier(TOOLBAR_LINE_SPACING_MULTIPLIER);
+                mCollapsingToolbarLayout.setHyphenationFrequency(HYPHENATION_FREQUENCY_NORMAL_FAST);
             }
             disableCollapsingToolbarLayoutScrollingBehavior();
         } else {
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index f0d2799..d57a2a1 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -40,6 +40,8 @@
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.PreferenceCategory;
+import androidx.recyclerview.widget.DefaultItemAnimator;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.R;
 import com.android.settings.applications.AppInfoBase;
@@ -105,6 +107,7 @@
     private Context mContext;
     private ArrayList<Long> mCycles;
     private long mSelectedCycle;
+    private boolean mIsLoading;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -226,6 +229,16 @@
     @Override
     public void onResume() {
         super.onResume();
+        // No animations will occur before:
+        //  - LOADER_APP_USAGE_DATA initially updates the cycle
+        //  - updatePrefs() initially updates the preference visibility
+        // This is mainly for the cycle spinner, because when the page is entered from the
+        // AppInfoDashboardFragment, there is no way to know whether the cycle data is available
+        // before finished the async loading.
+        // The animator will be set back if any page updates happens after loading, in
+        // setBackPreferenceListAnimatorIfLoaded().
+        mIsLoading = true;
+        getListView().setItemAnimator(null);
         if (mDataSaverBackend != null) {
             mDataSaverBackend.addListener(this);
         }
@@ -297,7 +310,25 @@
         }
     }
 
+    /**
+     * Sets back the preference list's animator if the loading is finished.
+     *
+     * The preference list's animator was temporarily removed before loading in onResume().
+     * When need to update the preference visibility in this page after the loading, adding the
+     * animator back to keeping the usual animations.
+     */
+    private void setBackPreferenceListAnimatorIfLoaded() {
+        if (mIsLoading) {
+            return;
+        }
+        RecyclerView recyclerView = getListView();
+        if (recyclerView.getItemAnimator() == null) {
+            recyclerView.setItemAnimator(new DefaultItemAnimator());
+        }
+    }
+
     private void updatePrefs(boolean restrictBackground, boolean unrestrictData) {
+        setBackPreferenceListAnimatorIfLoaded();
         final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted(
                 mContext, mPackageName, UserHandle.getUserId(mAppItem.key));
         if (mRestrictBackground != null) {
@@ -448,6 +479,7 @@
                 } else {
                     bindData(0 /* position */);
                 }
+                mIsLoading = false;
             }
 
             @Override
diff --git a/src/com/android/settings/datausage/AppDataUsagePreference.java b/src/com/android/settings/datausage/AppDataUsagePreference.java
index 3025a49..2805819 100644
--- a/src/com/android/settings/datausage/AppDataUsagePreference.java
+++ b/src/com/android/settings/datausage/AppDataUsagePreference.java
@@ -20,6 +20,7 @@
 
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.settings.R;
 import com.android.settingslib.AppItem;
 import com.android.settingslib.net.UidDetail;
 import com.android.settingslib.net.UidDetailProvider;
@@ -49,6 +50,9 @@
         if (mDetail != null) {
             setAppInfo();
         } else {
+            // Set a placeholder title before starting to fetch real title, this is necessary
+            // to avoid preference height change.
+            setTitle(R.string.summary_placeholder);
             ThreadUtils.postOnBackgroundThread(() -> {
                 mDetail = provider.getUidDetail(mItem.key, true /* blocking */);
                 ThreadUtils.postOnMainThread(() -> setAppInfo());
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index a4809c9..a4cc513 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -378,9 +378,7 @@
             return;
         }
 
-        if (getView().findViewById(R.id.loading_container).getVisibility() == View.VISIBLE) {
-            setLoading(false /* loading */, true /* animate */);
-        }
+        setLoading(false /* loading */, true /* animate */);
 
         final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
         mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java
index fb384d4..825cb09 100644
--- a/src/com/android/settings/network/SubscriptionsPreferenceController.java
+++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java
@@ -274,8 +274,12 @@
         String result = mSubsPrefCtrlInjector.getNetworkType(
                 mContext, mConfig, mTelephonyDisplayInfo, subId, isCarrierNetworkActive);
         if (mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext) || isCarrierNetworkActive) {
-            result = mContext.getString(R.string.preference_summary_default_combination,
-                    mContext.getString(R.string.mobile_data_connection_active), result);
+            if (result.isEmpty()) {
+                result = mContext.getString(R.string.mobile_data_connection_active);
+            } else {
+                result = mContext.getString(R.string.preference_summary_default_combination,
+                        mContext.getString(R.string.mobile_data_connection_active), result);
+            }
         } else if (!isDataInService) {
             result = mContext.getString(R.string.mobile_data_no_connection);
         }
diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java
index 813b9d6..c9c52cb 100644
--- a/src/com/android/settings/network/UiccSlotUtil.java
+++ b/src/com/android/settings/network/UiccSlotUtil.java
@@ -193,7 +193,7 @@
                             if (slotInfo == null) {
                                 return false;
                             }
-                            return !slotInfo.isRemovable();
+                            return slotInfo.getIsEuicc();
                         })
                 .findFirst().orElse(-1);
 
diff --git a/src/com/android/settings/slices/SlicesIndexer.java b/src/com/android/settings/slices/SlicesIndexer.java
index ac30c6c..0160843 100644
--- a/src/com/android/settings/slices/SlicesIndexer.java
+++ b/src/com/android/settings/slices/SlicesIndexer.java
@@ -101,7 +101,7 @@
         for (SliceData dataRow : indexData) {
             values = new ContentValues();
             values.put(IndexColumns.KEY, dataRow.getKey());
-            values.put(IndexColumns.SLICE_URI, dataRow.getUri().toSafeString());
+            values.put(IndexColumns.SLICE_URI, dataRow.getUri().toString());
             values.put(IndexColumns.TITLE, dataRow.getTitle());
             values.put(IndexColumns.SUMMARY, dataRow.getSummary());
             final CharSequence screenTitle = dataRow.getScreenTitle();
@@ -122,4 +122,4 @@
                     values);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
index 14431ee..483d746 100644
--- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
@@ -48,6 +48,7 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.applications.AppInfoBase;
 import com.android.settings.testutils.FakeFeatureFactory;
@@ -240,6 +241,7 @@
         ReflectionHelpers.setField(mFragment, "mUnrestrictedData", unrestrictedDataPref);
         ReflectionHelpers.setField(mFragment, "mDataSaverBackend", dataSaverBackend);
         ReflectionHelpers.setField(mFragment.services, "mPolicyManager", networkPolicyManager);
+        when(mFragment.getListView()).thenReturn(mock(RecyclerView.class));
 
         ShadowRestrictedLockUtilsInternal.setRestricted(true);
         doReturn(NetworkPolicyManager.POLICY_NONE).when(networkPolicyManager)
diff --git a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
index 15a124d..f349600 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
@@ -120,7 +120,7 @@
         final Intent searchIntent = mProvider.buildSearchIntent(mActivity, SettingsEnums.TESTING);
         final Uri referrer = searchIntent.getParcelableExtra(Intent.EXTRA_REFERRER);
 
-        assertThat(referrer.toSafeString()).isEqualTo(
+        assertThat(referrer.toString()).isEqualTo(
                 "android-app://" + mActivity.getPackageName() + "/" + SettingsEnums.TESTING);
     }
 
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
index f47c5f9..fa1fed5 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
@@ -332,7 +332,7 @@
         values.put(SlicesDatabaseHelper.IndexColumns.ICON_RESOURCE, SliceTestUtils.FAKE_ICON);
         values.put(SlicesDatabaseHelper.IndexColumns.FRAGMENT, SliceTestUtils.FAKE_FRAGMENT_NAME);
         values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, controllerClass);
-        values.put(SlicesDatabaseHelper.IndexColumns.SLICE_URI, buildUri(key).toSafeString());
+        values.put(SlicesDatabaseHelper.IndexColumns.SLICE_URI, buildUri(key).toString());
         values.put(SlicesDatabaseHelper.IndexColumns.HIGHLIGHT_MENU_RESOURCE,
                 SliceTestUtils.FAKE_HIGHLIGHT_MENU_RES);
         mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
@@ -357,4 +357,4 @@
             return true;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
index 0c654a4..69f1886 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
@@ -121,7 +121,7 @@
         assertThat(fakeSlice.getScreenTitle()).isEqualTo(FAKE_SCREEN_TITLE);
         assertThat(fakeSlice.getKeywords()).isNull();
         assertThat(fakeSlice.getIconResource()).isNotNull();
-        assertThat(fakeSlice.getUri().toSafeString())
+        assertThat(fakeSlice.getUri().toString())
                 .isEqualTo("content://com.android.settings.slices/action/key");
         assertThat(fakeSlice.getFragmentClassName()).isEqualTo(FAKE_FRAGMENT_CLASSNAME);
         assertThat(fakeSlice.getPreferenceController()).isEqualTo(FAKE_CONTROLLER_NAME);
@@ -160,4 +160,4 @@
 
         return serviceInfoList;
     }
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/slices/SliceTestUtils.java b/tests/robotests/src/com/android/settings/slices/SliceTestUtils.java
index 97beeb3..d6a0b5e 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceTestUtils.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceTestUtils.java
@@ -64,7 +64,7 @@
                                 : SettingsSliceProvider.SLICE_AUTHORITY)
                         .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
                         .appendPath(key)
-                        .build().toSafeString());
+                        .build().toString());
         values.put(SlicesDatabaseHelper.IndexColumns.TITLE, FAKE_TITLE);
         values.put(SlicesDatabaseHelper.IndexColumns.SUMMARY, FAKE_SUMMARY);
         values.put(SlicesDatabaseHelper.IndexColumns.SCREENTITLE, FAKE_SCREEN_TITLE);
diff --git a/tests/unit/src/com/android/settings/DefaultRingtonePreferenceTest.java b/tests/unit/src/com/android/settings/DefaultRingtonePreferenceTest.java
index b9dea01..7877684 100644
--- a/tests/unit/src/com/android/settings/DefaultRingtonePreferenceTest.java
+++ b/tests/unit/src/com/android/settings/DefaultRingtonePreferenceTest.java
@@ -59,6 +59,7 @@
         when(mDefaultRingtonePreference.getRingtoneType())
                 .thenReturn(RingtoneManager.TYPE_RINGTONE);
         mDefaultRingtonePreference.setUserId(1);
+        mDefaultRingtonePreference.mUserContext = context;
     }
 
     @Test
diff --git a/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java b/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
index 2cf9845..5aa73ea 100644
--- a/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
+++ b/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
@@ -92,6 +92,14 @@
 
         assertThat(testSlot).isEqualTo(0);
     }
+    @Test
+    public void getEsimSlotId_twoSimSlotsDeviceAndRemovableEsimIsSlot1_returnTheCorrectEsimSlot() {
+        when(mTelephonyManager.getUiccSlotsInfo()).thenReturn(
+                twoSimSlotsDeviceActivePsimActiveRemovableEsim());
+        int testSlot = UiccSlotUtil.getEsimSlotId(mContext);
+
+        assertThat(testSlot).isEqualTo(1);
+    }
 
     @Test
     public void getEsimSlotId_twoSimSlotsDeviceAndEsimIsSlot1_returnTheCorrectEsimSlot() {
@@ -729,6 +737,12 @@
                 createUiccSlotInfo(true, false, 1, true)};
     }
 
+    private UiccSlotInfo[] twoSimSlotsDeviceActivePsimActiveRemovableEsim() {
+        return new UiccSlotInfo[]{
+                createUiccSlotInfo(false, true, 0, true),
+                createUiccSlotInfo(true, true, 1, true)};
+    }
+
     private UiccSlotInfo[] twoSimSlotsDeviceActiveEsimActivePsim() {
         return new UiccSlotInfo[]{
                 createUiccSlotInfo(true, false, 0, true),
diff --git a/tests/unit/src/com/android/settings/slices/SliceTestUtils.java b/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
index 40a827a..020bde2 100644
--- a/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
+++ b/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
@@ -64,7 +64,7 @@
                                 : SettingsSliceProvider.SLICE_AUTHORITY)
                         .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
                         .appendPath(key)
-                        .build().toSafeString());
+                        .build().toString());
         values.put(SlicesDatabaseHelper.IndexColumns.TITLE, FAKE_TITLE);
         values.put(SlicesDatabaseHelper.IndexColumns.SUMMARY, FAKE_SUMMARY);
         values.put(SlicesDatabaseHelper.IndexColumns.SCREENTITLE, FAKE_SCREEN_TITLE);