Merge "Refactor FingerprintEnrollEnrolling to fragment"
diff --git a/res/drawable/ic_battery_charging.xml b/res/drawable/ic_battery_charging.xml
new file mode 100644
index 0000000..06e0e71
--- /dev/null
+++ b/res/drawable/ic_battery_charging.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M8,22q-0.425,0 -0.713,-0.288Q7,21.425 7,21L7,5q0,-0.425 0.287,-0.713Q7.575,4 8,4h2L10,2h4v2h2q0.425,0 0.712,0.287Q17,4.575 17,5v16q0,0.425 -0.288,0.712Q16.425,22 16,22zM11,20l4,-7.5h-2L13,7l-4,7.5h2z"/>
+</vector>
diff --git a/res/drawable/ic_edit.xml b/res/drawable/ic_edit.xml
index abc1980..0d7cd1c 100644
--- a/res/drawable/ic_edit.xml
+++ b/res/drawable/ic_edit.xml
@@ -15,6 +15,12 @@
   ~ limitations under the License.
   -->
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorControlNormal">
-    <path android:fillColor="@android:color/white" android:pathData="M9,39H11.2L35.45,14.75L34.35,13.65L33.25,12.55L9,36.8ZM6,42V35.6L35.4,6.2Q36.25,5.35 37.525,5.375Q38.8,5.4 39.65,6.25L41.8,8.4Q42.65,9.25 42.65,10.5Q42.65,11.75 41.8,12.6L12.4,42ZM39.5,10.45 L37.45,8.4ZM35.45,14.75 L34.35,13.65 33.25,12.55 35.45,14.75Z"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24"
+        android:tint="?android:attr/colorControlNormal">
+    <path android:fillColor="#FFFFFFFF"
+          android:pathData="M5,19H6.4L16.45,8.975L15.75,8.25L15.025,7.55L5,17.6ZM3,21V16.75L16.45,3.325Q17.025,2.75 17.863,2.75Q18.7,2.75 19.275,3.325L20.675,4.75Q21.25,5.325 21.25,6.15Q21.25,6.975 20.675,7.55L7.25,21ZM19.25,6.15 L17.85,4.75ZM16.45,8.975 L15.75,8.25 15.025,7.55 16.45,8.975Z"/>
 </vector>
\ No newline at end of file
diff --git a/res/drawable/work_challenge_emergency_button_background.xml b/res/drawable/work_challenge_emergency_button_background.xml
new file mode 100644
index 0000000..1a92fed
--- /dev/null
+++ b/res/drawable/work_challenge_emergency_button_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+<inset xmlns:android="http://schemas.android.com/apk/res/android">
+    <shape android:shape="rectangle">
+        <corners android:radius="25dp"/>
+        <solid android:color="@android:color/system_accent3_100" />
+    </shape>
+</inset>
\ No newline at end of file
diff --git a/res/layout-land/confirm_lock_pattern_base.xml b/res/layout-land/confirm_lock_pattern_base.xml
index f79fc72..9961769 100644
--- a/res/layout-land/confirm_lock_pattern_base.xml
+++ b/res/layout-land/confirm_lock_pattern_base.xml
@@ -89,6 +89,19 @@
                 android:layout_marginTop="12dp"
                 android:gravity="center_vertical"/>
 
+            <Button
+                android:id="@+id/emergencyCallButton"
+                style="@style/WorkChallengeEmergencyButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="?attr/sudMarginStart"
+                android:layout_marginEnd="?attr/sudMarginEnd"
+                android:layout_marginTop="60dp"
+                android:layout_marginBottom="14dp"
+                android:visibility="gone"
+                android:layout_gravity="center_horizontal"
+                android:text="@string/work_challenge_emergency_button_text"/>
+
         </LinearLayout>
 
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout-land/confirm_lock_pattern_normal_base.xml b/res/layout-land/confirm_lock_pattern_normal_base.xml
index ced0e2c..9a5097e 100644
--- a/res/layout-land/confirm_lock_pattern_normal_base.xml
+++ b/res/layout-land/confirm_lock_pattern_normal_base.xml
@@ -70,6 +70,19 @@
                 android:layout_marginBottom="80dp"
                 android:text="@string/cancel" />
 
+            <Button
+                android:id="@+id/emergencyCallButton"
+                style="@style/WorkChallengeEmergencyButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="?attr/sudMarginStart"
+                android:layout_marginEnd="?attr/sudMarginEnd"
+                android:layout_marginTop="60dp"
+                android:layout_marginBottom="14dp"
+                android:visibility="gone"
+                android:layout_gravity="center_horizontal"
+                android:text="@string/work_challenge_emergency_button_text"/>
+
         </LinearLayout>
 
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout/confirm_lock_password_base.xml b/res/layout/confirm_lock_password_base.xml
index a3e5659..84b6668 100644
--- a/res/layout/confirm_lock_password_base.xml
+++ b/res/layout/confirm_lock_password_base.xml
@@ -91,5 +91,17 @@
             android:layout_gravity="center_horizontal"
             android:text="@string/cancel" />
 
+        <Button
+            android:id="@+id/emergencyCallButton"
+            style="@style/WorkChallengeEmergencyButtonStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="?attr/sudMarginStart"
+            android:layout_marginEnd="?attr/sudMarginEnd"
+            android:layout_marginBottom="12dp"
+            android:visibility="gone"
+            android:layout_gravity="center_horizontal"
+            android:text="@string/work_challenge_emergency_button_text"/>
+
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/confirm_lock_password_normal.xml b/res/layout/confirm_lock_password_normal.xml
index 645c444..c2a7b5d 100644
--- a/res/layout/confirm_lock_password_normal.xml
+++ b/res/layout/confirm_lock_password_normal.xml
@@ -84,5 +84,17 @@
             android:layout_gravity="center_horizontal"
             android:text="@string/cancel" />
 
+        <Button
+            android:id="@+id/emergencyCallButton"
+            style="@style/WorkChallengeEmergencyButtonStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="?attr/sudMarginStart"
+            android:layout_marginEnd="?attr/sudMarginEnd"
+            android:layout_marginBottom="12dp"
+            android:visibility="gone"
+            android:layout_gravity="center_horizontal"
+            android:text="@string/work_challenge_emergency_button_text"/>
+
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/confirm_lock_pattern_base.xml b/res/layout/confirm_lock_pattern_base.xml
index 5b19105..01f028e 100644
--- a/res/layout/confirm_lock_pattern_base.xml
+++ b/res/layout/confirm_lock_pattern_base.xml
@@ -89,6 +89,19 @@
                 android:layout_marginTop="12dp"
                 android:gravity="center_vertical"/>
 
+            <Button
+                android:id="@+id/emergencyCallButton"
+                style="@style/WorkChallengeEmergencyButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="?attr/sudMarginStart"
+                android:layout_marginEnd="?attr/sudMarginEnd"
+                android:layout_marginTop="60dp"
+                android:layout_marginBottom="14dp"
+                android:visibility="gone"
+                android:layout_gravity="center_horizontal"
+                android:text="@string/work_challenge_emergency_button_text"/>
+
         </LinearLayout>
 
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout/confirm_lock_pattern_normal_base.xml b/res/layout/confirm_lock_pattern_normal_base.xml
index 5d1ca7c..44d9ab7 100644
--- a/res/layout/confirm_lock_pattern_normal_base.xml
+++ b/res/layout/confirm_lock_pattern_normal_base.xml
@@ -71,6 +71,18 @@
                 android:layout_marginBottom="80dp"
                 android:text="@string/cancel" />
 
+            <Button
+                android:id="@+id/emergencyCallButton"
+                style="@style/WorkChallengeEmergencyButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="?attr/sudMarginStart"
+                android:layout_marginEnd="?attr/sudMarginEnd"
+                android:layout_marginBottom="12dp"
+                android:visibility="gone"
+                android:layout_gravity="center_horizontal"
+                android:text="@string/work_challenge_emergency_button_text"/>
+
         </LinearLayout>
 
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/values/config.xml b/res/values/config.xml
index aa345ca..5c5a07f 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -600,13 +600,7 @@
     <!-- The option list for switch screen resolution -->
     <string-array name="config_screen_resolution_options_strings" translatable="false">
         <item>@string/screen_resolution_option_high</item>
-        <item>@string/screen_resolution_option_highest</item>
-    </string-array>
-
-    <!-- The option summary list for screen resolution -->
-    <string-array name="config_screen_resolution_summaries_strings" translatable="false">
-        <item>@string/screen_resolution_summary_high</item>
-        <item>@string/screen_resolution_summary_highest</item>
+        <item>@string/screen_resolution_option_full</item>
     </string-array>
 
     <!-- Whether to aggregate for network selection list-->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 273e3ae..9c6b03b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -839,6 +839,8 @@
     <string name="biometric_settings_intro">When you set up Face Unlock and Fingerprint Unlock, your phone will ask for your fingerprint when you wear a mask or are in a dark area</string>
     <!-- Biometric category title - biometric options for unlocking the device. [CHAR LIMIT=50] -->
     <string name="biometric_settings_category_ways_to_unlock">Ways to unlock</string>
+    <!-- Biometric category title - biometric options for unlocking the device. [CHAR LIMIT=60] -->
+    <string name="biometric_settings_category_use_face_fingerprint">Use face or fingerprint to</string>
     <!-- Text shown on a toggle which allows or disallows the device to use biometric for unlocking the device. [CHAR LIMIT=50] -->
     <string name="biometric_settings_use_biometric_unlock_phone">Unlock your phone</string>
     <!-- Text shown on a toggle which allows or disallows the device to use biometric for authentication. [CHAR LIMIT=50] -->
@@ -2208,14 +2210,10 @@
 
     <!-- Display settings screen, screen resolution settings title [CHAR LIMIT=30] -->
     <string name="screen_resolution_title">Screen resolution</string>
-    <!-- Display settings screen, screen resolution option for "FHD+" [CHAR LIMIT=45] -->
+    <!-- Display settings screen, screen resolution option for high resolution [CHAR LIMIT=45] -->
     <string name="screen_resolution_option_high">High resolution</string>
