diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index aa2a142..60dbb24 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1323,7 +1323,8 @@
         <activity
             android:name=".notification.history.NotificationHistoryActivity"
             android:exported="true"
-            android:label="@string/notification_history_title">
+            android:label="@string/notification_history_title"
+            android:theme="@style/Theme.Settings.NoActionBar">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.NOTIFICATION_HISTORY" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -1517,7 +1518,8 @@
         <activity android:name=".applications.specialaccess.deviceadmin.DeviceAdminAdd"
                   android:label="@string/device_admin_add_title"
                   android:exported="true"
-                  android:clearTaskOnLaunch="true">
+                  android:clearTaskOnLaunch="true"
+                  android:theme="@style/Theme.Settings.NoActionBar">
             <intent-filter>
                 <action android:name="android.app.action.ADD_DEVICE_ADMIN" />
                 <category android:name="android.intent.category.DEFAULT" />
diff --git a/res/drawable/ic_power_settings.xml b/res/drawable/ic_power_settings.xml
deleted file mode 100644
index b56e332..0000000
--- a/res/drawable/ic_power_settings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-    Copyright (C) 2021 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.
--->
-
-<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:pathData="M11,2h2v10h-2zM18.37,5.64l-1.41,1.41c2.73,2.73 2.72,7.16 -0.01,9.89 -2.73,2.73 -7.17,2.73 -9.89,0.01 -2.73,-2.73 -2.74,-7.18 -0.01,-9.91l-1.41,-1.4c-3.51,3.51 -3.51,9.21 0.01,12.73 3.51,3.51 9.21,3.51 12.72,-0.01 3.51,-3.51 3.51,-9.2 0,-12.72z"
-        android:fillColor="@android:color/white"/>
-</vector>
\ No newline at end of file
diff --git a/res/layout/main_clear.xml b/res/layout/main_clear.xml
index cbccb0a..a2464e2 100644
--- a/res/layout/main_clear.xml
+++ b/res/layout/main_clear.xml
@@ -27,40 +27,39 @@
     <ScrollView
         android:id="@+id/main_clear_scrollview"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginStart="@dimen/reset_main_clear_margin_start"
-        android:layout_marginEnd="@dimen/reset_main_clear_margin_end">
+        android:layout_height="match_parent">
 
         <LinearLayout
             android:id="@+id/main_clear_container"
             style="@style/SudContentFrame"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
             android:orientation="vertical">
 
             <TextView
-                style="@style/TextAppearance.SudGlifItemSummary"
+                style="@style/TextAppearance.PreferenceTitle.SettingsLib"
                 android:id="@+id/sud_layout_description"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/main_clear_desc"/>
             <TextView
                 android:id="@+id/also_erases_external"
-                style="@style/TextAppearance.SudGlifItemSummary"
+                style="@style/TextAppearance.PreferenceTitle.SettingsLib"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:visibility="gone"
                 android:text="@string/main_clear_desc_also_erases_external"/>
             <TextView
                 android:id="@+id/also_erases_esim"
-                style="@style/TextAppearance.SudGlifItemSummary"
+                style="@style/TextAppearance.PreferenceTitle.SettingsLib"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:visibility="gone"
                 android:text="@string/main_clear_desc_also_erases_esim"/>
             <TextView
                 android:id="@+id/accounts_label"
-                style="@style/TextAppearance.SudGlifItemSummary"
+                style="@style/TextAppearance.PreferenceTitle.SettingsLib"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:visibility="gone"
@@ -76,21 +75,21 @@
             </LinearLayout>
             <TextView
                 android:id="@+id/other_users_present"
-                style="@style/TextAppearance.SudGlifItemSummary"
+                style="@style/TextAppearance.PreferenceTitle.SettingsLib"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:visibility="gone"
                 android:text="@string/main_clear_other_users_present"/>
             <TextView
                 android:id="@+id/no_cancel_mobile_plan"
-                style="@style/TextAppearance.SudGlifItemSummary"
+                style="@style/TextAppearance.PreferenceTitle.SettingsLib"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:visibility="gone"
                 android:text="@string/main_clear_desc_no_cancel_mobile_plan"/>
             <TextView
                 android:id="@+id/erase_external_option_text"
-                style="@style/TextAppearance.SudGlifItemSummary"
+                style="@style/TextAppearance.PreferenceTitle.SettingsLib"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/main_clear_desc_erase_external_storage"/>
@@ -116,12 +115,12 @@
                     android:layout_gravity="center_vertical"
                     android:orientation="vertical">
                     <TextView
-                        style="@style/TextAppearance.SudGlifItemTitle"
+                        style="@style/TextAppearance.PreferenceTitle.SettingsLib"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/erase_external_storage"/>
                     <TextView
-                        style="@style/TextAppearance.SudGlifItemSummary"
+                        style="?android:attr/textAppearanceListItemSecondary"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/erase_external_storage_description"/>
diff --git a/res/layout/main_clear_account.xml b/res/layout/main_clear_account.xml
index f95a44f..6dbf4d8 100644
--- a/res/layout/main_clear_account.xml
+++ b/res/layout/main_clear_account.xml
@@ -4,9 +4,9 @@
      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.
@@ -30,6 +30,6 @@
         android:id="@android:id/title"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        style="@style/TextAppearance.SudGlifItemSummary"/>
+        style="@style/TextAppearance.PreferenceTitle.SettingsLib"/>
 </LinearLayout>
 
diff --git a/res/layout/main_clear_confirm.xml b/res/layout/main_clear_confirm.xml
index 914a998..c5601c7 100644
--- a/res/layout/main_clear_confirm.xml
+++ b/res/layout/main_clear_confirm.xml
@@ -31,7 +31,7 @@
 
         <TextView
             android:id="@+id/sud_layout_description"
-            style="@style/SudItemTitle.GlifDescription"
+            style="@style/TextAppearance.PreferenceTitle.SettingsLib"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/main_clear_final_desc"/>
diff --git a/res/layout/preference_widget_main_switch.xml b/res/layout/preference_widget_main_switch.xml
index a02ed43..a01105f 100644
--- a/res/layout/preference_widget_main_switch.xml
+++ b/res/layout/preference_widget_main_switch.xml
@@ -15,10 +15,11 @@
   limitations under the License.
   -->
 
-<LinearLayout
+<FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+    android:layout_height="wrap_content"
+    android:importantForAccessibility="no">
 
     <com.android.settings.widget.SettingsMainSwitchBar
         android:id="@+id/main_switch_bar"
@@ -26,4 +27,4 @@
         android:layout_height="wrap_content"
         android:layout_width="match_parent" />
 
-</LinearLayout>
+</FrameLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 908b640..fe0ada0 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -327,8 +327,6 @@
     <!-- Margin for the reset screens -->
     <dimen name="reset_network_margin_start">72dp</dimen>
     <dimen name="reset_network_margin_end">12dp</dimen>
-    <dimen name="reset_main_clear_margin_start">32dp</dimen>
-    <dimen name="reset_main_clear_margin_end">12dp</dimen>
     <dimen name="reset_button_margin_end">20dp</dimen>
 
     <!-- Padding for the reset screens -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2ddbae3..aeaea61 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13203,23 +13203,29 @@
     <string name="cards_passes_lower">cards &amp; passes</string>
 
     <!-- Power menu setting name [CHAR LIMIT=NONE] -->
-    <string name="power_menu_setting_name">Power menu</string>
+    <string name="power_menu_setting_name">Press and hold power button</string>
 
-    <!-- Power menu setting title [CHAR LIMIT=NONE] -->
-    <string name="power_menu_setting_title">Power button menu</string>
-
-    <!-- Power menu setting option none [CHAR LIMIT=NONE] -->
-    <string name="power_menu_none">Don\u2019t show any content</string>
+    <!-- Power menu setting summary to describe press and hold power button for Assistant is enabled. [CHAR LIMIT=NONE] -->
+    <string name="power_menu_summary_long_press_for_assist_enabled">Press and hold for the Assistant</string>
+    <!-- Power menu setting summary to describe press and hold power button for Assistant is disabled and power menu will appear. [CHAR LIMIT=NONE] -->
+    <string name="power_menu_summary_long_press_for_assist_disabled_with_power_menu">Press and hold for the power menu</string>
+    <!-- Power menu setting summary to describe press and hold power button for Assistant is disabled and nothing will happen. [CHAR LIMIT=NONE] -->
+    <string name="power_menu_summary_long_press_for_assist_disabled_no_action">Press and hold disabled</string>
 
     <!-- Power menu setting privacy no secure screen lock set [CHAR_LIMIT=NONE] -->
     <string name="lockscreen_privacy_not_secure">To use, first set a screen lock</string>
 
-    <!-- Power menu setting use long press power to invoke assistant. [CHAR_LIMIT=NONE] -->
+    <!-- Power menu setting use long press power to invoke assistant. [CHAR LIMIT=NONE] -->
     <string name="power_menu_long_press_for_assist">Hold for Assistant</string>
 
-    <!-- Power menu setting use log press power to invoke assistant summary. [CHAR_LIMIT=NONE] -->
+    <!-- Power menu setting use log press power to invoke assistant summary. [CHAR LIMIT=NONE] -->
     <string name="power_menu_long_press_for_assist_summary">Trigger the Assistant by holding the power button</string>
 