-    <!-- Display settings screen, screen resolution option for "QHD+" [CHAR LIMIT=45] -->
-    <string name="screen_resolution_option_highest">Full resolution</string>
-    <!-- Display settings screen, "FHD+" screen resolution summary [CHAR LIMIT=NONE] -->
-    <string name="screen_resolution_summary_high">1080p FHD+</string>
-    <!-- Display settings screen, "QHD+" screen resolution summary [CHAR LIMIT=NONE] -->
-    <string name="screen_resolution_summary_highest">1440p QHD+</string>
+    <!-- Display settings screen, screen resolution option for full resolution [CHAR LIMIT=45] -->
+    <string name="screen_resolution_option_full">Full resolution</string>
     <!-- The footer message for switch screen resolution [CHAR LIMIT=NONE] -->
     <string name="screen_resolution_footer">Full resolution uses more of your battery. Switching your resolution may cause some apps to restart.</string>
     <!-- Message announced to a11y users when they selected one resolution [CHAR LIMIT=NONE] -->
@@ -3350,6 +3348,8 @@
     <!-- Security & location settings screen, change unlock pattern screen instruction if user
          draws incorrect pattern [CHAR LIMIT=30] -->
     <string name="lockpattern_need_to_unlock_wrong">Wrong pattern</string>
+    <!-- Work challenge screen, this string is the label for an emergency call button, which opens the personal safety app to allow the user to make an emergency call. [CHAR LIMIT=20] -->
+    <string name="work_challenge_emergency_button_text">Emergency</string>
 
     <!-- Lock Pattern settings -->
     <!-- Security & location settings screen, header -->
@@ -5086,6 +5086,12 @@
     <string name="battery_tip_unrestrict_app_dialog_cancel">Cancel</string>
     <!-- Charge to full button for battery defender tips [CHAR LIMIT=NONE] -->
     <string name="battery_tip_charge_to_full_button">Charge to full</string>
+    <!-- Title of incompatible charging battery tip [CHAR LIMIT=NONE] -->
+    <string name="battery_tip_incompatible_charging_title">Incompatible charging setup</string>
+    <!-- Message of incompatible charging battery tip [CHAR LIMIT=NONE] -->
+    <string name="battery_tip_incompatible_charging_message">Your battery is not charging or is charging very slowly</string>
+    <!-- Content description for the incompatible charging battery tip button [CHAR LIMIT=NONE] -->
+    <string name="battery_tip_incompatible_charging_content_description">Learn more about incompatible charging</string>
 
     <!-- Title for the smart battery manager preference [CHAR LIMIT=NONE] -->
     <string name="smart_battery_manager_title">Battery Manager</string>
@@ -6388,6 +6394,8 @@
     <string name="help_url_battery_defender" translatable="false"></string>
     <!-- Help URL, Dock Defender [DO NOT TRANSLATE] -->
     <string name="help_url_dock_defender" translatable="false"></string>
+    <!-- Help URL, Incompatible charging [DO NOT TRANSLATE] -->
+    <string name="help_url_incompatible_charging" translatable="false"></string>
     <!-- Help URL, Accounts [DO NOT TRANSLATE] -->
     <string name="help_url_accounts" translatable="false"></string>
     <!-- Help URL, Choose lockscreen [DO NOT TRANSLATE] -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 0dc19be..42ccf0d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -406,6 +406,17 @@
         <item name="android:layout_gravity">start|top</item>
     </style>
 
+    <style name="WorkChallengeEmergencyButtonStyle">
+        <item name="android:background">@drawable/work_challenge_emergency_button_background</item>
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
+        <item name="android:outlineProvider">none</item>
+        <item name="android:paddingTop">15dp</item>
+        <item name="android:paddingBottom">15dp</item>
+        <item name="android:paddingLeft">30dp</item>
+        <item name="android:paddingRight">30dp</item>
+        <item name="android:textSize">16dp</item>
+    </style>
+
     <style name="device_info_dialog_label">
         <item name="android:textAlignment">viewStart</item>
         <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
diff --git a/res/xml/security_settings_combined_biometric.xml b/res/xml/security_settings_combined_biometric.xml
index 1bbe7b3..5041778 100644
--- a/res/xml/security_settings_combined_biometric.xml
+++ b/res/xml/security_settings_combined_biometric.xml
@@ -50,7 +50,8 @@
     </PreferenceCategory>
 
     <PreferenceCategory
-        android:key="biometric_ways_to_use">
+        android:key="biometric_ways_to_use"
+        android:title="@string/biometric_settings_category_use_face_fingerprint">
 
         <com.android.settingslib.RestrictedSwitchPreference
             android:key="biometric_settings_biometric_keyguard"
diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java
index e6e6df3..49cb85e 100644
--- a/src/com/android/settings/SettingsApplication.java
+++ b/src/com/android/settings/SettingsApplication.java
@@ -53,7 +53,7 @@
         setSpaEnvironment();
 
         if (FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)
-                && SplitController.getInstance().isSplitSupported()) {
+                && SplitController.getInstance(this).isSplitSupported()) {
             if (WizardManagerHelper.isUserSetupComplete(this)) {
                 new ActivityEmbeddingRulesController(this).initRules();
             } else {
diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java
index 2c10502..1d23523 100644
--- a/src/com/android/settings/SettingsInitialize.java
+++ b/src/com/android/settings/SettingsInitialize.java
@@ -166,7 +166,7 @@
                 DeepLinkHomepageActivity.class);
         final ComponentName searchStateReceiver = new ComponentName(context,
                 SearchStateReceiver.class);
-        final int enableState = SplitController.getInstance().isSplitSupported()
+        final int enableState = SplitController.getInstance(context).isSplitSupported()
                 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                 : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
         pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP);
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
index 1e2a0c9..7bbd31b 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
@@ -22,12 +22,12 @@
 import android.content.Context;
 import android.content.Intent;
 import android.util.FeatureFlagUtils;
-import android.util.LayoutDirection;
 import android.util.Log;
 
 import androidx.window.embedding.ActivityFilter;
 import androidx.window.embedding.ActivityRule;
-import androidx.window.embedding.SplitController;
+import androidx.window.embedding.RuleController;
+import androidx.window.embedding.SplitAttributes;
 import androidx.window.embedding.SplitPairFilter;
 import androidx.window.embedding.SplitPairRule;
 import androidx.window.embedding.SplitPlaceholderRule;
@@ -50,6 +50,7 @@
 import com.android.settings.password.ChooseLockPattern;
 import com.android.settingslib.users.AvatarPickerActivity;
 
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -60,11 +61,11 @@
     private static final ComponentName COMPONENT_NAME_WILDCARD = new ComponentName(
             "*" /* pkg */, "*" /* cls */);
     private final Context mContext;
-    private final SplitController mSplitController;
+    private final RuleController mRuleController;
 
     public ActivityEmbeddingRulesController(Context context) {
         mContext = context;
-        mSplitController = SplitController.getInstance();
+        mRuleController = RuleController.getInstance(context);
     }
 
     /**
@@ -76,7 +77,7 @@
             return;
         }
 
-        mSplitController.clearRegisteredRules();
+        mRuleController.clearRules();
 
         // Set a placeholder for home page.
         registerHomepagePlaceholderRule();
@@ -89,8 +90,8 @@
             ComponentName primaryComponent,
             ComponentName secondaryComponent,
             String secondaryIntentAction,
-            int finishPrimaryWithSecondary,
-            int finishSecondaryWithPrimary,
+            SplitRule.FinishBehavior finishPrimaryWithSecondary,
+            SplitRule.FinishBehavior finishSecondaryWithPrimary,
             boolean clearTop) {
         if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
             return;
@@ -99,14 +100,20 @@
         filters.add(new SplitPairFilter(primaryComponent, secondaryComponent,
                 secondaryIntentAction));
 
-        SplitController.getInstance().registerRule(new SplitPairRule(filters,
-                finishPrimaryWithSecondary,
-                finishSecondaryWithPrimary,
-                clearTop,
-                ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
-                ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
-                ActivityEmbeddingUtils.getSplitRatio(context),
-                LayoutDirection.LOCALE));
+        SplitAttributes attributes = new SplitAttributes.Builder()
+                .setSplitType(SplitAttributes.SplitType.ratio(
+                        ActivityEmbeddingUtils.getSplitRatio(context)))
+                .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+                .build();
+        SplitPairRule splitPairRule = new SplitPairRule.Builder(filters)
+                .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary)
+                .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary)
+                .setClearTop(clearTop)
+                .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp())
+                .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp())
+                .setDefaultSplitAttributes(attributes)
+                .build();
+        RuleController.getInstance(context).addRule(splitPairRule);
     }
 
     /**
@@ -127,8 +134,10 @@
                 new ComponentName(context, Settings.class),
                 secondaryComponent,
                 secondaryIntentAction,
-                finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
-                finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
+                finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT
+                        : SplitRule.FinishBehavior.NEVER,
+                finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT
+                        : SplitRule.FinishBehavior.NEVER,
                 clearTop);
 
         registerTwoPanePairRule(
@@ -136,8 +145,10 @@
                 new ComponentName(context, SettingsHomepageActivity.class),
                 secondaryComponent,
                 secondaryIntentAction,
-                finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
-                finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
+                finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT
+                        : SplitRule.FinishBehavior.NEVER,
+                finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT
+                        : SplitRule.FinishBehavior.NEVER,
                 clearTop);
 
         // We should finish HomePageActivity altogether even if it shows in single pane for all deep
@@ -147,8 +158,10 @@
                 new ComponentName(context, DeepLinkHomepageActivity.class),
                 secondaryComponent,
                 secondaryIntentAction,
-                finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
-                finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
+                finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS
+                        : SplitRule.FinishBehavior.NEVER,
+                finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS
+                        : SplitRule.FinishBehavior.NEVER,
                 clearTop);
 
         registerTwoPanePairRule(
@@ -156,8 +169,10 @@
                 new ComponentName(context, DeepLinkHomepageActivityInternal.class),
                 secondaryComponent,
                 secondaryIntentAction,
-                finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
-                finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
+                finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS
+                        : SplitRule.FinishBehavior.NEVER,
+                finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS
+                        : SplitRule.FinishBehavior.NEVER,
                 clearTop);
     }
 
@@ -208,17 +223,20 @@
 
         final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class);
         intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true);
-        final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule(
-                activityFilters,
-                intent,
-                false /* stickyPlaceholder */,
-                SplitRule.FINISH_ADJACENT,
-                ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext),
-                ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext),
-                ActivityEmbeddingUtils.getSplitRatio(mContext),
-                LayoutDirection.LOCALE);
+        SplitAttributes attributes = new SplitAttributes.Builder()
+                .setSplitType(SplitAttributes.SplitType.ratio(
+                        ActivityEmbeddingUtils.getSplitRatio(mContext)))
+                .build();
+        final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.Builder(
+                activityFilters, intent)
+                .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp())
+                .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp())
+                .setSticky(false)
+                .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT)
+                .setDefaultSplitAttributes(attributes)
+                .build();
 