+    <!-- Power menu explanation to press power and volume up to show power and emergency menu. [CHAR LIMIT=NONE] -->
+    <string name="power_menu_power_volume_up_hint">Power &amp; Emergency Menu:\nPress Power and Volume up at the same time.</string>
+    <!-- Power menu explanation where to find prevent ringing option. [CHAR LIMIT=NONE] -->
+    <string name="power_menu_power_prevent_ringing_hint">Prevent ringing:\nShortcut available in the volume menu.</string>
+
     <!-- Wallet (formerly Cards and passes) toggle name [CHAR LIMIT=60] -->
     <string name="lockscreen_privacy_wallet_setting_toggle">Show wallet</string>
     <!-- Wallet (formerly Cards and passes) summary [CHAR LIMIT=NONE] -->
diff --git a/res/xml/apps.xml b/res/xml/apps.xml
index a7d823b..e6314da 100644
--- a/res/xml/apps.xml
+++ b/res/xml/apps.xml
@@ -55,7 +55,7 @@
         settings:searchable="false"/>
 
     <Preference
-        android:key="default_apps_v2"
+        android:key="default_apps"
         android:title="@string/app_default_dashboard_title"
         android:order="-996"
         settings:controller="com.android.settings.applications.DefaultAppsPreferenceController">
@@ -85,7 +85,7 @@
     </Preference>
 
     <Preference
-        android:key="special_access_v2"
+        android:key="special_access"
         android:fragment="com.android.settings.applications.specialaccess.SpecialAccessSettings"
         android:title="@string/special_access"
         android:order="20"
diff --git a/res/xml/gestures.xml b/res/xml/gestures.xml
index 6de9c1a..175a826 100644
--- a/res/xml/gestures.xml
+++ b/res/xml/gestures.xml
@@ -86,4 +86,10 @@
         android:title="@string/gesture_prevent_ringing_screen_title"
         android:fragment="com.android.settings.gestures.PreventRingingGestureSettings"
         settings:controller="com.android.settings.gestures.PreventRingingParentPreferenceController" />
+
+    <Preference
+        android:key="gesture_power_menu_summary"
+        android:title="@string/power_menu_setting_name"
+        android:fragment="com.android.settings.gestures.PowerMenuSettings"
+        settings:controller="com.android.settings.gestures.PowerMenuPreferenceController" />
 </PreferenceScreen>
diff --git a/res/xml/power_menu_settings.xml b/res/xml/power_menu_settings.xml
index f88531e..caaeb97 100644
--- a/res/xml/power_menu_settings.xml
+++ b/res/xml/power_menu_settings.xml
@@ -1,19 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 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.
-  -->
+<!-- Copyright (C) 2020 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.
+-->
 
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
@@ -26,4 +23,10 @@
         android:summary="@string/power_menu_long_press_for_assist_summary"
         settings:controller="com.android.settings.gestures.LongPressPowerButtonPreferenceController"
         />
+
+    <com.android.settingslib.widget.FooterPreference
+        android:key="power_menu_power_volume_up_hint"
+        android:title="@string/power_menu_power_volume_up_hint"
+        android:selectable="false"
+        settings:searchable="false" />
 </PreferenceScreen>
diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml
index 6737775..9228ddd 100644
--- a/res/xml/system_dashboard_fragment.xml
+++ b/res/xml/system_dashboard_fragment.xml
@@ -43,14 +43,6 @@
         android:fragment="com.android.settings.datetime.DateTimeSettings"
         settings:controller="com.android.settings.datetime.DateTimePreferenceController"/>
 
-    <Preference
-        android:key="gesture_power_menu_summary"
-        android:title="@string/power_menu_setting_name"
-        android:icon="@drawable/ic_power_settings"
-        android:order="-220"
-        android:fragment="com.android.settings.gestures.PowerMenuSettings"
-        settings:controller="com.android.settings.gestures.PowerMenuPreferenceController" />
-
     <!-- System updates -->
     <Preference
         android:key="additional_system_update_settings"
diff --git a/src/com/android/settings/PointerSpeedPreference.java b/src/com/android/settings/PointerSpeedPreference.java
index d48d26c..6a93477 100644
--- a/src/com/android/settings/PointerSpeedPreference.java
+++ b/src/com/android/settings/PointerSpeedPreference.java
@@ -73,6 +73,7 @@
         mOldSpeed = mIm.getPointerSpeed(getContext());
         mSeekBar.setProgress(mOldSpeed - InputManager.MIN_POINTER_SPEED);
         mSeekBar.setOnSeekBarChangeListener(this);
+        mSeekBar.setContentDescription(getTitle());
     }
 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
diff --git a/src/com/android/settings/applications/AppDashboardFragment.java b/src/com/android/settings/applications/AppDashboardFragment.java
index ff12595..7e203b0 100644
--- a/src/com/android/settings/applications/AppDashboardFragment.java
+++ b/src/com/android/settings/applications/AppDashboardFragment.java
@@ -69,6 +69,7 @@
         use(SpecialAppAccessPreferenceController.class).setSession(getSettingsLifecycle());
         mAppsPreferenceController = use(AppsPreferenceController.class);
         mAppsPreferenceController.setFragment(this /* fragment */);
+        getSettingsLifecycle().addObserver(mAppsPreferenceController);
 
         final HibernatedAppsPreferenceController hibernatedAppsPreferenceController =
                 use(HibernatedAppsPreferenceController.class);
diff --git a/src/com/android/settings/applications/AppsPreferenceController.java b/src/com/android/settings/applications/AppsPreferenceController.java
index 72d4492..9fbd5c1 100644
--- a/src/com/android/settings/applications/AppsPreferenceController.java
+++ b/src/com/android/settings/applications/AppsPreferenceController.java
@@ -26,6 +26,9 @@
 
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceScreen;
@@ -45,7 +48,8 @@
  * This controller displays up to four recently used apps.
  * If there is no recently used app, we only show up an "App Info" preference.
  */
-public class AppsPreferenceController extends BasePreferenceController {
+public class AppsPreferenceController extends BasePreferenceController implements
+        LifecycleObserver {
 
     public static final int SHOW_RECENT_APP_COUNT = 4;
 
@@ -73,6 +77,7 @@
     Preference mSeeAllPref;
 
     private Fragment mHost;
+    private boolean mInitialLaunch = false;
 
     public AppsPreferenceController(Context context) {
         super(context, KEY_RECENT_APPS_CATEGORY);
@@ -95,12 +100,23 @@
         super.displayPreference(screen);
         initPreferences(screen);
         refreshUi();
+        mInitialLaunch = true;
     }
 
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        refreshUi();
+        if (!mInitialLaunch) {
+            refreshUi();
+        }
+    }
+
+    /**
+     * Called when the apps page pauses.
+     */
+    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+    public void onPause() {
+        mInitialLaunch = false;
     }
 
     @VisibleForTesting
@@ -109,11 +125,15 @@
         mRecentApps = loadRecentApps();
         if (!mRecentApps.isEmpty()) {
             displayRecentApps();
+            mAllAppsInfoPref.setVisible(false);
             mRecentAppsCategory.setVisible(true);
             mGeneralCategory.setVisible(true);
             mSeeAllPref.setVisible(true);
         } else {
             mAllAppsInfoPref.setVisible(true);
+            mRecentAppsCategory.setVisible(false);
+            mGeneralCategory.setVisible(false);
+            mSeeAllPref.setVisible(false);
         }
     }
 
diff --git a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
index d83f5d1..89c3478 100644
--- a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
@@ -43,6 +43,7 @@
 import com.android.settings.fuelgauge.BatteryEntry;
 import com.android.settings.fuelgauge.BatteryUsageStatsLoader;
 import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.fuelgauge.ConvertUtils;
 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -113,7 +114,13 @@
         if (!KEY_BATTERY.equals(preference.getKey())) {
             return false;
         }
+
         if (mBatteryDiffEntry != null) {
+            Log.i(TAG, "BatteryDiffEntry not null, launch : "
+                    + mBatteryDiffEntry.getPackageName()
+                    + " | uid : "
+                    + mBatteryDiffEntry.mBatteryHistEntry.mUid
+                    + " with DiffEntry data");
             AdvancedPowerUsageDetail.startBatteryDetailPage(
                     mParent.getActivity(),
                     mParent,
@@ -131,10 +138,16 @@
             final BatteryEntry entry = new BatteryEntry(mContext, /* handler */null, userManager,
                     mUidBatteryConsumer, /* isHidden */ false,
                     mUidBatteryConsumer.getUid(), /* packages */ null, mPackageName);
+            Log.i(TAG, "Battery consumer available, launch : "
+                    + entry.getDefaultPackageName()
+                    + " | uid : "
+                    + entry.getUid()
+                    + " with BatteryEntry data");
             AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, entry,
                     mIsChartGraphEnabled ? Utils.formatPercentage(0) : mBatteryPercent,
                     !mIsChartGraphEnabled);
         } else {
+            Log.i(TAG, "Launch : " + mPackageName + " with package name");
             AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent,
                     mPackageName);
         }
@@ -162,7 +175,9 @@
                         BatteryChartPreferenceController.getBatteryLast24HrUsageData(mContext);
                 if (batteryDiffEntries != null) {
                     for (BatteryDiffEntry batteryDiffEntry : batteryDiffEntries) {
-                        if (batteryDiffEntry.mBatteryHistEntry.mUid == mUid) {
+                        if (batteryDiffEntry.mBatteryHistEntry.mUid == mUid
+                                && batteryDiffEntry.mBatteryHistEntry.mConsumerType
+                                == ConvertUtils.CONSUMER_TYPE_UID_BATTERY) {
                             return batteryDiffEntry;
                         }
                     }
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 6d3aaa3..e1ea8e4 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -582,9 +582,8 @@
         if (mUid <= 0) {
             final Intent intent = args == null
                     ? getActivity().getIntent() : (Intent) args.getParcelable("intent");
-            if (intent != null && intent.getExtras() != null) {
-                mUid = intent.getIntExtra("uId", -1);
-            }
+            mUid = intent != null && intent.getExtras() != null
+                    ? mUid = intent.getIntExtra("uId", -1) : -1;
         }
         return mUid;
     }
diff --git a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java
index 8e43853..7cbbf6d 100644
--- a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java
+++ b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java
@@ -67,6 +67,7 @@
 public class PasswordsPreferenceController extends BasePreferenceController
         implements LifecycleObserver {
     private static final String TAG = "AutofillSettings";
+    private static final boolean DEBUG = false;
 
     private final PackageManager mPm;
     private final IconDrawableFactory mIconFactory;
@@ -128,6 +129,8 @@
             pref.setIntent(
                     new Intent(Intent.ACTION_MAIN)
                             .setClassName(serviceInfo.packageName, service.getPasswordsActivity()));
+            // Set an empty summary to avoid a UI flicker when the value loads.
+            pref.setSummary(R.string.summary_placeholder);
 
             final MutableLiveData<Integer> passwordCount = new MutableLiveData<>();
             passwordCount.observe(
@@ -172,15 +175,18 @@
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             final IAutoFillService autofillService = IAutoFillService.Stub.asInterface(service);
-            // TODO check if debug is logged on user build.
-            Log.d(TAG, "Fetching password count from " + name);
+            if (DEBUG) {
+                Log.d(TAG, "Fetching password count from " + name);
+            }
             try {
                 autofillService.onSavedPasswordCountRequest(
                         new IResultReceiver.Stub() {
                             @Override
                             public void send(int resultCode, Bundle resultData) {
-                                Log.d(TAG, "Received password count result " + resultCode
-                                        + " from " + name);
+                                if (DEBUG) {
+                                    Log.d(TAG, "Received password count result " + resultCode
+                                            + " from " + name);
+                                }
                                 if (resultCode == 0 && resultData != null) {
                                     mData.postValue(resultData.getInt(EXTRA_RESULT));
                                 }
diff --git a/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java b/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java
index 0a60ed3..ec311f4 100644
--- a/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java
+++ b/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java
@@ -54,7 +54,7 @@
         SettingsMainSwitchPreference pref = (SettingsMainSwitchPreference) screen.findPreference(
                 getPreferenceKey());
         pref.addOnSwitchChangeListener(this);
-        pref.updateStatus(isChecked());
+        pref.setChecked(isChecked());
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java
index 15070c3..8fec9b4 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverController.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverController.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.fuelgauge;
 
+import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
@@ -23,6 +24,7 @@
 import android.os.PowerManager;
 import android.provider.Settings;
 import android.provider.Settings.Global;
+import android.util.Pair;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -30,6 +32,8 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -44,6 +48,7 @@
     private final BatterySaverReceiver mBatteryStateChangeReceiver;
     private final PowerManager mPowerManager;
     private Preference mBatterySaverPref;
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
     private final ContentObserver mObserver = new ContentObserver(
             new Handler(Looper.getMainLooper())) {
         @Override
@@ -56,6 +61,7 @@
         super(context, KEY_BATTERY_SAVER);
 
         mPowerManager = mContext.getSystemService(PowerManager.class);
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
         mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
         mBatteryStateChangeReceiver.setBatterySaverListener(this);
         BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
@@ -121,9 +127,43 @@
         }
     }
 
+    private void logPowerSaver() {
+        if (!mPowerManager.isPowerSaveMode()) {
+            // Power saver is off, so don't do anything.
+            return;
+        }
+
+        final ContentResolver resolver = mContext.getContentResolver();
+        final int mode = Global.getInt(resolver, Global.AUTOMATIC_POWER_SAVE_MODE,
+                PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+        int fuelgaugeScheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE;
+        switch (mode) {
+            case PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE:
+                fuelgaugeScheduleType =
+                        SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE;
+                final int powerLevelTriggerPercentage = Global.getInt(resolver,
+                        Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+                mMetricsFeatureProvider.action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                        Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                                fuelgaugeScheduleType),
+                        Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+                                powerLevelTriggerPercentage));
+                break;
+            case PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC:
+                fuelgaugeScheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE;
+                break;
+            default:
+                // empty
+        }
+        mMetricsFeatureProvider.action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                        fuelgaugeScheduleType));
+    }
+
     @Override
     public void onPowerSaveModeChanged() {
         updateSummary();
+        logPowerSaver();
     }
 
     @Override
diff --git a/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java b/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
index 96db2c9..3e9c80f 100644
--- a/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
+++ b/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
@@ -16,45 +16,30 @@
 
 package com.android.settings.gestures;
 
-import android.content.ContentResolver;
 import android.content.Context;
-import android.content.pm.PackageManager;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Looper;
 import android.provider.Settings;
 
-import androidx.annotation.Nullable;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
-import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
 import com.android.settings.core.TogglePreferenceController;
 
+import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+
 /**
  * Configures the behaviour of long press power button action.
  */
-public class LongPressPowerButtonPreferenceController extends TogglePreferenceController implements
-        LifecycleObserver {
+public class LongPressPowerButtonPreferenceController extends TogglePreferenceController {
 
     private static final String POWER_BUTTON_LONG_PRESS_SETTING =
             Settings.Global.POWER_BUTTON_LONG_PRESS;
-    private static final Uri POWER_BUTTON_LONG_PRESS_SETTING_URI =
-            Settings.Global.getUriFor(POWER_BUTTON_LONG_PRESS_SETTING);
     private static final String KEY_CHORD_POWER_VOLUME_UP_SETTING =
             Settings.Global.KEY_CHORD_POWER_VOLUME_UP;
 
-    // Used for fallback to global actions if necessary.
-    @VisibleForTesting
-    static final String CARDS_AVAILABLE_KEY =
-            Settings.Secure.GLOBAL_ACTIONS_PANEL_AVAILABLE;
-    @VisibleForTesting
-    static final String CARDS_ENABLED_KEY = Settings.Secure.GLOBAL_ACTIONS_PANEL_ENABLED;
+    private static final String FOOTER_HINT_KEY = "power_menu_power_volume_up_hint";
+    private static final String ASSIST_SWITCH_KEY = "gesture_power_menu_long_press_for_assist";
 
     /**
      * Values used for long press power button behaviour when Assist setting is enabled.
@@ -63,9 +48,9 @@
      * source of the value.
      */
     @VisibleForTesting
-    static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
+    static final int LONG_PRESS_POWER_NO_ACTION = 0;
     @VisibleForTesting
-    static final int LONG_PRESS_POWER_SHUT_OFF = 2;
+    static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
     @VisibleForTesting
     static final int LONG_PRESS_POWER_ASSISTANT_VALUE = 5; // Settings.Secure.ASSISTANT
 
@@ -89,13 +74,18 @@
      * power menu, depending on their respective settings.
      */
     private static final int POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE =
-            R.integer.config_longPressOnPowerBehavior;
+            com.android.internal.R.integer.config_longPressOnPowerBehavior;
 
     private static final int KEY_CHORD_POWER_VOLUME_UP_DEFAULT_VALUE_RESOURCE =
-            R.integer.config_keyChordPowerVolumeUp;
+            com.android.internal.R.integer.config_keyChordPowerVolumeUp;
 
-    @Nullable
-    private SettingObserver mSettingsObserver;
+    @MonotonicNonNull
+    @VisibleForTesting
+    Preference mFooterHint;
+
+    @MonotonicNonNull
+    @VisibleForTesting
+    Preference mAssistSwitch;
 
     public LongPressPowerButtonPreferenceController(Context context, String key) {
         super(context, key);
@@ -104,26 +94,22 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mSettingsObserver = new SettingObserver(screen.findPreference(getPreferenceKey()));
+        mFooterHint = screen.findPreference(FOOTER_HINT_KEY);
+        mAssistSwitch = screen.findPreference(ASSIST_SWITCH_KEY);
+        refreshStateDisplay();
     }
 
-    /**
-     * Called when the settings pages resumes.
-     */
-    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
-    public void onResume() {
-        if (mSettingsObserver != null) {
-            mSettingsObserver.register();
-        }
-    }
-
-    /**
-     * Called when the settings page pauses.
-     */
-    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
-    public void onPause() {
-        if (mSettingsObserver != null) {
-            mSettingsObserver.unregister();
+    @Override
+    public CharSequence getSummary() {
+        final int powerButtonValue = getPowerButtonValue();
+        if (powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
+            return mContext.getString(R.string.power_menu_summary_long_press_for_assist_enabled);
+        } else if (powerButtonValue == LONG_PRESS_POWER_GLOBAL_ACTIONS) {
+            return mContext.getString(
+                    R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu);
+        } else {
+            return mContext.getString(
+                    R.string.power_menu_summary_long_press_for_assist_disabled_no_action);
         }
     }
 
@@ -136,10 +122,7 @@
 
     @Override
     public boolean isChecked() {
-        final int powerButtonValue = Settings.Global.getInt(mContext.getContentResolver(),
-                POWER_BUTTON_LONG_PRESS_SETTING,
-                mContext.getResources().getInteger(POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE));
-        return powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE;
+        return getPowerButtonValue() == LONG_PRESS_POWER_ASSISTANT_VALUE;
     }
 
     @Override
@@ -148,12 +131,48 @@
             // The key chord value is dependant on the long press setting and it always
             // toggled in tandem. POWER_BUTTON_LONG_PRESS_SETTING is always the source
             // of truth for both.
-            return setPowerVolumeChordValue(isChecked);
+            setPowerVolumeChordValue(isChecked);
+            refreshStateDisplay();
+            return true;
         }
 
         return false;
     }
 
+    private void refreshStateDisplay() {
+        if (mAssistSwitch != null) {
+            mAssistSwitch.setSummary(getSummary());
+        }
+
+        if (mFooterHint != null) {
+            String footerHintText = mContext.getString(R.string.power_menu_power_volume_up_hint);
+            // If the device supports hush gesture, we need to notify the user where to find
+            // the setting.
+            if (mContext.getResources().getBoolean(
+                    com.android.internal.R.bool.config_volumeHushGestureEnabled)) {
+                footerHintText = footerHintText + "\n\n" + mContext.getString(
+                        R.string.power_menu_power_prevent_ringing_hint);
+            }
+
+            mFooterHint.setSummary(footerHintText);
+            mFooterHint.setVisible(isPowerMenuKeyChordEnabled(mContext));
+        }
+    }
+
+    private int getPowerButtonValue() {
+        return Settings.Global.getInt(mContext.getContentResolver(),
+                POWER_BUTTON_LONG_PRESS_SETTING,
+                mContext.getResources().getInteger(POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE));
+    }
+
+    private static boolean isPowerMenuKeyChordEnabled(Context context) {
+        return Settings.Global.getInt(context.getContentResolver(),
+                KEY_CHORD_POWER_VOLUME_UP_SETTING,
+                context.getResources().getInteger(
+                        com.android.internal.R.integer.config_keyChordPowerVolumeUp))
+                == KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS;
+    }
+
     private boolean setPowerLongPressValue(boolean isChecked) {
         if (isChecked) {
             return Settings.Global.putInt(mContext.getContentResolver(),
@@ -162,14 +181,12 @@
 
         // We need to determine the right disabled value - we set it to device default
         // if it's different than Assist, otherwise we fallback to either global actions or power
-        //menu.
+        // menu.
         final int defaultPowerButtonValue = mContext.getResources().getInteger(
                 POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE);
         if (defaultPowerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
-            final int fallbackValue = isCardsOrControlsAvailable() ? LONG_PRESS_POWER_GLOBAL_ACTIONS
-                    : LONG_PRESS_POWER_SHUT_OFF;
             return Settings.Global.putInt(mContext.getContentResolver(),
-                    POWER_BUTTON_LONG_PRESS_SETTING, fallbackValue);
+                    POWER_BUTTON_LONG_PRESS_SETTING, LONG_PRESS_POWER_NO_ACTION);
         }
 
         return Settings.Global.putInt(mContext.getContentResolver(),
@@ -187,53 +204,11 @@
                     KEY_CHORD_POWER_VOLUME_UP_SETTING, KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
         }
 
-        // If the key chord defaults to mute toggle, we restore that setting if LPP option is
-        // disabled. Otherwise we default to no action.
-        boolean isMuteToggleKeyChordDefault = mContext.getResources().getInteger(
-                KEY_CHORD_POWER_VOLUME_UP_DEFAULT_VALUE_RESOURCE)
-                == KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE;
+        // We restore key chord to the default value.
+        int keyChordDefaultValue = mContext.getResources().getInteger(
+                KEY_CHORD_POWER_VOLUME_UP_DEFAULT_VALUE_RESOURCE);
         return Settings.Global.putInt(mContext.getContentResolver(),
-                KEY_CHORD_POWER_VOLUME_UP_SETTING, isMuteToggleKeyChordDefault
-                        ? KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE
-                        : KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
-    }
-
-    /**
-     * Returns true if the global actions menu on power button click is enabled via any of the
-     * content options.
-     */
-    private boolean isCardsOrControlsAvailable() {
-        final ContentResolver resolver = mContext.getContentResolver();
-        final boolean cardsAvailable = Settings.Secure.getInt(resolver, CARDS_AVAILABLE_KEY, 0)
-                != 0;
-        final boolean controlsAvailable = mContext.getPackageManager().hasSystemFeature(
-                PackageManager.FEATURE_CONTROLS);
-        return cardsAvailable || controlsAvailable;
-    }
-
-    private final class SettingObserver extends ContentObserver {
-
-        private final Preference mPreference;
-
-        SettingObserver(Preference preference) {
-            super(new Handler(Looper.getMainLooper()));
-            mPreference = preference;
-        }
-
-        public void register() {
-            final ContentResolver cr = mContext.getContentResolver();
-            cr.registerContentObserver(POWER_BUTTON_LONG_PRESS_SETTING_URI, false, this);
-        }
-
-        public void unregister() {
-            final ContentResolver cr = mContext.getContentResolver();
-            cr.unregisterContentObserver(this);
-        }
-
-        @Override
-        public void onChange(boolean selfChange) {
-            updateState(mPreference);
-        }
+                KEY_CHORD_POWER_VOLUME_UP_SETTING, keyChordDefaultValue);
     }
 
 }
diff --git a/src/com/android/settings/gestures/PowerMenuPreferenceController.java b/src/com/android/settings/gestures/PowerMenuPreferenceController.java
index 0693753..0d5f810 100644
--- a/src/com/android/settings/gestures/PowerMenuPreferenceController.java
+++ b/src/com/android/settings/gestures/PowerMenuPreferenceController.java
@@ -17,28 +17,54 @@
 package com.android.settings.gestures;
 
 import android.content.Context;
+import android.provider.Settings;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 
 public class PowerMenuPreferenceController extends BasePreferenceController {
 
+    private static final String POWER_BUTTON_LONG_PRESS_SETTING =
+            Settings.Global.POWER_BUTTON_LONG_PRESS;
+
+    @VisibleForTesting
+    static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
+    @VisibleForTesting
+    static final int LONG_PRESS_POWER_ASSISTANT_VALUE = 5;
+
     public PowerMenuPreferenceController(Context context, String key) {
         super(context, key);
     }
 
     @Override
     public CharSequence getSummary() {
-        return mContext.getText(R.string.power_menu_long_press_for_assist);
+        final int powerButtonValue = getPowerButtonLongPressValue(mContext);
+        if (powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
+            return mContext.getText(R.string.power_menu_summary_long_press_for_assist_enabled);
+        } else if (powerButtonValue == LONG_PRESS_POWER_GLOBAL_ACTIONS) {
+            return mContext.getText(
+                    R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu);
+        } else {
+            return mContext.getText(
+                    R.string.power_menu_summary_long_press_for_assist_disabled_no_action);
+        }
     }
 
     @Override
     public int getAvailabilityStatus() {
-        return isAssistInvocationAvailable() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+        return isAssistInvocationAvailable() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
     private boolean isAssistInvocationAvailable() {
         return mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable);
     }
+
+    private static int getPowerButtonLongPressValue(Context context) {
+        return Settings.Global.getInt(context.getContentResolver(),
+                POWER_BUTTON_LONG_PRESS_SETTING,
+                context.getResources().getInteger(
+                        com.android.internal.R.integer.config_longPressOnPowerBehavior));
+    }
 }
diff --git a/src/com/android/settings/network/InternetResetHelper.java b/src/com/android/settings/network/InternetResetHelper.java
new file mode 100644
index 0000000..d6c5476
--- /dev/null
+++ b/src/com/android/settings/network/InternetResetHelper.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2021 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.network;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.UiThread;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.WorkerThread;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper class to restart connectivity for all requested subsystems.
+ */
+public class InternetResetHelper implements LifecycleObserver,
+        ConnectivitySubsystemsRecoveryManager.RecoveryStatusCallback {
+
+    protected static final String TAG = "InternetResetHelper";
+    public static final long RESTART_TIMEOUT_MS = 15_000; // 15 seconds
+
+    protected final Context mContext;
+    protected Preference mResettingPreference;
+    protected NetworkMobileProviderController mMobileNetworkController;
+    protected Preference mWifiTogglePreferences;
+    protected List<PreferenceCategory> mWifiNetworkPreferences =
+            new ArrayList<PreferenceCategory>();
+
+    protected final WifiManager mWifiManager;
+    protected final IntentFilter mWifiStateFilter;
+    protected final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() {
+        @Override
+        @WorkerThread
+        public void onReceive(Context context, Intent intent) {
+            if (intent != null && TextUtils.equals(intent.getAction(),
+                    WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+                updateWifiStateChange();
+            }
+        }
+    };
+
+    protected ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
+    protected HandlerThread mWorkerThread;
+    protected boolean mIsRecoveryReady;
+    protected boolean mIsWifiReady;
+    protected HandlerInjector mHandlerInjector;
+    protected final Runnable mResumeRunnable = () -> {
+        resumePreferences();
+    };
+    protected final Runnable mTimeoutRunnable = () -> {
+        mIsRecoveryReady = true;
+        mIsWifiReady = true;
+        resumePreferences();
+    };
+
+    public InternetResetHelper(Context context, Lifecycle lifecycle) {
+        mContext = context;
+        mHandlerInjector = new HandlerInjector(context);
+        mWifiManager = mContext.getSystemService(WifiManager.class);
+        mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+
+        mWorkerThread = new HandlerThread(TAG
+                + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
+                Process.THREAD_PRIORITY_BACKGROUND);
+        mWorkerThread.start();
+        mConnectivitySubsystemsRecoveryManager = new ConnectivitySubsystemsRecoveryManager(
+                mContext, mWorkerThread.getThreadHandler());
+
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
+    }
+
+    /** @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) */
+    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+    public void onResume() {
+        mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
+    }
+
+    /** @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) */
+    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+    public void onPause() {
+        mContext.unregisterReceiver(mWifiStateReceiver);
+    }
+
+    /** @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) */
+    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+    public void onDestroy() {
+        mHandlerInjector.removeCallbacks(mResumeRunnable);
+        mHandlerInjector.removeCallbacks(mTimeoutRunnable);
+        mWorkerThread.quit();
+    }
+
+    @Override
+    @WorkerThread
+    public void onSubsystemRestartOperationBegin() {
+        Log.d(TAG, "The connectivity subsystem is starting for recovery.");
+    }
+
+    @Override
+    @WorkerThread
+    public void onSubsystemRestartOperationEnd() {
+        Log.d(TAG, "The connectivity subsystem is done for recovery.");
+        if (!mIsRecoveryReady) {
+            mIsRecoveryReady = true;
+            mHandlerInjector.postDelayed(mResumeRunnable, 0 /* delayMillis */);
+        }
+    }
+
+    @VisibleForTesting
+    @WorkerThread
+    protected void updateWifiStateChange() {
+        if (!mIsWifiReady && mWifiManager.isWifiEnabled()) {
+            Log.d(TAG, "The Wi-Fi subsystem is done for recovery.");
+            mIsWifiReady = true;
+            mHandlerInjector.postDelayed(mResumeRunnable, 0 /* delayMillis */);
+        }
+    }
+
+    /**
+     * Sets the resetting preference.
+     */
+    @UiThread
+    public void setResettingPreference(Preference preference) {
+        mResettingPreference = preference;
+    }
+
+    /**
+     * Sets the mobile network controller.
+     */
+    @UiThread
+    public void setMobileNetworkController(NetworkMobileProviderController controller) {
+        mMobileNetworkController = controller;
+    }
+
+    /**
+     * Sets the Wi-Fi toggle preference.
+     */
+    @UiThread
+    public void setWifiTogglePreference(Preference preference) {
+        mWifiTogglePreferences = preference;
+    }
+
+    /**
+     * Adds the Wi-Fi network preference.
+     */
+    @UiThread
+    public void addWifiNetworkPreference(PreferenceCategory preference) {
+        if (preference != null) {
+            mWifiNetworkPreferences.add(preference);
+        }
+    }
+
+    @UiThread
+    protected void suspendPreferences() {
+        Log.d(TAG, "Suspend the subsystem preferences");
+        if (mMobileNetworkController != null) {
+            mMobileNetworkController.hidePreference(true /* hide */, true /* immediately */);
+        }
+        if (mWifiTogglePreferences != null) {
+            mWifiTogglePreferences.setVisible(false);
+        }
+        for (PreferenceCategory pref : mWifiNetworkPreferences) {
+            pref.removeAll();
+            pref.setVisible(false);
+        }
+        if (mResettingPreference != null) {
+            mResettingPreference.setVisible(true);
+        }
+    }
+
+    @UiThread
+    protected void resumePreferences() {
+        if (mIsRecoveryReady && mMobileNetworkController != null) {
+            Log.d(TAG, "Resume the Mobile Network controller");
+            mMobileNetworkController.hidePreference(false /* hide */, false /* immediately */);
+        }
+        if (mIsWifiReady && mWifiTogglePreferences != null) {
+            Log.d(TAG, "Resume the Wi-Fi preferences");
+            mWifiTogglePreferences.setVisible(true);
+            for (PreferenceCategory pref : mWifiNetworkPreferences) {
+                pref.setVisible(true);
+            }
+        }
+        if (mIsRecoveryReady && mIsWifiReady) {
+            mHandlerInjector.removeCallbacks(mTimeoutRunnable);
+            if (mResettingPreference != null) {
+                Log.d(TAG, "Resume the Resetting preference");
+                mResettingPreference.setVisible(false);
+            }
+        }
+    }
+
+    /**
+     * Restart connectivity for all requested subsystems.
+     */
+    @UiThread
+    public void restart() {
+        if (!mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()) {
+            Log.e(TAG, "The connectivity subsystem is not available to restart.");
+            return;
+        }
+
+        Log.d(TAG, "The connectivity subsystem is restarting for recovery.");
+        suspendPreferences();
+        mIsRecoveryReady = false;
+        mIsWifiReady = !mWifiManager.isWifiEnabled();
+        mHandlerInjector.postDelayed(mTimeoutRunnable, RESTART_TIMEOUT_MS);
+        mConnectivitySubsystemsRecoveryManager.triggerSubsystemRestart(null /* reason */, this);
+    }
+
+    /**
+     * Wrapper for testing compatibility.
+     */
+    @VisibleForTesting
+    static class HandlerInjector {
+        protected final Handler mHandler;
+
+        HandlerInjector(Context context) {
+            mHandler = context.getMainThreadHandler();
+        }
+
+        public void postDelayed(Runnable runnable, long delayMillis) {
+            mHandler.postDelayed(runnable, delayMillis);
+        }
+
+        public void removeCallbacks(Runnable runnable) {
+            mHandler.removeCallbacks(runnable);
+        }
+    }
+}
diff --git a/src/com/android/settings/network/NetworkMobileProviderController.java b/src/com/android/settings/network/NetworkMobileProviderController.java
index 5dc6c0d..33123b3 100644
--- a/src/com/android/settings/network/NetworkMobileProviderController.java
+++ b/src/com/android/settings/network/NetworkMobileProviderController.java
@@ -50,6 +50,7 @@
     private SubscriptionsPreferenceController mSubscriptionsController;
 
     private int mOriginalExpandedChildrenCount;
+    private boolean mHide;
 
     public NetworkMobileProviderController(Context context, String key) {
         super(context, key);
@@ -94,7 +95,7 @@
 
     @Override
     public int getAvailabilityStatus() {
-        if (mSubscriptionsController == null) {
+        if (mHide || mSubscriptionsController == null) {
             return CONDITIONALLY_UNAVAILABLE;
         }
         return mSubscriptionsController.isAvailable() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
@@ -122,4 +123,14 @@
             mSubscriptionsController.setWifiPickerTrackerHelper(helper);
         }
     }
+
+    /**
+     * Hides the preference.
+     */
+    public void hidePreference(boolean hide, boolean immediately) {
+        mHide = hide;
+        if (immediately) {
+            mPreferenceCategory.setVisible(hide ? false : isAvailable());
+        }
+    }
 }
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index 88e732a..f6e7917 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -32,9 +32,7 @@
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.HandlerThread;
 import android.os.PowerManager;
-import android.os.Process;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -78,7 +76,6 @@
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtilsInternal;
-import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
 import com.android.settingslib.search.Indexable;
 import com.android.settingslib.search.SearchIndexable;
 import com.android.settingslib.utils.ThreadUtils;
@@ -101,7 +98,6 @@
 public class NetworkProviderSettings extends RestrictedSettingsFragment
         implements Indexable, WifiPickerTracker.WifiPickerTrackerCallback,
         WifiDialog2.WifiDialog2Listener, DialogInterface.OnDismissListener,
-        ConnectivitySubsystemsRecoveryManager.RecoveryStatusCallback,
         AirplaneModeEnabler.OnAirplaneModeChangedListener, InternetUpdater.InternetChangeListener {
 
     public static final String ACTION_NETWORK_PROVIDER_SETTINGS =
@@ -192,9 +188,7 @@
     private WifiManager.ActionListener mSaveListener;
     private WifiManager.ActionListener mForgetListener;
 
-    @VisibleForTesting
-    protected ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
-    private HandlerThread mRecoveryThread;
+    protected InternetResetHelper mInternetResetHelper;
 
     /**
      * The state of {@link #isUiRestricted()} at {@link #onCreate(Bundle)}}. This is necessary to
@@ -1274,39 +1268,17 @@
     }
 
     private void fixConnectivity() {
-        if (mConnectivitySubsystemsRecoveryManager == null) {
-            mRecoveryThread = new HandlerThread(TAG
-                    + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
-                    Process.THREAD_PRIORITY_BACKGROUND);
-            mRecoveryThread.start();
-            mConnectivitySubsystemsRecoveryManager = new ConnectivitySubsystemsRecoveryManager(
-                    getContext(), mRecoveryThread.getThreadHandler());
+        if (mInternetResetHelper == null) {
+            mInternetResetHelper = new InternetResetHelper(getContext(), getLifecycle());
+            mInternetResetHelper.setResettingPreference(mResetInternetPreference);
+            mInternetResetHelper.setMobileNetworkController(mNetworkMobileProviderController);
+            mInternetResetHelper.setWifiTogglePreference(
+                    findPreference(WifiSwitchPreferenceController.KEY));
+            mInternetResetHelper.addWifiNetworkPreference(mConnectedWifiEntryPreferenceCategory);
+            mInternetResetHelper.addWifiNetworkPreference(mFirstWifiEntryPreferenceCategory);
+            mInternetResetHelper.addWifiNetworkPreference(mWifiEntryPreferenceCategory);
         }
-        if (mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()) {
-            mConnectivitySubsystemsRecoveryManager.triggerSubsystemRestart(null /* reason */, this);
-        }
-    }
-
-    /**
-     * Callback for the internet recovery started.
-     */
-    public void onSubsystemRestartOperationBegin() {
-        if (mResetInternetPreference != null) {
-            mResetInternetPreference.setVisible(true);
-        }
-        updateAirplaneModeMsgPreference(false /* visible */);
-    }
-
-    /**
-     * Callback for the internet recovery ended.
-     */
-    public void onSubsystemRestartOperationEnd() {
-        if (mResetInternetPreference != null) {
-            mResetInternetPreference.setVisible(false);
-        }
-        if (mAirplaneModeEnabler.isAirplaneModeOn()) {
-            updateAirplaneModeMsgPreference(true /* visible */);
-        }
+        mInternetResetHelper.restart();
     }
 
     /**
diff --git a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
index 14c9117..5ea01ea 100644
--- a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
+++ b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
@@ -150,6 +150,6 @@
         final Intent intent = new Intent(ACTION_ZEN_MODE_SLICE_CHANGED)
                 .setClass(context, SliceBroadcastReceiver.class);
         return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent,
-                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE);
     }
 }
diff --git a/src/com/android/settings/widget/SettingsMainSwitchPreference.java b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
index 09e1ca4..f0e8d95 100644
--- a/src/com/android/settings/widget/SettingsMainSwitchPreference.java
+++ b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
@@ -86,9 +86,12 @@
             mEnforcedAdmin = mRestrictedHelper.checkRestrictionEnforced();
         }
         mMainSwitchBar = (SettingsMainSwitchBar) holder.findViewById(R.id.main_switch_bar);
+        initMainSwitchBar();
         if (mIsVisible) {
             mMainSwitchBar.show();
-            updateStatus(isChecked());
+            if (mMainSwitchBar.isChecked() != isChecked()) {
+                setChecked(isChecked());
+            }
             registerListenerToSwitchBar();
         } else {
             mMainSwitchBar.hide();
@@ -145,18 +148,6 @@
     }
 
     /**
-     * Update the switch status of preference
-     */
-    public void updateStatus(boolean checked) {
-        setChecked(checked);
-        if (mMainSwitchBar != null) {
-            mMainSwitchBar.setTitle(mTitle);
-            mMainSwitchBar.setDisabledByAdmin(mEnforcedAdmin);
-            mMainSwitchBar.show();
-        }
-    }
-
-    /**
      * Show the MainSwitchBar
      */
     public void show() {
@@ -251,6 +242,13 @@
         }
     }
 
+    private void initMainSwitchBar() {
+        if (mMainSwitchBar != null) {
+            mMainSwitchBar.setTitle(mTitle);
+            mMainSwitchBar.setDisabledByAdmin(mEnforcedAdmin);
+        }
+    }
+
     private void registerListenerToSwitchBar() {
         for (OnBeforeCheckedChangeListener listener : mBeforeCheckedChangeListeners) {
             mMainSwitchBar.setOnBeforeCheckedChangeListener(listener);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 75e6307..59f6504 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -233,6 +233,9 @@
 
         if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlagUtils.SETTINGS_PROVIDER_MODEL)) {
             final Intent intent = new Intent("android.settings.NETWORK_PROVIDER_SETTINGS");
+            // Add FLAG_ACTIVITY_NEW_TASK and FLAG_ACTIVITY_CLEAR_TASK to avoid multiple
+            // instances issue. (e.g. b/191956700)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
             final Bundle extras = getActivity().getIntent().getExtras();
             if (extras != null) {
                 intent.putExtras(extras);
diff --git a/tests/robotests/res/layout/main_clear.xml b/tests/robotests/res/layout/main_clear.xml
index 868d88f..b9a126d 100644
--- a/tests/robotests/res/layout/main_clear.xml
+++ b/tests/robotests/res/layout/main_clear.xml
@@ -28,9 +28,7 @@
     <ScrollView
         android:id="@+id/main_clear_scrollview"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginStart="@dimen/reset_main_clear_margin_start"
-        android:layout_marginEnd="@dimen/reset_main_clear_margin_end">
+        android:layout_height="match_parent">
 
         <LinearLayout
             android:id="@+id/main_clear_container"
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
index 52f682c..cee1160 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
@@ -21,12 +21,17 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.PowerManager;
 import android.provider.Settings;
+import android.util.Pair;
 
 import androidx.preference.Preference;
 
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -46,12 +51,16 @@
 
     private BatterySaverController mBatterySaverController;
     private Context mContext;
+    private FakeFeatureFactory mFeatureFactory;
+    private MetricsFeatureProvider mMetricsFeatureProvider;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
         mContext = RuntimeEnvironment.application;
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
         mBatterySaverController = spy(new BatterySaverController(mContext));
         ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
         ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
@@ -73,6 +82,49 @@
     }
 
     @Test
+    public void onPreferenceChange_onPowerSaveModeChanged_manualTrigger_logsType() {
+        when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AUTOMATIC_POWER_SAVE_MODE, -1);
+
+        mBatterySaverController.onPowerSaveModeChanged();
+        verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                        SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE));
+    }
+
+    @Test
+    public void onPreferenceChange_onPowerSaveModeChanged_triggerPercent_logsTypeAndPercentage() {
+        when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
+                PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+        final int percentageVal = 15;
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, percentageVal);
+
+        mBatterySaverController.onPowerSaveModeChanged();
+        verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                        SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE),
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+                        percentageVal));
+    }
+
+    @Test
+    public void onPreferenceChange_onPowerSaveModeChanged_triggerDynamic_logsType() {
+        when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
+                PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC);
+
+        mBatterySaverController.onPowerSaveModeChanged();
+        verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                        SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE));
+    }
+
+    @Test
     public void getSummary_batterySaverOn_showSummaryOn() {
         when(mPowerManager.isPowerSaveMode()).thenReturn(true);
 
diff --git a/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
index 085e53d..053fa5a 100644
--- a/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
@@ -18,20 +18,28 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Application;
 import android.content.res.Resources;
 import android.provider.Settings;
 
+import androidx.annotation.StringRes;
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class LongPressPowerButtonPreferenceControllerTest {
@@ -46,14 +54,20 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application);
+        mContext = spy(ApplicationProvider.getApplicationContext());
         mResources = mock(Resources.class);
         when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getString(anyInt())).thenAnswer((Answer<String>) invocation -> {
+            int id = invocation.getArgument(0);
+            return getString(id);
+        });
         when(mResources.getBoolean(
                 com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable))
                 .thenReturn(true);
         mController = new LongPressPowerButtonPreferenceController(mContext,
                 KEY_LONG_PRESS_POWER_BUTTON);