-        mSplitController.registerRule(placeholderRule);
+        mRuleController.addRule(placeholderRule);
     }
 
     private void registerAlwaysExpandRule() {
@@ -237,14 +255,16 @@
         addActivityFilter(activityFilters, FaceEnrollIntroduction.class);
         addActivityFilter(activityFilters, AvatarPickerActivity.class);
         addActivityFilter(activityFilters, ChooseLockPattern.class);
-        mSplitController.registerRule(new ActivityRule(activityFilters, true /* alwaysExpand */));
+        ActivityRule activityRule = new ActivityRule.Builder(activityFilters).setAlwaysExpand(true)
+                .build();
+        mRuleController.addRule(activityRule);
     }
 
     private static void addActivityFilter(Set<ActivityFilter> activityFilters, Intent intent) {
         activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction()));
     }
 
-    private void addActivityFilter(Set<ActivityFilter> activityFilters,
+    private void addActivityFilter(Collection<ActivityFilter> activityFilters,
             Class<? extends Activity> activityClass) {
         activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass),
                 null /* intentAction */));
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
index f00542d..370392b 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
@@ -32,29 +32,25 @@
 /** An util class collecting all common methods for the embedding activity features. */
 public class ActivityEmbeddingUtils {
     // The smallest value of current width of the window when the split should be used.
-    private static final float MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720f;
+    private static final int MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720;
     // The smallest value of the smallest-width (sw) of the window in any rotation when
     // the split should be used.
-    private static final float MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600f;
+    private static final int MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600;
     // The minimum width of the activity to show the regular homepage layout.
     private static final float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f;
     private static final String TAG = "ActivityEmbeddingUtils";
 
-    /** Get the smallest pixel value of width of the window when the split should be used. */
-    public static int getMinCurrentScreenSplitWidthPx(Context context) {
-        final DisplayMetrics dm = context.getResources().getDisplayMetrics();
-        return (int) TypedValue.applyDimension(
-                TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm);
+    /** Get the smallest width dp of the window when the split should be used. */
+    public static int getMinCurrentScreenSplitWidthDp() {
+        return MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP;
     }
 
     /**
-     * Get the smallest pixel value of the smallest-width (sw) of the window in any rotation when
+     * Get the smallest dp value of the smallest-width (sw) of the window in any rotation when
      * the split should be used.
      */
-    public static int getMinSmallestScreenSplitWidthPx(Context context) {
-        final DisplayMetrics dm = context.getResources().getDisplayMetrics();
-        return (int) TypedValue.applyDimension(
-                TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm);
+    public static int getMinSmallestScreenSplitWidthDp() {
+        return MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP;
     }
 
     /**
@@ -69,7 +65,7 @@
     public static boolean isEmbeddingActivityEnabled(Context context) {
         boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context,
                 FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN);
-        boolean isSplitSupported = SplitController.getInstance().isSplitSupported();
+        boolean isSplitSupported = SplitController.getInstance(context).isSplitSupported();
         boolean isUserSetupComplete = WizardManagerHelper.isUserSetupComplete(context);
 
         Log.d(TAG, "isFlagEnabled = " + isFlagEnabled);
diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java
index 5227284..9fec27e 100644
--- a/src/com/android/settings/datausage/DataUsageUtils.java
+++ b/src/com/android/settings/datausage/DataUsageUtils.java
@@ -15,6 +15,7 @@
 package com.android.settings.datausage;
 
 import static android.content.pm.PackageManager.FEATURE_ETHERNET;
+import static android.content.pm.PackageManager.FEATURE_USB_HOST;
 import static android.content.pm.PackageManager.FEATURE_WIFI;
 import static android.telephony.TelephonyManager.SIM_STATE_READY;
 
@@ -70,7 +71,9 @@
             return SystemProperties.get(DataUsageUtils.TEST_RADIOS_PROP).contains(ETHERNET);
         }
 
-        if (!context.getPackageManager().hasSystemFeature(FEATURE_ETHERNET)) {
+        // See ConnectivityService#deviceSupportsEthernet.
+        final PackageManager pm = context.getPackageManager();
+        if (!pm.hasSystemFeature(FEATURE_ETHERNET) && !pm.hasSystemFeature(FEATURE_USB_HOST)) {
             return false;
         }
 
diff --git a/src/com/android/settings/display/ScreenResolutionController.java b/src/com/android/settings/display/ScreenResolutionController.java
index dca1275..a3433d4 100644
--- a/src/com/android/settings/display/ScreenResolutionController.java
+++ b/src/com/android/settings/display/ScreenResolutionController.java
@@ -17,7 +17,9 @@
 package com.android.settings.display;
 
 import android.content.Context;
+import android.graphics.Point;
 import android.hardware.display.DisplayManager;
+import android.util.Log;
 import android.view.Display;
 
 import androidx.annotation.VisibleForTesting;
@@ -25,32 +27,63 @@
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 /** Controller that switch the screen resolution. */
 public class ScreenResolutionController extends BasePreferenceController {
-
-    static final int FHD_WIDTH = 1080;
-    static final int QHD_WIDTH = 1440;
+    private static final String TAG = "ScreenResolutionController";
+    static final int HIGHRESOLUTION_IDX = 0;
+    static final int FULLRESOLUTION_IDX = 1;
 
     private Display mDisplay;
+    private Set<Point> mSupportedResolutions = null;
+    private int mHighWidth = 0;
+    private int mFullWidth = 0;
+    private int mHighHeight = 0;
+    private int mFullHeight = 0;
 
     public ScreenResolutionController(Context context, String key) {
         super(context, key);
 
         mDisplay =
                 mContext.getSystemService(DisplayManager.class).getDisplay(Display.DEFAULT_DISPLAY);
+
+        initSupportedResolutionData();
     }
 
-    /** Check if the width is supported by the display. */
-    private boolean isSupportedMode(int width) {
+    /**
+     * Initialize the resolution data. So far, we support two resolution switching. Save the width
+     * and the height for high resolution and full resolution.
+     */
+    private void initSupportedResolutionData() {
+        // Collect and filter the resolutions
+        Set<Point> resolutions = new HashSet<>();
         for (Display.Mode mode : getSupportedModes()) {
-            if (mode.getPhysicalWidth() == width) return true;
+            resolutions.add(new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight()));
         }
-        return false;
+        mSupportedResolutions = resolutions;
+
+        // Get the width and height for high resolution and full resolution
+        List<Point> resolutionList = new ArrayList<>(resolutions);
+        if (resolutionList == null || resolutionList.size() != 2) {
+            Log.e(TAG, "No support");
+            return;
+        }
+
+        Collections.sort(resolutionList, (p1, p2) -> p1.x * p1.y - p2.x * p2.y);
+        mHighWidth = resolutionList.get(HIGHRESOLUTION_IDX).x;
+        mHighHeight = resolutionList.get(HIGHRESOLUTION_IDX).y;
+        mFullWidth = resolutionList.get(FULLRESOLUTION_IDX).x;
+        mFullHeight = resolutionList.get(FULLRESOLUTION_IDX).y;
     }
 
     /** Return true if the device contains two (or more) resolutions. */
     protected boolean checkSupportedResolutions() {
-        return isSupportedMode(FHD_WIDTH) && isSupportedMode(QHD_WIDTH);
+        return getHighWidth() != 0 && getFullWidth() != 0;
     }
 
     @Override
@@ -61,20 +94,43 @@
     @Override
     public CharSequence getSummary() {
         String summary = null;
-        switch (getDisplayWidth()) {
-            case FHD_WIDTH:
-                summary = mContext.getString(R.string.screen_resolution_summary_high);
-                break;
-            case QHD_WIDTH:
-                summary = mContext.getString(R.string.screen_resolution_summary_highest);
-                break;
-            default:
-                summary = mContext.getString(R.string.screen_resolution_title);
+        int width = getDisplayWidth();
+        if (width == mHighWidth) {
+            summary = mContext.getString(R.string.screen_resolution_option_high);
+        } else if (width == mFullWidth) {
+            summary = mContext.getString(R.string.screen_resolution_option_full);
+        } else {
+            summary = mContext.getString(R.string.screen_resolution_title);
         }
 
         return summary;
     }
 
+    /** Return all supported resolutions of the device. */
+    public Set<Point> getAllSupportedResolutions() {
+        return this.mSupportedResolutions;
+    }
+
+    /** Return the high resolution width of the device. */
+    public int getHighWidth() {
+        return this.mHighWidth;
+    }
+
+    /** Return the full resolution width of the device. */
+    public int getFullWidth() {
+        return this.mFullWidth;
+    }
+
+    /** Return the high resolution height of the device. */
+    public int getHighHeight() {
+        return this.mHighHeight;
+    }
+
+    /** Return the full resolution height of the device. */
+    public int getFullHeight() {
+        return this.mFullHeight;
+    }
+
     @VisibleForTesting
     public int getDisplayWidth() {
         return mDisplay.getMode().getPhysicalWidth();
diff --git a/src/com/android/settings/display/ScreenResolutionFragment.java b/src/com/android/settings/display/ScreenResolutionFragment.java
index 13191ce..b40b48f 100644
--- a/src/com/android/settings/display/ScreenResolutionFragment.java
+++ b/src/com/android/settings/display/ScreenResolutionFragment.java
@@ -16,9 +16,6 @@
 
 package com.android.settings.display;
 
-import static com.android.settings.display.ScreenResolutionController.FHD_WIDTH;
-import static com.android.settings.display.ScreenResolutionController.QHD_WIDTH;
-
 import android.annotation.Nullable;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
@@ -48,7 +45,6 @@
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
 
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -59,9 +55,8 @@
     private static final String TAG = "ScreenResolution";
 
     private Resources mResources;
-    private static final int FHD_INDEX = 0;
-    private static final int QHD_INDEX = 1;
     private static final String SCREEN_RESOLUTION = "user_selected_resolution";
+    private static final String SCREEN_RESOLUTION_KEY = "screen_resolution";
     private Display mDefaultDisplay;
     private String[] mScreenResolutionOptions;
     private Set<Point> mResolutions;
@@ -71,6 +66,9 @@
     private DisplayObserver mDisplayObserver;
     private AccessibilityManager mAccessibilityManager;
 
+    private int mHighWidth;
+    private int mFullWidth;
+
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
@@ -81,11 +79,19 @@
         mResources = context.getResources();
         mScreenResolutionOptions =
                 mResources.getStringArray(R.array.config_screen_resolution_options_strings);
-        mScreenResolutionSummaries =
-                mResources.getStringArray(R.array.config_screen_resolution_summaries_strings);
-        mResolutions = getAllSupportedResolution();
         mImagePreference = new IllustrationPreference(context);
         mDisplayObserver = new DisplayObserver(context);
+        ScreenResolutionController controller =
+                new ScreenResolutionController(context, SCREEN_RESOLUTION_KEY);
+        mResolutions = controller.getAllSupportedResolutions();
+        mHighWidth = controller.getHighWidth();
+        mFullWidth = controller.getFullWidth();
+        Log.i(TAG, "mHighWidth:" + mHighWidth + "mFullWidth:" + mFullWidth);
+        mScreenResolutionSummaries =
+                new String[] {
+                    mHighWidth + " x " + controller.getHighHeight(),
+                    mFullWidth + " x " + controller.getFullHeight()
+                };
     }
 
     @Override
@@ -133,16 +139,6 @@
         return candidates;
     }
 
-    /** Get all supported resolutions on the device. */
-    private Set<Point> getAllSupportedResolution() {
-        Set<Point> resolutions = new HashSet<>();
-        for (Display.Mode mode : mDefaultDisplay.getSupportedModes()) {
-            resolutions.add(new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight()));
-        }
-
-        return resolutions;
-    }
-
     /** Get prefer display mode. */
     private Display.Mode getPreferMode(int width) {
         for (Point resolution : mResolutions) {
@@ -177,6 +173,7 @@
 
         try {
             /** Apply the resolution change. */
+            Log.i(TAG, "setUserPreferredDisplayMode: " + mode);
             mDefaultDisplay.setUserPreferredDisplayMode(mode);
         } catch (Exception e) {
             Log.e(TAG, "setUserPreferredDisplayMode() failed", e);
@@ -194,16 +191,20 @@
     /** Get the key corresponding to the resolution. */
     @VisibleForTesting
     String getKeyForResolution(int width) {
-        return width == FHD_WIDTH
-                ? mScreenResolutionOptions[FHD_INDEX]
-                : width == QHD_WIDTH ? mScreenResolutionOptions[QHD_INDEX] : null;
+        return width == mHighWidth
+                ? mScreenResolutionOptions[ScreenResolutionController.HIGHRESOLUTION_IDX]
+                : width == mFullWidth
+                        ? mScreenResolutionOptions[ScreenResolutionController.FULLRESOLUTION_IDX]
+                        : null;
     }
 
     /** Get the width corresponding to the resolution key. */
     int getWidthForResoluitonKey(String key) {
-        return mScreenResolutionOptions[FHD_INDEX].equals(key)
-                ? FHD_WIDTH
-                : mScreenResolutionOptions[QHD_INDEX].equals(key) ? QHD_WIDTH : -1;
+        return mScreenResolutionOptions[ScreenResolutionController.HIGHRESOLUTION_IDX].equals(key)
+                ? mHighWidth
+                : mScreenResolutionOptions[ScreenResolutionController.FULLRESOLUTION_IDX].equals(
+                    key)
+                ? mFullWidth : -1;
     }
 
     @Override
@@ -248,9 +249,11 @@
     private void updateIllustrationImage(IllustrationPreference preference) {
         String key = getDefaultKey();
 
-        if (TextUtils.equals(mScreenResolutionOptions[FHD_INDEX], key)) {
+        if (TextUtils.equals(
+                mScreenResolutionOptions[ScreenResolutionController.HIGHRESOLUTION_IDX], key)) {
             preference.setLottieAnimationResId(R.drawable.screen_resolution_1080p);
-        } else if (TextUtils.equals(mScreenResolutionOptions[QHD_INDEX], key)) {
+        } else if (TextUtils.equals(
+                mScreenResolutionOptions[ScreenResolutionController.FULLRESOLUTION_IDX], key)) {
             preference.setLottieAnimationResId(R.drawable.screen_resolution_1440p);
         }
     }
@@ -300,7 +303,7 @@
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
                     ScreenResolutionController mController =
-                            new ScreenResolutionController(context, "fragment");
+                            new ScreenResolutionController(context, SCREEN_RESOLUTION_KEY);
                     return mController.checkSupportedResolutions();
                 }
             };
@@ -408,6 +411,8 @@
                 return false;
             }
 
+            Log.i(TAG,
+                    "resolution changed from " + mPreviousWidth.get() + " to " + getCurrentWidth());
             return true;
         }
     }
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
index c525be6..da646cb 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
@@ -30,7 +30,6 @@
 import com.android.settings.fuelgauge.batterytip.detectors.SmartBatteryDetector;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
 import com.android.settingslib.fuelgauge.EstimateKt;
 import com.android.settingslib.utils.AsyncLoaderCompat;
 
@@ -45,8 +44,6 @@
 public class BatteryTipLoader extends AsyncLoaderCompat<List<BatteryTip>> {
     private static final String TAG = "BatteryTipLoader";
 
-    private static final boolean USE_FAKE_DATA = false;
-
     private BatteryUsageStats mBatteryUsageStats;
     @VisibleForTesting
     BatteryUtils mBatteryUtils;
@@ -59,9 +56,6 @@
 
     @Override
     public List<BatteryTip> loadInBackground() {
-        if (USE_FAKE_DATA) {
-            return getFakeData();
-        }
         final List<BatteryTip> tips = new ArrayList<>();
         final BatteryTipPolicy policy = new BatteryTipPolicy(getContext());
         final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG);
@@ -81,14 +75,4 @@
     @Override
     protected void onDiscardResult(List<BatteryTip> result) {
     }
-
-    private List<BatteryTip> getFakeData() {
-        final List<BatteryTip> tips = new ArrayList<>();
-        tips.add(new SummaryTip(BatteryTip.StateType.NEW,
-                EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN));
-        tips.add(new LowBatteryTip(BatteryTip.StateType.NEW, false /* powerSaveModeOn */));
-
-        return tips;
-    }
-
 }
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
deleted file mode 100644
index 70ae0ec..0000000
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2018 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.fuelgauge.batterytip.detectors;
-
-import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
-
-import android.content.Context;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
-import com.android.settings.fuelgauge.batterytip.AppInfo;
-import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
-import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
-import com.android.settings.fuelgauge.batterytip.BatteryTipUtils;
-import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Detector whether to show summary tip. This detector should be executed as the last
- * {@link BatteryTipDetector} since it need the most up-to-date {@code visibleTips}
- */
-public class RestrictAppDetector implements BatteryTipDetector {
-    @VisibleForTesting
-    static final boolean USE_FAKE_DATA = false;
-    private BatteryTipPolicy mPolicy;
-    @VisibleForTesting
-    BatteryDatabaseManager mBatteryDatabaseManager;
-    private Context mContext;
-
-    private AppRestrictionPredicate mAppRestrictionPredicate;
-    private AppLabelPredicate mAppLabelPredicate;
-
-    public RestrictAppDetector(Context context, BatteryTipPolicy policy) {
-        mContext = context;
-        mPolicy = policy;
-        mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context);
-        mAppRestrictionPredicate = AppRestrictionPredicate.getInstance(context);
-        mAppLabelPredicate = AppLabelPredicate.getInstance(context);
-    }
-
-    @Override
-    public BatteryTip detect() {
-        if (USE_FAKE_DATA) {
-            return getFakeData();
-        }
-        if (mPolicy.appRestrictionEnabled) {
-            final long oneDayBeforeMs = System.currentTimeMillis()
-                    - TimeUnit.HOURS.toMillis(mPolicy.appRestrictionActiveHour);
-            final List<AppInfo> highUsageApps = BatteryTipUtils.detectAnomalies(mContext,
-                    oneDayBeforeMs);
-            if (!highUsageApps.isEmpty()) {
-                // If there are new anomalies, show them
-                return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
-            } else {
-                // Otherwise, show auto-handled one if it exists
-                final List<AppInfo> autoHandledApps = mBatteryDatabaseManager.queryAllAnomalies(
-                        oneDayBeforeMs, AnomalyDatabaseHelper.State.AUTO_HANDLED);
-                // Remove it if it doesn't have label or unrestricted
-                autoHandledApps.removeIf(mAppLabelPredicate.or(mAppRestrictionPredicate.negate()));
-                return new RestrictAppTip(autoHandledApps.isEmpty() ? BatteryTip.StateType.INVISIBLE
-                        : BatteryTip.StateType.HANDLED, autoHandledApps);
-            }
-        } else {
-            return new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
-        }
-    }
-
-    private BatteryTip getFakeData() {
-        final List<AppInfo> highUsageApps = new ArrayList<>();
-        highUsageApps.add(new AppInfo.Builder()
-                .setPackageName(SETTINGS_PACKAGE_NAME)
-                .build());
-        return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetector.java
deleted file mode 100644
index 0a20aac..0000000
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetector.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2017 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.fuelgauge.batterytip.detectors;
-
-import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
-import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
-
-/**
- * Detector whether to show summary tip. This detector should be executed as the last
- * {@link BatteryTipDetector} since it need the most up-to-date {@code visibleTips}
- */
-public class SummaryDetector implements BatteryTipDetector {
-    private BatteryTipPolicy mPolicy;
-    private long mAverageTimeMs;
-
-    public SummaryDetector(BatteryTipPolicy policy, long averageTimeMs) {
-        mPolicy = policy;
-        mAverageTimeMs = averageTimeMs;
-    }
-
-    @Override
-    public BatteryTip detect() {
-        // Show it if there is no other tips shown
-        final int state = mPolicy.summaryEnabled
-                ? BatteryTip.StateType.NEW
-                : BatteryTip.StateType.INVISIBLE;
-        return new SummaryTip(state, mAverageTimeMs);
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
index 1ccc29c..2035f23 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
@@ -106,10 +106,6 @@
                 R.string.battery_tip_limited_temporarily_sec_button_content_description));
     }
 
-    private CardPreference castToCardPreferenceSafely(Preference preference) {
-        return preference instanceof CardPreference ? (CardPreference) preference : null;
-    }
-
     private void resumeCharging(Context context) {
         final Intent intent =
                 FeatureFactory.getFactory(context)
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
index fcf5e09..c869b92 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
@@ -27,6 +27,7 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 
+import com.android.settings.widget.CardPreference;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import java.lang.annotation.Retention;
@@ -59,7 +60,8 @@
             TipType.LOW_BATTERY,
             TipType.REMOVE_APP_RESTRICTION,
             TipType.BATTERY_DEFENDER,
-            TipType.DOCK_DEFENDER})
+            TipType.DOCK_DEFENDER,
+            TipType.INCOMPATIBLE_CHARGER})
     public @interface TipType {
         int SMART_BATTERY_MANAGER = 0;
         int APP_RESTRICTION = 1;
@@ -71,6 +73,7 @@
         int REMOVE_APP_RESTRICTION = 7;
         int BATTERY_DEFENDER = 8;
         int DOCK_DEFENDER = 9;
+        int INCOMPATIBLE_CHARGER = 10;
     }
 
     @VisibleForTesting
@@ -81,12 +84,13 @@
         TIP_ORDER.append(TipType.LOW_BATTERY, 1);
         TIP_ORDER.append(TipType.BATTERY_DEFENDER, 2);
         TIP_ORDER.append(TipType.DOCK_DEFENDER, 3);
-        TIP_ORDER.append(TipType.APP_RESTRICTION, 4);
-        TIP_ORDER.append(TipType.HIGH_DEVICE_USAGE, 5);
-        TIP_ORDER.append(TipType.SUMMARY, 6);
-        TIP_ORDER.append(TipType.SMART_BATTERY_MANAGER, 7);
-        TIP_ORDER.append(TipType.REDUCED_BATTERY, 8);
-        TIP_ORDER.append(TipType.REMOVE_APP_RESTRICTION, 9);
+        TIP_ORDER.append(TipType.INCOMPATIBLE_CHARGER, 4);
+        TIP_ORDER.append(TipType.APP_RESTRICTION, 5);
+        TIP_ORDER.append(TipType.HIGH_DEVICE_USAGE, 6);
+        TIP_ORDER.append(TipType.SUMMARY, 7);
+        TIP_ORDER.append(TipType.SMART_BATTERY_MANAGER, 8);
+        TIP_ORDER.append(TipType.REDUCED_BATTERY, 9);
+        TIP_ORDER.append(TipType.REMOVE_APP_RESTRICTION, 10);
     }
 
     private static final String KEY_PREFIX = "key_battery_tip";