+        mController.mAssistSwitch = mock(Preference.class);
+        mController.mFooterHint = mock(Preference.class);
     }
 
     @Test
@@ -75,6 +89,60 @@
     }
 
     @Test
+    public void preferenceChecked_powerMenuHintTextShown() {
+        mController.onPreferenceChange(null, true);
+
+        verify(mController.mFooterHint).setSummary(
+                getString(
+                        R.string.power_menu_power_volume_up_hint));
+        verify(mController.mFooterHint).setVisible(true);
+    }
+
+
+    @Test
+    public void preferenceUnchecked_keyChordEnabled_powerMenuHintTextShown() {
+        when(mResources.getInteger(
+                com.android.internal.R.integer.config_keyChordPowerVolumeUp))
+                .thenReturn(
+                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
+
+        mController.onPreferenceChange(null, false);
+
+        verify(mController.mFooterHint).setSummary(
+                getString(
+                        R.string.power_menu_power_volume_up_hint));
+        verify(mController.mFooterHint).setVisible(true);
+    }
+
+    @Test
+    public void preferenceChecked_hushGestureEnabled_powerMenuHintTextIncludesHushHint() {
+        when(mResources.getBoolean(
+                com.android.internal.R.bool.config_volumeHushGestureEnabled))
+                .thenReturn(true);
+
+        mController.onPreferenceChange(null, true);
+
+        verify(mController.mFooterHint).setSummary(
+                getString(
+                        R.string.power_menu_power_volume_up_hint) + "\n\n"
+                        + getString(
+                        R.string.power_menu_power_prevent_ringing_hint));
+        verify(mController.mFooterHint).setVisible(true);
+    }
+
+
+    @Test
+    public void preferenceUnchecked_keyChordDisabled_powerMenuHintTextHidden() {
+        mController.onPreferenceChange(null, false);
+        when(mResources.getInteger(
+                com.android.internal.R.integer.config_keyChordPowerVolumeUp))
+                .thenReturn(
+                      LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+
+        verify(mController.mFooterHint).setVisible(false);
+    }
+
+    @Test
     public void preferenceChecked_longPressPowerSettingSetToAssistant() {
         mController.onPreferenceChange(null, true);
 
@@ -84,21 +152,29 @@
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
+        verify(mController.mAssistSwitch).setSummary(
+                getString(
+                        R.string.power_menu_summary_long_press_for_assist_enabled));
     }
 
     @Test
     public void preferenceUnchecked_longPressPowerSettingSetToDefaultValue() {
-        // Value out of range chosen deliberately.
         when(mResources.getInteger(
                 com.android.internal.R.integer.config_longPressOnPowerBehavior))
-                .thenReturn(8);
+                .thenReturn(
+                        LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
 
         mController.onPreferenceChange(null, false);
+
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(8);
+                Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
+                LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+        verify(mController.mAssistSwitch).setSummary(
+                getString(
+                       R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu));
     }
 
     @Test
@@ -110,9 +186,10 @@
         when(mResources.getInteger(
                 com.android.internal.R.integer.config_keyChordPowerVolumeUp))
                 .thenReturn(
-                LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE);
+                    LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE);
 
         mController.onPreferenceChange(null, false);
+
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(8);
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
@@ -121,7 +198,7 @@
     }
 
     @Test
-    public void preferenceUnchecked_assistDefault_setShutOff() {
+    public void preferenceUnchecked_assistDefault_setNoAction() {
         // Value out of range chosen deliberately.
         when(mResources.getInteger(
                 com.android.internal.R.integer.config_longPressOnPowerBehavior))
@@ -129,33 +206,19 @@
                         LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE);
 
         mController.onPreferenceChange(null, false);
+
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
-                LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_SHUT_OFF);
+                LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_NO_ACTION);
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+        verify(mController.mAssistSwitch).setSummary(
+                getString(
+                        R.string.power_menu_summary_long_press_for_assist_disabled_no_action));
     }
 