@@ -203,4 +207,8 @@
     public String toString() {
         return "type=" + mType + " state=" + mState;
     }
+
+    CardPreference castToCardPreferenceSafely(Preference preference) {
+        return preference instanceof CardPreference ? (CardPreference) preference : null;
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
index bc0ba08..327f974 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
@@ -151,10 +151,6 @@
 
     }
 
-    private CardPreference castToCardPreferenceSafely(Preference preference) {
-        return preference instanceof CardPreference ? (CardPreference) preference : null;
-    }
-
     private void resumeCharging(Context context) {
         final Intent intent =
                 FeatureFactory.getFactory(context)
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
new file mode 100644
index 0000000..7ad3d13
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2023 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.fuelgauge.batterytip.tips;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Parcel;
+import android.util.Log;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.widget.CardPreference;
+import com.android.settingslib.HelpUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+/** Tip to show incompatible charger state */
+public final class IncompatibleChargerTip extends BatteryTip {
+    private static final String TAG = "IncompatibleChargerTip";
+
+    public IncompatibleChargerTip(@StateType int state) {
+        super(TipType.INCOMPATIBLE_CHARGER, state, /* showDialog */ false);
+    }
+
+    private IncompatibleChargerTip(Parcel in) {
+        super(in);
+    }
+
+    @Override
+    public CharSequence getTitle(Context context) {
+        return context.getString(R.string.battery_tip_incompatible_charging_title);
+    }
+
+    @Override
+    public CharSequence getSummary(Context context) {
+        return context.getString(R.string.battery_tip_incompatible_charging_message);
+    }
+
+    @Override
+    public int getIconId() {
+        return R.drawable.ic_battery_charging;
+    }
+
+    @Override
+    public void updateState(BatteryTip tip) {
+        mState = tip.mState;
+    }
+
+    @Override
+    public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
+       metricsFeatureProvider.action(context, SettingsEnums.ACTION_INCOMPATIBLE_CHARGING_TIP,
+                mState);
+    }
+
+    @Override
+    public void updatePreference(Preference preference) {
+        super.updatePreference(preference);
+        final Context context = preference.getContext();
+        final CardPreference cardPreference = castToCardPreferenceSafely(preference);
+        if (cardPreference == null) {
+            Log.e(TAG, "cast Preference to CardPreference failed");
+            return;
+        }
+
+        cardPreference.setSelectable(false);
+        cardPreference.setSecondaryButtonText(context.getString(R.string.learn_more));
+        cardPreference.setSecondaryButtonClickListener(
+                button -> button.startActivityForResult(
+                        HelpUtils.getHelpIntent(
+                                context,
+                                context.getString(R.string.help_url_incompatible_charging),
+                                /* backupContext */ ""), /* requestCode */ 0));
+        cardPreference.setSecondaryButtonVisible(true);
+        cardPreference.setSecondaryButtonContentDescription(context.getString(
+                R.string.battery_tip_incompatible_charging_content_description));
+    }
+
+    public static final Creator CREATOR = new Creator() {
+        public BatteryTip createFromParcel(Parcel in) {
+            return new IncompatibleChargerTip(in);
+        }
+
+        public BatteryTip[] newArray(int size) {
+            return new IncompatibleChargerTip[size];
+        }
+    };
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTip.java
deleted file mode 100644
index 37122d8..0000000
--- a/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTip.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2017 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.fuelgauge.batterytip.tips;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-/**
- * Tip to show general summary about battery life
- */
-public class SummaryTip extends BatteryTip {
-    private long mAverageTimeMs;
-
-    public SummaryTip(@StateType int state, long averageTimeMs) {
-        super(TipType.SUMMARY, state, true /* showDialog */);
-        mAverageTimeMs = averageTimeMs;
-    }
-
-    @VisibleForTesting
-    SummaryTip(Parcel in) {
-        super(in);
-        mAverageTimeMs = in.readLong();
-    }
-
-    @Override
-    public CharSequence getTitle(Context context) {
-        return context.getString(R.string.battery_tip_summary_title);
-    }
-
-    @Override
-    public CharSequence getSummary(Context context) {
-        return context.getString(R.string.battery_tip_summary_summary);
-    }
-
-    @Override
-    public int getIconId() {
-        return R.drawable.ic_battery_status_good_24dp;
-    }
-
-    @Override
-    public int getIconTintColorId() {
-        return R.color.battery_good_color_light;
-    }
-
-    @Override
-    public void updateState(BatteryTip tip) {
-        mState = tip.mState;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        super.writeToParcel(dest, flags);
-        dest.writeLong(mAverageTimeMs);
-    }
-
-    @Override
-    public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
-        metricsFeatureProvider.action(context, SettingsEnums.ACTION_SUMMARY_TIP,
-                mState);
-    }
-
-    public long getAverageTimeMs() {
-        return mAverageTimeMs;
-    }
-
-    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
-        public BatteryTip createFromParcel(Parcel in) {
-            return new SummaryTip(in);
-        }
-
-        public BatteryTip[] newArray(int size) {
-            return new SummaryTip[size];
-        }
-    };
-}
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 3345426..189b4bc 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -56,6 +56,7 @@
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
+import androidx.window.embedding.ActivityEmbeddingController;
 import androidx.window.embedding.SplitController;
 import androidx.window.embedding.SplitRule;
 
@@ -104,7 +105,7 @@
     private View mTwoPaneSuggestionView;
     private CategoryMixin mCategoryMixin;
     private Set<HomepageLoadedListener> mLoadedListeners;
-    private SplitController mSplitController;
+    private ActivityEmbeddingController mActivityEmbeddingController;
     private boolean mIsEmbeddingActivityEnabled;
     private boolean mIsTwoPane;
     // A regular layout shows icons on homepage, whereas a simplified layout doesn't.
@@ -192,8 +193,8 @@
         setupEdgeToEdge();
         setContentView(R.layout.settings_homepage_container);
 
-        mSplitController = SplitController.getInstance();
-        mIsTwoPane = mSplitController.isActivityEmbedded(this);
+        mActivityEmbeddingController = ActivityEmbeddingController.getInstance(this);
+        mIsTwoPane = mActivityEmbeddingController.isActivityEmbedded(this);
 
         updateAppBarMinHeight();
         initHomepageContainer();
@@ -276,7 +277,7 @@
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
-        final boolean newTwoPaneState = mSplitController.isActivityEmbedded(this);
+        final boolean newTwoPaneState = mActivityEmbeddingController.isActivityEmbedded(this);
         if (mIsTwoPane != newTwoPaneState) {
             mIsTwoPane = newTwoPaneState;
             updateHomepageAppBar();
@@ -420,7 +421,7 @@
 
     private boolean shouldLaunchDeepLinkIntentToRight() {
         if (!FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)
-                || !SplitController.getInstance().isSplitSupported()) {
+                || !SplitController.getInstance(this).isSplitSupported()) {
             return false;
         }
 
@@ -535,15 +536,15 @@
                 new ComponentName(getApplicationContext(), getClass()),
                 targetComponentName,
                 targetIntent.getAction(),
-                SplitRule.FINISH_ALWAYS,
-                SplitRule.FINISH_ALWAYS,
+                SplitRule.FinishBehavior.ALWAYS,
+                SplitRule.FinishBehavior.ALWAYS,
                 true /* clearTop */);
         ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
                 new ComponentName(getApplicationContext(), Settings.class),
                 targetComponentName,
                 targetIntent.getAction(),
-                SplitRule.FINISH_ALWAYS,
-                SplitRule.FINISH_ALWAYS,
+                SplitRule.FinishBehavior.ALWAYS,
+                SplitRule.FinishBehavior.ALWAYS,
                 true /* clearTop */);
 
         final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class);
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index 21f026e..1ced5ac 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -36,7 +36,7 @@
 import androidx.preference.PreferenceFragmentCompat;
 import androidx.preference.PreferenceScreen;
 import androidx.recyclerview.widget.RecyclerView;
-import androidx.window.embedding.SplitController;
+import androidx.window.embedding.ActivityEmbeddingController;
 
 import com.android.settings.R;
 import com.android.settings.Utils;
@@ -66,6 +66,7 @@
     private int mPaddingHorizontal;
     private boolean mScrollNeeded = true;
     private boolean mFirstStarted = true;
+    private ActivityEmbeddingController mActivityEmbeddingController;
 
     public TopLevelSettings() {
         final Bundle args = new Bundle();
@@ -151,7 +152,7 @@
             return;
         }
 
-        boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity());
+        boolean activityEmbedded = isActivityEmbedded();
         if (icicle != null) {
             mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN);
             mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded;
@@ -162,6 +163,15 @@
         }
     }
 
+    /** Wrap ActivityEmbeddingController#isActivityEmbedded for testing. */
+    @VisibleForTesting
+    public boolean isActivityEmbedded() {
+        if (mActivityEmbeddingController == null) {
+            mActivityEmbeddingController = ActivityEmbeddingController.getInstance(getActivity());
+        }
+        return mActivityEmbeddingController.isActivityEmbedded(getActivity());
+    }
+
     @Override
     public void onStart() {
         if (mFirstStarted) {
@@ -169,7 +179,7 @@
             FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent(
                     getContext());
         } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask()
-                && !SplitController.getInstance().isActivityEmbedded(getActivity())) {
+                && !isActivityEmbedded()) {
             // Set default highlight menu key for 1-pane homepage since it will show the placeholder
             // page once changing back to 2-pane.
             Log.i(TAG, "Set default menu key");
@@ -294,7 +304,7 @@
          * 3. the current activity is embedded */
         return mHighlightMixin != null
                 && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey())
-                && SplitController.getInstance().isActivityEmbedded(getActivity());
+                && isActivityEmbedded();
     }
 
     /** Show/hide the highlight on the menu entry for the search page presence */
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index a2ade47..e285a91 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -1098,10 +1098,13 @@
                 .launch();
     }
 
-    /** Removes all preferences and hide the {@link #mConnectedWifiEntryPreferenceCategory}. */
+    /** Removes all preferences and hide the {@link #mConnectedWifiEntryPreferenceCategory} and
+     *  {@link #mFirstWifiEntryPreferenceCategory}. */
     private void removeConnectedWifiEntryPreference() {
         mConnectedWifiEntryPreferenceCategory.removeAll();
         mConnectedWifiEntryPreferenceCategory.setVisible(false);
+        mFirstWifiEntryPreferenceCategory.setVisible(false);
+        mFirstWifiEntryPreferenceCategory.removeAll();
     }
 
     private void removeWifiEntryPreference() {
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
index 7feb2b1..7787ae1 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
@@ -25,6 +25,7 @@
 import android.app.Dialog;
 import android.app.KeyguardManager;
 import android.app.admin.DevicePolicyManager;
+import android.app.admin.ManagedSubscriptionsPolicy;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -34,6 +35,7 @@
 import android.os.Handler;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.telecom.TelecomManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
@@ -139,6 +141,31 @@
             getActivity().finish();
         });
         setupForgotButtonIfManagedProfile(view);
+        setupEmergencyCallButtonIfManagedSubscription(view);
+    }
+
+    private void setupEmergencyCallButtonIfManagedSubscription(View view) {
+        int policyType = getContext().getSystemService(
+                DevicePolicyManager.class).getManagedSubscriptionsPolicy().getPolicyType();
+
+        if (policyType == ManagedSubscriptionsPolicy.TYPE_ALL_MANAGED_SUBSCRIPTIONS) {
+            Button emergencyCallButton = view.findViewById(R.id.emergencyCallButton);
+            if (emergencyCallButton == null) {
+                Log.wtf(TAG,
+                        "Emergency call button not found in managed profile credential dialog");
+                return;
+            }
+            emergencyCallButton.setVisibility(View.VISIBLE);
+            emergencyCallButton.setOnClickListener(v -> {
+                final Intent intent = getActivity()
+                        .getSystemService(TelecomManager.class)
+                        .createLaunchEmergencyDialerIntent(null)
+                        .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                getActivity().startActivity(intent);
+                getActivity().finish();
+            });
+        }
     }
 
     private void setupForgotButtonIfManagedProfile(View view) {
diff --git a/src/com/android/settings/security/MemtagHelper.java b/src/com/android/settings/security/MemtagHelper.java
index b3e24e4..9fd74f3 100644
--- a/src/com/android/settings/security/MemtagHelper.java
+++ b/src/com/android/settings/security/MemtagHelper.java
@@ -29,14 +29,14 @@
         return "force_off"
                 .equals(
                         SystemProperties.get(
-                                "persist.device_config.memory_safety_native.bootloader_override"));
+                                "persist.device_config.memory_safety_native_boot.bootloader_override"));
     }
 
     private static boolean isForcedOn() {
         return "force_on"
                 .equals(
                         SystemProperties.get(
-                                "persist.device_config.memory_safety_native.bootloader_override"));
+                                "persist.device_config.memory_safety_native_boot.bootloader_override"));
     }
 
     public static boolean isChecked() {
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
index 3cc7ef2..8084a48 100644
--- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -30,7 +30,7 @@
 import androidx.preference.PreferenceGroupAdapter;
 import androidx.preference.PreferenceViewHolder;
 import androidx.recyclerview.widget.RecyclerView;
-import androidx.window.embedding.SplitController;
+import androidx.window.embedding.ActivityEmbeddingController;
 
 import com.android.settings.R;
 import com.android.settings.Utils;
@@ -250,6 +250,7 @@
     }
 
     private boolean isHighlightNeeded() {
-        return SplitController.getInstance().isActivityEmbedded(mHomepageActivity);
+        return ActivityEmbeddingController.getInstance(mHomepageActivity)
+                .isActivityEmbedded(mHomepageActivity);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 88c9597..4ba6eae 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -564,8 +564,10 @@
         mActivityInfo.metaData.putString("com.android.settings.intent.action", "TestAction");
         tile.userHandle = null;
 
-        TopLevelSettings largeScreenTopLevelSettings = new TopLevelSettings(
-                new TestTopLevelHighlightMixin(highlightMixinPrefKey, true /* activityEmbedded */));
+        TopLevelSettings largeScreenTopLevelSettings = spy(new TopLevelSettings(
+                new TestTopLevelHighlightMixin(highlightMixinPrefKey,
+                true /* activityEmbedded */)));
+        doReturn(true).when(largeScreenTopLevelSettings).isActivityEmbedded();
         largeScreenTopLevelSettings.setHighlightPreferenceKey(clickPrefKey);
 
         mImpl.bindPreferenceToTileAndGetObservers(activity, largeScreenTopLevelSettings,
@@ -593,8 +595,10 @@
         mActivityInfo.metaData.putString("com.android.settings.intent.action", "TestAction");
         tile.userHandle = null;
 
-        TopLevelSettings largeScreenTopLevelSettings = new TopLevelSettings(
-                new TestTopLevelHighlightMixin(highlightMixinPrefKey, true /* activityEmbedded */));
+        TopLevelSettings largeScreenTopLevelSettings = spy(new TopLevelSettings(
+                new TestTopLevelHighlightMixin(highlightMixinPrefKey,
+                true /* activityEmbedded */)));
+        doReturn(true).when(largeScreenTopLevelSettings).isActivityEmbedded();
         largeScreenTopLevelSettings.setHighlightPreferenceKey(clickPrefKey);
 
         mImpl.bindPreferenceToTileAndGetObservers(activity, largeScreenTopLevelSettings,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
index c5d66a6..1aefd14 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
@@ -35,7 +35,6 @@
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
 import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
-import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
 import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
@@ -74,7 +73,6 @@
     private RestrictAppTip mRestrictedOneAppTip;
     private RestrictAppTip mRestrictTwoAppsTip;
     private UnrestrictAppTip mUnrestrictAppTip;
-    private SummaryTip mSummaryTip;
     private BatteryDefenderTip mDefenderTip;
     private AppInfo mAppInfo;
     private ShadowPackageManager mPackageManager;
@@ -116,8 +114,6 @@
                 new ArrayList<>(restrictApps));
 
         mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo);
-        mSummaryTip = spy(new SummaryTip(BatteryTip.StateType.NEW,
-                EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN));
         mDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW);
     }
 
@@ -229,19 +225,4 @@
         assertThat(shadowDialog.getMessage())
                 .isEqualTo(mContext.getString(R.string.battery_tip_unrestrict_app_dialog_message));
     }
-
-    @Test
-    public void testOnCreateDialog_summaryTip_fireDialog() {
-        doReturn(AVERAGE_TIME_MS).when(mSummaryTip).getAverageTimeMs();
-        mDialogFragment = BatteryTipDialogFragment.newInstance(mSummaryTip, METRICS_KEY);
-
-        FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
-                0 /* containerViewId */, null /* bundle */);
-
-        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
-        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
-
-        assertThat(shadowDialog.getMessage()).isEqualTo(
-                mContext.getText(R.string.battery_tip_dialog_summary_message));
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
index dbde3a7..1c1d2cc 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
@@ -37,7 +37,6 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.widget.CardPreference;
 
@@ -88,9 +87,7 @@
         mFeatureFactory = FakeFeatureFactory.setupForTest();
 
         mOldBatteryTips = new ArrayList<>();
-        mOldBatteryTips.add(new SummaryTip(BatteryTip.StateType.NEW, AVERAGE_TIME_MS));
         mNewBatteryTips = new ArrayList<>();
-        mNewBatteryTips.add(new SummaryTip(BatteryTip.StateType.INVISIBLE, AVERAGE_TIME_MS));
 
         mBatteryTipPreferenceController = buildBatteryTipPreferenceController();
         mBatteryTipPreferenceController.mCardPreference = mCardPreference;
@@ -105,13 +102,6 @@
     }
 
     @Test
-    public void testUpdateBatteryTips_tipsStateNew_isVisible() {
-        mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
-
-        assertThat(mCardPreference.isVisible()).isTrue();
-    }
-
-    @Test
     public void testUpdateBatteryTips_tipsStateInvisible_isInvisible() {
         mBatteryTipPreferenceController.updateBatteryTips(mNewBatteryTips);
 
@@ -119,15 +109,6 @@
     }
 
     @Test