-
-    @Test
-    public void preferenceUnchecked_assistDefaultGlobalActionsEnabled_setGlobalActions() {
-        // Value out of range chosen deliberately.
-        when(mResources.getInteger(
-                com.android.internal.R.integer.config_longPressOnPowerBehavior))
-                .thenReturn(
-                        LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE);
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                LongPressPowerButtonPreferenceController.CARDS_AVAILABLE_KEY, 1);
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                LongPressPowerButtonPreferenceController.CARDS_ENABLED_KEY, 1);
-
-        mController.onPreferenceChange(null, false);
-        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
-                LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
-        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
-                LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+    private String getString(@StringRes int id) {
+        return ApplicationProvider.getApplicationContext().getString(id);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java
index 811ed70..1a82a13 100644
--- a/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java
@@ -70,6 +70,6 @@
                     .thenReturn(false);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
-                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
+                BasePreferenceController.UNSUPPORTED_ON_DEVICE);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
index 9951449..47cd87c 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
@@ -66,7 +66,6 @@
 import com.android.settings.wifi.ConnectedWifiEntryPreference;
 import com.android.settings.wifi.WifiConfigController2;
 import com.android.settings.wifi.WifiDialog2;
-import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
 import com.android.settingslib.widget.LayoutPreference;
 import com.android.settingslib.wifi.LongPressWifiEntryPreference;
 import com.android.wifitrackerlib.WifiEntry;
@@ -105,7 +104,7 @@
     @Mock
     private PreferenceManager mPreferenceManager;
     @Mock
-    private ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
+    private InternetResetHelper mInternetResetHelper;
     @Mock
     private Preference mAirplaneModeMsgPreference;
     @Mock
@@ -439,49 +438,14 @@
     }
 
     @Test
-    public void onOptionsItemSelected_fixConnectivity_triggerSubsystemRestart() {
-        doReturn(true).when(mConnectivitySubsystemsRecoveryManager).isRecoveryAvailable();
-        mNetworkProviderSettings.mConnectivitySubsystemsRecoveryManager =
-                mConnectivitySubsystemsRecoveryManager;
+    public void onOptionsItemSelected_fixConnectivity_restartInternet() {
+        mNetworkProviderSettings.mInternetResetHelper = mInternetResetHelper;
         doReturn(false).when(mNetworkProviderSettings).isPhoneOnCall();
         doReturn(NetworkProviderSettings.MENU_FIX_CONNECTIVITY).when(mMenuItem).getItemId();
 
         mNetworkProviderSettings.onOptionsItemSelected(mMenuItem);
 
-        verify(mConnectivitySubsystemsRecoveryManager).triggerSubsystemRestart(any(), any());
-    }
-
-    @Test
-    public void onOptionsItemSelected_fixConnectivityOnCall_neverTriggerSubsystemRestart() {
-        doReturn(true).when(mConnectivitySubsystemsRecoveryManager).isRecoveryAvailable();
-        mNetworkProviderSettings.mConnectivitySubsystemsRecoveryManager =
-                mConnectivitySubsystemsRecoveryManager;
-        doReturn(true).when(mNetworkProviderSettings).isPhoneOnCall();
-        doNothing().when(mNetworkProviderSettings).showResetInternetDialog();
-        doReturn(NetworkProviderSettings.MENU_FIX_CONNECTIVITY).when(mMenuItem).getItemId();
-
-        mNetworkProviderSettings.onOptionsItemSelected(mMenuItem);
-
-        verify(mConnectivitySubsystemsRecoveryManager, never()).triggerSubsystemRestart(any(),
-                any());
-    }
-
-    @Test
-    public void onSubsystemRestartOperationBegin_showResetInternetHideApmMsg() {
-        mNetworkProviderSettings.onSubsystemRestartOperationBegin();
-
-        verify(mResetInternetPreference).setVisible(true);
-        verify(mAirplaneModeMsgPreference).setVisible(false);
-    }
-
-    @Test
-    public void onSubsystemRestartOperationEnd_showApmMsgHideResetInternet() {
-        doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn();
-
-        mNetworkProviderSettings.onSubsystemRestartOperationEnd();
-
-        verify(mResetInternetPreference).setVisible(false);
-        verify(mAirplaneModeMsgPreference).setVisible(true);
+        verify(mInternetResetHelper).restart();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
index c0c4fd7..31d10d9 100644
--- a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
@@ -59,8 +59,8 @@
     }
 
     @Test
-    public void updateStatus_isRestricted_restrictIconShouldDisplay() {
-        mPreference.updateStatus(true);
+    public void onBindViewHolder_isRestricted_restrictIconShouldDisplay() {
+        mPreference.onBindViewHolder(mHolder);
 
         final SettingsMainSwitchBar switchBar = mPreference.getSwitchBar();
         final ImageView restrictedIcon = switchBar.findViewById(
diff --git a/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java b/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
new file mode 100644
index 0000000..00ca8e1
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2021 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.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.IntentFilter;
+import android.net.wifi.WifiManager;
+import android.os.HandlerThread;
+import android.os.Looper;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class InternetResetHelperTest {
+
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Mock
+    private WifiManager mWifiManager;
+    @Mock
+    public HandlerThread mWorkerThread;
+    @Mock
+    public ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
+    @Mock
+    public NetworkMobileProviderController mMobileNetworkController;
+
+    private Context mContext;
+    private InternetResetHelper mInternetResetHelper;
+    private Preference mResettingPreference;
+    private Preference mWifiTogglePreferences;
+    private PreferenceCategory mConnectedWifiEntryPreferences;
+    private PreferenceCategory mWifiEntryPreferences;
+
+    private FakeHandlerInjector mFakeHandlerInjector;
+
+    private static class FakeHandlerInjector extends InternetResetHelper.HandlerInjector {
+
+        private Runnable mRunnable;
+
+        FakeHandlerInjector(Context context) {
+            super(context);
+        }
+
+        @Override
+        public void postDelayed(Runnable runnable, long delayMillis) {
+            mRunnable = runnable;
+        }
+
+        public Runnable getRunnable() {
+            return mRunnable;
+        }
+    }
+
+    @Before
+    public void setUp() {
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+        mResettingPreference = new Preference(mContext);
+        mWifiTogglePreferences = new Preference(mContext);
+        mConnectedWifiEntryPreferences = spy(new PreferenceCategory(mContext));
+        mWifiEntryPreferences = spy(new PreferenceCategory(mContext));
+
+        final Lifecycle lifecycle = mock(Lifecycle.class);
+        mInternetResetHelper = new InternetResetHelper(mContext, lifecycle);
+        mInternetResetHelper.mWorkerThread = mWorkerThread;
+        mFakeHandlerInjector = new FakeHandlerInjector(mContext);
+        mInternetResetHelper.mHandlerInjector = mFakeHandlerInjector;
+        mInternetResetHelper.mConnectivitySubsystemsRecoveryManager =
+                mConnectivitySubsystemsRecoveryManager;
+        mInternetResetHelper.setResettingPreference(mResettingPreference);
+        mInternetResetHelper.setMobileNetworkController(mMobileNetworkController);
+        mInternetResetHelper.setWifiTogglePreference(mWifiTogglePreferences);
+        mInternetResetHelper.addWifiNetworkPreference(mConnectedWifiEntryPreferences);
+        mInternetResetHelper.addWifiNetworkPreference(mWifiEntryPreferences);
+    }
+
+    @Test
+    public void onResume_registerReceiver() {
+        mInternetResetHelper.onResume();
+
+        verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
+    }
+
+    @Test
+    public void onPause_unregisterReceiver() {
+        mInternetResetHelper.onResume();
+
+        mInternetResetHelper.onPause();
+
+        verify(mContext).unregisterReceiver(any(BroadcastReceiver.class));
+    }
+
+    @Test
+    public void onDestroy_quitWorkerThread() {
+        mInternetResetHelper.onDestroy();
+
+        verify(mWorkerThread).quit();
+    }
+
+    @Test
+    public void onSubsystemRestartOperationEnd_recoveryIsNotReady_postResumeRunnable() {
+        mInternetResetHelper.mIsRecoveryReady = false;
+
+        mInternetResetHelper.onSubsystemRestartOperationEnd();
+
+        assertThat(mInternetResetHelper.mIsRecoveryReady).isTrue();
+        assertThat(mFakeHandlerInjector.getRunnable())
+                .isEqualTo(mInternetResetHelper.mResumeRunnable);
+    }
+
+    @Test
+    public void onSubsystemRestartOperationEnd_recoveryIsReady_doNothing() {
+        mInternetResetHelper.mIsRecoveryReady = true;
+
+        mInternetResetHelper.onSubsystemRestartOperationEnd();
+
+        assertThat(mFakeHandlerInjector.getRunnable()).isNull();
+    }
+
+    @Test
+    public void updateWifiStateChange_wifiIsNotReadyAndWifiDisabled_doNothing() {
+        mInternetResetHelper.mIsWifiReady = false;
+        when(mWifiManager.isWifiEnabled()).thenReturn(false);
+
+        mInternetResetHelper.updateWifiStateChange();
+
+        assertThat(mInternetResetHelper.mIsWifiReady).isFalse();
+        assertThat(mFakeHandlerInjector.getRunnable()).isNull();
+    }
+
+    @Test
+    public void updateWifiStateChange_wifiIsNotReadyAndWifiEnabled_postResumeRunnable() {
+        mInternetResetHelper.mIsWifiReady = false;
+        when(mWifiManager.isWifiEnabled()).thenReturn(true);
+
+        mInternetResetHelper.updateWifiStateChange();
+
+        assertThat(mInternetResetHelper.mIsWifiReady).isTrue();
+        assertThat(mFakeHandlerInjector.getRunnable())
+                .isEqualTo(mInternetResetHelper.mResumeRunnable);
+    }
+
+    @Test
+    public void updateWifiStateChange_wifiIsReady_doNothing() {
+        mInternetResetHelper.mIsWifiReady = true;
+
+        mInternetResetHelper.updateWifiStateChange();
+
+        assertThat(mInternetResetHelper.mIsWifiReady).isTrue();
+        assertThat(mFakeHandlerInjector.getRunnable()).isNull();
+    }
+
+    @Test
+    public void suspendPreferences_shouldShowResettingHideSubSys() {
+        mInternetResetHelper.suspendPreferences();
+
+        // Show resetting preference
+        assertThat(mResettingPreference.isVisible()).isTrue();
+        // Hide subsystem preferences
+        verify(mMobileNetworkController).hidePreference(true /* hide */, true /* immediately*/);
+        assertThat(mWifiTogglePreferences.isVisible()).isFalse();
+        verify(mConnectedWifiEntryPreferences).removeAll();
+        assertThat(mConnectedWifiEntryPreferences.isVisible()).isFalse();
+        verify(mWifiEntryPreferences).removeAll();
+        assertThat(mWifiEntryPreferences.isVisible()).isFalse();
+    }
+
+    @Test
+    public void resumePreferences_onlyRecoveryReady_shouldShowSubSysHideResetting() {
+        mInternetResetHelper.suspendPreferences();
+        mInternetResetHelper.mIsRecoveryReady = true;
+        mInternetResetHelper.mIsWifiReady = false;
+
+        mInternetResetHelper.resumePreferences();
+
+        // Show resetting preference
+        assertThat(mResettingPreference.isVisible()).isTrue();
+        // Show Mobile Network controller
+        verify(mMobileNetworkController).hidePreference(false /* hide */, false /* immediately*/);
+        // Hide Wi-Fi preferences
+        assertThat(mWifiTogglePreferences.isVisible()).isFalse();
+        assertThat(mConnectedWifiEntryPreferences.isVisible()).isFalse();
+        assertThat(mWifiEntryPreferences.isVisible()).isFalse();
+    }
+
+    @Test
+    public void resumePreferences_onlyWifiReady_shouldShowSubSysHideResetting() {
+        mInternetResetHelper.suspendPreferences();
+        mInternetResetHelper.mIsRecoveryReady = false;
+        mInternetResetHelper.mIsWifiReady = true;
+
+        mInternetResetHelper.resumePreferences();
+
+        // Show resetting preference
+        assertThat(mResettingPreference.isVisible()).isTrue();
+        // Show Wi-Fi preferences
+        assertThat(mWifiTogglePreferences.isVisible()).isTrue();
+        assertThat(mConnectedWifiEntryPreferences.isVisible()).isTrue();
+        assertThat(mWifiEntryPreferences.isVisible()).isTrue();
+        // Hide Mobile Network controller
+        verify(mMobileNetworkController, never())
+                .hidePreference(false /* hide */, false /* immediately*/);
+    }
+
+    @Test
+    public void resumePreferences_allReady_shouldShowSubSysHideResetting() {
+        mInternetResetHelper.suspendPreferences();
+        mInternetResetHelper.mIsRecoveryReady = true;
+        mInternetResetHelper.mIsWifiReady = true;
+        mInternetResetHelper.resumePreferences();
+
+        // Show subsystem preferences
+        verify(mMobileNetworkController).hidePreference(false, false);
+        assertThat(mWifiTogglePreferences.isVisible()).isTrue();
+        assertThat(mConnectedWifiEntryPreferences.isVisible()).isTrue();
+        assertThat(mWifiEntryPreferences.isVisible()).isTrue();
+        // Hide resetting preference
+        assertThat(mResettingPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void restart_recoveryNotAvailable_shouldDoTriggerSubsystemRestart() {
+        when(mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()).thenReturn(false);
+
+        mInternetResetHelper.restart();
+
+        verify(mConnectivitySubsystemsRecoveryManager, never())
+                .triggerSubsystemRestart(any(), any());
+    }
+
+    @Test
+    public void restart_recoveryAvailable_triggerSubsystemRestart() {
+        when(mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()).thenReturn(true);
+
+        mInternetResetHelper.restart();
+
+        assertThat(mFakeHandlerInjector.getRunnable())
+                .isEqualTo(mInternetResetHelper.mTimeoutRunnable);
+        verify(mConnectivitySubsystemsRecoveryManager).triggerSubsystemRestart(any(), any());
+    }
+}
diff --git a/tests/unit/src/com/android/settings/network/NetworkMobileProviderControllerTest.java b/tests/unit/src/com/android/settings/network/NetworkMobileProviderControllerTest.java
index 31c68da..b626bff 100644
--- a/tests/unit/src/com/android/settings/network/NetworkMobileProviderControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/NetworkMobileProviderControllerTest.java
@@ -173,6 +173,44 @@
         assertEquals(mPreferenceScreen.getInitialExpandedChildrenCount(), Integer.MAX_VALUE);
     }
 
+    @Test
+    public void hidePreference_hidePreferenceTrue_preferenceIsNotVisible() {
+        when(mSubscriptionsController.isAvailable()).thenReturn(true);
+        setupNetworkMobileProviderController();
+        mPreferenceCategory.setVisible(true);
+
+        mNetworkMobileProviderController.hidePreference(true /* hide */, true /* immediately*/);
+
+        assertThat(mPreferenceCategory.isVisible()).isFalse();
+    }
+
+    @Test
+    public void hidePreference_hidePreferenceFalse_preferenceIsVisible() {
+        when(mSubscriptionsController.isAvailable()).thenReturn(true);
+        setupNetworkMobileProviderController();
+
+        mNetworkMobileProviderController.hidePreference(false /* hide */, true /* immediately*/);
+
+        assertThat(mPreferenceCategory.isVisible()).isTrue();
+    }
+
+    @Test
+    public void hidePreference_hidePreferenceFalse_preferenceIsNotVisibleImmediately() {
+        when(mSubscriptionsController.isAvailable()).thenReturn(true);
+        setupNetworkMobileProviderController();
+        mPreferenceCategory.setVisible(false);
+
+        mNetworkMobileProviderController.hidePreference(false /* hide */, false /* immediately*/);
+
+        // The preference is not visible immediately.
+        assertThat(mPreferenceCategory.isVisible()).isFalse();
+
+        mNetworkMobileProviderController.displayPreference(mPreferenceScreen);
+
+        // The preference is visible after displayPreference() updated.
+        assertThat(mPreferenceCategory.isVisible()).isTrue();
+    }
+
     private void setupNetworkMobileProviderController() {
         mNetworkMobileProviderController.init(mLifecycle);
         mNetworkMobileProviderController.displayPreference(mPreferenceScreen);