-    public void testUpdateBatteryTips_logBatteryTip() {
-        mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
-
-        verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
-                MetricsProto.MetricsEvent.ACTION_SUMMARY_TIP,
-                BatteryTip.StateType.NEW);
-    }
-
-    @Test
     public void testGetCurrentBatteryTip_noTips_isNull() {
         assertThat(mBatteryTipPreferenceController.getCurrentBatteryTip()).isNull();
     }
@@ -139,28 +120,6 @@
     }
 
     @Test
-    public void testGetCurrentBatteryTip_tipsVisible_returnTips() {
-        mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
-
-        assertThat(mBatteryTipPreferenceController.getCurrentBatteryTip().getType()).isEqualTo(
-                BatteryTip.TipType.SUMMARY);
-    }
-
-    @Test
-    public void testSaveAndRestore() {
-        mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
-        final Bundle bundle = new Bundle();
-        mBatteryTipPreferenceController.saveInstanceState(bundle);
-
-        final BatteryTipPreferenceController controller = buildBatteryTipPreferenceController();
-        controller.mCardPreference = mCardPreference;
-        controller.mPrefContext = mContext;
-        controller.restoreInstanceState(bundle);
-
-        assertOnlyContainsSummaryTip(mCardPreference);
-    }
-
-    @Test
     public void testRestoreFromNull_shouldNotCrash() {
         final Bundle bundle = new Bundle();
         // Battery tip list is null at this time
@@ -192,13 +151,6 @@
                 BasePreferenceController.AVAILABLE_UNSEARCHABLE);
     }
 
-    private void assertOnlyContainsSummaryTip(CardPreference preference) {
-        assertThat(preference.getTitle()).isEqualTo(
-                mContext.getString(R.string.battery_tip_summary_title));
-        assertThat(preference.getSummary()).isEqualTo(
-                mContext.getString(R.string.battery_tip_summary_summary));
-    }
-
     private BatteryTipPreferenceController buildBatteryTipPreferenceController() {
         final BatteryTipPreferenceController controller = new BatteryTipPreferenceController(
                 mContext, KEY_PREF);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
deleted file mode 100644
index f68a0b4..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2018 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.fuelgauge.batterytip.detectors;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.spy;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-
-import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
-import com.android.settings.fuelgauge.batterytip.AppInfo;
-import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
-import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
-import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
-import com.android.settings.testutils.BatteryTestUtils;
-import com.android.settings.testutils.DatabaseTestUtils;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(RobolectricTestRunner.class)
-public class RestrictAppDetectorTest {
-
-    private static final int RESTRICTED_UID = 222;
-    private static final int UNRESTRICTED_UID = 333;
-    private static final String PACKAGE_NAME = "com.android.app";
-    private static final String UNINSTALLED_PACKAGE_NAME = "com.android.uninstalled";
-    private static final String RESTRICTED_PACKAGE_NAME = "com.android.restricted";
-    private static final String UNRESTRICTED_PACKAGE_NAME = "com.android.unrestricted";
-    private Context mContext;
-    private BatteryTipPolicy mPolicy;
-    private RestrictAppDetector mRestrictAppDetector;
-    private List<AppInfo> mAppInfoList;
-    private AppInfo mAppInfo;
-    @Mock
-    private BatteryDatabaseManager mBatteryDatabaseManager;
-    @Mock
-    private PackageManager mPackageManager;
-    @Mock
-    private ApplicationInfo mApplicationInfo;
-    @Mock
-    private AppOpsManager mAppOpsManager;
-
-    @Before
-    public void setUp() throws PackageManager.NameNotFoundException {
-        MockitoAnnotations.initMocks(this);
-
-        mAppInfoList = new ArrayList<>();
-        mAppInfo = new AppInfo.Builder().setPackageName(PACKAGE_NAME).build();
-        mAppInfoList.add(mAppInfo);
-
-        mContext = spy(RuntimeEnvironment.application);
-        mPolicy = spy(new BatteryTipPolicy(mContext));
-
-        doReturn(mContext).when(mContext).getApplicationContext();
-        doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
-        doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(
-                AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, RESTRICTED_UID, RESTRICTED_PACKAGE_NAME);
-        doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager).checkOpNoThrow(
-                AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UNRESTRICTED_UID,
-                UNRESTRICTED_PACKAGE_NAME);
-
-        BatteryDatabaseManager.setUpForTest(mBatteryDatabaseManager);
-        doReturn(mPackageManager).when(mContext).getPackageManager();
-        doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(any(),
-                anyInt());
-        doReturn(PACKAGE_NAME).when(mApplicationInfo).loadLabel(any());
-        doThrow(new PackageManager.NameNotFoundException()).when(
-                mPackageManager).getApplicationInfo(eq(UNINSTALLED_PACKAGE_NAME), anyInt());
-
-        mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy);
-        mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager;
-    }
-
-    @After
-    public void tearDown() {
-        ReflectionHelpers.setStaticField(AppLabelPredicate.class, "sInstance", null);
-        ReflectionHelpers.setStaticField(AppRestrictionPredicate.class, "sInstance", null);
-    }
-
-    @After
-    public void cleanUp() {
-        DatabaseTestUtils.clearDb(mContext);
-    }
-
-    @Test
-    public void testDetect_hasAnomaly_tipNew() {
-        doReturn(mAppInfoList).when(mBatteryDatabaseManager)
-                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
-
-        assertThat(mRestrictAppDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW);
-    }
-
-    @Test
-    public void testDetect_hasAutoHandledAnomaly_tipHandled() {
-        mAppInfoList.add(new AppInfo.Builder()
-                .setUid(RESTRICTED_UID)
-                .setPackageName(RESTRICTED_PACKAGE_NAME)
-                .build());
-        doReturn(new ArrayList<AppInfo>()).when(mBatteryDatabaseManager)
-                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
-        doReturn(mAppInfoList).when(mBatteryDatabaseManager)
-                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.AUTO_HANDLED));
-
-        assertThat(mRestrictAppDetector.detect().getState())
-                .isEqualTo(BatteryTip.StateType.HANDLED);
-    }
-
-    @Test
-    public void testDetect_typeNewHasUninstalledAnomaly_removeIt() {
-        mAppInfoList.add(new AppInfo.Builder()
-                .setPackageName(UNINSTALLED_PACKAGE_NAME)
-                .build());
-        doReturn(mAppInfoList).when(mBatteryDatabaseManager)
-                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
-
-        final RestrictAppTip restrictAppTip = (RestrictAppTip) mRestrictAppDetector.detect();
-        assertThat(restrictAppTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
-        assertThat(restrictAppTip.getRestrictAppList()).containsExactly(mAppInfo);
-    }
-
-    @Test
-    public void testDetect_typeNewHasRestrictedAnomaly_removeIt() throws
-            PackageManager.NameNotFoundException {
-        mAppInfoList.add(new AppInfo.Builder()
-                .setUid(RESTRICTED_UID)
-                .setPackageName(RESTRICTED_PACKAGE_NAME)
-                .build());
-        doReturn(mAppInfoList).when(mBatteryDatabaseManager)
-                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
-        doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(
-                eq(RESTRICTED_PACKAGE_NAME), anyInt());
-
-        final RestrictAppTip restrictAppTip = (RestrictAppTip) mRestrictAppDetector.detect();
-        assertThat(restrictAppTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
-        assertThat(restrictAppTip.getRestrictAppList()).containsExactly(mAppInfo);
-    }
-
-    @Test
-    public void testDetect_typeHandledHasUnRestrictedAnomaly_removeIt() throws
-            PackageManager.NameNotFoundException {
-        mAppInfoList.clear();
-        mAppInfoList.add(new AppInfo.Builder()
-                .setUid(UNRESTRICTED_UID)
-                .setPackageName(UNRESTRICTED_PACKAGE_NAME)
-                .build());
-        doReturn(new ArrayList<>()).when(mBatteryDatabaseManager)
-                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
-        doReturn(mAppInfoList).when(mBatteryDatabaseManager)
-                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.AUTO_HANDLED));
-        doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(
-                eq(UNRESTRICTED_PACKAGE_NAME), anyInt());
-
-        final RestrictAppTip restrictAppTip = (RestrictAppTip) mRestrictAppDetector.detect();
-        assertThat(restrictAppTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE);
-    }
-
-    @Test
-    public void testDetect_noAnomaly_tipInvisible() {
-        doReturn(new ArrayList<AppInfo>()).when(mBatteryDatabaseManager)
-                .queryAllAnomalies(anyLong(), anyInt());
-
-        assertThat(mRestrictAppDetector.detect().getState())
-                .isEqualTo(BatteryTip.StateType.INVISIBLE);
-    }
-
-    @Test
-    public void testUseFakeData_alwaysFalse() {
-        assertThat(RestrictAppDetector.USE_FAKE_DATA).isFalse();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java
deleted file mode 100644
index 5794b6c..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2017 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.fuelgauge.batterytip.detectors;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-
-import android.text.format.DateUtils;
-
-import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(RobolectricTestRunner.class)
-public class SummaryDetectorTest {
-
-    private BatteryTipPolicy mPolicy;
-    private static final long AVERAGE_TIME_MS = DateUtils.HOUR_IN_MILLIS;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mPolicy = spy(new BatteryTipPolicy(RuntimeEnvironment.application));
-    }
-
-    @Test
-    public void testDetect_disabledByPolicy_tipInvisible() {
-        ReflectionHelpers.setField(mPolicy, "summaryEnabled", false);
-        SummaryDetector detector = new SummaryDetector(mPolicy, AVERAGE_TIME_MS);
-
-        assertThat(detector.detect().isVisible()).isFalse();
-    }
-
-    @Test
-    public void testDetect_notDisabled_tipInvisible() {
-        SummaryDetector detector = new SummaryDetector(mPolicy, AVERAGE_TIME_MS);
-
-        assertThat(detector.detect().isVisible()).isFalse();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
new file mode 100644
index 0000000..ce70f50
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2023 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.fuelgauge.batterytip.tips;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.widget.CardPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowLog;
+
+@RunWith(RobolectricTestRunner.class)
+public final class IncompatibleChargerTipTest {
+
+    private Context mContext;
+    private FakeFeatureFactory mFeatureFactory;
+    private IncompatibleChargerTip mIncompatibleChargerTip;
+    private MetricsFeatureProvider mMetricsFeatureProvider;
+
+    @Mock private BatteryTip mBatteryTip;
+    @Mock private Preference mPreference;
+    @Mock private CardPreference mCardPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
+        mContext = RuntimeEnvironment.application;
+        mIncompatibleChargerTip = new IncompatibleChargerTip(BatteryTip.StateType.NEW);
+
+        when(mPreference.getContext()).thenReturn(mContext);
+        when(mCardPreference.getContext()).thenReturn(mContext);
+    }
+
+    @Test
+    public void getTitle_showTitle() {
+        assertThat(mIncompatibleChargerTip.getTitle(mContext)).isEqualTo(
+                mContext.getString(R.string.battery_tip_incompatible_charging_title));
+    }
+
+    @Test
+    public void getSummary_showSummary() {
+        assertThat(mIncompatibleChargerTip.getSummary(mContext)).isEqualTo(
+                mContext.getString(R.string.battery_tip_incompatible_charging_message));
+    }
+
+    @Test
+    public void getIcon_showIcon() {
+        assertThat(mIncompatibleChargerTip.getIconId())
+                .isEqualTo(R.drawable.ic_battery_charging);
+    }
+
+    @Test
+    public void testLog_logMetric() {
+        mIncompatibleChargerTip.updateState(mBatteryTip);
+        mIncompatibleChargerTip.log(mContext, mMetricsFeatureProvider);
+
+        verify(mMetricsFeatureProvider).action(mContext,
+                SettingsEnums.ACTION_INCOMPATIBLE_CHARGING_TIP, mBatteryTip.mState);
+    }
+
+    @Test
+    public void updatePreference_castFail_logErrorMessage() {
+        mIncompatibleChargerTip.updatePreference(mPreference);
+        assertThat(getLastErrorLog()).isEqualTo("cast Preference to CardPreference failed");
+    }
+
+    @Test
+    public void updatePreference_shouldSetSecondaryButtonText() {
+        String expected = mContext.getString(R.string.learn_more);
+
+        mIncompatibleChargerTip.updatePreference(mCardPreference);
+
+        verify(mCardPreference).setSecondaryButtonText(expected);
+    }
+
+    @Test
+    public void updatePreference_shouldSetSecondaryButtonVisible() {
+        mIncompatibleChargerTip.updatePreference(mCardPreference);
+        verify(mCardPreference).setSecondaryButtonVisible(true);
+    }
+
+    private String getLastErrorLog() {
+        return ShadowLog.getLogsForTag(IncompatibleChargerTip.class.getSimpleName()).stream()
+                .filter(log -> log.type == Log.ERROR)
+                .reduce((first, second) -> second)
+                .orElse(createErrorLog("No Error Log"))
+                .msg;
+    }
+
+    private ShadowLog.LogItem createErrorLog(String msg) {
+        return new ShadowLog.LogItem(Log.ERROR, "tag", msg, null);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTipTest.java
deleted file mode 100644
index f751b29..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTipTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2018 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.fuelgauge.batterytip.tips;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.os.Parcel;
-import android.text.format.DateUtils;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class SummaryTipTest {
-
-    private static final long AVERAGE_TIME_MS = DateUtils.HOUR_IN_MILLIS;
-
-    @Mock
-    private MetricsFeatureProvider mMetricsFeatureProvider;
-    private Context mContext;
-    private SummaryTip mSummaryTip;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = RuntimeEnvironment.application;
-        mSummaryTip = new SummaryTip(BatteryTip.StateType.NEW, AVERAGE_TIME_MS);
-    }
-
-    @Test
-    public void testParcelable() {
-        Parcel parcel = Parcel.obtain();
-        mSummaryTip.writeToParcel(parcel, mSummaryTip.describeContents());
-        parcel.setDataPosition(0);
-
-        final SummaryTip parcelTip = new SummaryTip(parcel);
-
-        assertThat(parcelTip.getAverageTimeMs()).isEqualTo(AVERAGE_TIME_MS);
-    }
-
-    @Test
-    public void testLog() {
-        mSummaryTip.log(mContext, mMetricsFeatureProvider);
-
-        verify(mMetricsFeatureProvider).action(mContext,
-                MetricsProto.MetricsEvent.ACTION_SUMMARY_TIP, BatteryTip.StateType.NEW);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java b/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
index 2b9ecf7..3d38bbc 100644
--- a/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
+++ b/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
@@ -34,7 +34,7 @@
     private final String mMemtagProperty = "arm64.memtag.bootctl";
     private final String mMemtagSupportedProperty = "ro.arm64.memtag.bootctl_settings_toggle";
     private final String mDeviceConfigOverride =
-            "persist.device_config.memory_safety_native.bootloader_override";
+            "persist.device_config.memory_safety_native_boot.bootloader_override";
 
     @Test
     public void isChecked_empty_isFalse() {
diff --git a/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java b/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java
index a32904e..b5df3a2 100644
--- a/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java
+++ b/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java
@@ -35,22 +35,23 @@
 
 @RunWith(AndroidJUnit4.class)
 public class ScreenResolutionControllerTest {
-
-    private static final int FHD_WIDTH = 1080;
-    private static final int QHD_WIDTH = 1440;
-
     private ScreenResolutionController mController;
+    private int mHighWidth;
+    private int mFullWidth;
 
     @Before
     public void setUp() {
         Context context = spy(ApplicationProvider.getApplicationContext());
         mController = spy(new ScreenResolutionController(context, "test"));
+
+        mHighWidth = mController.getHighWidth();
+        mFullWidth = mController.getFullWidth();
     }
 
     @Test
     public void getAvailabilityStatus_hasFhdAndQhdModes_returnAvailable() {
-        Display.Mode modeA = new Display.Mode(0, FHD_WIDTH, 0, 0);
-        Display.Mode modeB = new Display.Mode(0, QHD_WIDTH, 0, 0);
+        Display.Mode modeA = new Display.Mode(0, mHighWidth, 0, 0);
+        Display.Mode modeB = new Display.Mode(0, mFullWidth, 0, 0);
         Display.Mode[] modes = {modeA, modeB};
         doReturn(modes).when(mController).getSupportedModes();
 
@@ -60,27 +61,25 @@
 
     @Test
     public void getAvailabilityStatus_hasOneMode_returnUnsupported() {
-        Display.Mode modeA = new Display.Mode(0, FHD_WIDTH, 0, 0);
-        Display.Mode[] modes = {modeA};
-        doReturn(modes).when(mController).getSupportedModes();
+        doReturn(0).when(mController).getHighWidth();
 
         assertThat(mController.getAvailabilityStatus())
                 .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
     }
 
     @Test
-    public void updateState_screenResolutionFHD_shouldSetSummaryToFHD() {
-        int width = FHD_WIDTH;
+    public void updateState_HighResolution_shouldSetSummaryToHighResolution() {
+        int width = mHighWidth;
         doReturn(width).when(mController).getDisplayWidth();
 
-        assertThat(mController.getSummary().toString()).isEqualTo("1080p FHD+");
+        assertThat(mController.getSummary().toString()).isEqualTo("High resolution");
     }
 
     @Test
-    public void updateState_screenResolutionQHD_shouldSetSummaryToQHD() {
-        int width = QHD_WIDTH;
+    public void updateState_FullResolution_shouldSetSummaryToFullResolution() {
+        int width = mFullWidth;
         doReturn(width).when(mController).getDisplayWidth();
 
-        assertThat(mController.getSummary().toString()).isEqualTo("1440p QHD+");
+        assertThat(mController.getSummary().toString()).isEqualTo("Full resolution");
     }
 }
diff --git a/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java b/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
index 4e674d2..8409531 100644
--- a/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
+++ b/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
@@ -37,59 +37,62 @@
 
     private Context mContext;
     private ScreenResolutionFragment mFragment;
-
-    private static final int FHD_WIDTH = 1080;
-    private static final int QHD_WIDTH = 1440;
+    private ScreenResolutionController mController;
+    private int mHighWidth;
+    private int mFullWidth;
 
     @Before
     @UiThreadTest
     public void setup() {
         mContext = spy(ApplicationProvider.getApplicationContext());
         mFragment = spy(new ScreenResolutionFragment());
+        mController = spy(new ScreenResolutionController(mContext, "test"));
+        mHighWidth = mController.getHighWidth();
+        mFullWidth = mController.getFullWidth();
     }
 
     @Test
     @UiThreadTest
-    public void getDefaultKey_FHD() {
-        Display.Mode mode = new Display.Mode(0, FHD_WIDTH, 0, 0);
+    public void getDefaultKey_highResolution() {
+        Display.Mode mode = new Display.Mode(0, mHighWidth, 0, 0);
         doReturn(mode).when(mFragment).getDisplayMode();
         doReturn(mContext).when(mFragment).getContext();
 
         mFragment.onAttach(mContext);
-        assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(FHD_WIDTH));
+        assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(mHighWidth));
     }
 
     @Test
     @UiThreadTest
-    public void getDefaultKey_QHD() {
-        Display.Mode mode = new Display.Mode(0, QHD_WIDTH, 0, 0);
+    public void getDefaultKey_fullResolution() {
+        Display.Mode mode = new Display.Mode(0, mFullWidth, 0, 0);
         doReturn(mode).when(mFragment).getDisplayMode();
         doReturn(mContext).when(mFragment).getContext();
 
         mFragment.onAttach(mContext);
-        assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(QHD_WIDTH));
+        assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(mFullWidth));
     }
 
     @Test
     @UiThreadTest
-    public void setDefaultKey_FHD() {
+    public void setDefaultKey_highResolution() {
         doReturn(mContext).when(mFragment).getContext();
         mFragment.onAttach(mContext);
 
-        mFragment.setDefaultKey(mFragment.getKeyForResolution(FHD_WIDTH));
+        mFragment.setDefaultKey(mFragment.getKeyForResolution(mHighWidth));
 
-        verify(mFragment).setDisplayMode(FHD_WIDTH);
+        verify(mFragment).setDisplayMode(mHighWidth);
     }
 
     @Test
     @UiThreadTest
-    public void setDefaultKey_QHD() {
+    public void setDefaultKey_fullResolution() {
         doReturn(mContext).when(mFragment).getContext();
         mFragment.onAttach(mContext);
 
-        mFragment.setDefaultKey(mFragment.getKeyForResolution(QHD_WIDTH));
+        mFragment.setDefaultKey(mFragment.getKeyForResolution(mFullWidth));
 
-        verify(mFragment).setDisplayMode(QHD_WIDTH);
+        verify(mFragment).setDisplayMode(mFullWidth);
     }
 
     @Test