Merge "[BiometricsV2] Ignore ui tests" into main
diff --git a/Android.bp b/Android.bp
index 3055863..ca4971e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -105,6 +105,7 @@
         "android.hardware.dumpstate-V1.1-java",
         "android.hardware.dumpstate-V1-java",
         "lottie",
+        "BiometricsSharedLib",
         "WifiTrackerLib",
         "SettingsLibActivityEmbedding",
         "Settings-change-ids",
diff --git a/res/layout/battery_chart_graph.xml b/res/layout/battery_chart_graph.xml
index f116c8e..9e816ed 100644
--- a/res/layout/battery_chart_graph.xml
+++ b/res/layout/battery_chart_graph.xml
@@ -27,6 +27,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginVertical="16dp"
+        android:textAlignment="viewStart"
         android:textAppearance="?android:attr/textAppearanceSmall"
         android:textColor="?android:attr/textColorSecondary"
         android:text="@string/battery_usage_chart_graph_hint_last_full_charge" />
@@ -40,7 +41,7 @@
         <com.android.settings.fuelgauge.batteryusage.BatteryChartView
             android:id="@+id/daily_battery_chart"
             android:layout_width="match_parent"
-            android:layout_height="170dp"
+            android:layout_height="@dimen/chartview_layout_height"
             android:layout_marginBottom="16dp"
             android:visibility="gone"
             android:contentDescription="@string/daily_battery_usage_chart"
@@ -50,7 +51,7 @@
         <com.android.settings.fuelgauge.batteryusage.BatteryChartView
             android:id="@+id/hourly_battery_chart"
             android:layout_width="match_parent"
-            android:layout_height="170dp"
+            android:layout_height="@dimen/chartview_layout_height"
             android:layout_marginBottom="16dp"
             android:visibility="visible"
             android:contentDescription="@string/hourly_battery_usage_chart"
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 1d79b68..a8ad434 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -390,6 +390,12 @@
     <dimen name="chartview_text_padding">6dp</dimen>
     <dimen name="chartview_divider_width">1dp</dimen>
     <dimen name="chartview_divider_height">4dp</dimen>
+    <dimen name="chartview_transom_width">4dp</dimen>
+    <dimen name="chartview_transom_radius">4dp</dimen>
+    <dimen name="chartview_transom_icon_size">12dp</dimen>
+    <dimen name="chartview_transom_padding_top">2dp</dimen>
+    <dimen name="chartview_transom_layout_height">12dp</dimen>
+    <dimen name="chartview_layout_height">182dp</dimen>
     <dimen name="chartview_trapezoid_radius">5dp</dimen>
     <dimen name="chartview_trapezoid_margin_start">1dp</dimen>
     <dimen name="chartview_trapezoid_margin_bottom">2dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a4f709d..5014a66 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -257,6 +257,8 @@
     <string name="connected_device_other_device_title">Other devices</string>
     <!-- Title for connected device group [CHAR LIMIT=none]-->
     <string name="connected_device_saved_title">Saved devices</string>
+    <!-- Title for fast pair device group [CHAR LIMIT=none]-->
+    <string name="connected_device_fast_pair_device_title">Associated with account</string>
     <!-- Summary for preference to add a device [CHAR LIMIT=none]-->
     <string name="connected_device_add_device_summary">Bluetooth will turn on to pair</string>
     <!-- Title for other connection preferences [CHAR LIMIT=none]-->
@@ -1175,13 +1177,38 @@
 
     <!-- Title for the subpage in the "Security & privacy". This page consists of the more security and privacy settings. Can be navigated by Settings -> Security & privacy -> More security & privacy [CHAR LIMIT=NONE] -->
     <string name="more_security_privacy_settings">More security &amp; privacy</string>
-    <!-- Title for the section that has security entries in the More security & privacy page. [CHAR LIMIT=60] -->
+    <!-- Title for the section that has security entries in the More security & privacy page. Also used for Private Space security category. [CHAR LIMIT=60] -->
     <string name="security_header">Security</string>
     <!-- Title for the section that has privacy entries in the More security & privacy page. [CHAR LIMIT=60] -->
     <string name="privacy_header">Privacy</string>
     <!-- Title for the section that has work profile entries in the More security & privacy page. [CHAR LIMIT=60] -->
     <string name="work_profile_category_header">Work profile</string>
 
+    <!-- Title for the Private Space page. [CHAR LIMIT=60] -->
+    <string name="private_space_title">Private Space</string>
+    <!-- Summary for the Private Space page. [CHAR LIMIT=NONE] -->
+    <string name="private_space_summary">Hide apps in a private folder</string>
+    <!-- Title for the Private Space one lock preference. [CHAR LIMIT=60] -->
+    <string name="private_space_one_lock_title">Unlock using screen lock</string>
+    <!-- Title for the preference to hide Private Space. [CHAR LIMIT=60] -->
+    <string name="private_space_hide_title">Show Private Space</string>
+    <!-- System category for the Private Space page. [CHAR LIMIT=30] -->
+    <string name="private_space_category_system">System</string>
+    <!-- Title for the preference to create Private Space. [CHAR LIMIT=60] -->
+    <string name="private_space_create_title">Create Private Space</string>
+    <!-- Title for the preference to delete Private Space. [CHAR LIMIT=60] -->
+    <string name="private_space_delete_title">Delete Private Space</string>
+    <!-- Toast to show when the private space was created. [CHAR LIMIT=NONE] -->
+    <string name="private_space_created">Private Space successfully created</string>
+    <!-- Toast to show when the private space already exists. [CHAR LIMIT=NONE] -->
+    <string name="private_space_already_exists">Private Space already exists</string>
+    <!-- Toast to show when the private space could not be created. [CHAR LIMIT=NONE] -->
+    <string name="private_space_create_failed">Private Space could not be created</string>
+    <!-- Toast to show when the private space was deleted. [CHAR LIMIT=NONE] -->
+    <string name="private_space_deleted">Private Space successfully deleted</string>
+    <!-- Toast to show when the private space could not be deleted. [CHAR LIMIT=NONE] -->
+    <string name="private_space_delete_failed">Private Space could not be deleted</string>
+
     <!-- Text shown when "Add fingerprint" button is disabled -->
     <string name="fingerprint_add_max">You can add up to <xliff:g id="count" example="5">%d</xliff:g> fingerprints</string>
     <!-- Text shown when users has enrolled a maximum number of fingerprints [CHAR LIMIT=NONE] -->
@@ -10037,7 +10064,7 @@
     <!-- Title text for edge to edge navigation [CHAR LIMIT=60] -->
     <string name="edge_to_edge_navigation_title">Gesture navigation</string>
     <!-- Summary text for edge to edge navigation [CHAR LIMIT=NONE] -->
-    <string name="edge_to_edge_navigation_summary">To go Home, swipe up from the bottom of the screen. To switch apps, swipe up from the bottom, hold, then release. To go back, swipe from either the left or right edge.</string>
+    <string name="edge_to_edge_navigation_summary">To go home, swipe up from the bottom of the screen. To switch apps, swipe up from the bottom, hold, then release. To go back, swipe from either the left or right edge.</string>
 
     <!-- Title text for 3-button navigation [CHAR LIMIT=60] -->
     <string name="legacy_navigation_title">3-button navigation</string>
@@ -12135,6 +12162,11 @@
     <!-- The summary of the head tracking [CHAR LIMIT=none] -->
     <string name="bluetooth_details_head_tracking_summary">Audio changes as you move your head to sound more natural</string>
 
+    <!-- The title of CDM Permissions Sync -->
+    <string name="bluetooth_details_permissions_sync_title">Sync permissions from phone</string>
+    <!-- The summary of CDM Permissions Sync -->
+    <string name="bluetooth_details_permissions_sync_summary">Give your watch the same app permissions that you’ve allowed on this phone</string>
+
     <!-- The title of the bluetooth audio device type selection [CHAR LIMIT=none] -->
     <string name="bluetooth_details_audio_device_types_title">Audio Device Type</string>
     <!-- The audio device type corresponding to unknown device type [CHAR LIMIT=none] -->
@@ -12245,11 +12277,13 @@
     <!-- [CHAR LIMIT=60] Aspect ratio title setting to choose app aspect ratio -->
     <string name="aspect_ratio_title">Aspect ratio</string>
     <!-- [CHAR LIMIT=NONE] Aspect ratio setting summary to choose aspect ratio for apps unoptimized for device -->
-    <string name="aspect_ratio_summary">Choose an aspect ratio to view this app if it hasn\'t been designed to fit your <xliff:g id="device_name">%1$s</xliff:g></string>
+    <string name="aspect_ratio_summary">Try a new aspect ratio to view this app if it hasn\'t been designed to fit your <xliff:g id="device_name">%1$s</xliff:g></string>
+    <!-- [CHAR LIMIT=NONE] Aspect ratio setting main summary on page to choose aspect ratio for apps unoptimized for device -->
+    <string name="aspect_ratio_main_summary">Try a new aspect ratio to view this app if it hasn\'t been designed to fit your <xliff:g id="device_name">%1$s</xliff:g>. Some apps may not be optimized for certain aspect ratios.</string>
     <!-- [CHAR LIMIT=NONE] Aspect ratio suggested apps filter label -->
     <string name="user_aspect_ratio_suggested_apps_label">Suggested apps</string>
-    <!-- [CHAR LIMIT=NONE] Filter label for apps that have user aspect ratio override applied -->
-    <string name="user_aspect_ratio_overridden_apps_label">Apps you have overridden</string>
+    <!-- [CHAR LIMIT=14] Filter label for apps that have user aspect ratio changed -->
+    <string name="user_aspect_ratio_changed_apps_label">Changed apps</string>
     <!-- [CHAR LIMIT=NONE] App default aspect ratio entry -->
     <string name="user_aspect_ratio_app_default">App default</string>
     <!-- [CHAR LIMIT=NONE] Fullscreen aspect ratio entry -->
@@ -12265,7 +12299,7 @@
     <!-- [CHAR LIMIT=NONE] 4:3 aspect ratio entry -->
     <string name="user_aspect_ratio_4_3">4:3</string>
     <!-- [CHAR LIMIT=NONE] Warning description for app info aspect ratio page -->
-    <string name="app_aspect_ratio_footer">The app will restart when you change aspect ratio. You may lose unsaved changes.</string>
+    <string name="app_aspect_ratio_footer">The app will restart when you change aspect ratio. You may lose unsaved changes. Some apps may not be optimized for certain aspect ratios.</string>
 
 
     <!-- Accessibility label for fingerprint sensor [CHAR LIMIT=NONE] -->
diff --git a/res/xml/apps.xml b/res/xml/apps.xml
index 651ed9b..db46a1a 100644
--- a/res/xml/apps.xml
+++ b/res/xml/apps.xml
@@ -80,18 +80,6 @@
         android:order="10"/>
 
     <Preference
-        android:key="aspect_ratio_apps"
-        android:title="@string/aspect_ratio_title"
-        android:summary="@string/summary_placeholder"
-        android:order="14"
-        settings:controller="com.android.settings.applications.appcompat.UserAspectRatioAppsPreferenceController"
-        android:fragment="com.android.settings.applications.manageapplications.ManageApplications">
-        <extra android:name="classname"
-               android:value="com.android.settings.Settings$UserAspectRatioAppListActivity"/>
-        <intent android:action="android.settings.MANAGE_USER_ASPECT_RATIO_SETTINGS"/>
-    </Preference>
-
-    <Preference
         android:key="hibernated_apps"
         android:title="@string/unused_apps"
         android:summary="@string/summary_placeholder"
@@ -119,4 +107,23 @@
         android:title="@string/special_access"
         android:order="20"/>
 
+    <PreferenceCategory
+        android:key="advanced_category"
+        android:title="@string/advanced_apps"
+        android:order="21"
+        android:visibility="gone"
+        settings:searchable="false"/>
+
+    <Preference
+        android:key="aspect_ratio_apps"
+        android:title="@string/aspect_ratio_title"
+        android:summary="@string/summary_placeholder"
+        android:order="22"
+        settings:controller="com.android.settings.applications.appcompat.UserAspectRatioAppsPreferenceController"
+        android:fragment="com.android.settings.applications.manageapplications.ManageApplications">
+        <extra android:name="classname"
+               android:value="com.android.settings.Settings$UserAspectRatioAppListActivity"/>
+        <intent android:action="android.settings.MANAGE_USER_ASPECT_RATIO_SETTINGS"/>
+    </Preference>
+
 </PreferenceScreen>
diff --git a/res/xml/bluetooth_device_details_fragment.xml b/res/xml/bluetooth_device_details_fragment.xml
index 8f309a4..12ed8eb 100644
--- a/res/xml/bluetooth_device_details_fragment.xml
+++ b/res/xml/bluetooth_device_details_fragment.xml
@@ -92,6 +92,9 @@
             settings:controller="com.android.settings.accessibility.LiveCaptionPreferenceController"/>
     </PreferenceCategory>
 
+    <PreferenceCategory
+        android:key="data_sync_group"/>
+
     <Preference
         android:key="keyboard_settings"
         android:persistent="false"
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index 5d7e0a8..830ed87 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -63,7 +63,7 @@
 
     <PreferenceCategory
         android:key="fast_pair_devices"
-        android:title="TODO(296507968): Placeholder"
+        android:title="@string/connected_device_fast_pair_device_title"
         settings:controller=
             "com.android.settings.connecteddevice.fastpair.FastPairDevicePreferenceController">
 
diff --git a/res/xml/fast_pair_devices.xml b/res/xml/fast_pair_devices.xml
index f549ff4..7e72cd7 100644
--- a/res/xml/fast_pair_devices.xml
+++ b/res/xml/fast_pair_devices.xml
@@ -17,7 +17,8 @@
 
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto">
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/connected_device_fast_pair_device_title">
 
     <PreferenceCategory
         android:key="fast_pair_device_list"
diff --git a/res/xml/private_space_settings.xml b/res/xml/private_space_settings.xml
new file mode 100644
index 0000000..08053e0
--- /dev/null
+++ b/res/xml/private_space_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:key="private_space_title"
+    android:title="@string/private_space_title">
+
+    <PreferenceCategory
+        android:title="@string/security_header">
+
+        <SwitchPreference
+            android:key="private_space_use_one_lock"
+            android:title="@string/private_space_one_lock_title"
+            settings:controller="com.android.settings.privatespace.UseOneLockController"
+            settings:searchable="false" />
+
+        <SwitchPreference
+            android:key="private_space_hidden"
+            android:title="@string/private_space_hide_title"
+            settings:controller="com.android.settings.privatespace.HidePrivateSpaceController"
+            settings:searchable="false" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:title="@string/private_space_category_system">
+
+        <Preference
+            android:key="private_space_create"
+            android:title="@string/private_space_create_title"
+            settings:controller="com.android.settings.privatespace.CreatePrivateSpaceController"
+            settings:searchable="false" />
+
+        <Preference
+            android:key="private_space_delete"
+            android:title="@string/private_space_delete_title"
+            settings:controller="com.android.settings.privatespace.DeletePrivateSpaceController"
+            settings:searchable="false" />
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml
index 3bd7a13..08852c9 100644
--- a/res/xml/reset_dashboard_fragment.xml
+++ b/res/xml/reset_dashboard_fragment.xml
@@ -57,5 +57,13 @@
         settings:keywords="@string/keywords_factory_data_reset"
         settings:userRestriction="no_factory_reset"
         settings:useAdminDisabledSummary="true"
+        settings:controller="com.android.settings.system.FactoryResetPreferenceController"
+        android:fragment="com.android.settings.MainClear" />
+
+    <Preference
+        android:key="factory_reset_demo_user"
+        android:title="@string/main_clear_title"
+        settings:keywords="@string/keywords_factory_data_reset"
+        settings:controller="com.android.settings.system.FactoryResetDemoUserPreferenceController"
         android:fragment="com.android.settings.MainClear" />
 </PreferenceScreen>
diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java
index b559b47..55d0af9 100644
--- a/src/com/android/settings/MainClear.java
+++ b/src/com/android/settings/MainClear.java
@@ -571,7 +571,7 @@
                         UserHandle.myUserId());
         if (disallow && !Utils.isDemoUser(context)) {
             return inflater.inflate(R.layout.main_clear_disallowed_screen, null);
-        } else if (admin != null) {
+        } else if (admin != null && !Utils.isDemoUser(context)) {
             new ActionDisabledByAdminDialogHelper(getActivity())
                     .prepareDialogBuilder(UserManager.DISALLOW_FACTORY_RESET, admin)
                     .setOnDismissListener(__ -> getActivity().finish())
diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
index 4ba634c..182e5ae 100644
--- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
@@ -302,8 +302,36 @@
                 null);
     }
 
+    private Set<ComponentName> buildComponentNameSet(List<CredentialProviderInfo> providers) {
+        Set<ComponentName> output = new HashSet<>();
+
+        for (CredentialProviderInfo cpi : providers) {
+            output.add(cpi.getComponentName());
+        }
+
+        return output;
+    }
+
     private void updateFromExternal() {
-        update();
+        if (mCredentialManager == null) {
+            return;
+        }
+
+        // Get the list of new providers and components.
+        List<CredentialProviderInfo> newProviders =
+                mCredentialManager.getCredentialProviderServices(
+                        getUser(), CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY);
+        Set<ComponentName> newComponents = buildComponentNameSet(newProviders);
+
+        // Get the list of old components
+        Set<ComponentName> oldComponents = buildComponentNameSet(mServices);
+
+        // If the sets are equal then don't update the UI.
+        if (oldComponents.equals(newComponents)) {
+            return;
+        }
+
+        setAvailableServices(newProviders, null);
 
         if (mPreferenceScreen != null) {
             displayPreference(mPreferenceScreen);
diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java
index 77b8aea..d17fa24 100644
--- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java
+++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java
@@ -37,8 +37,8 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
-import com.android.settingslib.udfps.UdfpsOverlayParams;
-import com.android.settingslib.udfps.UdfpsUtils;
+import com.android.systemui.biometrics.UdfpsUtils;
+import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
 
 import com.google.android.setupcompat.template.FooterBarMixin;
 import com.google.android.setupdesign.GlifLayout;
diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollView.java b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollView.java
index 5ded91e..2d392ff 100644
--- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollView.java
+++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollView.java
@@ -33,7 +33,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.settings.R;
-import com.android.settingslib.udfps.UdfpsOverlayParams;
+import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
 
 /**
  * View corresponding with udfps_enroll_view.xml
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt
index e7c458d..1f57198 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt
@@ -47,6 +47,12 @@
   /** Returns the max enrollable fingerprints, note during SUW this might be 1 */
   val maxEnrollableFingerprints: Flow<Int>
 
+  /** Returns true if a user can enroll a fingerprint false otherwise. */
+  val canEnrollFingerprints: Flow<Boolean>
+
+  /** Retrieves the sensor properties of a device */
+  val sensorPropertiesInternal: Flow<FingerprintSensorPropertiesInternal?>
+
   /** Runs [FingerprintManager.authenticate] */
   suspend fun authenticate(): FingerprintAuthAttemptViewModel
 
@@ -60,9 +66,6 @@
    */
   suspend fun generateChallenge(gateKeeperPasswordHandle: Long): Pair<Long, ByteArray>
 
-  /** Returns true if a user can enroll a fingerprint false otherwise. */
-  fun canEnrollFingerprints(numFingerprints: Int): Flow<Boolean>
-
   /**
    * Removes the given fingerprint, returning true if it was successfully removed and false
    * otherwise
@@ -77,9 +80,6 @@
 
   /** Indicates if the press to auth feature has been enabled */
   suspend fun pressToAuthEnabled(): Boolean
-
-  /** Retrieves the sensor properties of a device */
-  suspend fun sensorPropertiesInternal(): List<FingerprintSensorPropertiesInternal>
 }
 
 class FingerprintManagerInteractorImpl(
@@ -120,8 +120,15 @@
     )
   }
 
-  override fun canEnrollFingerprints(numFingerprints: Int): Flow<Boolean> = flow {
-    emit(numFingerprints < maxFingerprints)
+  override val canEnrollFingerprints: Flow<Boolean> = flow {
+    emit(
+      fingerprintManager.getEnrolledFingerprints(applicationContext.userId).size < maxFingerprints
+    )
+  }
+
+  override val sensorPropertiesInternal = flow {
+    val sensorPropertiesInternal = fingerprintManager.sensorPropertiesInternal
+    emit(if (sensorPropertiesInternal.isEmpty()) null else sensorPropertiesInternal.first())
   }
 
   override val maxEnrollableFingerprints = flow { emit(maxFingerprints) }
@@ -165,11 +172,6 @@
     it.resume(pressToAuthProvider())
   }
 
-  override suspend fun sensorPropertiesInternal(): List<FingerprintSensorPropertiesInternal> =
-    suspendCancellableCoroutine {
-      it.resume(fingerprintManager.sensorPropertiesInternal)
-    }
-
   override suspend fun authenticate(): FingerprintAuthAttemptViewModel =
     suspendCancellableCoroutine { c: CancellableContinuation<FingerprintAuthAttemptViewModel> ->
       val authenticationCallback =
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
index 36bdf8d..db28e79 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
@@ -16,18 +16,6 @@
 
 package com.android.settings.biometrics.fingerprint2.shared.model
 
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
-
-/** Represents the fingerprint data nad the relevant state. */
-data class FingerprintStateViewModel(
-  val fingerprintViewModels: List<FingerprintViewModel>,
-  val canEnroll: Boolean,
-  val maxFingerprints: Int,
-  val hasSideFps: Boolean,
-  val pressToAuth: Boolean,
-  val sensorProps: FingerprintSensorPropertiesInternal,
-)
-
 data class FingerprintViewModel(
   val name: String,
   val fingerId: Int,
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index d497d46..f6d20ae 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -47,10 +47,10 @@
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Confirmation
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Finish
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Intro
@@ -179,8 +179,10 @@
       )[FingerprintEnrollmentNavigationViewModel::class.java]
 
     // Initialize FingerprintViewModel
-    ViewModelProvider(this, FingerprintViewModel.FingerprintViewModelFactory(interactor))[
-      FingerprintViewModel::class.java]
+    ViewModelProvider(
+      this,
+      FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(interactor)
+    )[FingerprintEnrollViewModel::class.java]
 
     // Initialize scroll view model
     ViewModelProvider(this, FingerprintScrollViewModel.FingerprintScrollViewModelFactory())[
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollmentIntroV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollmentIntroV2Fragment.kt
index c7fcb66..f2f925b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollmentIntroV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollmentIntroV2Fragment.kt
@@ -21,7 +21,6 @@
 import android.graphics.Color
 import android.graphics.PorterDuff
 import android.graphics.PorterDuffColorFilter
-import android.hardware.fingerprint.FingerprintSensorProperties
 import android.os.Bundle
 import android.text.Html
 import android.text.method.LinkMovementMethod
@@ -34,11 +33,12 @@
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.lifecycleScope
 import com.android.settings.R
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Unicorn
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import com.google.android.setupcompat.template.FooterBarMixin
 import com.google.android.setupcompat.template.FooterButton
 import com.google.android.setupdesign.GlifLayout
@@ -76,7 +76,7 @@
   private lateinit var footerBarMixin: FooterBarMixin
   private lateinit var textModel: TextModel
   private lateinit var navigationViewModel: FingerprintEnrollmentNavigationViewModel
-  private lateinit var fingerprintStateViewModel: FingerprintViewModel
+  private lateinit var fingerprintEnrollViewModel: FingerprintEnrollViewModel
   private lateinit var fingerprintScrollViewModel: FingerprintScrollViewModel
   private lateinit var gateKeeperViewModel: FingerprintGatekeeperViewModel
 
@@ -84,8 +84,8 @@
     super.onCreate(savedInstanceState)
     navigationViewModel =
       ViewModelProvider(requireActivity())[FingerprintEnrollmentNavigationViewModel::class.java]
-    fingerprintStateViewModel =
-      ViewModelProvider(requireActivity())[FingerprintViewModel::class.java]
+    fingerprintEnrollViewModel =
+      ViewModelProvider(requireActivity())[FingerprintEnrollViewModel::class.java]
     fingerprintScrollViewModel =
       ViewModelProvider(requireActivity())[FingerprintScrollViewModel::class.java]
     gateKeeperViewModel =
@@ -98,13 +98,11 @@
     lifecycleScope.launch {
       combine(
           navigationViewModel.enrollType,
-          fingerprintStateViewModel.fingerprintStateViewModel,
-        ) { enrollType, fingerprintStateViewModel ->
-          Pair(enrollType, fingerprintStateViewModel)
+          fingerprintEnrollViewModel.sensorType,
+        ) { enrollType, sensorType ->
+          Pair(enrollType, sensorType)
         }
-        .collect { (enrollType, fingerprintStateViewModel) ->
-          val sensorProps = fingerprintStateViewModel?.sensorProps
-
+        .collect { (enrollType, sensorType) ->
           textModel =
             when (enrollType) {
               Unicorn -> getUnicornTextModel()
@@ -145,9 +143,9 @@
 
             val iconShield: ImageView = view.requireViewById(R.id.icon_shield)
             val footerMessage6: TextView = view.requireViewById(R.id.footer_message_6)
-            when (sensorProps?.sensorType) {
-              FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC,
-              FingerprintSensorProperties.TYPE_UDFPS_OPTICAL -> {
+            when (sensorType) {
+              FingerprintSensorType.UDFPS_ULTRASONIC,
+              FingerprintSensorType.UDFPS_OPTICAL -> {
                 footerMessage6.visibility = View.VISIBLE
                 iconShield.visibility = View.VISIBLE
               }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
new file mode 100644
index 0000000..31fa03d
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.toSensorType
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.map
+
+/** Represents all of the fingerprint information needed for fingerprint enrollment. */
+class FingerprintEnrollViewModel(fingerprintManagerInteractor: FingerprintManagerInteractor) :
+  ViewModel() {
+
+  /** Represents the stream of [FingerprintSensorType] */
+  val sensorType: Flow<FingerprintSensorType> =
+    fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map {
+      it.sensorType.toSensorType()
+    }
+
+  class FingerprintEnrollViewModelFactory(val interactor: FingerprintManagerInteractor) :
+    ViewModelProvider.Factory {
+
+    @Suppress("UNCHECKED_CAST")
+    override fun <T : ViewModel> create(
+      modelClass: Class<T>,
+    ): T {
+      return FingerprintEnrollViewModel(interactor) as T
+    }
+  }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintStateViewModel.kt
deleted file mode 100644
index 20e3a0a..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintStateViewModel.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintStateViewModel
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.last
-import kotlinx.coroutines.flow.update
-import kotlinx.coroutines.launch
-
-/** Represents all of the fingerprint information needed for fingerprint enrollment. */
-class FingerprintViewModel(fingerprintManagerInteractor: FingerprintManagerInteractor) :
-  ViewModel() {
-
-  private val _fingerprintViewModel: MutableStateFlow<FingerprintStateViewModel?> =
-    MutableStateFlow(null)
-
-  /**
-   * A flow that contains a [FingerprintStateViewModel] which contains the relevant information for
-   * enrollment
-   */
-  val fingerprintStateViewModel: Flow<FingerprintStateViewModel?> =
-    _fingerprintViewModel.asStateFlow()
-
-  init {
-    viewModelScope.launch {
-      val enrolledFingerprints =
-        fingerprintManagerInteractor.enrolledFingerprints.last().map {
-          com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel(
-            it.name,
-            it.fingerId,
-            it.deviceId
-          )
-        }
-      val sensorProps = fingerprintManagerInteractor.sensorPropertiesInternal().first()
-      val maxFingerprints = 5
-      _fingerprintViewModel.update {
-        FingerprintStateViewModel(
-          enrolledFingerprints,
-          enrolledFingerprints.size < maxFingerprints,
-          maxFingerprints,
-          sensorProps.isAnySidefpsType,
-          false,
-          sensorProps,
-        )
-      }
-    }
-  }
-
-  class FingerprintViewModelFactory(val interactor: FingerprintManagerInteractor) :
-    ViewModelProvider.Factory {
-
-    @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
-
-      return FingerprintViewModel(interactor) as T
-    }
-  }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
index 6a44630..9f42d81 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
@@ -20,7 +20,6 @@
 import android.util.Log
 import androidx.lifecycle.LifecycleCoroutineScope
 import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintStateViewModel
 import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
 import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder.FingerprintView
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollAdditionalFingerprint
@@ -35,6 +34,7 @@
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.ShowSettings
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
+import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.launch
@@ -70,7 +70,11 @@
     /** Indicates what result should be set for the returning callee */
     fun setResultExternal(resultCode: Int)
     /** Indicates the settings UI should be shown */
-    fun showSettings(state: FingerprintStateViewModel)
+    fun showSettings(enrolledFingerprints: List<FingerprintViewModel>)
+    /** Updates the add fingerprints preference */
+    fun updateAddFingerprintsPreference(canEnroll: Boolean, maxFingerprints: Int)
+    /** Updates the sfps fingerprints preference */
+    fun updateSfpsPreference(isSfpsPrefVisible: Boolean)
     /** Indicates that a user has been locked out */
     fun userLockout(authAttemptViewModel: FingerprintAuthAttemptViewModel.Error)
     /** Indicates a fingerprint preference should be highlighted */
@@ -93,9 +97,13 @@
     /** Result listener for launching enrollments **after** a user has reached the settings page. */
 
     // Settings display flow
+    lifecycleScope.launch { viewModel.enrolledFingerprints.collect { view.showSettings(it) } }
     lifecycleScope.launch {
-      viewModel.fingerprintState.filterNotNull().collect { view.showSettings(it) }
+      viewModel.addFingerprintPrefInfo.collect { (enablePref, maxFingerprints) ->
+        view.updateAddFingerprintsPreference(enablePref, maxFingerprints)
+      }
     }
+    lifecycleScope.launch { viewModel.isSfpsPrefVisible.collect { view.updateSfpsPreference(it) } }
 
     // Dialog flow
     lifecycleScope.launch {
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
index 7dcf46a..c818566 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
@@ -47,7 +47,6 @@
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal
 import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
 import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintStateViewModel
 import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
 import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
@@ -304,44 +303,52 @@
     settingsViewModel.onDeleteClicked(fingerprintViewModel)
   }
 
-  override fun showSettings(state: FingerprintStateViewModel) {
+  override fun showSettings(enrolledFingerprints: List<FingerprintViewModel>) {
     val category =
       this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINTS_ENROLLED_CATEGORY)
         as PreferenceCategory?
 
     category?.removeAll()
 
-    state.fingerprintViewModels.forEach { fingerprint ->
+    enrolledFingerprints.forEach { fingerprint ->
       category?.addPreference(
         FingerprintSettingsPreference(
           requireContext(),
           fingerprint,
           this@FingerprintSettingsV2Fragment,
-          state.fingerprintViewModels.size == 1,
+          enrolledFingerprints.size == 1,
         )
       )
     }
     category?.isVisible = true
-
-    createFingerprintsFooterPreference(state.canEnroll, state.maxFingerprints)
     preferenceScreen.isVisible = true
+    addFooter()
+  }
 
+  override fun updateAddFingerprintsPreference(canEnroll: Boolean, maxFingerprints: Int) {
+    val pref = this@FingerprintSettingsV2Fragment.findPreference<Preference>(KEY_FINGERPRINT_ADD)
+    val maxSummary = context?.getString(R.string.fingerprint_add_max, maxFingerprints) ?: ""
+    pref?.summary = maxSummary
+    pref?.isEnabled = canEnroll
+    pref?.setOnPreferenceClickListener {
+      navigationViewModel.onAddFingerprintClicked()
+      true
+    }
+    pref?.isVisible = true
+  }
+
+  override fun updateSfpsPreference(isSfpsPrefVisible: Boolean) {
     val sideFpsPref =
       this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINT_SIDE_FPS_CATEGORY)
         as PreferenceCategory?
-    sideFpsPref?.isVisible = false
-
-    if (state.hasSideFps) {
-      sideFpsPref?.isVisible = state.fingerprintViewModels.isNotEmpty()
-      val otherPref =
-        this@FingerprintSettingsV2Fragment.findPreference(
-          KEY_FINGERPRINT_SIDE_FPS_SCREEN_ON_TO_AUTH
-        ) as Preference?
-      otherPref?.isVisible = state.fingerprintViewModels.isNotEmpty()
-    }
-    addFooter(state.hasSideFps)
+    sideFpsPref?.isVisible = isSfpsPrefVisible
+    val otherPref =
+      this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINT_SIDE_FPS_SCREEN_ON_TO_AUTH)
+        as Preference?
+    otherPref?.isVisible = isSfpsPrefVisible
   }
-  private fun addFooter(hasSideFps: Boolean) {
+
+  private fun addFooter() {
     val footer =
       this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINT_FOOTER)
         as PreferenceCategory?
@@ -380,10 +387,8 @@
       footerColumns.add(column1)
       val column2 = FooterColumn()
       column2.title = getText(R.string.security_fingerprint_disclaimer_lockscreen_disabled_2)
-      if (hasSideFps) {
-        column2.learnMoreOverrideText =
-          getText(R.string.security_settings_fingerprint_settings_footer_learn_more)
-      }
+      column2.learnMoreOverrideText =
+        getText(R.string.security_settings_fingerprint_settings_footer_learn_more)
       column2.learnMoreOnClickListener = learnMoreClickListener
       footerColumns.add(column2)
     } else {
@@ -394,10 +399,8 @@
           DeviceHelper.getDeviceName(requireActivity())
         )
       column.learnMoreOnClickListener = learnMoreClickListener
-      if (hasSideFps) {
-        column.learnMoreOverrideText =
-          getText(R.string.security_settings_fingerprint_settings_footer_learn_more)
-      }
+      column.learnMoreOverrideText =
+        getText(R.string.security_settings_fingerprint_settings_footer_learn_more)
       footerColumns.add(column)
     }
 
@@ -550,18 +553,6 @@
     }
   }
 
-  private fun createFingerprintsFooterPreference(canEnroll: Boolean, maxFingerprints: Int) {
-    val pref = this@FingerprintSettingsV2Fragment.findPreference<Preference>(KEY_FINGERPRINT_ADD)
-    val maxSummary = context?.getString(R.string.fingerprint_add_max, maxFingerprints) ?: ""
-    pref?.summary = maxSummary
-    pref?.isEnabled = canEnroll
-    pref?.setOnPreferenceClickListener {
-      navigationViewModel.onAddFingerprintClicked()
-      true
-    }
-    pref?.isVisible = true
-  }
-
   private fun fingerprintPreferences(): List<FingerprintSettingsPreference?> {
     val category =
       this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINTS_ENROLLED_CATEGORY)
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
index fbd0f1d..5770d09 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
@@ -17,27 +17,29 @@
 package com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel
 
 import android.hardware.fingerprint.FingerprintManager
-import android.hardware.fingerprint.FingerprintSensorProperties
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
 import android.util.Log
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
 import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractor
 import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintStateViewModel
 import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.toSensorType
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.combineTransform
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.last
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.sample
+import kotlinx.coroutines.flow.transform
 import kotlinx.coroutines.flow.transformLatest
 import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.launch
@@ -52,13 +54,30 @@
   private val backgroundDispatcher: CoroutineDispatcher,
   private val navigationViewModel: FingerprintSettingsNavigationViewModel,
 ) : ViewModel() {
-
-  private val _consumerShouldAuthenticate: MutableStateFlow<Boolean> = MutableStateFlow(false)
-
-  private val fingerprintSensorPropertiesInternal:
-    MutableStateFlow<List<FingerprintSensorPropertiesInternal>?> =
+  private val _enrolledFingerprints: MutableStateFlow<List<FingerprintViewModel>?> =
     MutableStateFlow(null)
 
+  /** Represents the stream of enrolled fingerprints. */
+  val enrolledFingerprints: Flow<List<FingerprintViewModel>> =
+    _enrolledFingerprints.asStateFlow().filterNotNull().filterOnlyWhenSettingsIsShown()
+
+  /** Represents the stream of the information of "Add Fingerprint" preference. */
+  val addFingerprintPrefInfo: Flow<Pair<Boolean, Int>> =
+    _enrolledFingerprints.filterOnlyWhenSettingsIsShown().transform {
+      emit(
+        Pair(
+          fingerprintManagerInteractor.canEnrollFingerprints.first(),
+          fingerprintManagerInteractor.maxEnrollableFingerprints.first()
+        )
+      )
+    }
+
+  /** Represents the stream of visibility of sfps preference. */
+  val isSfpsPrefVisible: Flow<Boolean> =
+    _enrolledFingerprints.filterOnlyWhenSettingsIsShown().transform {
+      emit(fingerprintManagerInteractor.hasSideFps() && !it.isNullOrEmpty())
+    }
+
   private val _isShowingDialog: MutableStateFlow<PreferenceViewModel?> = MutableStateFlow(null)
   val isShowingDialog =
     _isShowingDialog.combine(navigationViewModel.nextStep) { dialogFlow, nextStep ->
@@ -69,24 +88,23 @@
       }
     }
 
-  private val _fingerprintStateViewModel: MutableStateFlow<FingerprintStateViewModel?> =
-    MutableStateFlow(null)
-  val fingerprintState: Flow<FingerprintStateViewModel?> =
-    _fingerprintStateViewModel.combineTransform(navigationViewModel.nextStep) {
-      settingsShowingViewModel,
-      currStep ->
-      if (currStep != null && currStep is ShowSettings) {
-        emit(settingsShowingViewModel)
-      }
+  private val _consumerShouldAuthenticate: MutableStateFlow<Boolean> = MutableStateFlow(false)
+
+  private val _fingerprintSensorType: Flow<FingerprintSensorType> =
+    fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map {
+      it.sensorType.toSensorType()
     }
 
+  private val _sensorNullOrEmpty: Flow<Boolean> =
+    fingerprintManagerInteractor.sensorPropertiesInternal.map { it == null }
+
   private val _isLockedOut: MutableStateFlow<FingerprintAuthAttemptViewModel.Error?> =
     MutableStateFlow(null)
 
   private val _authSucceeded: MutableSharedFlow<FingerprintAuthAttemptViewModel.Success?> =
     MutableSharedFlow()
 
-  private val attemptsSoFar: MutableStateFlow<Int> = MutableStateFlow(0)
+  private val _attemptsSoFar: MutableStateFlow<Int> = MutableStateFlow(0)
   /**
    * This is a very tricky flow. The current fingerprint manager APIs are not robust, and a proper
    * implementation would take quite a lot of code to implement, it might be easier to rewrite
@@ -101,11 +119,20 @@
         _isShowingDialog,
         navigationViewModel.nextStep,
         _consumerShouldAuthenticate,
-        _fingerprintStateViewModel,
+        _enrolledFingerprints,
         _isLockedOut,
-        attemptsSoFar,
-        fingerprintSensorPropertiesInternal
-      ) { dialogShowing, step, resume, fingerprints, isLockedOut, attempts, sensorProps ->
+        _attemptsSoFar,
+        _fingerprintSensorType,
+        _sensorNullOrEmpty
+      ) {
+        dialogShowing,
+        step,
+        resume,
+        fingerprints,
+        isLockedOut,
+        attempts,
+        sensorType,
+        sensorNullOrEmpty ->
         if (DEBUG) {
           Log.d(
             TAG,
@@ -115,25 +142,22 @@
               "fingerprints=${fingerprints}," +
               "lockedOut=${isLockedOut}," +
               "attempts=${attempts}," +
-              "sensorProps=${sensorProps}"
+              "sensorType=${sensorType}" +
+              "sensorNullOrEmpty=${sensorNullOrEmpty}"
           )
         }
-        if (sensorProps.isNullOrEmpty()) {
+        if (sensorNullOrEmpty) {
           return@combine false
         }
-        val sensorType = sensorProps[0].sensorType
         if (
-          listOf(
-              FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
-              FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC
-            )
+          listOf(FingerprintSensorType.UDFPS_ULTRASONIC, FingerprintSensorType.UDFPS_OPTICAL)
             .contains(sensorType)
         ) {
           return@combine false
         }
 
         if (step != null && step is ShowSettings) {
-          if (fingerprints?.fingerprintViewModels?.isNotEmpty() == true) {
+          if (fingerprints?.isNotEmpty() == true) {
             return@combine dialogShowing == null && isLockedOut == null && resume && attempts < 15
           }
         }
@@ -173,17 +197,11 @@
 
   init {
     viewModelScope.launch {
-      fingerprintSensorPropertiesInternal.update {
-        fingerprintManagerInteractor.sensorPropertiesInternal()
-      }
-    }
-
-    viewModelScope.launch {
       navigationViewModel.nextStep.filterNotNull().collect {
         _isShowingDialog.update { null }
         if (it is ShowSettings) {
           // reset state
-          updateSettingsData()
+          updateEnrolledFingerprints()
         }
       }
     }
@@ -200,7 +218,7 @@
   }
 
   override fun toString(): String {
-    return "userId: $userId\n" + "fingerprintState: ${_fingerprintStateViewModel.value}\n"
+    return "userId: $userId\n" + "enrolledFingerprints: ${_enrolledFingerprints.value}\n"
   }
 
   /** The fingerprint delete button has been clicked. */
@@ -229,7 +247,7 @@
   fun deleteFingerprint(fp: FingerprintViewModel) {
     viewModelScope.launch(backgroundDispatcher) {
       if (fingerprintManagerInteractor.removeFingerprint(fp)) {
-        updateSettingsData()
+        updateEnrolledFingerprints()
       }
     }
   }
@@ -238,45 +256,25 @@
   fun renameFingerprint(fp: FingerprintViewModel, newName: String) {
     viewModelScope.launch {
       fingerprintManagerInteractor.renameFingerprint(fp, newName)
-      updateSettingsData()
+      updateEnrolledFingerprints()
     }
   }
 
   private fun attemptingAuth() {
-    attemptsSoFar.update { it + 1 }
+    _attemptsSoFar.update { it + 1 }
   }
 
   private suspend fun onAuthSuccess(success: FingerprintAuthAttemptViewModel.Success) {
     _authSucceeded.emit(success)
-    attemptsSoFar.update { 0 }
+    _attemptsSoFar.update { 0 }
   }
 
   private fun lockout(attemptViewModel: FingerprintAuthAttemptViewModel.Error) {
     _isLockedOut.update { attemptViewModel }
   }
 
-  /**
-   * This function is sort of a hack, it's used whenever we want to check for fingerprint state
-   * updates.
-   */
-  private suspend fun updateSettingsData() {
-    Log.d(TAG, "update settings data called")
-    val fingerprints = fingerprintManagerInteractor.enrolledFingerprints.last()
-    val canEnrollFingerprint =
-      fingerprintManagerInteractor.canEnrollFingerprints(fingerprints.size).last()
-    val maxFingerprints = fingerprintManagerInteractor.maxEnrollableFingerprints.last()
-    val hasSideFps = fingerprintManagerInteractor.hasSideFps()
-    val pressToAuthEnabled = fingerprintManagerInteractor.pressToAuthEnabled()
-    _fingerprintStateViewModel.update {
-      FingerprintStateViewModel(
-        fingerprints,
-        canEnrollFingerprint,
-        maxFingerprints,
-        hasSideFps,
-        pressToAuthEnabled,
-        fingerprintManagerInteractor.sensorPropertiesInternal().first(),
-      )
-    }
+  private suspend fun updateEnrolledFingerprints() {
+    _enrolledFingerprints.update { fingerprintManagerInteractor.enrolledFingerprints.first() }
   }
 
   /** Used to indicate whether the consumer of the view model is ready for authentication. */
@@ -284,6 +282,13 @@
     _consumerShouldAuthenticate.update { authenticate }
   }
 
+  private fun <T> Flow<T>.filterOnlyWhenSettingsIsShown() =
+    combineTransform(navigationViewModel.nextStep) { value, currStep ->
+      if (currStep != null && currStep is ShowSettings) {
+        emit(value)
+      }
+    }
+
   class FingerprintSettingsViewModelFactory(
     private val userId: Int,
     private val interactor: FingerprintManagerInteractor,
@@ -307,7 +312,7 @@
   }
 }
 
-private inline fun <T1, T2, T3, T4, T5, T6, T7, R> combine(
+private inline fun <T1, T2, T3, T4, T5, T6, T7, T8, R> combine(
   flow: Flow<T1>,
   flow2: Flow<T2>,
   flow3: Flow<T3>,
@@ -315,9 +320,10 @@
   flow5: Flow<T5>,
   flow6: Flow<T6>,
   flow7: Flow<T7>,
-  crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7) -> R
+  flow8: Flow<T8>,
+  crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R
 ): Flow<R> {
-  return combine(flow, flow2, flow3, flow4, flow5, flow6, flow7) { args: Array<*> ->
+  return combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8) { args: Array<*> ->
     @Suppress("UNCHECKED_CAST")
     transform(
       args[0] as T1,
@@ -327,6 +333,7 @@
       args[4] as T5,
       args[5] as T6,
       args[6] as T7,
+      args[7] as T8,
     )
   }
 }
diff --git a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java b/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java
index 55a78b8..831e83b 100644
--- a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java
+++ b/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java
@@ -37,8 +37,8 @@
 import androidx.annotation.Nullable;
 
 import com.android.settings.R;
-import com.android.settingslib.udfps.UdfpsOverlayParams;
-import com.android.settingslib.udfps.UdfpsUtils;
+import com.android.systemui.biometrics.UdfpsUtils;
+import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
 
 /**
  * View corresponding with udfps_enroll_view.xml
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncController.java b/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncController.java
new file mode 100644
index 0000000..5969ada
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncController.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.companion.AssociationInfo;
+import android.companion.CompanionDeviceManager;
+import android.companion.datatransfer.PermissionSyncRequest;
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import com.google.common.base.Objects;
+
+import java.util.Comparator;
+
+/**
+ * The controller of the CDM data sync in the bluetooth detail settings.
+ */
+public class BluetoothDetailsDataSyncController extends BluetoothDetailsController
+        implements Preference.OnPreferenceClickListener {
+
+    private static final int DUMMY_ASSOCIATION_ID = -1;
+    private static final String TAG = "BTDataSyncController";
+    private static final String KEY_DATA_SYNC_GROUP = "data_sync_group";
+    private static final String KEY_PERM_SYNC = "perm_sync";
+
+    @VisibleForTesting
+    PreferenceCategory mPreferenceCategory;
+    @VisibleForTesting
+    int mAssociationId = DUMMY_ASSOCIATION_ID;
+
+    private CachedBluetoothDevice mCachedDevice;
+    private CompanionDeviceManager mCompanionDeviceManager;
+
+    public BluetoothDetailsDataSyncController(Context context,
+            PreferenceFragmentCompat fragment,
+            CachedBluetoothDevice device,
+            Lifecycle lifecycle) {
+        super(context, fragment, device, lifecycle);
+        mCachedDevice = device;
+        mCompanionDeviceManager = context.getSystemService(CompanionDeviceManager.class);
+
+        mCompanionDeviceManager.getAllAssociations().stream().filter(
+                a -> Objects.equal(mCachedDevice.getAddress(),
+                        a.getDeviceMacAddress().toString().toUpperCase())).max(
+                Comparator.comparingLong(AssociationInfo::getTimeApprovedMs)).ifPresent(
+                a -> mAssociationId = a.getId());
+    }
+
+    @Override
+    public boolean isAvailable() {
+        if (mAssociationId == DUMMY_ASSOCIATION_ID) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        SwitchPreference switchPreference = (SwitchPreference) preference;
+        String key = switchPreference.getKey();
+        if (key.equals(KEY_PERM_SYNC)) {
+            if (switchPreference.isChecked()) {
+                mCompanionDeviceManager.enablePermissionsSync(mAssociationId);
+            } else {
+                mCompanionDeviceManager.disablePermissionsSync(mAssociationId);
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_DATA_SYNC_GROUP;
+    }
+
+    @Override
+    protected void init(PreferenceScreen screen) {
+        mPreferenceCategory = screen.findPreference(getPreferenceKey());
+        refresh();
+    }
+
+    @Override
+    protected void refresh() {
+        SwitchPreference permSyncPref = mPreferenceCategory.findPreference(KEY_PERM_SYNC);
+        if (permSyncPref == null) {
+            permSyncPref = createPermSyncPreference(mPreferenceCategory.getContext());
+            mPreferenceCategory.addPreference(permSyncPref);
+        }
+
+        boolean visible = false;
+        boolean checked = false;
+        PermissionSyncRequest request = mCompanionDeviceManager.getPermissionSyncRequest(
+                mAssociationId);
+        if (request != null) {
+            visible = true;
+            if (request.isUserConsented()) {
+                checked = true;
+            }
+        }
+        permSyncPref.setVisible(visible);
+        permSyncPref.setChecked(checked);
+    }
+
+    @VisibleForTesting
+    SwitchPreference createPermSyncPreference(Context context) {
+        SwitchPreference pref = new SwitchPreference(context);
+        pref.setKey(KEY_PERM_SYNC);
+        pref.setTitle(context.getString(R.string.bluetooth_details_permissions_sync_title));
+        pref.setSummary(context.getString(R.string.bluetooth_details_permissions_sync_summary));
+        pref.setOnPreferenceClickListener(this);
+        return pref;
+    }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index bf8ed77..8a7c048 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -316,6 +316,8 @@
                     lifecycle));
             controllers.add(new BluetoothDetailsHearingDeviceControlsController(context, this,
                     mCachedDevice, lifecycle));
+            controllers.add(new BluetoothDetailsDataSyncController(context, this,
+                    mCachedDevice, lifecycle));
         }
         return controllers;
     }
diff --git a/src/com/android/settings/bluetooth/OWNERS b/src/com/android/settings/bluetooth/OWNERS
index 4b79652..0a3dec9 100644
--- a/src/com/android/settings/bluetooth/OWNERS
+++ b/src/com/android/settings/bluetooth/OWNERS
@@ -5,5 +5,7 @@
 robertluo@google.com
 yiyishen@google.com
 yqian@google.com
+chelseahao@google.com
+hahong@google.com
 
 # Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
index 7eabf01..c095fee 100644
--- a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
+++ b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
@@ -135,6 +135,11 @@
     }
 
     @VisibleForTesting
+    public void setFragmentManager(FragmentManager fragmentManager) {
+        mFragmentManager = fragmentManager;
+    }
+
+    @VisibleForTesting
     public void setBluetoothDeviceUpdater(BluetoothDeviceUpdater bluetoothDeviceUpdater) {
         mBluetoothDeviceUpdater = bluetoothDeviceUpdater;
     }
diff --git a/src/com/android/settings/connecteddevice/OWNERS b/src/com/android/settings/connecteddevice/OWNERS
index 3179a05..5215a8f 100644
--- a/src/com/android/settings/connecteddevice/OWNERS
+++ b/src/com/android/settings/connecteddevice/OWNERS
@@ -4,5 +4,7 @@
 robertluo@google.com
 yiyishen@google.com
 yqian@google.com
+chelseahao@google.com
+hahong@google.com
 
 # Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java
index 9a19e85..50ce579 100644
--- a/src/com/android/settings/fuelgauge/BatteryInfo.java
+++ b/src/com/android/settings/fuelgauge/BatteryInfo.java
@@ -44,7 +44,6 @@
 
 public class BatteryInfo {
     private static final String TAG = "BatteryInfo";
-    private static final String GLOBAL_TIME_TO_FULL_MILLIS = "time_to_full_millis";
 
     public CharSequence chargeLabel;
     public CharSequence remainingLabel;
@@ -152,7 +151,7 @@
     static long getSettingsChargeTimeRemaining(final Context context) {
         return Settings.Global.getLong(
                 context.getContentResolver(),
-                GLOBAL_TIME_TO_FULL_MILLIS, -1);
+                com.android.settingslib.fuelgauge.BatteryUtils.GLOBAL_TIME_TO_FULL_MILLIS, -1);
     }
 
     public static void getBatteryInfo(final Context context, final Callback callback,
@@ -287,7 +286,7 @@
         if (getSettingsChargeTimeRemaining(context) != chargeTimeMs) {
             Settings.Global.putLong(
                     context.getContentResolver(),
-                    GLOBAL_TIME_TO_FULL_MILLIS,
+                    com.android.settingslib.fuelgauge.BatteryUtils.GLOBAL_TIME_TO_FULL_MILLIS,
                     chargeTimeMs);
         }
 
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index eba13f4..75b7c08 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -85,6 +85,10 @@
     int mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
     @VisibleForTesting
     int mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+    @VisibleForTesting
+    int mDailyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
+    @VisibleForTesting
+    int mHourlyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
 
     private boolean mIs24HourFormat;
     private View mBatteryChartViewGroup;
@@ -217,6 +221,37 @@
         refreshUi();
     }
 
+    void onHighlightSlotIndexUpdate(int dailyHighlightSlotIndex, int hourlyHighlightSlotIndex) {
+        if (mDailyHighlightSlotIndex == dailyHighlightSlotIndex
+                && mHourlyHighlightSlotIndex == hourlyHighlightSlotIndex) {
+            return;
+        }
+        mDailyHighlightSlotIndex = dailyHighlightSlotIndex;
+        mHourlyHighlightSlotIndex = hourlyHighlightSlotIndex;
+        refreshUi();
+    }
+
+    void selectHighlightSlotIndex() {
+        if (mDailyHighlightSlotIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID
+                || mHourlyHighlightSlotIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID) {
+            return;
+        }
+        if (mDailyHighlightSlotIndex == mDailyChartIndex
+                && mHourlyHighlightSlotIndex == mHourlyChartIndex) {
+            return;
+        }
+        mDailyChartIndex = mDailyHighlightSlotIndex;
+        mHourlyChartIndex = mHourlyHighlightSlotIndex;
+        Log.d(TAG, String.format("onDailyChartSelect:%d, onHourlyChartSelect:%d",
+                mDailyChartIndex, mHourlyChartIndex));
+        refreshUi();
+        mHandler.post(() -> mDailyChartView.announceForAccessibility(
+                getAccessibilityAnnounceMessage()));
+        if (mOnSelectedIndexUpdatedListener != null) {
+            mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
+        }
+    }
+
     void setBatteryChartView(@NonNull final BatteryChartView dailyChartView,
             @NonNull final BatteryChartView hourlyChartView) {
         final View parentView = (View) dailyChartView.getParent();
@@ -320,6 +355,7 @@
                 mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
             }
             mDailyViewModel.setSelectedIndex(mDailyChartIndex);
+            mDailyViewModel.setHighlightSlotIndex(mDailyHighlightSlotIndex);
             mDailyChartView.setViewModel(mDailyViewModel);
         }
 
@@ -334,6 +370,9 @@
                 mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
             }
             hourlyViewModel.setSelectedIndex(mHourlyChartIndex);
+            hourlyViewModel.setHighlightSlotIndex((mDailyChartIndex == mDailyHighlightSlotIndex)
+                    ? mHourlyHighlightSlotIndex
+                    : BatteryChartViewModel.SELECTED_INDEX_INVALID);
             mHourlyChartView.setViewModel(hourlyViewModel);
         }
     }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
index 086f56c..bb468fe 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
@@ -31,6 +31,7 @@
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.util.ArraySet;
 import android.util.AttributeSet;
@@ -90,6 +91,15 @@
     private int mTrapezoidHoverColor;
     private int mDefaultTextColor;
     private int mTextPadding;
+    private int mTransomIconSize;
+    private int mTransomTop;
+    private int mTransomViewHeight;
+    private int mTransomLineDefaultColor;
+    private int mTransomLineSelectedColor;
+    private float mTransomPadding;
+    private Drawable mTransomIcon;
+    private Paint mTransomLinePaint;
+    private Paint mTransomSelectedSlotPaint;
     private Paint mDividerPaint;
     private Paint mTrapezoidPaint;
     private Paint mTextPaint;
@@ -123,8 +133,9 @@
             return;
         }
 
-        Log.d(TAG, String.format("setViewModel(): size: %d, selectedIndex: %d.",
-                viewModel.size(), viewModel.selectedIndex()));
+        Log.d(TAG, String.format(
+                "setViewModel(): size: %d, selectedIndex: %d, getHighlightSlotIndex: %d",
+                viewModel.size(), viewModel.selectedIndex(), viewModel.getHighlightSlotIndex()));
         mViewModel = viewModel;
         initializeAxisLabelsBounds();
         initializeTrapezoidSlots(viewModel.size() - 1);
@@ -162,7 +173,7 @@
                         mPercentageBounds[index]);
             }
             // Updates the indent configurations.
-            mIndent.top = mPercentageBounds[0].height();
+            mIndent.top = mPercentageBounds[0].height() + mTransomViewHeight;
             final int textWidth = mPercentageBounds[0].width() + mTextPadding;
             if (isRTL()) {
                 mIndent.left = textWidth;
@@ -196,6 +207,7 @@
         }
         drawVerticalDividers(canvas);
         drawTrapezoids(canvas);
+        drawTransomLine(canvas);
     }
 
     @Override
@@ -340,6 +352,40 @@
                         resources.getDimensionPixelSize(R.dimen.chartview_trapezoid_radius)));
         // Initializes for drawing text information.
         mTextPadding = resources.getDimensionPixelSize(R.dimen.chartview_text_padding);
+        // Initializes the padding top for drawing text information.
+        mTransomViewHeight = resources.getDimensionPixelSize(
+                R.dimen.chartview_transom_layout_height);
+    }
+
+    private void initializeTransomPaint() {
+        if (mTransomLinePaint != null && mTransomSelectedSlotPaint != null
+                && mTransomIcon != null) {
+            return;
+        }
+        // Initializes the transom line paint.
+        final Resources resources = getContext().getResources();
+        final int transomLineWidth = resources.getDimensionPixelSize(
+                R.dimen.chartview_transom_width);
+        final int transomRadius = resources.getDimensionPixelSize(R.dimen.chartview_transom_radius);
+        mTransomPadding = transomRadius * .5f;
+        mTransomTop = resources.getDimensionPixelSize(R.dimen.chartview_transom_padding_top);
+        mTransomLineDefaultColor = Utils.getDisabled(mContext, DIVIDER_COLOR);
+        mTransomLineSelectedColor = resources.getColor(
+                R.color.color_battery_anomaly_yellow_selector);
+        final int slotHighlightColor = Utils.getDisabled(mContext, mTransomLineSelectedColor);
+        mTransomIconSize = resources.getDimensionPixelSize(R.dimen.chartview_transom_icon_size);
+        mTransomLinePaint = new Paint();
+        mTransomLinePaint.setAntiAlias(true);
+        mTransomLinePaint.setStyle(Paint.Style.STROKE);
+        mTransomLinePaint.setStrokeWidth(transomLineWidth);
+        mTransomLinePaint.setStrokeCap(Paint.Cap.ROUND);
+        mTransomLinePaint.setPathEffect(new CornerPathEffect(transomRadius));
+        mTransomSelectedSlotPaint = new Paint();
+        mTransomSelectedSlotPaint.setAntiAlias(true);
+        mTransomSelectedSlotPaint.setColor(slotHighlightColor);
+        mTransomSelectedSlotPaint.setStyle(Paint.Style.FILL);
+        // Get the companion icon beside transom line
+        mTransomIcon = getResources().getDrawable(R.drawable.ic_battery_tips_warning_icon);
     }
 
     private void drawHorizontalDividers(Canvas canvas) {
@@ -592,6 +638,50 @@
         }
     }
 
+    private boolean isHighlightSlotValid() {
+        return mViewModel != null && mViewModel.getHighlightSlotIndex()
+                != BatteryChartViewModel.SELECTED_INDEX_INVALID;
+    }
+
+    private void drawTransomLine(Canvas canvas) {
+        if (!isHighlightSlotValid()) {
+            return;
+        }
+        initializeTransomPaint();
+        // Draw the whole transom line and a warning icon
+        mTransomLinePaint.setColor(mTransomLineDefaultColor);
+        final int width = getWidth() - abs(mIndent.width());
+        final float transomOffset = mTrapezoidHOffset + mDividerWidth * .5f + mTransomPadding;
+        final float trapezoidBottom = getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth
+                - mTrapezoidVOffset;
+        canvas.drawLine(mIndent.left + transomOffset, mTransomTop,
+                mIndent.left + width - transomOffset, mTransomTop,
+                mTransomLinePaint);
+        drawTransomIcon(canvas);
+        // Draw selected segment of transom line and a highlight slot
+        mTransomLinePaint.setColor(mTransomLineSelectedColor);
+        final int index = mViewModel.getHighlightSlotIndex();
+        final float startX = mTrapezoidSlots[index].mLeft;
+        final float endX = mTrapezoidSlots[index].mRight;
+        canvas.drawLine(startX + mTransomPadding, mTransomTop,
+                endX - mTransomPadding, mTransomTop,
+                mTransomLinePaint);
+        canvas.drawRect(startX, mTransomTop, endX, trapezoidBottom,
+                mTransomSelectedSlotPaint);
+    }
+
+    private void drawTransomIcon(Canvas canvas) {
+        if (mTransomIcon == null) {
+            return;
+        }
+        final int left = isRTL()
+                ? mIndent.left - mTextPadding - mTransomIconSize
+                : getWidth() - abs(mIndent.width()) + mTextPadding;
+        mTransomIcon.setBounds(left, mTransomTop - mTransomIconSize / 2,
+                left + mTransomIconSize, mTransomTop + mTransomIconSize / 2);
+        mTransomIcon.draw(canvas);
+    }
+
     // Searches the corresponding trapezoid index from x location.
     private int getTrapezoidIndex(float x) {
         if (mTrapezoidSlots == null) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
index f58d241..bf8a771 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
@@ -55,6 +55,7 @@
     private final String[] mFullTexts;
 
     private int mSelectedIndex = SELECTED_INDEX_ALL;
+    private int mHighlightSlotIndex = SELECTED_INDEX_INVALID;
 
     BatteryChartViewModel(@NonNull List<Integer> levels, @NonNull List<Long> timestamps,
             @NonNull AxisLabelPosition axisLabelPosition,
@@ -106,6 +107,14 @@
         mSelectedIndex = index;
     }
 
+    public int getHighlightSlotIndex() {
+        return mHighlightSlotIndex;
+    }
+
+    public void setHighlightSlotIndex(int index) {
+        mHighlightSlotIndex = index;
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(mLevels, mTimestamps, mSelectedIndex, mAxisLabelPosition);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
index 53ebbd9..09d66c7 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
@@ -20,6 +20,7 @@
 
 import android.text.format.DateUtils;
 import android.util.ArrayMap;
+import android.util.Pair;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -69,6 +70,16 @@
             return String.format(Locale.ENGLISH, "timestamps: %s; levels: %s",
                     Objects.toString(mTimestamps), Objects.toString(mLevels));
         }
+
+        private int getIndexByTimestamps(long startTimestamp, long endTimestamp) {
+            for (int index = 0; index < mTimestamps.size() - 1; index++) {
+                if (mTimestamps.get(index) <= startTimestamp
+                        && endTimestamp <= mTimestamps.get(index + 1)) {
+                    return index;
+                }
+            }
+            return BatteryChartViewModel.SELECTED_INDEX_INVALID;
+        }
     }
 
     /**
@@ -100,6 +111,18 @@
         }
     }
 
+    /** Gets daily and hourly index between start and end timestamps. */
+    public Pair<Integer, Integer> getIndexByTimestamps(long startTimestamp, long endTimestamp) {
+        final int dailyHighlightIndex =
+                mDailyBatteryLevels.getIndexByTimestamps(startTimestamp, endTimestamp);
+        final int hourlyHighlightIndex =
+                (dailyHighlightIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID)
+                        ? BatteryChartViewModel.SELECTED_INDEX_INVALID
+                        : mHourlyBatteryLevelsPerDay.get(dailyHighlightIndex)
+                        .getIndexByTimestamps(startTimestamp, endTimestamp);
+        return Pair.create(dailyHighlightIndex, hourlyHighlightIndex);
+    }
+
     public PeriodBatteryLevelData getDailyBatteryLevels() {
         return mDailyBatteryLevels;
     }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
index 65cca7c..e5cff20 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
@@ -16,9 +16,7 @@
 
 package com.android.settings.fuelgauge.batteryusage;
 
-import android.app.settings.SettingsEnums;
 import android.content.Context;
-import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
@@ -31,8 +29,6 @@
 import androidx.preference.PreferenceViewHolder;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
@@ -45,10 +41,17 @@
 
     private static final String TAG = "BatteryTipsCardPreference";
 
-    private final MetricsFeatureProvider mMetricsFeatureProvider;
+    interface OnConfirmListener {
+        void onConfirm();
+    }
 
-    private String mAnomalyEventId;
-    private PowerAnomalyKey mPowerAnomalyKey;
+    interface OnRejectListener {
+        void onReject();
+    }
+
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
+    private OnConfirmListener mOnConfirmListener;
+    private OnRejectListener mOnRejectListener;
     private int mIconResourceId = 0;
     private int mMainButtonStrokeColorResourceId = 0;
 
@@ -56,12 +59,6 @@
     CharSequence mMainButtonLabel;
     @VisibleForTesting
     CharSequence mDismissButtonLabel;
-    @VisibleForTesting
-    String mDestinationComponentName;
-    @VisibleForTesting
-    String mPreferenceHighlightKey;
-    @VisibleForTesting
-    Integer mSourceMetricsCategory;
 
     public BatteryTipsCardPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -69,7 +66,14 @@
         setSelectable(false);
         final FeatureFactory featureFactory = FeatureFactory.getFeatureFactory();
         mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
-        mPowerAnomalyKey = null;
+    }
+
+    public void setOnConfirmListener(OnConfirmListener listener) {
+        mOnConfirmListener = listener;
+    }
+
+    public void setOnRejectListener(OnRejectListener listener) {
+        mOnRejectListener = listener;
     }
 
     /**
@@ -93,13 +97,6 @@
     }
 
     /**
-     * Sets the anomaly event id which is used in metrics.
-     */
-    public void setAnomalyEventId(final String anomalyEventId) {
-        mAnomalyEventId = anomalyEventId;
-    }
-
-    /**
      * Sets the label of main button in tips card.
      */
     public void setMainButtonLabel(CharSequence label) {
@@ -119,50 +116,18 @@
         }
     }
 
-    /**
-     * Sets the power anomaly key of battery tips card.
-     */
-    public void setPowerAnomalyKey(final PowerAnomalyKey powerAnomalyKey) {
-        mPowerAnomalyKey = powerAnomalyKey;
-    }
-
-    /**
-     * Sets the info of target fragment launched by main button.
-     */
-    public void setMainButtonLauncherInfo(final String destinationClassName,
-            final Integer sourceMetricsCategory, final String highlightKey) {
-        mDestinationComponentName = destinationClassName;
-        mSourceMetricsCategory = sourceMetricsCategory;
-        mPreferenceHighlightKey = highlightKey;
-    }
-
     @Override
     public void onClick(View view) {
         final int viewId = view.getId();
         if (viewId == R.id.main_button || viewId == R.id.tips_card) {
-            if (TextUtils.isEmpty(mDestinationComponentName)) {
-                return;
-            }
-            Bundle arguments = Bundle.EMPTY;
-            if (!TextUtils.isEmpty(mPreferenceHighlightKey)) {
-                arguments = new Bundle(1);
-                arguments.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
-                        mPreferenceHighlightKey);
-            }
-            new SubSettingLauncher(getContext())
-                    .setDestination(mDestinationComponentName)
-                    .setSourceMetricsCategory(mSourceMetricsCategory)
-                    .setArguments(arguments)
-                    .launch();
             setVisible(false);
-            mMetricsFeatureProvider.action(
-                    getContext(), SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, mAnomalyEventId);
+            if (mOnConfirmListener != null) {
+                mOnConfirmListener.onConfirm();
+            }
         } else if (viewId == R.id.dismiss_button) {
             setVisible(false);
-            mMetricsFeatureProvider.action(
-                    getContext(), SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, mAnomalyEventId);
-            if (mPowerAnomalyKey != null) {
-                DatabaseUtils.setDismissedPowerAnomalyKeys(getContext(), mPowerAnomalyKey.name());
+            if (mOnRejectListener != null) {
+                mOnRejectListener.onReject();
             }
         }
     }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
index 625d9e5..b3a3508 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
@@ -18,13 +18,16 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.os.Bundle;
 import android.text.TextUtils;
 
 import androidx.preference.PreferenceScreen;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
+import com.android.settings.SettingsActivity;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
@@ -39,6 +42,21 @@
 
     private final MetricsFeatureProvider mMetricsFeatureProvider;
 
+    /** A callback listener for the battery tips is confirmed. */
+    interface OnAnomalyConfirmListener {
+        /** The callback function for the battery tips is confirmed. */
+        void onAnomalyConfirm();
+    }
+
+    /** A callback listener for the battery tips is rejected. */
+    interface OnAnomalyRejectListener {
+        /** The callback function for the battery tips is rejected. */
+        void onAnomalyReject();
+    }
+
+    private OnAnomalyConfirmListener mOnAnomalyConfirmListener;
+    private OnAnomalyRejectListener mOnAnomalyRejectListener;
+
     @VisibleForTesting
     BatteryTipsCardPreference mCardPreference;
 
@@ -59,6 +77,14 @@
         mCardPreference = screen.findPreference(CARD_PREFERENCE_KEY);
     }
 
+    void setOnAnomalyConfirmListener(OnAnomalyConfirmListener listener) {
+        mOnAnomalyConfirmListener = listener;
+    }
+
+    void setOnAnomalyRejectListener(OnAnomalyRejectListener listener) {
+        mOnAnomalyRejectListener = listener;
+    }
+
     private <T> T getInfo(PowerAnomalyEvent powerAnomalyEvent,
                           Function<WarningBannerInfo, T> warningBannerInfoSupplier,
                           Function<WarningItemInfo, T> warningItemInfoSupplier) {
@@ -95,6 +121,21 @@
                 : getStringFromResource(resourceId, resourceIndex);
     }
 
+    /** Generate a key string of current anomaly to record as dismissed in sharedPreferences. */
+    public static String getDismissRecordKey(PowerAnomalyEvent event) {
+        if (!event.hasKey()) {
+            return null;
+        }
+        switch (event.getKey()){
+            case KEY_APP:
+                return event.hasWarningItemInfo()
+                        && event.getWarningItemInfo().hasDismissRecordKey()
+                        ? event.getWarningItemInfo().getDismissRecordKey() : null;
+            default:
+                return event.getKey().name();
+        }
+    }
+
     void handleBatteryTipsCardUpdated(PowerAnomalyEvent powerAnomalyEvent) {
         if (powerAnomalyEvent == null) {
             mCardPreference.setVisible(false);
@@ -109,44 +150,76 @@
                 R.array.battery_tips_card_colors, cardStyleId, "color");
 
         // Get card preference strings and navigate fragment info
+        final String eventId = powerAnomalyEvent.hasEventId()
+                ? powerAnomalyEvent.getEventId() : null;
         final PowerAnomalyKey powerAnomalyKey = powerAnomalyEvent.hasKey()
                 ? powerAnomalyEvent.getKey() : null;
         final int resourceIndex = powerAnomalyKey != null ? powerAnomalyKey.getNumber() : -1;
 
-        String titleString = getString(powerAnomalyEvent, WarningBannerInfo::getTitleString,
+        final String titleString = getString(powerAnomalyEvent, WarningBannerInfo::getTitleString,
                 WarningItemInfo::getTitleString, R.array.power_anomaly_titles, resourceIndex);
         if (titleString.isEmpty()) {
             mCardPreference.setVisible(false);
             return;
         }
 
-        String mainBtnString = getString(powerAnomalyEvent,
+        final String mainBtnString = getString(powerAnomalyEvent,
                 WarningBannerInfo::getMainButtonString, WarningItemInfo::getMainButtonString,
                 R.array.power_anomaly_main_btn_strings, resourceIndex);
-        String dismissBtnString = getString(powerAnomalyEvent,
+        final String dismissBtnString = getString(powerAnomalyEvent,
                 WarningBannerInfo::getCancelButtonString, WarningItemInfo::getCancelButtonString,
                 R.array.power_anomaly_dismiss_btn_strings, resourceIndex);
 
-        String destinationClassName = getInfo(powerAnomalyEvent,
+        final String destinationClassName = getInfo(powerAnomalyEvent,
                 WarningBannerInfo::getMainButtonDestination, null);
-        Integer sourceMetricsCategory = getInfo(powerAnomalyEvent,
+        final Integer sourceMetricsCategory = getInfo(powerAnomalyEvent,
                 WarningBannerInfo::getMainButtonSourceMetricsCategory, null);
-        String preferenceHighlightKey = getInfo(powerAnomalyEvent,
+        final String preferenceHighlightKey = getInfo(powerAnomalyEvent,
                 WarningBannerInfo::getMainButtonSourceHighlightKey, null);
 
         // Update card preference and main button fragment launcher
-        mCardPreference.setAnomalyEventId(powerAnomalyEvent.getEventId());
-        mCardPreference.setPowerAnomalyKey(powerAnomalyKey);
         mCardPreference.setTitle(titleString);
         mCardPreference.setIconResourceId(iconResId);
         mCardPreference.setMainButtonStrokeColorResourceId(colorResId);
         mCardPreference.setMainButtonLabel(mainBtnString);
         mCardPreference.setDismissButtonLabel(dismissBtnString);
-        mCardPreference.setMainButtonLauncherInfo(
-                destinationClassName, sourceMetricsCategory, preferenceHighlightKey);
-        mCardPreference.setVisible(true);
 
-        mMetricsFeatureProvider.action(mContext,
-                SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, powerAnomalyEvent.getEventId());
+        // Set battery tips card listener
+        mCardPreference.setOnConfirmListener(() -> {
+            if (mOnAnomalyConfirmListener != null) {
+                mOnAnomalyConfirmListener.onAnomalyConfirm();
+            } else if (!TextUtils.isEmpty(destinationClassName)) {
+                // Navigate to sub setting page
+                Bundle arguments = Bundle.EMPTY;
+                if (!TextUtils.isEmpty(preferenceHighlightKey)) {
+                    arguments = new Bundle(1);
+                    arguments.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
+                            preferenceHighlightKey);
+                }
+                new SubSettingLauncher(mContext)
+                        .setDestination(destinationClassName)
+                        .setSourceMetricsCategory(sourceMetricsCategory)
+                        .setArguments(arguments)
+                        .launch();
+            }
+            mMetricsFeatureProvider.action(
+                    mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, eventId);
+        });
+        mCardPreference.setOnRejectListener(() -> {
+            if (mOnAnomalyRejectListener != null) {
+                mOnAnomalyRejectListener.onAnomalyReject();
+            }
+            // For anomaly events with same record key, dismissed until next time full charged.
+            final String dismissRecordKey = getDismissRecordKey(powerAnomalyEvent);
+            if (!TextUtils.isEmpty(dismissRecordKey)) {
+                DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, dismissRecordKey);
+            }
+            mMetricsFeatureProvider.action(
+                    mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, eventId);
+        });
+
+        mCardPreference.setVisible(true);
+        mMetricsFeatureProvider.action(
+                mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, eventId);
     }
 }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
index ab5ab8a..63f0d40 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
@@ -120,6 +120,7 @@
 
         mFetchBatteryUsageData = true;
         BatteryUsageDataLoader.enqueueWork(context, /*isFullChargeStart=*/ true);
+        BootBroadcastReceiver.invokeJobRecheck(context);
     }
 
     private void sendBatteryEventData(Context context, BatteryEventType batteryEventType) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
index ece9960..1cbf2a3 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
@@ -28,6 +28,7 @@
 
 import com.android.settings.fuelgauge.BatteryUsageHistoricalLogEntry.Action;
 import com.android.settings.fuelgauge.batteryusage.bugreport.BatteryUsageLogUtils;
+import com.android.settings.overlay.FeatureFactory;
 
 import java.util.List;
 import java.util.Map;
@@ -138,6 +139,8 @@
                 // No app usage data or battery diff data at this time.
                 loadAppUsageData(context);
                 preprocessBatteryUsageSlots(context);
+                FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider()
+                        .detectSettingsAnomaly(context, /* displayDrain= */ 0);
             }
             Log.d(TAG, String.format(
                     "loadUsageDataSafely() in %d/ms", System.currentTimeMillis() - start));
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index ec0d01a..a1987c9 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -473,6 +473,9 @@
                 .setConsumePower(batteryDiffEntry.mConsumePower)
                 .setForegroundUsageConsumePower(batteryDiffEntry.mForegroundUsageConsumePower)
                 .setBackgroundUsageConsumePower(batteryDiffEntry.mBackgroundUsageConsumePower)
+                .setForegroundServiceUsageConsumePower(
+                        batteryDiffEntry.mForegroundServiceUsageConsumePower)
+                .setCachedUsageConsumePower(batteryDiffEntry.mCachedUsageConsumePower)
                 .setForegroundUsageTime(batteryDiffEntry.mForegroundUsageTimeInMs)
                 .setBackgroundUsageTime(batteryDiffEntry.mBackgroundUsageTimeInMs)
                 .setScreenOnTime(batteryDiffEntry.mScreenOnTimeInMs);
@@ -525,9 +528,9 @@
                 batteryUsageDiff.getScreenOnTime(),
                 batteryUsageDiff.getConsumePower(),
                 batteryUsageDiff.getForegroundUsageConsumePower(),
-                /*foregroundServiceUsageConsumePower=*/ 0,
+                batteryUsageDiff.getForegroundServiceUsageConsumePower(),
                 batteryUsageDiff.getBackgroundUsageConsumePower(),
-                /*cachedUsageConsumePower=*/ 0);
+                batteryUsageDiff.getCachedUsageConsumePower());
     }
 
     static BatteryDiffData convertToBatteryDiffData(
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
index 0e15093..7fb2c56 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
@@ -68,6 +68,8 @@
     /** Schedules the next alarm job if it is available. */
     public void refreshJob(final boolean fromBoot) {
         if (mAlarmManager == null) {
+            BatteryUsageLogUtils.writeLog(mContext, Action.SCHEDULE_JOB,
+                    "cannot schedule next alarm job due to AlarmManager is null");
             Log.e(TAG, "cannot schedule next alarm job");
             return;
         }
@@ -80,8 +82,8 @@
                 AlarmManager.RTC_WAKEUP, triggerAtMillis, pendingIntent);
 
         final String utcToLocalTime = ConvertUtils.utcToLocalTimeForLogging(triggerAtMillis);
-        BatteryUsageLogUtils.writeLog(
-                mContext, Action.SCHEDULE_JOB, "triggerTime=" + utcToLocalTime);
+        BatteryUsageLogUtils.writeLog(mContext, Action.SCHEDULE_JOB,
+                String.format("triggerTime=%s, fromBoot=%b", utcToLocalTime, fromBoot));
         Log.d(TAG, "schedule next alarm job at " + utcToLocalTime);
     }
 
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
index 2371a19..dccca43 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
@@ -33,12 +33,23 @@
 
     @Override
     public void onReceive(Context context, Intent intent) {
+        try {
+            loadDataAndRefreshJob(context, intent);
+        } catch (Exception e) {
+            BatteryUsageLogUtils.writeLog(context, Action.SCHEDULE_JOB,
+                    String.format("loadDataAndRefreshJob() failed: %s", e));
+        }
+    }
+
+    private static void loadDataAndRefreshJob(Context context, Intent intent) {
         final String action = intent == null ? "" : intent.getAction();
         if (!ACTION_PERIODIC_JOB_UPDATE.equals(action)) {
             Log.w(TAG, "receive unexpected action=" + action);
             return;
         }
         if (DatabaseUtils.isWorkProfile(context)) {
+            BatteryUsageLogUtils.writeLog(context, Action.SCHEDULE_JOB,
+                    "do not refresh job for work profile");
             Log.w(TAG, "do not refresh job for work profile action=" + action);
             return;
         }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
index a5449aa..283b742 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
@@ -27,6 +27,7 @@
 import android.os.Looper;
 import android.provider.SearchIndexableResource;
 import android.util.Log;
+import android.util.Pair;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.loader.app.LoaderManager;
@@ -67,11 +68,6 @@
 
     private boolean mIsChartDataLoaded = false;
     private long mResumeTimestamp;
-    private BatteryTipsController mBatteryTipsController;
-    private BatteryChartPreferenceController mBatteryChartPreferenceController;
-    private ScreenOnTimeController mScreenOnTimeController;
-    private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
-    private Optional<BatteryLevelData> mBatteryLevelData;
     private Map<Integer, Map<Integer, BatteryDiffData>> mBatteryUsageMap;
 
     private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
@@ -87,6 +83,19 @@
                 }
             };
 
+    @VisibleForTesting
+    BatteryTipsController mBatteryTipsController;
+    @VisibleForTesting
+    BatteryChartPreferenceController mBatteryChartPreferenceController;
+    @VisibleForTesting
+    ScreenOnTimeController mScreenOnTimeController;
+    @VisibleForTesting
+    BatteryUsageBreakdownController mBatteryUsageBreakdownController;
+    @VisibleForTesting
+    PowerAnomalyEvent mPowerAnomalyEvent;
+    @VisibleForTesting
+    Optional<BatteryLevelData> mBatteryLevelData;
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -179,6 +188,7 @@
             mIsChartDataLoaded = true;
             mBatteryLevelData = null;
             mBatteryUsageMap = null;
+            mPowerAnomalyEvent = null;
             restartLoader(LoaderIndex.BATTERY_LEVEL_DATA_LOADER, bundle,
                     mBatteryLevelDataLoaderCallbacks);
         }
@@ -253,12 +263,45 @@
         Log.d(TAG, "anomalyEventList = " + anomalyEventList);
         final PowerAnomalyEvent displayEvent =
                 getHighestScoreAnomalyEvent(getContext(), anomalyEventList);
-        if (displayEvent == null) {
+        onDisplayAnomalyEventUpdated(displayEvent);
+    }
+
+    @VisibleForTesting
+    void onDisplayAnomalyEventUpdated(PowerAnomalyEvent event) {
+        mPowerAnomalyEvent = event;
+        if (mBatteryTipsController == null
+                || mBatteryChartPreferenceController == null
+                || mBatteryUsageBreakdownController == null) {
             return;
         }
-        if (mBatteryTipsController != null) {
-            mBatteryTipsController.handleBatteryTipsCardUpdated(displayEvent);
+
+        // Update battery tips card preference & behaviour
+        mBatteryTipsController.setOnAnomalyConfirmListener(null);
+        mBatteryTipsController.setOnAnomalyRejectListener(null);
+        mBatteryTipsController.handleBatteryTipsCardUpdated(mPowerAnomalyEvent);
+
+        // Update highlight slot effect in battery chart view
+        Pair<Integer, Integer> highlightSlotIndexPair = Pair.create(
+                BatteryChartViewModel.SELECTED_INDEX_INVALID,
+                BatteryChartViewModel.SELECTED_INDEX_INVALID);
+        if (mPowerAnomalyEvent != null && mPowerAnomalyEvent.hasWarningItemInfo()) {
+            final WarningItemInfo warningItemInfo = mPowerAnomalyEvent.getWarningItemInfo();
+            final Long startTimestamp = warningItemInfo.hasStartTimestamp()
+                    ? warningItemInfo.getStartTimestamp() : null;
+            final Long endTimestamp = warningItemInfo.hasEndTimestamp()
+                    ? warningItemInfo.getEndTimestamp() : null;
+            if (startTimestamp != null && endTimestamp != null) {
+                highlightSlotIndexPair = mBatteryLevelData.map(levelData ->
+                                levelData.getIndexByTimestamps(startTimestamp, endTimestamp))
+                        .orElse(highlightSlotIndexPair);
+                mBatteryTipsController.setOnAnomalyConfirmListener(
+                        mBatteryChartPreferenceController::selectHighlightSlotIndex);
+                mBatteryTipsController.setOnAnomalyRejectListener(
+                        () -> onDisplayAnomalyEventUpdated(null));
+            }
         }
+        mBatteryChartPreferenceController.onHighlightSlotIndexUpdate(
+                highlightSlotIndexPair.first, highlightSlotIndexPair.second);
     }
 
     private void setBatteryChartPreferenceController() {
@@ -306,8 +349,8 @@
 
         final PowerAnomalyEvent highestScoreEvent = anomalyEventList.getPowerAnomalyEventsList()
                 .stream()
-                .filter(event -> event.hasKey()
-                        && !dismissedPowerAnomalyKeys.contains(event.getKey().name()))
+                .filter(event -> !dismissedPowerAnomalyKeys.contains(
+                        BatteryTipsController.getDismissRecordKey(event)))
                 .max(Comparator.comparing(PowerAnomalyEvent::getScore))
                 .orElse(null);
         Log.d(TAG, "highestScoreAnomalyEvent = " + highestScoreEvent);
@@ -341,6 +384,7 @@
                     controllers.add(new BatteryUsageBreakdownController(
                             context, null /* lifecycle */, null /* activity */,
                             null /* fragment */));
+                    controllers.add(new BatteryTipsController(context));
                     return controllers;
                 }
             };
diff --git a/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto b/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
index e3b604b..5bc1a3e 100644
--- a/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
+++ b/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
@@ -26,7 +26,9 @@
   optional double consume_power = 9;
   optional double foreground_usage_consume_power = 10;
   optional double background_usage_consume_power = 11;
-  optional int64 foreground_usage_time = 12;
-  optional int64 background_usage_time = 13;
-  optional int64 screen_on_time = 14;
+  optional double foreground_service_usage_consume_power = 12;
+  optional double cached_usage_consume_power = 13;
+  optional int64 foreground_usage_time = 14;
+  optional int64 background_usage_time = 15;
+  optional int64 screen_on_time = 16;
 }
diff --git a/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto b/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
index 644ab9e..99df215 100644
--- a/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
+++ b/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
@@ -60,4 +60,6 @@
   optional string description_string = 5;
   optional string main_button_string = 6;
   optional string cancel_button_string = 7;
+  optional string dismiss_record_key = 8;
+  optional string item_key = 9;
 }
diff --git a/src/com/android/settings/privatespace/CreatePrivateSpaceController.java b/src/com/android/settings/privatespace/CreatePrivateSpaceController.java
new file mode 100644
index 0000000..3214988
--- /dev/null
+++ b/src/com/android/settings/privatespace/CreatePrivateSpaceController.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+// TODO(b/293569406): Remove this when we have the setup flow in place to create PS
+/**
+ * Temp Controller to create the private space from the PS Settings page. This is to allow PM, UX,
+ * and other folks to play around with PS before the PS setup flow is ready.
+ */
+public final class CreatePrivateSpaceController extends BasePreferenceController {
+
+    public CreatePrivateSpaceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+            return false;
+        }
+
+        if (PrivateSpaceMaintainer.getInstance(mContext).doesPrivateSpaceExist()) {
+            showPrivateSpaceAlreadyExistsToast();
+            return super.handlePreferenceTreeClick(preference);
+        }
+
+        if (PrivateSpaceMaintainer.getInstance(mContext).createPrivateSpace()) {
+            showPrivateSpaceCreatedToast();
+        } else {
+            showPrivateSpaceCreationFailedToast();
+        }
+        return super.handlePreferenceTreeClick(preference);
+    }
+
+    private void showPrivateSpaceCreatedToast() {
+        Toast.makeText(mContext, R.string.private_space_created, Toast.LENGTH_SHORT).show();
+    }
+
+    private void showPrivateSpaceCreationFailedToast() {
+        Toast.makeText(mContext, R.string.private_space_create_failed, Toast.LENGTH_SHORT).show();
+    }
+
+    private void showPrivateSpaceAlreadyExistsToast() {
+        Toast.makeText(mContext, R.string.private_space_already_exists, Toast.LENGTH_SHORT).show();
+    }
+}
diff --git a/src/com/android/settings/privatespace/DeletePrivateSpaceController.java b/src/com/android/settings/privatespace/DeletePrivateSpaceController.java
new file mode 100644
index 0000000..c94f63a
--- /dev/null
+++ b/src/com/android/settings/privatespace/DeletePrivateSpaceController.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NO_PRIVATE_SPACE;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+import androidx.preference.Preference;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+/** Controller to delete the private space from the PS Settings page */
+public class DeletePrivateSpaceController extends BasePreferenceController {
+    private static final String TAG = "DeletePrivateSpaceController";
+    private final PrivateSpaceMaintainer mPrivateSpaceMaintainer;
+
+    static class Injector {
+        PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
+            return PrivateSpaceMaintainer.getInstance(context);
+        }
+    }
+
+    public DeletePrivateSpaceController(Context context, String preferenceKey) {
+        this(context, preferenceKey, new Injector());
+    }
+
+    DeletePrivateSpaceController(Context context, String preferenceKey, Injector injector) {
+        super(context, preferenceKey);
+        mPrivateSpaceMaintainer = injector.injectPrivateSpaceMaintainer(context);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+            return false;
+        }
+
+        PrivateSpaceMaintainer.ErrorDeletingPrivateSpace error =
+                mPrivateSpaceMaintainer.deletePrivateSpace();
+        if (error == DELETE_PS_ERROR_NONE) {
+            showSuccessfulDeletionToast();
+        } else if (error == DELETE_PS_ERROR_INTERNAL) {
+            showDeletionInternalErrorToast();
+        } else if (error == DELETE_PS_ERROR_NO_PRIVATE_SPACE) {
+            // Ideally this should never happen as PS Settings is not available when there's no
+            // Private Profile.
+            Log.e(TAG, "Unexpected attempt to delete non-existent PS");
+        }
+        return super.handlePreferenceTreeClick(preference);
+    }
+
+    /** Shows a toast saying that the private space was deleted */
+    @VisibleForTesting
+    public void showSuccessfulDeletionToast() {
+        Toast.makeText(mContext, R.string.private_space_deleted, Toast.LENGTH_SHORT).show();
+    }
+
+    /** Shows a toast saying that the private space could not be deleted */
+    @VisibleForTesting
+    public void showDeletionInternalErrorToast() {
+        Toast.makeText(mContext, R.string.private_space_delete_failed, Toast.LENGTH_SHORT).show();
+    }
+}
diff --git a/src/com/android/settings/privatespace/HidePrivateSpaceController.java b/src/com/android/settings/privatespace/HidePrivateSpaceController.java
new file mode 100644
index 0000000..f27acbd
--- /dev/null
+++ b/src/com/android/settings/privatespace/HidePrivateSpaceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import android.content.Context;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/** Represents the preference controller for (un)hiding the Private Space */
+public final class HidePrivateSpaceController extends TogglePreferenceController {
+    public HidePrivateSpaceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean isChecked() {
+        // TODO(b/293569406) Need to check this from a persistent store, maybe like SettingsProvider
+        return false;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        // TODO(b/293569406) Need to save this to a persistent store, maybe like SettingsProvider
+        return true;
+    }
+
+    @Override
+    public int getSliceHighlightMenuRes() {
+        return 0;
+    }
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
new file mode 100644
index 0000000..9e1d0d5
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.util.FeatureFlagUtils;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.safetycenter.SafetyCenterManagerWrapper;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.search.SearchIndexable;
+
+import java.util.List;
+
+/** Fragment representing the Private Space dashboard in Settings. */
+@SearchIndexable
+public class PrivateSpaceDashboardFragment extends DashboardFragment {
+    private static final String TAG = "PrivateSpaceDashboardFragment";
+    private static final String KEY_CREATE_PROFILE_PREFERENCE = "private_space_create";
+    private static final String KEY_DELETE_PROFILE_PREFERENCE = "private_space_delete";
+    private static final String KEY_ONE_LOCK_PREFERENCE = "private_space_use_one_lock";
+    private static final String KEY_PS_HIDDEN_PREFERENCE = "private_space_hidden";
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.private_space_settings;
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.PRIVATE_SPACE_SETTINGS;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider(R.xml.private_space_settings) {
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    // Temporary workaround for hiding PS Settings until the trunk stable feature
+                    // flag is available.
+                    // TODO(b/295516544): Remove this workaround when trunk stable feature flag is
+                    // available.
+                    return SafetyCenterManagerWrapper.get().isEnabled(context)
+                            && FeatureFlagUtils.isEnabled(context,
+                            FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS);
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    List<String> keys = super.getNonIndexableKeys(context);
+                    keys.add(KEY_CREATE_PROFILE_PREFERENCE);
+                    keys.add(KEY_DELETE_PROFILE_PREFERENCE);
+                    keys.add(KEY_ONE_LOCK_PREFERENCE);
+                    keys.add(KEY_PS_HIDDEN_PREFERENCE);
+                    return keys;
+                }
+            };
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
new file mode 100644
index 0000000..709814d
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;
+
+import android.app.ActivityManager;
+import android.app.IActivityManager;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.ArraySet;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.List;
+
+// TODO(b/293569406): Update the javadoc when we have the setup flow in place to create PS
+/** A class to help with the creation / deletion of Private Space */
+public class PrivateSpaceMaintainer {
+    private static final String TAG = "PrivateSpaceMaintainer";
+    @GuardedBy("this")
+    private static PrivateSpaceMaintainer sPrivateSpaceMaintainer;
+
+    private final Context mContext;
+    private final UserManager mUserManager;
+    @GuardedBy("this")
+    private UserHandle mUserHandle;
+
+    public enum ErrorDeletingPrivateSpace {
+            DELETE_PS_ERROR_NONE,
+            DELETE_PS_ERROR_NO_PRIVATE_SPACE,
+            DELETE_PS_ERROR_INTERNAL
+    }
+
+    /**
+     * Returns true if the private space was successfully created.
+     *
+     * <p> This method should be used by the Private Space Setup Flow ONLY.
+     */
+    final synchronized boolean createPrivateSpace() {
+        // Check if Private space already exists
+        if (doesPrivateSpaceExist()) {
+            return true;
+        }
+        // a name indicating that the profile was created from the PS Settings page
+        final String userName = "psSettingsUser";
+
+        if (mUserHandle == null) {
+            try {
+                mUserHandle = mUserManager.createProfile(
+                                userName, USER_TYPE_PROFILE_PRIVATE, new ArraySet<>());
+            } catch (Exception e) {
+                Log.e(TAG, "Error creating private space", e);
+                return false;
+            }
+
+            if (mUserHandle == null) {
+                Log.e(TAG, "Failed to create private space");
+                return false;
+            }
+
+            IActivityManager am = ActivityManager.getService();
+            try {
+                am.startProfile(mUserHandle.getIdentifier());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Failed to start private profile");
+                return false;
+            }
+
+            Log.i(TAG, "Private space created with id: " + mUserHandle.getIdentifier());
+        }
+        return true;
+    }
+
+    /** Returns the {@link ErrorDeletingPrivateSpace} enum representing the result of operation.
+     *
+     * <p> This method should be used ONLY by the delete-PS controller in the PS Settings page.
+     */
+    public synchronized ErrorDeletingPrivateSpace deletePrivateSpace() {
+        if (!doesPrivateSpaceExist()) {
+            return ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NO_PRIVATE_SPACE;
+        }
+
+        try {
+            Log.i(TAG, "Deleting Private space with id: " + mUserHandle.getIdentifier());
+            if (mUserManager.removeUser(mUserHandle)) {
+                Log.i(TAG, "Private space deleted");
+                mUserHandle = null;
+
+                return ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
+            } else {
+                Log.e(TAG, "Failed to delete private space");
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Error deleting private space", e);
+        }
+        return ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
+    }
+
+    /** Returns true if the Private space exists. */
+    public synchronized boolean doesPrivateSpaceExist() {
+        if (mUserHandle != null) {
+            return true;
+        }
+
+        List<UserInfo> users = mUserManager.getProfiles(0);
+        for (UserInfo user : users) {
+            if (user.isPrivateProfile()) {
+                mUserHandle = user.getUserHandle();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    static synchronized PrivateSpaceMaintainer getInstance(Context context) {
+        if (sPrivateSpaceMaintainer == null) {
+            sPrivateSpaceMaintainer = new PrivateSpaceMaintainer(context);
+        }
+        return sPrivateSpaceMaintainer;
+    }
+
+    private PrivateSpaceMaintainer(Context context) {
+        mContext = context.getApplicationContext();
+        mUserManager = mContext.getSystemService(UserManager.class);
+    }
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java b/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java
new file mode 100644
index 0000000..b07c623
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import android.app.PendingIntent;
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserManager;
+import android.safetycenter.SafetyEvent;
+import android.safetycenter.SafetySourceData;
+import android.safetycenter.SafetySourceStatus;
+import android.util.FeatureFlagUtils;
+import android.util.Log;
+
+import com.android.settings.R;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.safetycenter.SafetyCenterManagerWrapper;
+import com.android.settingslib.transition.SettingsTransitionHelper;
+
+/** Private Space safety source for the Safety Center */
+public final class PrivateSpaceSafetySource {
+    public static final String SAFETY_SOURCE_ID = "AndroidPrivateSpace";
+    private static final String TAG = "PrivateSpaceSafetySource";
+
+    private PrivateSpaceSafetySource() {}
+
+    /** Sets lock screen safety data for Safety Center. */
+    public static void setSafetySourceData(Context context,
+            SafetyEvent safetyEvent) {
+        if (!SafetyCenterManagerWrapper.get().isEnabled(context)) {
+            Log.i(TAG, "Safety Center disabled");
+            return;
+        }
+
+        // Check the profile type - we don't want to show this for anything other than primary user.
+        UserManager userManager = context.getSystemService(UserManager.class);
+        if (userManager != null && !userManager.isMainUser()) {
+            Log.i(TAG, "setSafetySourceData not main user");
+            return;
+        }
+
+        // Temporary workaround to help prevent the PS Settings showing up in droidfood builds.
+        // TODO(b/295516544): remove this when the trunk stable feature flag for PS is available.
+        if (!FeatureFlagUtils.isEnabled(context,
+                FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS)) {
+            // Setting null safetySourceData so that an old entry gets cleared out and this way
+            // provide a response since SC always expects one on rescan.
+            SafetyCenterManagerWrapper.get().setSafetySourceData(
+                    context,
+                    SAFETY_SOURCE_ID,
+                    /* safetySourceData */ null,
+                    safetyEvent
+            );
+            return;
+        }
+
+        PendingIntent pendingIntent = getPendingIntentForPsDashboard(context);
+
+        SafetySourceStatus status = new SafetySourceStatus.Builder(
+                context.getString(R.string.private_space_title),
+                context.getString(R.string.private_space_summary),
+                SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED)
+                .setPendingIntent(pendingIntent).build();
+        SafetySourceData safetySourceData =
+                new SafetySourceData.Builder().setStatus(status).build();
+
+        Log.d(TAG, "Setting safety source data");
+        SafetyCenterManagerWrapper.get().setSafetySourceData(
+                context,
+                SAFETY_SOURCE_ID,
+                safetySourceData,
+                safetyEvent
+        );
+    }
+
+    private static PendingIntent getPendingIntentForPsDashboard(Context context) {
+        Intent privateSpaceDashboardIntent = new SubSettingLauncher(context)
+                .setDestination(PrivateSpaceDashboardFragment.class.getName())
+                .setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE)
+                .setSourceMetricsCategory(SettingsEnums.PRIVATE_SPACE_SETTINGS)
+                .toIntent()
+                .setIdentifier(SAFETY_SOURCE_ID);
+
+        return PendingIntent
+                .getActivity(
+                        context,
+                        /* requestCode */ 0,
+                        privateSpaceDashboardIntent,
+                        PendingIntent.FLAG_IMMUTABLE);
+    }
+}
diff --git a/src/com/android/settings/privatespace/UseOneLockController.java b/src/com/android/settings/privatespace/UseOneLockController.java
new file mode 100644
index 0000000..a94db57
--- /dev/null
+++ b/src/com/android/settings/privatespace/UseOneLockController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import android.content.Context;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/** Represents the preference controller for using the same lock as the screen lock */
+public class UseOneLockController extends TogglePreferenceController {
+    public UseOneLockController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean isChecked() {
+        // TODO(b/293569406) Need to save this to a persistent store, maybe like SettingsProvider
+        return false;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        // TODO(b/293569406) Need to save this to a persistent store, maybe like SettingsProvider
+        return true;
+    }
+
+    @Override
+    public int getSliceHighlightMenuRes() {
+        return 0;
+    }
+}
diff --git a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
index 0b556e7..cc0f892 100644
--- a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
+++ b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
@@ -28,6 +28,7 @@
 import android.safetycenter.SafetyCenterManager;
 import android.safetycenter.SafetyEvent;
 
+import com.android.settings.privatespace.PrivateSpaceSafetySource;
 import com.android.settings.security.ScreenLockPreferenceDetailsUtils;
 
 import com.google.common.collect.ImmutableList;
@@ -79,11 +80,16 @@
         if (sourceIds.contains(BiometricsSafetySource.SAFETY_SOURCE_ID)) {
             BiometricsSafetySource.setSafetySourceData(context, safetyEvent);
         }
+
+        if (sourceIds.contains(PrivateSpaceSafetySource.SAFETY_SOURCE_ID)) {
+            PrivateSpaceSafetySource.setSafetySourceData(context, safetyEvent);
+        }
     }
 
     private static void refreshAllSafetySources(Context context, SafetyEvent safetyEvent) {
         LockScreenSafetySource.setSafetySourceData(context,
                 new ScreenLockPreferenceDetailsUtils(context), safetyEvent);
         BiometricsSafetySource.setSafetySourceData(context, safetyEvent);
+        PrivateSpaceSafetySource.setSafetySourceData(context, safetyEvent);
     }
 }
diff --git a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
index e0c778d..f403743 100644
--- a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
+++ b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
@@ -109,7 +109,7 @@
         appList = appList,
         header = {
             Box(Modifier.padding(SettingsDimension.itemPadding)) {
-                SettingsBody(UserAspectRatioAppsPageProvider.getSummary())
+                SettingsBody(stringResource(R.string.aspect_ratio_main_summary, Build.MODEL))
             }
             Illustration(object : IllustrationModel {
                 override val resId = R.raw.user_aspect_ratio_education
@@ -215,5 +215,5 @@
 private enum class SpinnerItem(val stringResId: Int) {
     Suggested(R.string.user_aspect_ratio_suggested_apps_label),
     All(R.string.filter_all_apps),
-    Overridden(R.string.user_aspect_ratio_overridden_apps_label)
+    Overridden(R.string.user_aspect_ratio_changed_apps_label)
 }
\ No newline at end of file
diff --git a/src/com/android/settings/system/FactoryResetDemoUserPreferenceController.java b/src/com/android/settings/system/FactoryResetDemoUserPreferenceController.java
new file mode 100644
index 0000000..f6a9b31
--- /dev/null
+++ b/src/com/android/settings/system/FactoryResetDemoUserPreferenceController.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.settings.system;
+
+import android.content.Context;
+import com.android.settings.Utils;
+
+public class FactoryResetDemoUserPreferenceController extends FactoryResetPreferenceController {
+
+    public FactoryResetDemoUserPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    /** Hide demo user specific "Factory reset" settings for non demo users. */
+    @Override
+    public int getAvailabilityStatus() {
+        return Utils.isDemoUser(mContext) ? AVAILABLE : DISABLED_FOR_USER;
+    }
+}
diff --git a/src/com/android/settings/system/FactoryResetPreferenceController.java b/src/com/android/settings/system/FactoryResetPreferenceController.java
index a307171..6e010c1 100644
--- a/src/com/android/settings/system/FactoryResetPreferenceController.java
+++ b/src/com/android/settings/system/FactoryResetPreferenceController.java
@@ -24,35 +24,26 @@
 import com.android.settings.R;
 import com.android.settings.Settings;
 import com.android.settings.Utils;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settings.core.BasePreferenceController;
 
-public class FactoryResetPreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin {
-    /** Key of the "Factory reset" preference in {@link R.xml.reset_dashboard_fragment}. */
-    private static final String KEY_FACTORY_RESET = "factory_reset";
+public class FactoryResetPreferenceController extends BasePreferenceController {
 
     private final UserManager mUm;
 
-    public FactoryResetPreferenceController(Context context) {
-        super(context);
+    public FactoryResetPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
     }
 
-    /** Hide "Factory reset" settings for secondary users, except demo users. */
+    /** Hide "Factory reset" settings for secondary users. */
     @Override
-    public boolean isAvailable() {
-        return mUm.isAdminUser() || Utils.isDemoUser(mContext);
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_FACTORY_RESET;
+    public int getAvailabilityStatus() {
+        return mUm.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
     }
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (KEY_FACTORY_RESET.equals(preference.getKey())) {
+        if (mPreferenceKey.equals(preference.getKey())) {
             final Intent intent = new Intent(mContext, Settings.FactoryResetActivity.class);
             mContext.startActivity(intent);
             return true;
diff --git a/src/com/android/settings/system/ResetDashboardFragment.java b/src/com/android/settings/system/ResetDashboardFragment.java
index aea92aa..662edc5 100644
--- a/src/com/android/settings/system/ResetDashboardFragment.java
+++ b/src/com/android/settings/system/ResetDashboardFragment.java
@@ -78,7 +78,6 @@
         if (SubscriptionUtil.isSimHardwareVisible(context)) {
             controllers.add(new NetworkResetPreferenceController(context));
         }
-        controllers.add(new FactoryResetPreferenceController(context));
         controllers.add(new ResetAppPrefPreferenceController(context, lifecycle));
         return controllers;
     }
diff --git a/src/com/android/settings/system/ResetPreferenceController.java b/src/com/android/settings/system/ResetPreferenceController.java
index 0740ac9..35f1ff7 100644
--- a/src/com/android/settings/system/ResetPreferenceController.java
+++ b/src/com/android/settings/system/ResetPreferenceController.java
@@ -26,13 +26,11 @@
 
     private final UserManager mUm;
     private final NetworkResetPreferenceController mNetworkReset;
-    private final FactoryResetPreferenceController mFactpruReset;
 
     public ResetPreferenceController(Context context, String preferenceKey) {
         super(context, preferenceKey);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mNetworkReset = new NetworkResetPreferenceController(context);
-        mFactpruReset = new FactoryResetPreferenceController(context);
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/AllInOneTetherSettingsTest.java b/tests/robotests/src/com/android/settings/AllInOneTetherSettingsTest.java
index f4a20fe..f2a55c1 100644
--- a/tests/robotests/src/com/android/settings/AllInOneTetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/AllInOneTetherSettingsTest.java
@@ -52,7 +52,6 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -186,7 +185,6 @@
                 .getPreferenceControllers(mContext)).isNotEmpty();
     }
 
-    @Ignore
     @Test
     public void createPreferenceControllers_hasAutoOffPreference() {
         assertThat(mAllInOneTetherSettings.createPreferenceControllers(mContext)
diff --git a/tests/robotests/src/com/android/settings/MainClearConfirmTest.java b/tests/robotests/src/com/android/settings/MainClearConfirmTest.java
index 43fe9ca..b866c96 100644
--- a/tests/robotests/src/com/android/settings/MainClearConfirmTest.java
+++ b/tests/robotests/src/com/android/settings/MainClearConfirmTest.java
@@ -31,8 +31,6 @@
 
 import androidx.fragment.app.FragmentActivity;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -66,8 +64,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get());
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mMainClearConfirm = spy(new MainClearConfirm());
     }
 
diff --git a/tests/robotests/src/com/android/settings/MainClearTest.java b/tests/robotests/src/com/android/settings/MainClearTest.java
index d782e6d..dc17dda 100644
--- a/tests/robotests/src/com/android/settings/MainClearTest.java
+++ b/tests/robotests/src/com/android/settings/MainClearTest.java
@@ -52,12 +52,10 @@
 
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.development.DevelopmentSettingsEnabler;
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -113,8 +111,7 @@
             @Override
             boolean showAnySubscriptionInfo(Context context) { return true; }
         });
-        mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get());
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mShadowActivity = Shadows.shadowOf(mActivity);
         UserManager userManager = mActivity.getSystemService(UserManager.class);
         mShadowUserManager = Shadow.extract(userManager);
@@ -151,7 +148,6 @@
                 .isTrue();
     }
 
-    @Ignore
     @Test
     public void testShowFinalConfirmation_eraseEsimVisible_eraseEsimUnchecked() {
         final Context context = mock(Context.class);
@@ -237,7 +233,6 @@
         assertThat(mMainClear.showWipeEuicc()).isTrue();
     }
 
-    @Ignore
     @Test
     public void testShowWipeEuicc_developerMode_unprovisioned() {
         prepareEuiccState(
diff --git a/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java b/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java
index 34012d3..9ade776 100644
--- a/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java
+++ b/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java
@@ -18,8 +18,14 @@
 
 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.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
+import android.content.Context;
+import android.os.Looper;
 import android.view.LayoutInflater;
 import android.widget.TextView;
 
@@ -27,10 +33,10 @@
 
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
 import com.android.settings.testutils.shadow.ShadowRecoverySystem;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -57,8 +63,7 @@
         MockitoAnnotations.initMocks(this);
 
         mResetNetworkConfirm = new ResetNetworkConfirm();
-        mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get());
+        mActivity = spy(Robolectric.setupActivity(FragmentActivity.class));
         mResetNetworkConfirm.mActivity = mActivity;
     }
 
diff --git a/tests/robotests/src/com/android/settings/ResetNetworkTest.java b/tests/robotests/src/com/android/settings/ResetNetworkTest.java
index 0689e4a..0c2c7e8 100644
--- a/tests/robotests/src/com/android/settings/ResetNetworkTest.java
+++ b/tests/robotests/src/com/android/settings/ResetNetworkTest.java
@@ -27,8 +27,6 @@
 import android.view.View;
 import android.widget.CheckBox;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -43,8 +41,7 @@
 
     @Before
     public void setUp() {
-        mActivity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mActivity = Robolectric.setupActivity(Activity.class);
         mResetNetwork = spy(new ResetNetwork());
         when(mResetNetwork.getContext()).thenReturn(mActivity);
         mResetNetwork.mEsimContainer = new View(mActivity);
diff --git a/tests/robotests/src/com/android/settings/RestrictedListPreferenceTest.java b/tests/robotests/src/com/android/settings/RestrictedListPreferenceTest.java
index 232933c..9660b9d 100644
--- a/tests/robotests/src/com/android/settings/RestrictedListPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/RestrictedListPreferenceTest.java
@@ -30,7 +30,6 @@
 import android.util.AttributeSet;
 
 import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.RestrictedPreferenceHelper;
 
 import org.junit.Before;
@@ -59,8 +58,7 @@
 
     @Before
     public void setUp() {
-        mActivity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mActivity = Robolectric.setupActivity(Activity.class);
         mShadowKeyguardManager =
                 Shadows.shadowOf(application.getSystemService(KeyguardManager.class));
         mMockHelper = mock(RestrictedPreferenceHelper.class);
diff --git a/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java b/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
index 2e5c144..9d8841f 100644
--- a/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
@@ -34,7 +34,6 @@
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -100,7 +99,6 @@
                 ANOMALY_VERSION);
     }
 
-    @Ignore
     @Test
     public void testDump_printServiceAsKey() {
         mResolveInfo.activityInfo = new ActivityInfo();
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
index 7a0853f..adfd573 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
@@ -34,7 +34,6 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.bluetooth.BluetoothPairingDetail;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -65,8 +64,7 @@
     @Before
     public void setUpTestFragment() {
         mFragment = spy(HearingAidDialogFragment.newInstance());
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         when(mFragment.getActivity()).thenReturn(mActivity);
     }
 
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
index e632f97..6c1de59 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
@@ -45,7 +45,6 @@
 import com.android.settings.bluetooth.Utils;
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
 import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
 import com.android.settingslib.bluetooth.HearingAidInfo;
@@ -171,8 +170,7 @@
     private void setupDialog(int launchPage) {
         mFragment = spy(
                 HearingAidPairingDialogFragment.newInstance(TEST_DEVICE_ADDRESS, launchPage));
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mFragmentManager = mActivity.getSupportFragmentManager();
         when(mFragment.getActivity()).thenReturn(mActivity);
         doReturn(mFragmentManager).when(mFragment).getParentFragmentManager();
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
index 9863087..6d45af2 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
@@ -35,7 +35,6 @@
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
 import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
 import com.android.settingslib.bluetooth.CsipSetCoordinatorProfile;
@@ -92,8 +91,7 @@
     @Before
     public void setUp() {
         setupEnvironment();
-        final FragmentActivity mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
         shadowMainLooper().idle();
         mFragmentManager = mActivity.getSupportFragmentManager();
         ShadowAlertDialogCompat.reset();
diff --git a/tests/robotests/src/com/android/settings/accessibility/ScreenFlashNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ScreenFlashNotificationPreferenceControllerTest.java
index 8160fab..95a9438 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ScreenFlashNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ScreenFlashNotificationPreferenceControllerTest.java
@@ -40,7 +40,6 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -91,10 +90,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        FragmentActivity fragmentActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
-
-
+        FragmentActivity fragmentActivity = Robolectric.setupActivity(FragmentActivity.class);
         Context context = fragmentActivity.getApplicationContext();
         ShadowScreenFlashNotificationColorDialogFragment.setInstance(mDialogFragment);
         ShadowFlashNotificationsUtils.setColorDescriptionText(COLOR_DESCRIPTION_TEXT);
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
index 1d5370f..8212ba2 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
@@ -40,7 +40,6 @@
 import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
 import com.android.settings.accessibility.TextReadingResetController.ResetStateListener;
 import com.android.settings.testutils.XmlTestUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -83,9 +82,7 @@
         when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
         when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
         when(mFragment.getContext()).thenReturn(mContext);
-        when(mFragment.getActivity()).thenReturn((FragmentActivity)
-                ActivityControllerWrapper.setup(Robolectric.buildActivity(
-                        FragmentActivity.class)).get());
+        when(mFragment.getActivity()).thenReturn(Robolectric.setupActivity(FragmentActivity.class));
 
         // Avoid a NPE is happened in ShadowWindowManagerGlobal
         doReturn(mock(DisplaySizeData.class)).when(mFragment).createDisplaySizeData(mContext);
diff --git a/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
index 2c59354..6c9fbfc 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
@@ -30,8 +30,6 @@
 import androidx.preference.PreferenceScreen;
 import androidx.test.core.app.ApplicationProvider;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -66,8 +64,7 @@
 
     @Before
     public void setUp() {
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         when(mFragment.getContext()).thenReturn(mContext);
         when(mFragment.getActivity()).thenReturn(mActivity);
 
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountSyncPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/AccountSyncPreferenceControllerTest.java
index e760e62..1084102 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountSyncPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountSyncPreferenceControllerTest.java
@@ -36,7 +36,6 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.testutils.shadow.ShadowAccountManager;
 import com.android.settings.testutils.shadow.ShadowContentResolver;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -63,8 +62,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mActivity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mActivity = Robolectric.setupActivity(Activity.class);
         ShadowApplication.getInstance().setSystemService(Context.ACCOUNT_SERVICE, mAccountManager);
 
         when(mAccountManager.getAuthenticatorTypesAsUser(anyInt())).thenReturn(
diff --git a/tests/robotests/src/com/android/settings/accounts/ChooseAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/ChooseAccountPreferenceControllerTest.java
index 5c4af0d..783eebe 100644
--- a/tests/robotests/src/com/android/settings/accounts/ChooseAccountPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/ChooseAccountPreferenceControllerTest.java
@@ -41,7 +41,6 @@
 import com.android.settings.testutils.shadow.ShadowAccountManager;
 import com.android.settings.testutils.shadow.ShadowContentResolver;
 import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.After;
 import org.junit.Before;
@@ -69,8 +68,7 @@
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
         mController = spy(new ChooseAccountPreferenceController(mContext, "controller_key"));
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mPreferenceManager = new PreferenceManager(mContext);
         mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
     }
diff --git a/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java
index 7433d7a..ece7ea9 100644
--- a/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java
@@ -40,7 +40,6 @@
 import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowAccountManager;
 import com.android.settings.testutils.shadow.ShadowContentResolver;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.search.SearchIndexableRaw;
 
 import org.junit.After;
@@ -76,8 +75,7 @@
         doReturn(mock(DevicePolicyManager.class)).when(mContext)
                 .getSystemService(Context.DEVICE_POLICY_SERVICE);
         mController = new EmergencyInfoPreferenceController(mContext, "test_key");
-        mPreference = new Preference((Context) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get());
+        mPreference = new Preference(Robolectric.setupActivity(Activity.class));
         mPreference.setKey(mController.getPreferenceKey());
         when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
         when(mContext.getResources().getBoolean(R.bool.config_show_emergency_info_in_device_info))
diff --git a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java
index 8d8f0c1..2052f46 100644
--- a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java
@@ -53,7 +53,6 @@
 import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
 import com.android.settings.testutils.shadow.ShadowFragment;
 import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settings.widget.RestrictedButton;
 import com.android.settingslib.widget.LayoutPreference;
 
@@ -113,8 +112,8 @@
         when(mAccountManager.getAuthenticatorTypesAsUser(anyInt()))
                 .thenReturn(new AuthenticatorDescription[0]);
         when(mAccountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]);
-        mController = new RemoveAccountPreferenceController((Context) ActivityControllerWrapper
-                .setup(Robolectric.buildActivity(Activity.class)).get(), mFragment);
+        mController = new RemoveAccountPreferenceController(
+                Robolectric.setupActivity(Activity.class), mFragment);
     }
 
     @After
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java
index 5ca7415..638dabd 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java
@@ -43,7 +43,6 @@
 import com.android.settingslib.applications.ApplicationsState;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -117,7 +116,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void testAppBattery_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
index 87e4a8f..4fdf560 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
@@ -56,7 +56,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -156,7 +155,6 @@
         verify(menu.findItem(UNINSTALL_UPDATES), times(1)).setVisible(true);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void onPrepareOptionsMenu_setUpdateMenuVisible_ifDisabledByDevice_shouldBeFalse() {
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
index e948b7e..cc789c6 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
@@ -37,7 +37,6 @@
 import com.android.settings.testutils.shadow.ShadowUserManager;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -80,7 +79,6 @@
         when(mFragment.getActivity()).thenReturn(mActivity);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailabilityStatus_developmentSettingsEnabled_shouldReturnAvailable() {
@@ -109,7 +107,6 @@
                 .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailabilityStatus_developmentSettingsDisabled_shouldReturnDisabled() {
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppSettingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppSettingPreferenceControllerTest.java
index 2482945..bda1e61 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppSettingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppSettingPreferenceControllerTest.java
@@ -26,7 +26,6 @@
 import androidx.preference.Preference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -67,14 +66,12 @@
         mPreference.setKey(mController.getPreferenceKey());
     }
 
-    @Ignore
     @Test
     public void getAvailabilityStatus_noAppSetting_shouldNotBeAvailable() {
         assertThat(mController.isAvailable())
                 .isFalse();
     }
 
-    @Ignore
     @Test
     public void getAvailabilityStatus_noPackageName_shouldNotBeAvailable() {
         mController.setPackageName(null);
@@ -83,7 +80,6 @@
                 .isFalse();
     }
 
-    @Ignore
     @Test
     public void getAvailabilityStatus_hasAppSetting_shouldBeAvailable() {
         final ResolveInfo info = new ResolveInfo();
@@ -97,13 +93,11 @@
                 .isTrue();
     }
 
-    @Ignore
     @Test
     public void clickPreference_noAppSetting_shouldDoNothing() {
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
     }
 
-    @Ignore
     @Test
     public void clickPreference_hasAppSetting_shouldLaunchIntent() {
         final ResolveInfo info = new ResolveInfo();
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
index dde5914..74c0bb5 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
@@ -33,10 +33,8 @@
 import androidx.preference.Preference;
 
 import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -76,8 +74,7 @@
         MockitoAnnotations.initMocks(this);
         ShadowApplication shadowApplication = ShadowApplication.getInstance();
         shadowApplication.setSystemService(Context.ROLE_SERVICE, mRoleManager);
-        mActivity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mActivity = Robolectric.setupActivity(Activity.class);
         mShadowUserManager = shadowOf(mActivity.getSystemService(UserManager.class));
         mController = new TestRolePreferenceController(mActivity);
         when(mPreference.getKey()).thenReturn(mController.getPreferenceKey());
@@ -104,7 +101,6 @@
                 DefaultAppShortcutPreferenceControllerBase.UNSUPPORTED_ON_DEVICE);
     }
 
-    @Ignore
     @Test
     public void
     getAvailabilityStatus_noCallbackForIsRoleNotVisible_shouldReturnUnsupported() {
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java
index d035a64..85be59e 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java
@@ -35,7 +35,6 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -58,9 +57,7 @@
 
     @Before
     public void setUp() {
-        final FragmentActivity activity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
-
+        final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class);
         mContext = spy(RuntimeEnvironment.application);
         mFragment = InstantAppButtonDialogFragment.newInstance(TEST_PACKAGE);
         mFragment.show(activity.getSupportFragmentManager(), "InstantAppButtonDialogFragment");
diff --git a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
index 88377b8..178a26f 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
@@ -44,7 +44,6 @@
 import com.android.settingslib.applications.DefaultAppInfo;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -83,7 +82,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void testAssistAndVoiceInput_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsControllerTest.java
index 523112c..ed4cbd1 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsControllerTest.java
@@ -29,7 +29,6 @@
 import com.android.settings.R;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -61,7 +60,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailability_disabledByCarrier_returnUnavailable() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsScreenPreferenceControllerTest.java
index 37c3cc2..5982413 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsScreenPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsScreenPreferenceControllerTest.java
@@ -29,7 +29,6 @@
 import com.android.settings.R;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -61,7 +60,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailability_disabledByCarrier_returnUnavailable() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/EnabledVrListenersControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/EnabledVrListenersControllerTest.java
index 8c4df32..df5dfc9 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/EnabledVrListenersControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/EnabledVrListenersControllerTest.java
@@ -24,7 +24,6 @@
 import android.content.Context;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -61,7 +60,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailability_disabled_unavailable() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerScreenPreferenceControllerTest.java
index cf4e334..1e5e235 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerScreenPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerScreenPreferenceControllerTest.java
@@ -26,7 +26,6 @@
 import com.android.settings.testutils.shadow.ShadowActivityManager;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -62,7 +61,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailability_disabled_unavailable() {
diff --git a/tests/robotests/src/com/android/settings/biometrics/activeunlock/ActiveUnlockRequireBiometricSetupTest.java b/tests/robotests/src/com/android/settings/biometrics/activeunlock/ActiveUnlockRequireBiometricSetupTest.java
index 4ae1ecf..d3bbf24 100644
--- a/tests/robotests/src/com/android/settings/biometrics/activeunlock/ActiveUnlockRequireBiometricSetupTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/activeunlock/ActiveUnlockRequireBiometricSetupTest.java
@@ -29,7 +29,6 @@
 
 import com.android.settings.R;
 import com.android.settings.biometrics.BiometricEnrollActivity;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import com.google.android.setupcompat.PartnerCustomizationLayout;
 import com.google.android.setupcompat.template.FooterBarMixin;
@@ -50,8 +49,8 @@
 
     @Before
     public void setUp() {
-        mActivity = (ActiveUnlockRequireBiometricSetup) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(ActiveUnlockRequireBiometricSetup.class)).get();
+        mActivity = Robolectric.buildActivity(
+                ActiveUnlockRequireBiometricSetup.class).setup().get();
         mLayout = mActivity.findViewById(R.id.setup_wizard_layout);
     }
 
diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsFooterPreferenceControllerTest.java
index f34616f..9de2fc2 100644
--- a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsFooterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsFooterPreferenceControllerTest.java
@@ -41,7 +41,6 @@
 import com.android.settingslib.widget.FooterPreference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -57,7 +56,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 public class FaceSettingsFooterPreferenceControllerTest {
     @Rule
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
index 198bfd7..8727153 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
@@ -57,7 +57,6 @@
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import com.google.android.setupcompat.PartnerCustomizationLayout;
 import com.google.android.setupcompat.template.FooterBarMixin;
@@ -120,7 +119,7 @@
         props.add(newFingerprintSensorPropertiesInternal(TYPE_REAR));
         doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
 
-        ActivityControllerWrapper.setup(mActivityController);
+        mActivityController.setup();
     }
 
     private void setupActivity_onUdfpsDevice() {
@@ -128,7 +127,7 @@
         props.add(newFingerprintSensorPropertiesInternal(TYPE_UDFPS_OPTICAL));
         doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
 
-        ActivityControllerWrapper.setup(mActivityController);
+        mActivityController.setup();
     }
 
     private void setupActivity_onSfpsDevice() {
@@ -136,7 +135,7 @@
         props.add(newFingerprintSensorPropertiesInternal(TYPE_POWER_BUTTON));
         doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
 
-        ActivityControllerWrapper.setup(mActivityController);
+        mActivityController.setup();
     }
 
     private FingerprintSensorPropertiesInternal newFingerprintSensorPropertiesInternal(
@@ -592,7 +591,7 @@
     private void gotEnrollingResult_resumeActivityAndVerifyResultThenForward(
             int testActivityResult) {
         // resume activity
-        mActivityController.start().resume();
+        mActivityController.start().resume().visible();
         verifyNoSidecar();
 
         // onActivityResult from Enrolling activity shall be forward back
@@ -612,8 +611,7 @@
             int testActivityResult, @NonNull Bundle savedInstance) {
         // Rebuild activity and use savedInstance to restore.
         buildActivity();
-        ActivityControllerWrapper.setup(mActivityController, savedInstance);
-        //mActivityController.setup(savedInstance);
+        mActivityController.setup(savedInstance);
         verifyNoSidecar();
 
         // onActivityResult from Enrolling activity shall be forward back
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java
index d5500ad..ae580d5 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java
@@ -31,7 +31,6 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import com.google.android.setupcompat.PartnerCustomizationLayout;
 import com.google.android.setupcompat.template.FooterBarMixin;
@@ -67,8 +66,8 @@
         final Intent intent = new Intent()
                 // Set the challenge token so the confirm screen will not be shown
                 .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]);
-        mActivity = (SetupFingerprintEnrollFindSensor) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(SetupFingerprintEnrollFindSensor.class, intent)).get();
+        mActivity = Robolectric.buildActivity(SetupFingerprintEnrollFindSensor.class,
+                intent).setup().get();
         mTheme = mActivity.getTheme();
     }
 
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFinishTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFinishTest.java
index ea9cb84..e238a0e 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFinishTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFinishTest.java
@@ -30,7 +30,6 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowFingerprintManager;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import com.google.android.setupcompat.PartnerCustomizationLayout;
 import com.google.android.setupcompat.template.FooterBarMixin;
@@ -55,8 +54,7 @@
 
     @Before
     public void setUp() {
-        mActivity = (FingerprintEnrollFinish) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FingerprintEnrollFinish.class)).get();
+        mActivity = Robolectric.buildActivity(FingerprintEnrollFinish.class).setup().get();
         mLayout = mActivity.findViewById(R.id.setup_wizard_layout);
         Shadows.shadowOf(application.getPackageManager())
                 .setSystemFeature(PackageManager.FEATURE_FINGERPRINT, true);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncControllerTest.java
new file mode 100644
index 0000000..799f7fc
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncControllerTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.companion.CompanionDeviceManager;
+import android.companion.datatransfer.PermissionSyncRequest;
+
+import androidx.preference.PreferenceCategory;
+import androidx.preference.SwitchPreference;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.Collections;
+
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothDetailsDataSyncControllerTest extends BluetoothDetailsControllerTestBase {
+
+    private static final String MAC_ADDRESS = "AA:BB:CC:DD:EE:FF";
+    private static final int DUMMY_ASSOCIATION_ID = -1;
+    private static final int ASSOCIATION_ID = 1;
+    private static final String KEY_PERM_SYNC = "perm_sync";
+
+    private BluetoothDetailsDataSyncController mController;
+    @Mock
+    private Lifecycle mLifecycle;
+    @Mock
+    private PreferenceCategory mPreferenceCategory;
+    @Mock
+    private CompanionDeviceManager mCompanionDeviceManager;
+
+    private PermissionSyncRequest mPermissionSyncRequest;
+    private SwitchPreference mPermSyncPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getSystemService(CompanionDeviceManager.class)).thenReturn(
+                mCompanionDeviceManager);
+        when(mCachedDevice.getAddress()).thenReturn(MAC_ADDRESS);
+        when(mCompanionDeviceManager.getAllAssociations()).thenReturn(Collections.emptyList());
+        mPermissionSyncRequest = new PermissionSyncRequest(ASSOCIATION_ID);
+        when(mCompanionDeviceManager.getPermissionSyncRequest(ASSOCIATION_ID)).thenReturn(
+                mPermissionSyncRequest);
+
+        mController = new BluetoothDetailsDataSyncController(mContext, mFragment,
+                mCachedDevice, mLifecycle);
+        mController.mAssociationId = ASSOCIATION_ID;
+        mController.mPreferenceCategory = mPreferenceCategory;
+
+        mPermSyncPreference = mController.createPermSyncPreference(mContext);
+        when(mPreferenceCategory.findPreference(KEY_PERM_SYNC)).thenReturn(mPermSyncPreference);
+    }
+
+    @Test
+    public void isAvailable_noAssociations_returnsFalse() {
+        mController.mAssociationId = DUMMY_ASSOCIATION_ID;
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void isAvailable_hasAssociations_returnTrue() {
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void refresh_permSyncNull_checkPreferenceInvisible() {
+        mPermissionSyncRequest = null;
+        when(mCompanionDeviceManager.getPermissionSyncRequest(ASSOCIATION_ID)).thenReturn(
+                mPermissionSyncRequest);
+        mController.refresh();
+
+        assertThat(mPermSyncPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void refresh_permSyncEnabled_checkPreferenceOn() {
+        mPermissionSyncRequest.setUserConsented(true);
+        mController.refresh();
+
+        assertThat(mPermSyncPreference.isVisible()).isTrue();
+        assertThat(mPermSyncPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refresh_permSyncDisabled_checkPreferenceOff() {
+        mPermissionSyncRequest.setUserConsented(false);
+        mController.refresh();
+
+        assertThat(mPermSyncPreference.isVisible()).isTrue();
+        assertThat(mPermSyncPreference.isChecked()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
index 89e682c..8ac56dc 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
@@ -46,7 +46,6 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
@@ -231,9 +230,7 @@
         doReturn(mPreferenceScreen).when(fragment).getPreferenceScreen();
         doReturn(mUserManager).when(fragment).getUserManager();
 
-        mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get());
-
+        mActivity = spy(Robolectric.setupActivity(FragmentActivity.class));
         doReturn(mActivity).when(fragment).getActivity();
         doReturn(mContext).when(fragment).getContext();
 
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragmentTest.java
index 046a90c..f3f2b09 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragmentTest.java
@@ -36,7 +36,6 @@
 import androidx.preference.PreferenceCategory;
 
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -91,10 +90,7 @@
         doReturn(mCachedDevice).when(mFragment).getCachedDevice(any());
         doReturn(mBroadcastAssistant).when(mFragment).getLeBroadcastAssistant();
         doReturn(mPreferenceCategroy).when(mFragment).findPreference(any());
-
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
-
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         when(mFragment.getActivity()).thenReturn(mActivity);
 
         FragmentManager fragmentManager = mock(FragmentManager.class);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
index 17ab557..06dd42b 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
@@ -17,9 +17,7 @@
 
 import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE;
 import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-
 import static com.google.common.truth.Truth.assertThat;
-
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doReturn;
@@ -44,12 +42,10 @@
 import com.android.settings.R;
 import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater;
 import com.android.settings.bluetooth.Utils;
-import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowAudioManager;
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
 import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.bluetooth.BluetoothCallback;
 import com.android.settingslib.bluetooth.BluetoothEventManager;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -74,7 +70,7 @@
         ShadowAudioManager.class,
         ShadowBluetoothAdapter.class,
         ShadowBluetoothUtils.class,
-        com.android.settings.testutils.shadow.ShadowFragment.class,
+        ShadowAlertDialogCompat.class,
 })
 public class AvailableMediaDeviceGroupControllerTest {
 
@@ -82,8 +78,6 @@
     private static final String PREFERENCE_KEY_1 = "pref_key_1";
 
     @Mock
-    private DashboardFragment mDashboardFragment;
-    @Mock
     private AvailableMediaBluetoothDeviceUpdater mAvailableMediaBluetoothDeviceUpdater;
     @Mock
     private PreferenceScreen mPreferenceScreen;
@@ -114,16 +108,10 @@
         mPreference = new Preference(mContext);
         mPreference.setKey(PREFERENCE_KEY_1);
         mPreferenceGroup = spy(new PreferenceScreen(mContext, null));
-
-        final FragmentActivity mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
-
+        final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
         when(mPreferenceGroup.getPreferenceManager()).thenReturn(mPreferenceManager);
-        doReturn(mContext).when(mDashboardFragment).getContext();
         doReturn(mPackageManager).when(mContext).getPackageManager();
         doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
-        when(mDashboardFragment.getParentFragmentManager()).thenReturn(
-                mActivity.getSupportFragmentManager());
 
         ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
         mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
@@ -138,6 +126,8 @@
                 new AvailableMediaDeviceGroupController(mContext));
         mAvailableMediaDeviceGroupController.
                 setBluetoothDeviceUpdater(mAvailableMediaBluetoothDeviceUpdater);
+        mAvailableMediaDeviceGroupController.setFragmentManager(
+                mActivity.getSupportFragmentManager());
         mAvailableMediaDeviceGroupController.mPreferenceGroup = mPreferenceGroup;
     }
 
@@ -251,18 +241,17 @@
     }
 
     @Test
-    @Config(shadows = ShadowAlertDialogCompat.class)
     public void onActiveDeviceChanged_hearingAidProfile_launchHearingAidPairingDialog() {
         when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true);
         when(mCachedBluetoothDevice.getDeviceMode()).thenReturn(
                 HearingAidInfo.DeviceMode.MODE_BINAURAL);
         when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
                 HearingAidInfo.DeviceSide.SIDE_LEFT);
-        mAvailableMediaDeviceGroupController.init(mDashboardFragment);
 
         mAvailableMediaDeviceGroupController.onActiveDeviceChanged(mCachedBluetoothDevice,
                 BluetoothProfile.HEARING_AID);
         shadowMainLooper().idle();
+
         final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
         assertThat(dialog.isShowing()).isTrue();
     }
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
index eea561a..66f314d 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
@@ -24,7 +24,6 @@
 import android.content.Context;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -48,7 +47,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailabilityStatus_unsupportedWhenSet() {
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
index 42c994a..8257b43 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
@@ -44,7 +44,6 @@
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -223,7 +222,6 @@
         assertThat(prefs.get(3).isChecked()).isFalse();
     }
 
-    @Ignore
     @Test
     public void onClickNone_mtpEnabled_shouldDisableMtp() {
         when(mUsbBackend.areFunctionsSupported(anyLong())).thenReturn(true);
diff --git a/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java b/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java
index d8f4a90..3040039 100644
--- a/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java
+++ b/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java
@@ -31,7 +31,6 @@
 import androidx.appcompat.app.AppCompatActivity;
 
 import com.android.settings.core.CategoryMixin.CategoryListener;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -54,7 +53,7 @@
 
     @Test
     public void resumeActivity_shouldRegisterReceiver() {
-        ActivityControllerWrapper.setup(mActivityController);
+        mActivityController.setup();
 
         final TestActivity activity = mActivityController.get();
         assertThat(activity.getRegisteredReceivers()).isNotEmpty();
@@ -62,7 +61,7 @@
 
     @Test
     public void pauseActivity_shouldUnregisterReceiver() {
-        ActivityControllerWrapper.setup(mActivityController).pause();
+        mActivityController.setup().pause();
 
         final TestActivity activity = mActivityController.get();
         assertThat(activity.getRegisteredReceivers()).isEmpty();
@@ -70,7 +69,7 @@
 
     @Test
     public void onCategoriesChanged_listenerAdded_shouldNotifyChanged() {
-        ActivityControllerWrapper.setup(mActivityController).pause();
+        mActivityController.setup().pause();
         final CategoryMixin categoryMixin = mActivityController.get().getCategoryMixin();
         final CategoryListener listener = mock(CategoryListener.class);
         categoryMixin.addCategoryListener(listener);
diff --git a/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java b/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java
index 2f6940f..d74fab3 100644
--- a/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java
+++ b/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.core;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
@@ -33,8 +31,7 @@
      */
     @Test
     public void canInstantiate() {
-        ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(InstrumentedActivityTestable.class)).get();
+        Robolectric.buildActivity(InstrumentedActivityTestable.class).setup().get();
     }
 
     public static class InstrumentedActivityTestable extends InstrumentedActivity {
diff --git a/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java b/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java
index 34eab02..68dfb79 100644
--- a/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java
+++ b/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java
@@ -25,7 +25,6 @@
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -45,7 +44,6 @@
         mContext = RuntimeEnvironment.application;
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getControllers_shouldReturnAList() {
@@ -59,7 +57,6 @@
         }
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc998")
     public void getControllers_partialFailure_shouldReturnTheRest() {
diff --git a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
index b1aa321..f489123 100644
--- a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
@@ -34,7 +34,6 @@
 import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -51,7 +50,6 @@
  * If changing a preference file breaks a test in this test file, please replace its reference
  * with another preference with a matching replacement attribute.
  */
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 public class PreferenceXmlParserUtilsTest {
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index ecaf36f..cfbdd75 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -66,7 +66,6 @@
 import com.android.settingslib.drawer.Tile;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -236,7 +235,6 @@
         verify(mTestFragment.mScreen, never()).addPreference(nullable(Preference.class));
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void displayTilesAsPreference_shouldNotAddSuppressedTiles() {
diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
index fa61a33..6a1c0a6 100644
--- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
@@ -67,7 +67,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -83,7 +82,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowEntityHeaderController.class, ShadowRestrictedLockUtilsInternal.class})
 public class AppDataUsageTest {
diff --git a/tests/robotests/src/com/android/settings/datausage/ChartDataUsagePreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/ChartDataUsagePreferenceTest.java
index aee91f3..aab67be 100644
--- a/tests/robotests/src/com/android/settings/datausage/ChartDataUsagePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/ChartDataUsagePreferenceTest.java
@@ -31,7 +31,6 @@
 
 import com.android.settings.R;
 import com.android.settings.datausage.ChartDataUsagePreference.DataUsageSummaryNode;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settings.widget.UsageView;
 import com.android.settingslib.net.NetworkCycleChartData;
 import com.android.settingslib.net.NetworkCycleData;
@@ -65,8 +64,8 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mActivity = spy((Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get());
+
+        mActivity = spy(Robolectric.setupActivity(Activity.class));
         mPreference = new ChartDataUsagePreference(mActivity, null /* attrs */);
         LayoutInflater inflater = LayoutInflater.from(mActivity);
         View view = inflater.inflate(mPreference.getLayoutResource(), null /* root */,
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
index 762fbf8..4640efe 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
@@ -54,7 +54,6 @@
 import com.android.settingslib.net.NetworkCycleChartData;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -71,7 +70,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 public class DataUsageListTest {
 
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/BaseTimeZonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/BaseTimeZonePreferenceControllerTest.java
index d952438..865c2eb 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/BaseTimeZonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/BaseTimeZonePreferenceControllerTest.java
@@ -18,15 +18,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.spy;
-
 import android.app.Activity;
 import android.content.Context;
 
 import androidx.preference.Preference;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -40,8 +36,7 @@
 
     @Before
     public void setUp() {
-        mActivity = spy((Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get());
+        mActivity = Robolectric.setupActivity(Activity.class);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/FixedOffsetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/FixedOffsetPreferenceControllerTest.java
index 5b6d8bd..4a6f92f 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/FixedOffsetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/FixedOffsetPreferenceControllerTest.java
@@ -23,8 +23,6 @@
 
 import androidx.preference.Preference;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -38,8 +36,7 @@
 
     @Before
     public void setUp() {
-        mActivity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mActivity = Robolectric.setupActivity(Activity.class);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/RegionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/RegionPreferenceControllerTest.java
index 6689a1f..ea0be24 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/RegionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/RegionPreferenceControllerTest.java
@@ -18,14 +18,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.spy;
-
 import android.app.Activity;
 
 import androidx.preference.Preference;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -39,8 +35,7 @@
 
     @Before
     public void setUp() {
-        mActivity = spy((Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get());
+        mActivity = Robolectric.setupActivity(Activity.class);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/RegionSearchPickerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/RegionSearchPickerTest.java
index 69d46ea..78055cf 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/RegionSearchPickerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/RegionSearchPickerTest.java
@@ -33,7 +33,6 @@
 import com.android.settings.datetime.timezone.BaseTimeZoneAdapter.ItemViewHolder;
 import com.android.settings.datetime.timezone.RegionSearchPicker.RegionItem;
 import com.android.settings.datetime.timezone.model.TimeZoneData;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -143,8 +142,7 @@
     @Implements(Fragment.class)
     public static class ShadowFragment {
 
-        private FragmentActivity mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        private FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
 
         @Implementation
         public final FragmentActivity getActivity() {
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePreferenceControllerTest.java
index f0cb6e8..6d1bf66 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePreferenceControllerTest.java
@@ -23,8 +23,6 @@
 
 import androidx.preference.Preference;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -38,8 +36,7 @@
 
     @Before
     public void setUp() {
-        mActivity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mActivity = Robolectric.setupActivity(Activity.class);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
index 9268a72..d469c71 100644
--- a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import androidx.preference.SwitchPreference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -60,7 +59,6 @@
         mController.displayPreference(mScreen);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_withConfigNoShow_shouldReturnFalse() {
diff --git a/tests/robotests/src/com/android/settings/development/CoolColorTemperaturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CoolColorTemperaturePreferenceControllerTest.java
index f0e8292..cf84618 100644
--- a/tests/robotests/src/com/android/settings/development/CoolColorTemperaturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/CoolColorTemperaturePreferenceControllerTest.java
@@ -31,7 +31,6 @@
 import androidx.preference.SwitchPreference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -100,7 +99,6 @@
         verify(mPreference).setChecked(false);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_shouldBeFalse() {
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPageTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPageTest.java
index 052f705..2d4ce43 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPageTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPageTest.java
@@ -24,7 +24,6 @@
 import com.android.settings.R;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPreferenceControllerTest.java
index 18cacc6..d4af470 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPreferenceControllerTest.java
@@ -38,7 +38,6 @@
 import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -47,7 +46,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowSystemProperties;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 @Config(
         shadows = {
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java
index ccfd68b..6b4068d 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java
@@ -21,7 +21,6 @@
 import android.content.Context;
 
 import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,8 +34,7 @@
 
     @Test
     public void launchActivity_shouldShowToast() {
-        ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(DevelopmentSettingsDisabledActivity.class)).get();
+        Robolectric.setupActivity(DevelopmentSettingsDisabledActivity.class);
 
         final Context context = RuntimeEnvironment.application;
         assertThat(ShadowToast.getTextOfLatestToast())
diff --git a/tests/robotests/src/com/android/settings/development/RebootWithMtePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/RebootWithMtePreferenceControllerTest.java
index ad7d48e..f1e7d3f 100644
--- a/tests/robotests/src/com/android/settings/development/RebootWithMtePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/RebootWithMtePreferenceControllerTest.java
@@ -27,7 +27,6 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -60,7 +59,6 @@
         assertFalse(mController.isAvailable());
     }
 
-    @Ignore
     @Test
     public void onAvailable_sysPropEnabled() {
         SystemProperties.set("ro.arm64.memtag.bootctl_supported", "1");
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
index 9da9e20..ccc91e6 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
@@ -35,8 +35,6 @@
 
 import androidx.preference.Preference;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -60,8 +58,7 @@
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
-        mContext = spy((Context) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get());
+        mContext = spy(Robolectric.setupActivity(Activity.class));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicensePreferenceTest.java b/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicensePreferenceTest.java
index 304c5a5..08eec9e 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicensePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicensePreferenceTest.java
@@ -23,8 +23,6 @@
 import android.content.Intent;
 import android.content.pm.ModuleInfo;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -44,8 +42,7 @@
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
-        mContext = (Context) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mContext = Robolectric.setupActivity(Activity.class);
         mModuleInfo = new ModuleInfo();
         mModuleInfo.setPackageName(PACKAGE_NAME);
         mModuleInfo.setName(NAME);
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceControllerTest.java
index 7831207..c06f069 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceControllerTest.java
@@ -22,7 +22,6 @@
 import com.android.settings.core.BasePreferenceController;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -49,7 +48,6 @@
                 .isEqualTo(BasePreferenceController.AVAILABLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailabilityStatus_ifNotVisible_false() {
diff --git a/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
index 5d8d46b..3ad14e5 100644
--- a/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
@@ -36,7 +36,6 @@
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -140,7 +139,6 @@
         assertThat(controller.isSliceable()).isTrue();
     }
 
-    @Ignore
     @Test
     public void isSliceableIncorrectKey_returnsFalse() {
         final AmbientDisplayAlwaysOnPreferenceController controller =
@@ -148,7 +146,6 @@
         assertThat(controller.isSliceable()).isFalse();
     }
 
-    @Ignore
     @Test
     public void isPublicSlice_returnTrue() {
         assertThat(mController.isPublicSlice()).isTrue();
diff --git a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
index 1076d15..bbc9cf3 100644
--- a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
@@ -40,7 +40,6 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.core.SettingsBaseActivity;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.transition.SettingsTransitionHelper;
 
 import org.junit.Before;
@@ -166,9 +165,7 @@
 
     @Test
     public void handlePreferenceTreeClick_transitionTypeNone_shouldPassToNextActivity() {
-        final Activity activity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
-
+        final Activity activity = Robolectric.setupActivity(Activity.class);
         final BrightnessLevelPreferenceController controller =
                 new BrightnessLevelPreferenceController(activity, null);
         final ShadowActivity shadowActivity = shadowOf(activity);
diff --git a/tests/robotests/src/com/android/settings/display/ControlsTrivialPrivacyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/ControlsTrivialPrivacyPreferenceControllerTest.java
index f276af0..a82e1f1 100644
--- a/tests/robotests/src/com/android/settings/display/ControlsTrivialPrivacyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/ControlsTrivialPrivacyPreferenceControllerTest.java
@@ -44,7 +44,6 @@
 import com.android.settings.core.BasePreferenceController;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -147,7 +146,6 @@
         verify(mPreference, atLeastOnce()).setSummary(mController.getSummary());
     }
 
-    @Ignore
     @Test
     public void updateStateWithCustomizableLockScreenQuickAffordancesEnabled() {
         setCustomizableLockScreenQuickAffordancesEnabled(true);
@@ -168,7 +166,6 @@
                 BasePreferenceController.DISABLED_DEPENDENT_SETTING);
     }
 
-    @Ignore
     @Test
     public void getAvailabilityStatusWithCustomizableLockScreenQuickAffordancesEnabled() {
         setCustomizableLockScreenQuickAffordancesEnabled(true);
diff --git a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
index 01bb338..bdff55e 100644
--- a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
@@ -50,7 +50,6 @@
 import com.android.settingslib.devicestate.DeviceStateRotationLockSettingsManager;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -177,7 +176,6 @@
         assertThat(preferenceControllers).isEmpty();
     }
 
-    @Ignore
     @Test
     public void createPreferenceControllers_settableDeviceStates_returnsDeviceStateControllers() {
         enableDeviceStateSettableRotationStates(new String[]{"0:1", "1:1"},
diff --git a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
index 2ba0557..a5149b9 100644
--- a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
@@ -26,7 +26,6 @@
 import android.content.Context;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -51,7 +50,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailabilityStatus_unsupportedWhenSet() {
diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
index 8ae2a8d..6db008d 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
@@ -45,7 +45,6 @@
 import com.android.settings.testutils.shadow.ShadowActivity;
 import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
 import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 import org.junit.Before;
@@ -78,8 +77,7 @@
 
     @Before
     public void setUp() {
-        mActivity = (CustomActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(CustomActivity.class)).get();
+        mActivity = Robolectric.setupActivity(CustomActivity.class);
         mActivityShadow = Shadow.extract(mActivity);
         mHelper = new ActionDisabledByAdminDialogHelper(mActivity);
     }
diff --git a/tests/robotests/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java
index e91f56f..a2a0de4 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java
@@ -31,7 +31,6 @@
 import com.android.settingslib.utils.StringUtil;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -84,7 +83,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/flashlight/FlashlightHandleActivityTest.java b/tests/robotests/src/com/android/settings/flashlight/FlashlightHandleActivityTest.java
index a7bd21c..b0517cb 100644
--- a/tests/robotests/src/com/android/settings/flashlight/FlashlightHandleActivityTest.java
+++ b/tests/robotests/src/com/android/settings/flashlight/FlashlightHandleActivityTest.java
@@ -23,7 +23,6 @@
 import com.android.settingslib.search.SearchIndexableRaw;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -50,7 +49,6 @@
         assertThat(data).isEmpty();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getRawDataToIndex_sliceSupported_returnData() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
index 13d60bb..7dc4eab 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
@@ -18,6 +18,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.util.Pair;
+
+import com.android.settings.testutils.BatteryTestUtils;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -211,4 +215,29 @@
         assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getLevels())
                 .isEqualTo(List.of(100, 98));
     }
+
+    @Test
+    public void getIndexByTimestamps_returnExpectedResult() {
+        final BatteryLevelData batteryLevelData =
+                new BatteryLevelData(Map.of(
+                        1694354400000L, 1,      // 2023-09-10 22:00:00
+                        1694361600000L, 2,      // 2023-09-11 00:00:00
+                        1694368800000L, 3));    // 2023-09-11 02:00:00
+        final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
+
+        assertThat(batteryLevelData.getIndexByTimestamps(0L, 0L))
+                .isEqualTo(Pair.create(BatteryChartViewModel.SELECTED_INDEX_INVALID,
+                        BatteryChartViewModel.SELECTED_INDEX_INVALID));
+        assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L + 1L, 1694368800000L + 1L))
+                .isEqualTo(Pair.create(BatteryChartViewModel.SELECTED_INDEX_INVALID,
+                        BatteryChartViewModel.SELECTED_INDEX_INVALID));
+        assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L, 1694368800000L))
+                .isEqualTo(Pair.create(1, 0));
+        assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L + 1L, 1694368800000L - 1L))
+                .isEqualTo(Pair.create(1, 0));
+        assertThat(batteryLevelData.getIndexByTimestamps(
+                event.getWarningItemInfo().getStartTimestamp(),
+                event.getWarningItemInfo().getEndTimestamp()))
+                .isEqualTo(Pair.create(1, 0));
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
index ac67dfd..630ff45 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
@@ -19,7 +19,9 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -45,16 +47,24 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
+import java.util.Map;
+import java.util.Optional;
+
 @RunWith(RobolectricTestRunner.class)
 public final class BatteryTipsCardPreferenceTest {
 
     private Context mContext;
     private FakeFeatureFactory mFeatureFactory;
     private BatteryTipsCardPreference mBatteryTipsCardPreference;
+    private PowerUsageAdvanced mPowerUsageAdvanced;
     private BatteryTipsController mBatteryTipsController;
 
     @Mock
     private View mFakeView;
+    @Mock
+    private BatteryChartPreferenceController mBatteryChartPreferenceController;
+    @Mock
+    private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
 
     @Before
     public void setUp() {
@@ -64,6 +74,14 @@
         mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null);
         mBatteryTipsController = new BatteryTipsController(mContext);
         mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference;
+        mPowerUsageAdvanced = new PowerUsageAdvanced();
+        mPowerUsageAdvanced.mBatteryTipsController = mBatteryTipsController;
+        mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
+        mPowerUsageAdvanced.mBatteryUsageBreakdownController = mBatteryUsageBreakdownController;
+        mPowerUsageAdvanced.mBatteryLevelData = Optional.of(new BatteryLevelData(Map.of(
+                1694354400000L, 1,      // 2023-09-10 22:00:00
+                1694361600000L, 2,      // 2023-09-11 00:00:00
+                1694368800000L, 3)));    // 2023-09-11 02:00:00
     }
 
     @Test
@@ -71,8 +89,9 @@
         assertThat(mBatteryTipsCardPreference.getLayoutResource()).isEqualTo(
                 R.layout.battery_tips_card);
     }
+
     @Test
-    public void onClick_mainBtn_getAdaptiveBrightnessLauncher() {
+    public void onClick_mainBtnOfSettingsAnomaly_getAdaptiveBrightnessLauncher() {
         final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
         PowerAnomalyEvent adaptiveBrightnessAnomaly =
                 BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
@@ -80,10 +99,10 @@
         when(mFakeView.getId()).thenReturn(R.id.main_button);
         doNothing().when(mContext).startActivity(captor.capture());
 
-        mBatteryTipsController.handleBatteryTipsCardUpdated(adaptiveBrightnessAnomaly);
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(adaptiveBrightnessAnomaly);
         mBatteryTipsCardPreference.onClick(mFakeView);
 
-        assertThat(mBatteryTipsCardPreference.isVisible()).isEqualTo(false);
+        assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
         verify(mContext).startActivity(any(Intent.class));
         final Intent intent = captor.getValue();
         assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
@@ -96,21 +115,53 @@
 
     @Test
     public void onClick_dismissBtn_cardDismissAndLogged() {
-        PowerAnomalyEvent screenTimeoutAnomaly =
+        final PowerAnomalyEvent screenTimeoutAnomaly =
                 BatteryTestUtils.createScreenTimeoutAnomalyEvent();
         DatabaseUtils.removeDismissedPowerAnomalyKeys(mContext);
         when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
         when(mFakeView.getId()).thenReturn(R.id.dismiss_button);
 
-        mBatteryTipsController.handleBatteryTipsCardUpdated(screenTimeoutAnomaly);
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(screenTimeoutAnomaly);
         mBatteryTipsCardPreference.onClick(mFakeView);
 
-        assertThat(mBatteryTipsCardPreference.isVisible()).isEqualTo(false);
-        assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext).size())
-                .isEqualTo(1);
+        assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
+        assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext)).hasSize(1);
         assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext))
                 .contains(PowerAnomalyKey.KEY_SCREEN_TIMEOUT.name());
         verify(mFeatureFactory.metricsFeatureProvider).action(
                 mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "ScreenTimeoutAnomaly");
     }
+
+    @Test
+    public void onClick_mainBtnOfAppsAnomaly_selectHighlightSlot() {
+        final PowerAnomalyEvent appsAnomaly = BatteryTestUtils.createAppAnomalyEvent();
+        when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
+        when(mFakeView.getId()).thenReturn(R.id.main_button);
+
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(appsAnomaly);
+        mBatteryTipsCardPreference.onClick(mFakeView);
+
+        assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
+        verify(mContext, never()).startActivity(any(Intent.class));
+        verify(mBatteryChartPreferenceController).selectHighlightSlotIndex();
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, "AppAnomaly");
+    }
+
+    @Test
+    public void onClick_dismissBtnOfAppsAnomaly_removeHighlightSlotIndex() {
+        final PowerAnomalyEvent appsAnomaly = BatteryTestUtils.createAppAnomalyEvent();
+        when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
+        when(mFakeView.getId()).thenReturn(R.id.dismiss_button);
+
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(appsAnomaly);
+        mBatteryTipsCardPreference.onClick(mFakeView);
+
+        assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
+        verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
+                eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
+                eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "AppAnomaly");
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
index ac9de1f..913c00a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.fuelgauge.batteryusage;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -74,13 +76,25 @@
     }
 
     @Test
+    public void getDismissRecordKey_returnExpectedResult() {
+        assertThat(BatteryTipsController.getDismissRecordKey(
+                BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent()))
+                .isEqualTo("KEY_BRIGHTNESS");
+        assertThat(BatteryTipsController.getDismissRecordKey(
+                BatteryTestUtils.createScreenTimeoutAnomalyEvent()))
+                .isEqualTo("KEY_SCREEN_TIMEOUT");
+        assertThat(BatteryTipsController.getDismissRecordKey(
+                BatteryTestUtils.createAppAnomalyEvent()))
+                .isEqualTo("KEY_APP_1");
+    }
+
+    @Test
     public void handleBatteryTipsCardUpdated_adaptiveBrightnessAnomaly_showAnomaly() {
         PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
         when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
 
         mBatteryTipsController.handleBatteryTipsCardUpdated(event);
 
-        verify(mBatteryTipsCardPreference).setAnomalyEventId("BrightnessAnomaly");
         // Check pre-defined string
         verify(mBatteryTipsCardPreference).setTitle(
                 "Turn on adaptive brightness to extend battery life");
@@ -90,9 +104,6 @@
         verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
         verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
         // Check proto info
-        verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
-                "com.android.settings.DisplaySettings",
-                46, "auto_brightness_entry");
         verify(mBatteryTipsCardPreference).setVisible(true);
         verify(mFeatureFactory.metricsFeatureProvider).action(
                 mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "BrightnessAnomaly");
@@ -105,16 +116,12 @@
 
         mBatteryTipsController.handleBatteryTipsCardUpdated(event);
 
-        verify(mBatteryTipsCardPreference).setAnomalyEventId("ScreenTimeoutAnomaly");
         verify(mBatteryTipsCardPreference).setTitle("Reduce screen timeout to extend battery life");
         verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
         verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
                 R.color.color_accent_selector);
         verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
         verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
-        verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
-                "com.android.settings.display.ScreenTimeoutSettings",
-                1852, "60000");
         verify(mBatteryTipsCardPreference).setVisible(true);
         verify(mFeatureFactory.metricsFeatureProvider).action(
                 mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "ScreenTimeoutAnomaly");
@@ -134,16 +141,12 @@
 
         mBatteryTipsController.handleBatteryTipsCardUpdated(event);
 
-        verify(mBatteryTipsCardPreference).setAnomalyEventId("ScreenTimeoutAnomaly");
         verify(mBatteryTipsCardPreference).setTitle(testTitle);
         verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
         verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
                 R.color.color_accent_selector);
         verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
         verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
-        verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
-                "com.android.settings.display.ScreenTimeoutSettings",
-                1852, "60000");
         verify(mBatteryTipsCardPreference).setVisible(true);
         verify(mFeatureFactory.metricsFeatureProvider).action(
                 mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "ScreenTimeoutAnomaly");
@@ -156,7 +159,6 @@
 
         mBatteryTipsController.handleBatteryTipsCardUpdated(event);
 
-        verify(mBatteryTipsCardPreference).setAnomalyEventId("AppAnomaly");
         verify(mBatteryTipsCardPreference).setTitle(
                 "Chrome used more battery than usual in foreground");
         verify(mBatteryTipsCardPreference).setIconResourceId(
@@ -165,8 +167,6 @@
                 R.color.color_battery_anomaly_yellow_selector);
         verify(mBatteryTipsCardPreference).setMainButtonLabel("Check");
         verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
-        verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
-                null, null, null);
         verify(mBatteryTipsCardPreference).setVisible(true);
         verify(mFeatureFactory.metricsFeatureProvider).action(
                 mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
index ee2a8b2..953c2d4 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
@@ -17,9 +17,15 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.ArgumentMatchers.notNull;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
 import android.content.Context;
+import android.util.Pair;
 
 import com.android.settings.testutils.BatteryTestUtils;
 import com.android.settings.testutils.shadow.ShadowDashboardFragment;
@@ -27,19 +33,47 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
+import java.util.Map;
+import java.util.Optional;
+import java.util.TimeZone;
+
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = ShadowDashboardFragment.class)
 public final class PowerUsageAdvancedTest {
 
     private Context mContext;
+    private PowerUsageAdvanced mPowerUsageAdvanced;
+
+    @Mock
+    private BatteryTipsController mBatteryTipsController;
+    @Mock
+    private BatteryChartPreferenceController mBatteryChartPreferenceController;
+    @Mock
+    private ScreenOnTimeController mScreenOnTimeController;
+    @Mock
+    private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
 
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
         mContext = spy(RuntimeEnvironment.application);
+
+        mPowerUsageAdvanced = new PowerUsageAdvanced();
+        mPowerUsageAdvanced.mBatteryTipsController = mBatteryTipsController;
+        mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
+        mPowerUsageAdvanced.mScreenOnTimeController = mScreenOnTimeController;
+        mPowerUsageAdvanced.mBatteryUsageBreakdownController = mBatteryUsageBreakdownController;
+        mPowerUsageAdvanced.mBatteryLevelData = Optional.of(new BatteryLevelData(Map.of(
+                1694354400000L, 1,      // 2023-09-10 22:00:00
+                1694361600000L, 2,      // 2023-09-11 00:00:00
+                1694368800000L, 3)));    // 2023-09-11 02:00:00
     }
 
     @Test
@@ -87,6 +121,65 @@
         final PowerAnomalyEvent highestScoreEvent =
                 PowerUsageAdvanced.getHighestScoreAnomalyEvent(mContext, powerAnomalyEventList);
 
-        assertThat(highestScoreEvent).isEqualTo(null);
+        assertThat(highestScoreEvent).isNull();
+    }
+
+    @Test
+    public void onDisplayAnomalyEventUpdated_withSettingsAnomalyEvent_skipHighlightSlotEffect() {
+        final PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
+
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
+
+        assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isEqualTo(event);
+        verify(mBatteryTipsController).handleBatteryTipsCardUpdated(eq(event));
+        verify(mPowerUsageAdvanced.mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
+        verify(mPowerUsageAdvanced.mBatteryTipsController).setOnAnomalyRejectListener(isNull());
+        verify(mPowerUsageAdvanced.mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
+                eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
+                eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
+    }
+
+    @Test
+    public void onDisplayAnomalyEventUpdated_withAppAnomalyEvent_setHighlightSlotEffect() {
+        final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
+
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
+
+        assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isEqualTo(event);
+        verify(mBatteryTipsController).handleBatteryTipsCardUpdated(eq(event));
+        verify(mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
+        verify(mBatteryTipsController).setOnAnomalyRejectListener(isNull());
+
+        assertThat(event.getWarningItemInfo().hasStartTimestamp()).isTrue();
+        assertThat(event.getWarningItemInfo().hasEndTimestamp()).isTrue();
+        assertThat(mPowerUsageAdvanced.mBatteryLevelData.get().getIndexByTimestamps(
+                event.getWarningItemInfo().getStartTimestamp(),
+                event.getWarningItemInfo().getEndTimestamp()
+        )).isEqualTo(Pair.create(1, 0));
+        verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
+        verify(mBatteryTipsController).setOnAnomalyConfirmListener(notNull());
+        verify(mBatteryTipsController).setOnAnomalyRejectListener(notNull());
+    }
+
+    @Test
+    public void onDisplayAnomalyEventUpdated_withNull_removeHighlightSlotEffect() {
+        final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
+
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(null);
+
+        assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isNull();
+        verify(mBatteryTipsController, times(2))
+                .setOnAnomalyConfirmListener(isNull());
+        verify(mBatteryTipsController, times(2))
+                .setOnAnomalyRejectListener(isNull());
+        verify(mBatteryTipsController).setOnAnomalyConfirmListener(notNull());
+        verify(mBatteryTipsController).setOnAnomalyRejectListener(notNull());
+
+        verify(mBatteryChartPreferenceController)
+                .onHighlightSlotIndexUpdate(eq(1), eq(0));
+        verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
+                eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
+                eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
index 6bb8cd6..c281dca 100644
--- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
@@ -55,7 +55,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -106,7 +105,6 @@
         assertThat(avatarView.getVisibility()).isNotEqualTo(View.VISIBLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void launch_configEnabled_shouldShowAvatar() {
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
index f3c3e12..f18d94f 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
@@ -61,7 +61,6 @@
 import com.android.settingslib.core.lifecycle.events.OnStop;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -152,7 +151,6 @@
         assertThat(actual).containsExactlyElementsIn(expected);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void loadContextualCards_restartLoaderNotNeeded_shouldInitLoader() {
@@ -162,7 +160,6 @@
                 any(ContextualCardManager.CardContentLoaderCallbacks.class));
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void loadContextualCards_restartLoaderNeeded_shouldRestartLoaderAndSetIsFirstLaunch() {
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BackgroundDataConditionControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BackgroundDataConditionControllerTest.java
index 1413be3..aa4e11f 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BackgroundDataConditionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BackgroundDataConditionControllerTest.java
@@ -25,7 +25,6 @@
 import android.net.NetworkPolicyManager;
 
 import com.android.settings.Settings;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -53,8 +52,7 @@
         MockitoAnnotations.initMocks(this);
         ShadowApplication.getInstance().setSystemService(Context.NETWORK_POLICY_SERVICE,
                 mNetworkPolicyManager);
-        mActivity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mActivity = Robolectric.setupActivity(Activity.class);
         mController = new BackgroundDataConditionController(mActivity, mConditionManager);
     }
 
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionControllerTest.java
index aedd601..299780c 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionControllerTest.java
@@ -24,7 +24,6 @@
 import android.content.ComponentName;
 
 import com.android.settings.Settings;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -47,8 +46,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mActivity = spy((Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get());
+        mActivity = spy(Robolectric.setupActivity(Activity.class));
         mController = new WorkModeConditionController(mActivity, mConditionManager);
     }
 
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java
index 582c4a1..502a62b 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java
@@ -34,7 +34,6 @@
 import com.android.settingslib.suggestions.SuggestionController;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -69,7 +68,6 @@
         assertThat(controller.mSuggestionController).isNotNull();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void init_configOff_shouldNotCreateSuggestionController() {
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java
index b8b2aa8..8c25260 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java
@@ -144,7 +144,6 @@
                 .isEqualTo(ContextualCardFeedbackDialog.class.getName());
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isFeedbackEnabled_hasFeedbackEmail_debug_returnTrue() {
diff --git a/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java
index ea4675d..ae5afd2 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import android.view.InputDevice;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -111,7 +110,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailabilityStatus_ifDisabled_shouldReturnDisabled() {
diff --git a/tests/robotests/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerTest.java b/tests/robotests/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerTest.java
index 5d67955..2d4af3c 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerTest.java
@@ -27,7 +27,6 @@
 import androidx.fragment.app.FragmentActivity;
 
 import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -49,8 +48,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mFragment = spy(new InputMethodAndSubtypeEnabler());
         when(mFragment.getActivity()).thenReturn(mActivity);
     }
diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardLayoutPickerControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardLayoutPickerControllerTest.java
index 7840bfd..734f610 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/KeyboardLayoutPickerControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardLayoutPickerControllerTest.java
@@ -39,7 +39,6 @@
 import com.android.settings.testutils.shadow.ShadowInputDevice;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -50,7 +49,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 public class KeyboardLayoutPickerControllerTest {
 
diff --git a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
index 0a5be27..dd6da3b 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import androidx.preference.Preference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -78,7 +77,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void testVirtualKeyboard_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
index e2c39ec..4429dd7 100644
--- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
@@ -45,7 +45,6 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -115,7 +114,6 @@
         assertThat(controllers.isEmpty()).isFalse();
     }
 
-    @Ignore
     @Test
     public void testNonIndexableKeys_existInXmlLayout() {
         final Context context = spy(RuntimeEnvironment.application);
diff --git a/tests/robotests/src/com/android/settings/language/PhoneLanguagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/language/PhoneLanguagePreferenceControllerTest.java
index 8a362cd..aa4c32e 100644
--- a/tests/robotests/src/com/android/settings/language/PhoneLanguagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/language/PhoneLanguagePreferenceControllerTest.java
@@ -31,7 +31,6 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -94,7 +93,6 @@
                 .isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void testIsAvailable_ifDisabled_shouldReturnFalse() {
diff --git a/tests/robotests/src/com/android/settings/language/PointerSpeedControllerTest.java b/tests/robotests/src/com/android/settings/language/PointerSpeedControllerTest.java
index 9a3fe55..a917a6d 100644
--- a/tests/robotests/src/com/android/settings/language/PointerSpeedControllerTest.java
+++ b/tests/robotests/src/com/android/settings/language/PointerSpeedControllerTest.java
@@ -23,7 +23,6 @@
 import android.content.Context;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -34,25 +33,24 @@
 @RunWith(RobolectricTestRunner.class)
 public class PointerSpeedControllerTest {
 
-    private Context mContext;
-    private PointerSpeedController mController;
+  private Context mContext;
+  private PointerSpeedController mController;
 
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application.getApplicationContext());
-        mController = new PointerSpeedController(mContext);
-    }
+  @Before
+  public void setUp() {
+    MockitoAnnotations.initMocks(this);
+    mContext = spy(RuntimeEnvironment.application.getApplicationContext());
+    mController = new PointerSpeedController(mContext);
+  }
 
-    @Test
-    public void testDeviceAdministrators_byDefault_shouldBeShown() {
-        assertThat(mController.isAvailable()).isTrue();
-    }
+  @Test
+  public void testDeviceAdministrators_byDefault_shouldBeShown() {
+    assertThat(mController.isAvailable()).isTrue();
+  }
 
-    @Ignore
-    @Test
-    @Config(qualifiers = "mcc999")
-    public void testDeviceAdministrators_ifDisabled_shouldNotBeShown() {
-        assertThat(mController.isAvailable()).isFalse();
-    }
+  @Test
+  @Config(qualifiers = "mcc999")
+  public void testDeviceAdministrators_ifDisabled_shouldNotBeShown() {
+    assertThat(mController.isAvailable()).isFalse();
+  }
 }
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java
index bb22012..c8637c8 100644
--- a/tests/robotests/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java
@@ -36,7 +36,6 @@
 
 import com.android.internal.app.LocaleStore;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -65,8 +64,7 @@
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mDialogFragment = LocaleDialogFragment.newInstance();
         LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(Locale.ENGLISH);
         Bundle args = new Bundle();
diff --git a/tests/robotests/src/com/android/settings/location/LocationInjectedServicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationInjectedServicesPreferenceControllerTest.java
index 49caa70..bed3346 100644
--- a/tests/robotests/src/com/android/settings/location/LocationInjectedServicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationInjectedServicesPreferenceControllerTest.java
@@ -44,7 +44,6 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -115,7 +114,6 @@
         verify(mContext).unregisterReceiver(mController.mInjectedSettingsReceiver);
     }
 
-    @Ignore
     @Test
     public void workProfileDisallowShareLocationOn_getParentUserLocationServicesOnly() {
         final int fakeWorkProfileId = 123;
@@ -168,7 +166,6 @@
         verify(mSettingsInjector).reloadStatusMessages();
     }
 
-    @Ignore
     @Test
     public void withUserRestriction_shouldDisableLocationAccuracy() {
         final List<Preference> preferences = new ArrayList<>();
diff --git a/tests/robotests/src/com/android/settings/location/LocationServicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationServicesPreferenceControllerTest.java
index dacb7cf..f5868c2 100644
--- a/tests/robotests/src/com/android/settings/location/LocationServicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationServicesPreferenceControllerTest.java
@@ -23,7 +23,6 @@
 import android.content.Context;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -50,7 +49,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void testLocationScanning_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
index 8d6d2d9..bf866b2 100644
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
@@ -44,6 +44,8 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.Settings.MobileNetworkActivity;
+import com.android.settings.network.helper.SubscriptionAnnotation;
+import com.android.settings.network.helper.SubscriptionGrouping;
 import com.android.settings.widget.AddPreference;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.core.lifecycle.Lifecycle;
diff --git a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
index b5c8218..775ac47 100644
--- a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
@@ -67,7 +67,6 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -174,7 +173,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAvailabilityStatus_unsupportedWhenSet() {
@@ -296,7 +294,6 @@
                 com.android.settingslib.R.string.private_dns_mode_opportunistic));
     }
 
-    @Ignore
     @Test
     public void isEnabled_canBeDisabledByAdmin() {
         final int userId = UserHandle.myUserId();
diff --git a/tests/robotests/src/com/android/settings/notification/ChargingSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ChargingSoundPreferenceControllerTest.java
index 1c864c9..0131bc5 100644
--- a/tests/robotests/src/com/android/settings/notification/ChargingSoundPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ChargingSoundPreferenceControllerTest.java
@@ -31,7 +31,6 @@
 import androidx.preference.SwitchPreference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -76,7 +75,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
index 982316a..ed93473 100644
--- a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
@@ -42,7 +42,6 @@
 import com.android.settingslib.media.MediaOutputConstants;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -89,7 +88,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationRingtonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationRingtonePreferenceControllerTest.java
index 783a36b..1aecad5 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationRingtonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationRingtonePreferenceControllerTest.java
@@ -21,7 +21,6 @@
 import android.media.RingtoneManager;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -45,7 +44,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java b/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java
index 2668e6d..9d475b8 100644
--- a/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java
+++ b/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java
@@ -27,7 +27,6 @@
 
 import org.junit.After;
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -36,7 +35,6 @@
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowUserManager;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {
         ShadowUtils.class,
diff --git a/tests/robotests/src/com/android/settings/notification/ScreenLockSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ScreenLockSoundPreferenceControllerTest.java
index e0b7e14..0a1ce1f 100644
--- a/tests/robotests/src/com/android/settings/notification/ScreenLockSoundPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ScreenLockSoundPreferenceControllerTest.java
@@ -31,7 +31,6 @@
 import androidx.preference.SwitchPreference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -76,7 +75,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/notification/TouchSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/TouchSoundPreferenceControllerTest.java
index 53359cb..09fdada 100644
--- a/tests/robotests/src/com/android/settings/notification/TouchSoundPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/TouchSoundPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import androidx.preference.SwitchPreference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -80,7 +79,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
index 301a6db..7715c62 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
@@ -39,14 +39,12 @@
 
 import com.google.android.setupdesign.GlifLayout;
 
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = ShadowUtils.class)
 public class ChooseLockPatternTest {
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
index de55435..fcab797 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
@@ -24,7 +24,6 @@
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
 import com.google.android.setupdesign.util.ThemeHelper;
@@ -44,8 +43,7 @@
 
     @Test
     public void testLaunchConfirmationActivityWithExternal() {
-        final Activity activity  = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        final Activity activity = Robolectric.setupActivity(Activity.class);
 
         ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(activity);
         builder.setRequestCode(100)
@@ -130,8 +128,7 @@
 
     @Test
     public void launchConfirmPattern_ForceVerify_shouldLaunchInternalActivity() {
-        final Activity activity  = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        final Activity activity = Robolectric.setupActivity(Activity.class);
 
         ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(activity);
         builder.setRequestCode(100)
@@ -151,8 +148,7 @@
 
     @Test
     public void launchConfirmPassword_ForceVerify_shouldLaunchInternalActivity() {
-        final Activity activity  = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        final Activity activity = Robolectric.setupActivity(Activity.class);
 
         ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(activity);
         builder.setRequestCode(100)
@@ -172,8 +168,7 @@
 
     @Test
     public void launchConfirmPassword_remoteValidation_passwordLockType() throws Exception {
-        final Activity activity  = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        Activity activity = Robolectric.setupActivity(Activity.class);
         ShadowActivity shadowActivity = Shadows.shadowOf(activity);
         RemoteLockscreenValidationSession request = createRemoteLockscreenValidationSession(
                 KeyguardManager.PASSWORD, VALID_REMAINING_ATTEMPTS);
@@ -202,9 +197,7 @@
 
     @Test
     public void launchConfirmPassword_remoteValidation_pinLockType() throws Exception {
-        Activity activity  = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
-
+        Activity activity = Robolectric.setupActivity(Activity.class);
         ShadowActivity shadowActivity = Shadows.shadowOf(activity);
         RemoteLockscreenValidationSession request = createRemoteLockscreenValidationSession(
                 KeyguardManager.PIN, VALID_REMAINING_ATTEMPTS);
@@ -233,8 +226,7 @@
 
     @Test
     public void launchConfirmPattern_remoteValidation_patternLockType() throws Exception {
-        Activity activity  = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        Activity activity = Robolectric.setupActivity(Activity.class);
         ShadowActivity shadowActivity = Shadows.shadowOf(activity);
         RemoteLockscreenValidationSession request = createRemoteLockscreenValidationSession(
                 KeyguardManager.PATTERN, VALID_REMAINING_ATTEMPTS);
diff --git a/tests/robotests/src/com/android/settings/password/ConfirmLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ConfirmLockPasswordTest.java
index 2be8aba..d26c33b 100644
--- a/tests/robotests/src/com/android/settings/password/ConfirmLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/ConfirmLockPasswordTest.java
@@ -62,7 +62,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -162,7 +161,6 @@
                 InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
     }
 
-    @Ignore
     @Test
     public void handleNext_normalFlow_doesNotAttemptRemoteLockscreenValidation() {
         ConfirmLockPassword activity = Robolectric.buildActivity(
@@ -177,7 +175,6 @@
         verifyNoInteractions(mRemoteLockscreenValidationClient);
     }
 
-    @Ignore
     @Test
     public void handleNext_remoteValidation_correctGuess_checkboxChecked() throws Exception {
         ConfirmDeviceCredentialBaseActivity activity =
diff --git a/tests/robotests/src/com/android/settings/password/ConfirmLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ConfirmLockPatternTest.java
index 68bee68..2ed7988 100644
--- a/tests/robotests/src/com/android/settings/password/ConfirmLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/ConfirmLockPatternTest.java
@@ -55,11 +55,9 @@
 import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -145,9 +143,8 @@
 
     @Test
     public void onPatternDetected_normalFlow_doesNotAttemptRemoteLockscreenValidation() {
-        ConfirmLockPattern activity  = (ConfirmLockPattern) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(ConfirmLockPattern.class, new Intent())).get();
-
+        ConfirmLockPattern activity = Robolectric.buildActivity(
+                ConfirmLockPattern.class, new Intent()).setup().get();
         ConfirmDeviceCredentialBaseFragment fragment =
                 getConfirmDeviceCredentialBaseFragment(activity);
         LockPatternView lockPatternView = activity.findViewById(R.id.lockPattern);
@@ -158,7 +155,6 @@
         verifyNoInteractions(mRemoteLockscreenValidationClient);
     }
 
-    @Ignore
     @Test
     public void onPatternDetected_remoteValidation_guessValid_checkboxChecked() throws Exception {
         ConfirmDeviceCredentialBaseActivity activity =
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockGenericTest.java
index 0eb365b..c23ce9b 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockGenericTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockGenericTest.java
@@ -44,7 +44,6 @@
 import com.android.settings.testutils.shadow.ShadowPasswordUtils;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import com.google.android.setupdesign.GlifPreferenceLayout;
 
@@ -58,6 +57,7 @@
 import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 
 import java.util.List;
@@ -202,8 +202,8 @@
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, forFace);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, forBiometric);
 
-        SetupChooseLockGeneric activity = (SetupChooseLockGeneric) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(SetupChooseLockGeneric.class, intent)).get();
+        SetupChooseLockGeneric activity = ActivityController.of(
+                new SetupChooseLockGeneric(), intent).setup().get();
 
         List<Fragment> fragments = activity.getSupportFragmentManager().getFragments();
         assertThat(fragments).isNotNull();
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
index bff6991..97a326f 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
@@ -40,7 +40,6 @@
 import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
 import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settings.widget.ScrollToParentEditText;
 
 import com.google.android.setupcompat.PartnerCustomizationLayout;
@@ -50,7 +49,6 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.Shadows;
 import org.robolectric.android.controller.ActivityController;
@@ -96,8 +94,7 @@
                         application,
                         new IntentBuilder(application).build());
 
-        ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(SetupChooseLockPassword.class, intent)).get();
+        ActivityController.of(new SetupChooseLockPassword(), intent).setup().get();
     }
 
     @Test
@@ -218,8 +215,7 @@
                         application,
                         new IntentBuilder(application).build());
         intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
-        return (SetupChooseLockPassword) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(SetupChooseLockPassword.class, intent)).get();
+        return ActivityController.of(new SetupChooseLockPassword(), intent).setup().get();
     }
 
     @Implements(ChooseLockGenericController.class)
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
index d353a22..648c42f 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
@@ -45,19 +45,17 @@
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import com.google.android.setupcompat.PartnerCustomizationLayout;
 import com.google.android.setupcompat.template.FooterBarMixin;
 import com.google.android.setupcompat.template.FooterButton;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowPackageManager;
@@ -86,9 +84,7 @@
                         new IntentBuilder(application)
                                 .setUserId(UserHandle.myUserId())
                                 .build());
-
-        mActivity = (SetupChooseLockPattern) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(SetupChooseLockPattern.class, intent)).get();
+        mActivity = ActivityController.of(new SetupChooseLockPattern(), intent).setup().get();
     }
 
     @Test
@@ -102,7 +98,6 @@
         assertThat(componentEnabled).isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
     }
 
-    @Ignore
     @Test
     public void optionsButton_whenPatternSelected_shouldBeVisible() {
         final Button button = mActivity.findViewById(R.id.screen_lock_options);
@@ -128,14 +123,12 @@
         assertWithMessage("List items shown").that(count).isEqualTo(3);
     }
 
-    @Ignore
     @Config(qualifiers = "sw400dp")
     @Test
     public void sw400dp_shouldShowScreenLockOptions() {
         verifyScreenLockOptionsShown();
     }
 
-    @Ignore
     @Config(qualifiers = "sw400dp-land")
     @Test
     public void sw400dpLandscape_shouldShowScreenLockOptions() {
@@ -160,7 +153,6 @@
         verifyScreenLockOptionsHidden();
     }
 
-    @Ignore
     @Test
     public void skipButton_shouldBeVisible_duringNonFingerprintFlow() {
         final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
diff --git a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
index 2cc256b..53a80dc 100644
--- a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
@@ -35,7 +35,6 @@
 import com.android.settings.biometrics.BiometricUtils;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -71,8 +70,7 @@
         ShadowUtils.setFingerprintManager(mFingerprintManager);
         ShadowUtils.setFaceManager(mFaceManager);
         mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
 
         when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn(
                 true);
diff --git a/tests/robotests/src/com/android/settings/password/TestUtils.java b/tests/robotests/src/com/android/settings/password/TestUtils.java
index fa6a11d..ef08f05 100644
--- a/tests/robotests/src/com/android/settings/password/TestUtils.java
+++ b/tests/robotests/src/com/android/settings/password/TestUtils.java
@@ -27,7 +27,6 @@
 
 import com.android.security.SecureBox;
 import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.robolectric.Robolectric;
 
@@ -96,11 +95,7 @@
 
     public static ConfirmDeviceCredentialBaseActivity buildConfirmDeviceCredentialBaseActivity(
             Class<? extends ConfirmDeviceCredentialBaseActivity> impl, Intent intent) {
-
-        return (ConfirmDeviceCredentialBaseActivity) ActivityControllerWrapper.setup(
-                    Robolectric.buildActivity(impl, intent)).get();
-
-        //return Robolectric.buildActivity(impl, intent).setup().get();
+        return Robolectric.buildActivity(impl, intent).setup().get();
     }
 
     public static ConfirmDeviceCredentialBaseFragment getConfirmDeviceCredentialBaseFragment(
diff --git a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
index 8b8fad0..09b1ea9 100644
--- a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
@@ -31,7 +31,6 @@
 import com.android.settingslib.search.SearchIndexableRaw;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -96,7 +95,6 @@
         assertThat(mIndexProvider.getNonIndexableKeys(mContext)).isEqualTo(Collections.EMPTY_LIST);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getAllPreferenceControllers_shouldCreateControllerFromCodeAndXml() {
@@ -180,7 +178,6 @@
         assertThat(nonIndexableKeys).contains("status_header");
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getNonIndexableKeys_hasSearchableAttributeInXml_shouldSuppressUnsearchable() {
diff --git a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
index 0aa49eb..f349600 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
@@ -33,7 +33,6 @@
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Ignore;
@@ -55,11 +54,7 @@
     @Before
     public void setUp() {
         FakeFeatureFactory.setupForTest();
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
-
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mProvider = new SearchFeatureProviderImpl();
         mPackageManager = Shadows.shadowOf(mActivity.getPackageManager());
         Settings.Global.putInt(mActivity.getContentResolver(),
diff --git a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
index c70411c..21b00a3 100644
--- a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
@@ -30,7 +30,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -131,7 +130,6 @@
         assertThat(cursor.getString(6)).isNull();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void testNonIndexablesColumnFetched() {
diff --git a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
index 67798aa..410198b 100644
--- a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import com.android.settings.testutils.shadow.ShadowUserManager;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -57,7 +56,6 @@
         mPreference = new Preference(mContext);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_notVisible_false() {
diff --git a/tests/robotests/src/com/android/settings/security/MemtagPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/MemtagPreferenceControllerTest.java
index 521a939..e3fc3cc 100644
--- a/tests/robotests/src/com/android/settings/security/MemtagPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/MemtagPreferenceControllerTest.java
@@ -37,7 +37,6 @@
 import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -46,7 +45,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowSystemProperties;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 @Config(
         shadows = {
diff --git a/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java
index 546545c..4f694bc 100644
--- a/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -63,7 +62,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java
index 35e1c9b..206dee1 100644
--- a/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 import androidx.preference.PreferenceScreen;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -62,7 +61,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/security/screenlock/PinPrivacyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/screenlock/PinPrivacyPreferenceControllerTest.java
index 73b4b9b..171fb44 100644
--- a/tests/robotests/src/com/android/settings/security/screenlock/PinPrivacyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/screenlock/PinPrivacyPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import com.android.internal.widget.LockPatternUtils;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -67,7 +66,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     public void isAvailable_lockSetToPinOrPw_shouldReturnTrue() {
         when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)).thenReturn(
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
index 43f5cfc..33a62f4 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import com.android.settingslib.utils.StringUtil;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -76,7 +75,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
index b6b9788..0463e00 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
@@ -45,7 +45,6 @@
 import com.android.settingslib.search.SearchIndexableRaw;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -102,7 +101,6 @@
         assertThat(mController).isInstanceOf(PreferenceControllerMixin.class);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_whenNotVisible_isFalse() {
@@ -152,7 +150,6 @@
         verify(mCategory, atLeastOnce()).addPreference(any(Preference.class));
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void onResume_ifNotAvailable_shouldNotAddNewAgents() {
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index 4903a28..57f4e17 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -30,6 +30,7 @@
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -63,7 +64,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -636,7 +636,6 @@
         verify(mManager, never()).grantSlicePermission(anyString(), any(Uri.class));
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void grantAllowlistedPackagePermissions_hasPackageAllowlist_shouldGrant() {
@@ -664,7 +663,6 @@
         assertThat(mProvider.isPrivateSlicesNeeded(uri)).isFalse();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isPrivateSlicesNeeded_correctUriWithPermissionAndIsSI_returnTrue() {
diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
index ec828a8..69f1886 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
@@ -41,7 +41,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -89,7 +88,6 @@
         mFakeFeatureFactory.searchFeatureProvider = mock(SearchFeatureProvider.class);
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void testFakeProvider_convertsFakeData() {
diff --git a/tests/robotests/src/com/android/settings/support/SupportPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/support/SupportPreferenceControllerTest.java
index f095cc8..735dd34 100644
--- a/tests/robotests/src/com/android/settings/support/SupportPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/support/SupportPreferenceControllerTest.java
@@ -28,7 +28,6 @@
 import androidx.preference.Preference;
 
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -47,8 +46,7 @@
 
     @Before
     public void setUp() {
-        mActivity = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mActivity = Robolectric.setupActivity(Activity.class);
         mFeatureFactory = FakeFeatureFactory.setupForTest();
         mPreference = new Preference(mActivity);
         mPreference.setKey("test_key");
diff --git a/tests/robotests/src/com/android/settings/survey/SurveyMixinTest.java b/tests/robotests/src/com/android/settings/survey/SurveyMixinTest.java
index 0fc3ca1..8f43268 100644
--- a/tests/robotests/src/com/android/settings/survey/SurveyMixinTest.java
+++ b/tests/robotests/src/com/android/settings/survey/SurveyMixinTest.java
@@ -11,7 +11,6 @@
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.overlay.SurveyFeatureProvider;
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -43,8 +42,7 @@
     @Test
     public void onResume_noActionIfActivityDoesNotExist() {
         // Pretend we are an activity that is starting up
-        FragmentActivity temp  = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        FragmentActivity temp = Robolectric.setupActivity(FragmentActivity.class);
         when(mFragment.getActivity()).thenReturn(null);
         SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY);
         mixin.onResume();
diff --git a/tests/robotests/src/com/android/settings/system/AdditionalSystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/AdditionalSystemUpdatePreferenceControllerTest.java
index a853b9e..0abfc20 100644
--- a/tests/robotests/src/com/android/settings/system/AdditionalSystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/AdditionalSystemUpdatePreferenceControllerTest.java
@@ -20,7 +20,6 @@
 import android.content.Context;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -47,7 +46,6 @@
         assertThat(mController.isAvailable()).isFalse();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void displayPrefs_ifAvailable_shouldDisplay() {
diff --git a/tests/robotests/src/com/android/settings/system/FactoryResetDemoUserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/FactoryResetDemoUserPreferenceControllerTest.java
new file mode 100644
index 0000000..0c92b05
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/system/FactoryResetDemoUserPreferenceControllerTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.settings.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.settings.testutils.shadow.ShadowUserManager;
+import com.android.settings.testutils.shadow.ShadowUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowUserManager.class)
+public class FactoryResetDemoUserPreferenceControllerTest {
+
+    private static final String FACTORY_RESET_DEMO_USER_KEY = "factory_reset_demo_user";
+
+    private ShadowUserManager mShadowUserManager;
+
+    private Context mContext;
+    private FactoryResetDemoUserPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mShadowUserManager = ShadowUserManager.getShadow();
+
+        mController = new FactoryResetDemoUserPreferenceController(
+            mContext, FACTORY_RESET_DEMO_USER_KEY);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowUtils.reset();
+        mShadowUserManager.setIsAdminUser(false);
+        mShadowUserManager.setIsDemoUser(false);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 0);
+    }
+
+    @Test
+    public void isAvailable_systemUser() {
+        mShadowUserManager.setIsAdminUser(true);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void isAvailable_nonSystemUser() {
+        mShadowUserManager.setIsAdminUser(false);
+        mShadowUserManager.setIsDemoUser(false);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void isAvailable_demoUser() {
+        mShadowUserManager.setIsAdminUser(false);
+
+        // Place the device in demo mode.
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
+
+        // Indicate the user is a demo user.
+        mShadowUserManager.addUser(UserHandle.myUserId(), "test", UserInfo.FLAG_DEMO);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void getPreferenceKey() {
+        assertThat(mController.getPreferenceKey()).isEqualTo(FACTORY_RESET_DEMO_USER_KEY);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
index f2a932e..6e6fad8 100644
--- a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
@@ -49,7 +49,7 @@
         mContext = RuntimeEnvironment.application;
         mShadowUserManager = ShadowUserManager.getShadow();
 
-        mController = new FactoryResetPreferenceController(mContext);
+        mController = new FactoryResetPreferenceController(mContext, FACTORY_RESET_KEY);
     }
 
     @After
@@ -85,7 +85,7 @@
         // Indicate the user is a demo user.
         mShadowUserManager.addUser(UserHandle.myUserId(), "test", UserInfo.FLAG_DEMO);
 
-        assertThat(mController.isAvailable()).isTrue();
+        assertThat(mController.isAvailable()).isFalse();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
index 7ceac23..dd95d29 100644
--- a/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
@@ -20,7 +20,6 @@
 import android.content.Context;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -46,7 +45,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void isAvailable_ifNotVisible_false() {
diff --git a/tests/robotests/src/com/android/settings/system/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/SystemUpdatePreferenceControllerTest.java
index 544ba96..61aa294 100644
--- a/tests/robotests/src/com/android/settings/system/SystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/SystemUpdatePreferenceControllerTest.java
@@ -38,7 +38,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -112,7 +111,6 @@
         assertThat(mPreference.isVisible()).isFalse();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void displayPrefs_ifAdminUser_butNotVisible_shouldNotDisplay() {
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index 3297d1e..1035560 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -283,6 +283,9 @@
                 .setKey(PowerAnomalyKey.KEY_APP)
                 .setScore(2.0f)
                 .setWarningItemInfo(WarningItemInfo.newBuilder()
+                        .setDismissRecordKey("KEY_APP_1")
+                        .setStartTimestamp(1694361600000L)  // 2023-09-11 00:00:00
+                        .setEndTimestamp(1694368800000L)    // 2023-09-11 02:00:00
                         .setTitleString("Chrome used more battery than usual in foreground")
                         .setMainButtonString("Check")
                         .setCancelButtonString("Got it")
diff --git a/tests/robotests/src/com/android/settings/theme/ContrastPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/theme/ContrastPreferenceControllerTest.java
index 8f78df9..dbd3372 100644
--- a/tests/robotests/src/com/android/settings/theme/ContrastPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/theme/ContrastPreferenceControllerTest.java
@@ -38,7 +38,6 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -74,7 +73,6 @@
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
-    @Ignore
     @Test
     public void testHandlePreferenceTreeClick() {
         Preference preference = new Preference(mContext);
diff --git a/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java
index 92bdc6d..3d8e893 100644
--- a/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java
@@ -40,7 +40,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -127,7 +126,6 @@
                 BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
     }
 
-    @Ignore
     @Test
     public void getAvailabilityStatus_isCurrentlyMainUser_returnDisabledForUser() {
         when(Utils.canCurrentUserDream(mContext)).thenReturn(true);
@@ -136,7 +134,6 @@
                 BasePreferenceController.DISABLED_FOR_USER);
     }
 
-    @Ignore
     @Test
     public void getAvailabilityStatus_featureAndMultiUserEnabledAndNonMainUser_returnAvailable() {
         when(Utils.canCurrentUserDream(mContext)).thenReturn(false);
diff --git a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
index fbe4a05..256e08b 100644
--- a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
@@ -63,7 +63,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -662,7 +661,6 @@
         assertThat(result).isTrue();
     }
 
-    @Ignore
     @Test
     public void canDeleteUser_adminSelectsUser_hasRemoveRestriction_shouldReturnFalse() {
         setupSelectedUser();
diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
index 37af4b1..36eeac8 100644
--- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
@@ -73,7 +73,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.AdditionalMatchers;
@@ -262,7 +261,6 @@
                 eq(SettingsEnums.ACTION_USER_GUEST_EXIT_CONFIRMED));
     }
 
-    @Ignore
     @Test
     public void withDisallowRemoveUser_ShouldDisableRemoveUser() {
         // TODO(b/115781615): Tidy robolectric tests
diff --git a/tests/robotests/src/com/android/settings/utils/ActivityControllerWrapper.java b/tests/robotests/src/com/android/settings/utils/ActivityControllerWrapper.java
deleted file mode 100644
index 6ebbc65..0000000
--- a/tests/robotests/src/com/android/settings/utils/ActivityControllerWrapper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.utils;
-
-import android.os.Bundle;
-
-import org.robolectric.android.controller.ActivityController;
-
-/*
- * b/275023433
- * This class is a workaround for Robolectric, in order to re-enable presubmit
- * We don't use ActivityController#visible() to avoid test crash
- */
-public class ActivityControllerWrapper {
-
-    private static final boolean ENABLE_WORKAROUND = true;
-
-
-    public static ActivityController setup(ActivityController controller) {
-        if (ENABLE_WORKAROUND) {
-            return controller.create().start().postCreate(null).resume();
-        } else {
-            return controller.setup();
-        }
-    }
-
-    public static ActivityController setup(ActivityController controller, Bundle savedState) {
-        return controller.create(savedState)
-                .start()
-                .restoreInstanceState(savedState)
-                .postCreate(savedState)
-                .resume();
-    }
-
-}
diff --git a/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
index ed63cc0..6201bcb 100644
--- a/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
@@ -27,8 +27,6 @@
 import android.content.Intent;
 import android.content.res.Resources;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import com.google.android.setupcompat.util.WizardManagerHelper;
 
 import org.junit.After;
@@ -121,13 +119,10 @@
 
     @Test
     public void addExtras_intentNotFromSetupWizard_extrasHasFocusWallpaper() {
-        WallpaperSuggestionActivity activity =
-                (WallpaperSuggestionActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WallpaperSuggestionActivity.class,
-                        new Intent(Intent.ACTION_MAIN).setComponent(
+        WallpaperSuggestionActivity activity = Robolectric.buildActivity(
+                WallpaperSuggestionActivity.class, new Intent(Intent.ACTION_MAIN).setComponent(
                         new ComponentName(RuntimeEnvironment.application,
-                                PACKAGE_WALLPAPER_ACTIVITY)))).get();
-
+                                PACKAGE_WALLPAPER_ACTIVITY))).setup().get();
         Intent intent = Shadows.shadowOf(activity).getNextStartedActivity();
 
         assertThat(intent).isNotNull();
diff --git a/tests/robotests/src/com/android/settings/wallpaper/WallpaperTypePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wallpaper/WallpaperTypePreferenceControllerTest.java
index fc6df9c..8871cc8 100644
--- a/tests/robotests/src/com/android/settings/wallpaper/WallpaperTypePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wallpaper/WallpaperTypePreferenceControllerTest.java
@@ -25,7 +25,6 @@
 import androidx.preference.Preference;
 
 import com.android.settings.core.BasePreferenceController;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -45,8 +44,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = (Activity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(Activity.class)).get();
+        mContext = Robolectric.setupActivity(Activity.class);
         mController = new WallpaperTypePreferenceController(mContext, "pref_key");
         mIntent = new Intent();
         mPreference = new Preference(mContext);
diff --git a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
index bc816fa..834f3d1 100644
--- a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
@@ -45,7 +45,6 @@
 import com.android.settingslib.widget.LayoutPreference;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -204,7 +203,6 @@
         verify(activity, never()).startActivity(any(Intent.class));
     }
 
-    @Ignore
     @Test
     public void bindButton_hasAppInfo_shouldAttachClickListener() {
         final View appLinks = mLayoutInflater.inflate(
diff --git a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
index 809aa87..732defb 100644
--- a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
@@ -39,7 +39,6 @@
 import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -49,7 +48,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.androidx.fragment.FragmentController;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowRestrictedLockUtilsInternal.class, ShadowInteractionJankMonitor.class})
 public class SeekBarPreferenceTest {
@@ -102,7 +100,6 @@
         assertThat(mSeekBarPreference.isSelectable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc998")
     public void isSelectable_default_returnFalse() {
diff --git a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
index 33c9fac..c079029 100644
--- a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
@@ -29,7 +29,6 @@
 import com.android.settings.R;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -59,7 +58,6 @@
         mHolder = PreferenceViewHolder.createInstanceForTests(rootView);
     }
 
-    @Ignore
     @Test
     public void onBindViewHolder_isRestricted_restrictIconShouldDisplay() {
         mPreference.onBindViewHolder(mHolder);
diff --git a/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
index 2c0ad7d..2492de1 100644
--- a/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
@@ -40,7 +40,6 @@
 import com.android.settings.testutils.shadow.ShadowSettingsMediaPlayer;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -141,7 +140,6 @@
         assertThat(mAnimationController.isPlaying()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void onViewVisible_createAnimationController() {
diff --git a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
index bb0ae1a..5e3d715 100644
--- a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
@@ -30,7 +30,6 @@
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -69,7 +68,6 @@
 
     TestConfigureWifiSettings mSettings;
 
-    @Ignore
     @Before
     public void setUp() {
         when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
@@ -148,7 +146,6 @@
         verify(mPreferenceScreen).removeAll();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void getNonIndexableKeys_ifPageDisabled_shouldNotIndexResource() {
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
index fb29924..616cb0b 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
@@ -37,7 +37,6 @@
 
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE;
 import com.android.wifitrackerlib.WifiPickerTracker;
 
@@ -82,8 +81,7 @@
                 .thenReturn(mock(WifiPickerTracker.class));
         mScanResults.add(getScanResult(TEST_SSID, TEST_CAPABILITY));
 
-        mActivity = spy((NetworkRequestDialogActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(NetworkRequestDialogActivity.class)).get());
+        mActivity = spy(Robolectric.setupActivity(NetworkRequestDialogActivity.class));
         when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
     }
 
@@ -183,8 +181,7 @@
     @Test
     public void onAbort_withFakeActivity_callStopAndPopShouldBeTrue() {
         final FakeNetworkRequestDialogActivity fakeActivity =
-                (FakeNetworkRequestDialogActivity) ActivityControllerWrapper.setup(
-                        Robolectric.buildActivity(FakeNetworkRequestDialogActivity.class)).get();
+                Robolectric.setupActivity(FakeNetworkRequestDialogActivity.class);
 
         fakeActivity.onResume();
         fakeActivity.onAbort();
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
index 2679745..386f66d 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
@@ -45,7 +45,6 @@
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.wifitrackerlib.WifiEntry;
 import com.android.wifitrackerlib.WifiPickerTracker;
 
@@ -104,11 +103,10 @@
         when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker(
                 any(), any(), any(), any(), any(), anyLong(), anyLong(), any()))
                 .thenReturn(mock(WifiPickerTracker.class));
-        Intent intent = new Intent();
-        intent.putExtra(NetworkRequestDialogFragment.EXTRA_APP_NAME,
-                TEST_APP_NAME);
-        mActivity = (WifiDialogActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDialogActivity.class, intent)).get();
+
+        mActivity = Robolectric.buildActivity(FragmentActivity.class,
+                new Intent().putExtra(NetworkRequestDialogFragment.EXTRA_APP_NAME,
+                        TEST_APP_NAME)).setup().get();
         networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance());
         networkRequestDialogFragment.mWifiPickerTracker = mWifiPickerTracker;
     }
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
index 8b9faf2..c9cc02e 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
@@ -41,7 +41,6 @@
 import android.os.UserManager;
 
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.wifi.AccessPoint;
 import com.android.wifitrackerlib.WifiEntry;
 
@@ -99,8 +98,7 @@
         when(mWifiEntry.canConnect()).thenReturn(true);
         FakeFeatureFactory.setupForTest();
 
-        mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDialogActivity.class)).get());
+        mActivity = spy(Robolectric.setupActivity(WifiDialogActivity.class));
         when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
         when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
         when(mActivity.getSystemService(KeyguardManager.class)).thenReturn(mKeyguardManager);
@@ -156,8 +154,7 @@
         final Intent intent = new Intent("com.android.settings.WIFI_DIALOG");
         intent.putExtra(WifiDialogActivity.KEY_CHOSEN_WIFIENTRY_KEY, "FAKE_KEY");
         intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, true);
-        mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDialogActivity.class, intent)).get());
+        mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get());
         when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
 
         mActivity.onSubmit(mWifiDialog2);
@@ -169,8 +166,7 @@
     public void onSubmit_whenConnectForCallerIsFalse_shouldNotConnectToNetwork() {
         final Intent intent = new Intent();
         intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false);
-        mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDialogActivity.class, intent)).get());
+        mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get());
         when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
 
         mActivity.onSubmit(mWifiDialog);
@@ -183,8 +179,7 @@
         final Intent intent = new Intent("com.android.settings.WIFI_DIALOG");
         intent.putExtra(WifiDialogActivity.KEY_CHOSEN_WIFIENTRY_KEY, "FAKE_KEY");
         intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false);
-        mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDialogActivity.class, intent)).get());
+        mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get());
         when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
 
         mActivity.onSubmit(mWifiDialog2);
@@ -198,8 +193,7 @@
         intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false);
         intent.putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true);
         intent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true);
-        mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDialogActivity.class, intent)).get());
+        mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get());
         when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
         doNothing().when(mActivity).createDialogWithSuwTheme();
 
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiNoInternetDialogTest.java b/tests/robotests/src/com/android/settings/wifi/WifiNoInternetDialogTest.java
index 1788a0d..8e52210 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiNoInternetDialogTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiNoInternetDialogTest.java
@@ -43,10 +43,8 @@
 import android.os.Bundle;
 
 import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -57,7 +55,6 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 public class WifiNoInternetDialogTest {
 
@@ -87,8 +84,8 @@
 
     @Test
     public void launchActivity_noIntentAction_shouldNotFatalException() {
-        ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiNoInternetDialog.class)).get();
+        WifiNoInternetDialog wifiNoInternetDialog =
+                Robolectric.setupActivity(WifiNoInternetDialog.class);
     }
 
     @Test
@@ -276,7 +273,6 @@
                 RuntimeEnvironment.application.getPackageName(),
                 WifiNoInternetDialog.class.getName());
         intent.putExtra(ConnectivityManager.EXTRA_NETWORK, network);
-        mActivity = spy((WifiNoInternetDialog) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiNoInternetDialog.class, intent)).get());
+        mActivity = spy(Robolectric.buildActivity(WifiNoInternetDialog.class, intent).get());
     }
 }
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiPrimarySwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiPrimarySwitchPreferenceControllerTest.java
index 2c12517..9204d43 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiPrimarySwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiPrimarySwitchPreferenceControllerTest.java
@@ -46,7 +46,6 @@
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -97,7 +96,6 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
-    @Ignore
     @Test
     @Config(qualifiers = "mcc999")
     public void testWifiPrimarySwitch_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiScanModeActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiScanModeActivityTest.java
index 1d3dadf..5937997 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiScanModeActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiScanModeActivityTest.java
@@ -30,7 +30,6 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.wifi.WifiPermissionChecker;
 
 import org.junit.After;
@@ -69,8 +68,7 @@
         when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
         when(mUserManager.isGuestUser()).thenReturn(false);
 
-        mActivity = spy((WifiScanModeActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiScanModeActivity.class)).get());
+        mActivity = spy(Robolectric.setupActivity(WifiScanModeActivity.class));
         when(mActivity.getApplicationContext()).thenReturn(mContext);
         mActivity.mWifiPermissionChecker = mWifiPermissionChecker;
     }
@@ -82,8 +80,8 @@
 
     @Test
     public void launchActivity_noIntentAction_shouldNotFatalException() {
-        ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiScanModeActivity.class)).get();
+        WifiScanModeActivity wifiScanModeActivity =
+                Robolectric.setupActivity(WifiScanModeActivity.class);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
index c5f4cd4..303963d 100644
--- a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
@@ -43,7 +43,6 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.wifitrackerlib.WifiEntry;
 import com.android.wifitrackerlib.WifiPickerTracker;
 
@@ -100,8 +99,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mAddAppNetworksFragment = spy(new AddAppNetworksFragment());
-        mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get());
+        mActivity = spy(Robolectric.setupActivity(FragmentActivity.class));
         doReturn(mActivity).when(mAddAppNetworksFragment).getActivity();
         when(mWifiManager.isWifiEnabled()).thenReturn(true);
         when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
index da0bdf2..0ece537 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
@@ -40,7 +40,6 @@
 import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowDisclaimerItemFactory;
 import com.android.settings.testutils.shadow.ShadowFragment;
-import com.android.settings.utils.ActivityControllerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -90,8 +89,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mFragment = spy(new WifiCallingDisclaimerFragment());
 
         doReturn(mActivity).when(mFragment).getActivity();
diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
index 56c1ec7..d8605de 100644
--- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
@@ -28,8 +28,6 @@
 
 import androidx.test.core.app.ApplicationProvider;
 
-import com.android.settings.utils.ActivityControllerWrapper;
-
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -64,15 +62,14 @@
         mIntent.putExtra(WifiDppUtils.EXTRA_WIFI_SECURITY, "WPA");
         mIntent.putExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY, "\\012345678,");
 
-        mActivity = spy((WifiDppConfiguratorActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDppConfiguratorActivity.class)).get());
+        mActivity = spy(Robolectric.setupActivity(WifiDppConfiguratorActivity.class));
         when(mActivity.getApplicationContext()).thenReturn(mContext);
     }
 
     @Test
     public void launchActivity_noIntentAction_shouldNotFatalException() {
-        ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDppConfiguratorActivity.class)).get();
+        WifiDppConfiguratorActivity wifiDppConfiguratorActivity =
+                Robolectric.setupActivity(WifiDppConfiguratorActivity.class);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
index 717e4a7..67d4678 100644
--- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
@@ -19,16 +19,15 @@
 import static com.android.settings.wifi.dpp.WifiDppEnrolleeActivity.ACTION_ENROLLEE_QR_CODE_SCANNER;
 
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Intent;
 
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.wifi.WifiRestrictionsCache;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -58,18 +57,16 @@
         when(mIntent.getAction()).thenReturn(ACTION_ENROLLEE_QR_CODE_SCANNER);
         when(mIntent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID)).thenReturn(WIFI_SSID);
 
-        mActivity = (WifiDppEnrolleeActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDppEnrolleeActivity.class)).get();
+        mActivity = spy(Robolectric.setupActivity(WifiDppEnrolleeActivity.class));
         mActivity.mWifiRestrictionsCache = mWifiRestrictionsCache;
     }
 
     @Test
     public void launchActivity_noIntentAction_shouldNotFatalException() {
-        ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(WifiDppEnrolleeActivity.class)).get();
+        WifiDppEnrolleeActivity wifiDppEnrolleeActivity =
+                Robolectric.setupActivity(WifiDppEnrolleeActivity.class);
     }
 
-    @Ignore
     @Test
     public void handleIntent_noIntentAction_shouldFinish() {
         when(mIntent.getAction()).thenReturn(null);
@@ -79,7 +76,6 @@
         verify(mActivity).finish();
     }
 
-    @Ignore
     @Test
     public void handleIntent_notAllowedConfigWifi_shouldFinish() {
         when(mWifiRestrictionsCache.isConfigWifiAllowed()).thenReturn(false);
@@ -89,7 +85,6 @@
         verify(mActivity).finish();
     }
 
-    @Ignore
     @Test
     public void handleIntent_hasIntentDataAndAllowedConfigWifi_shouldShowFragment() {
         when(mWifiRestrictionsCache.isConfigWifiAllowed()).thenReturn(true);
diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
index 25a59a9..a8b1d9c 100644
--- a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
@@ -48,7 +48,6 @@
 
 import com.android.settings.testutils.XmlTestUtils;
 import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import org.junit.Before;
@@ -90,8 +89,7 @@
         mContext = RuntimeEnvironment.application;
         TestWifiP2pSettings.sMockWifiP2pManager = mWifiP2pManager;
 
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mFragment = new TestWifiP2pSettings();
         mFragment.mWifiP2pManager = mWifiP2pManager;
         doReturn(mChannel).when(mWifiP2pManager).initialize(any(), any(), any());
diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java
index d26287d..3e6c64b 100644
--- a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java
@@ -34,7 +34,6 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
-import com.android.settings.utils.ActivityControllerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import org.junit.Before;
@@ -66,8 +65,7 @@
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
         mSettings = spy(new TestFragment());
-        mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
-                Robolectric.buildActivity(FragmentActivity.class)).get();
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
 
         doReturn(mSubscribedApController).when(mSettings)
                 .use(SubscribedAccessPointsPreferenceController2.class);
diff --git a/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.kt b/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.kt
index 5350bd8..0cb03fe 100644
--- a/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.kt
+++ b/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.kt
@@ -19,6 +19,7 @@
 import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
 import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -30,11 +31,11 @@
 @RunWith(AndroidJUnit4::class)
 @SmallTest
 class AboutPhoneSettingsTests {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Settings.ACTION_DEVICE_INFO_SETTINGS)
+        device.startMainActivityFromHomeScreen(Settings.ACTION_DEVICE_INFO_SETTINGS)
     }
 
     @Test
diff --git a/tests/uitests/src/com/android/settings/ui/AppsSettingsRetainFilterTests.kt b/tests/uitests/src/com/android/settings/ui/AppsSettingsRetainFilterTests.kt
index 23d5384..43610ec 100644
--- a/tests/uitests/src/com/android/settings/ui/AppsSettingsRetainFilterTests.kt
+++ b/tests/uitests/src/com/android/settings/ui/AppsSettingsRetainFilterTests.kt
@@ -16,50 +16,40 @@
 
 package com.android.settings.ui
 
-import android.os.RemoteException
 import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiDevice
+import com.android.settings.ui.testutils.SettingsTestUtils.assertObject
 import com.android.settings.ui.testutils.SettingsTestUtils.clickObject
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
-import com.android.settings.ui.testutils.SettingsTestUtils.waitObject
-import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
 @RunWith(AndroidJUnit4::class)
 class AppsSettingsRetainFilterTests {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)
+        device.startMainActivityFromHomeScreen(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)
     }
 
     @Test
     fun testDisablingSystemAppAndRotateDevice() {
         device.clickObject(By.text("Calculator"))
         device.clickObject(By.text("Disable"))
-
-        // Click on "Disable App" on dialog.
-        device.clickObject(By.text("Disable app"))
-        assertThat(device.waitObject(By.text("Enable"))).isNotNull()
+        device.clickObject(By.text("Disable app"))  // Click on "Disable App" on dialog.
+        device.assertObject(By.text("Enable"))
         device.pressBack()
         device.clickObject(By.text("All apps"))
         device.clickObject(By.text("Disabled apps"))
-        try {
-            device.setOrientationLeft()
-        } catch (e: RemoteException) {
-            throw RuntimeException("Failed to freeze device orientation", e)
-        }
-        try {
-            device.unfreezeRotation()
-        } catch (e: RemoteException) {
-            throw RuntimeException("Failed to un-freeze device orientation", e)
-        }
-        assertThat(device.waitObject(By.text("Disabled apps"))).isNotNull()
+        device.setOrientationLeft()
+        device.assertObject(By.text("Disabled apps"))
+        device.setOrientationNatural()
+        device.assertObject(By.text("Disabled apps"))
         device.clickObject(By.text("Calculator"))
         device.clickObject(By.text("Enable"))
     }
diff --git a/tests/uitests/src/com/android/settings/ui/AppsSettingsTests.kt b/tests/uitests/src/com/android/settings/ui/AppsSettingsTests.kt
index 9c2dc5f..9c22247 100644
--- a/tests/uitests/src/com/android/settings/ui/AppsSettingsTests.kt
+++ b/tests/uitests/src/com/android/settings/ui/AppsSettingsTests.kt
@@ -17,30 +17,31 @@
 package com.android.settings.ui
 
 import android.provider.Settings
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiDevice
 import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
+import com.android.settings.ui.testutils.SettingsTestUtils.assertObject
 import com.android.settings.ui.testutils.SettingsTestUtils.clickObject
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
 import com.android.settings.ui.testutils.SettingsTestUtils.waitObject
-import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Before
 import org.junit.Test
 
 /** Verifies basic functionality of the About Phone screen  */
 class AppsSettingsTests {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)
-        val title = device.waitObject(By.text("All apps"))
-        assertWithMessage("Could not find Settings > Apps screen").that(title).isNotNull()
+        device.startMainActivityFromHomeScreen(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)
+        device.assertObject(By.text("All apps"))
     }
 
     @Test
     fun testAppSettingsListForCalculator() {
         device.clickObject(By.text("Calculator"))
+        device.waitObject(By.text("Open"))
         device.assertHasTexts(ON_SCREEN_TEXTS)
     }
 
@@ -50,8 +51,7 @@
         device.clickObject(By.text("Disable"))
         device.clickObject(By.text("Disable app"))  // Click on "Disable app" on dialog.
         device.clickObject(By.text("Enable"))
-        val disableButton = device.waitObject(By.text("Disable"))
-        assertWithMessage("App not enabled successfully").that(disableButton).isNotNull()
+        device.assertObject(By.text("Disable"))
     }
 
     private companion object {
@@ -63,7 +63,7 @@
             "Screen time",
             "App battery usage",
             "Language",
-            "Open by default"
+            "Unused app settings",
         )
     }
 }
diff --git a/tests/uitests/src/com/android/settings/ui/BatterySettingsTest.kt b/tests/uitests/src/com/android/settings/ui/BatterySettingsTest.kt
index fbdd2e5..d677fb5 100644
--- a/tests/uitests/src/com/android/settings/ui/BatterySettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/BatterySettingsTest.kt
@@ -18,6 +18,7 @@
 
 import android.content.Intent
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
 import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
 
 @RunWith(AndroidJUnit4::class)
 class BatterySettingsTest {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Intent.ACTION_POWER_USAGE_SUMMARY)
+        device.startMainActivityFromHomeScreen(Intent.ACTION_POWER_USAGE_SUMMARY)
     }
 
     @Test
diff --git a/tests/uitests/src/com/android/settings/ui/DataSaverSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/DataSaverSettingsTest.kt
index 2312291..f3d2d9d 100644
--- a/tests/uitests/src/com/android/settings/ui/DataSaverSettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/DataSaverSettingsTest.kt
@@ -18,26 +18,26 @@
 
 import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiDevice
+import com.android.settings.ui.testutils.SettingsTestUtils.assertObject
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
-import com.android.settings.ui.testutils.SettingsTestUtils.waitObject
-import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
 @RunWith(AndroidJUnit4::class)
 class DataSaverSettingsTest {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Settings.ACTION_DATA_SAVER_SETTINGS)
+        device.startMainActivityFromHomeScreen(Settings.ACTION_DATA_SAVER_SETTINGS)
     }
 
     @Test
     fun hasSwitchBar() {
-        assertThat(device.waitObject(By.text("Use Data Saver"))).isNotNull()
+        device.assertObject(By.text("Use Data Saver"))
     }
 }
diff --git a/tests/uitests/src/com/android/settings/ui/DevelopmentSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/DevelopmentSettingsTest.kt
new file mode 100644
index 0000000..1afa3ab
--- /dev/null
+++ b/tests/uitests/src/com/android/settings/ui/DevelopmentSettingsTest.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.ui
+
+import android.os.SystemClock
+import android.provider.Settings
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
+import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class DevelopmentSettingsTest {
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+
+    @Before
+    fun setUp() {
+        device.executeShellCommand("settings put global development_settings_enabled 1")
+        SystemClock.sleep(1000)
+        device.startMainActivityFromHomeScreen(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)
+    }
+
+    @Test
+    fun hasTexts() {
+        device.assertHasTexts(ON_SCREEN_TEXTS)
+    }
+
+    private companion object {
+        val ON_SCREEN_TEXTS = listOf(
+            "Use developer options",
+            "Memory",
+            "Stay awake",
+            "USB debugging",
+            "App Compatibility Changes",
+        )
+    }
+}
diff --git a/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.kt b/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.kt
index e3ee159..72a84dc 100644
--- a/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.kt
+++ b/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.kt
@@ -18,6 +18,7 @@
 
 import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
 import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
 
 @RunWith(AndroidJUnit4::class)
 class HomepageDisplayTests {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Settings.ACTION_SETTINGS)
+        device.startMainActivityFromHomeScreen(Settings.ACTION_SETTINGS)
     }
 
     @Test
diff --git a/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt b/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
index 1fb1a54..5339e95 100644
--- a/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
@@ -18,6 +18,7 @@
 
 import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
 import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
 
 @RunWith(AndroidJUnit4::class)
 class SecuritySettingsTest {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Settings.ACTION_SECURITY_SETTINGS)
+        device.startMainActivityFromHomeScreen(Settings.ACTION_SECURITY_SETTINGS)
     }
 
     @Test
diff --git a/tests/uitests/src/com/android/settings/ui/StorageSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/StorageSettingsTest.kt
index db0472d..771512a 100644
--- a/tests/uitests/src/com/android/settings/ui/StorageSettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/StorageSettingsTest.kt
@@ -18,6 +18,7 @@
 
 import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
 import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
 
 @RunWith(AndroidJUnit4::class)
 class StorageSettingsTest {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Settings.ACTION_INTERNAL_STORAGE_SETTINGS)
+        device.startMainActivityFromHomeScreen(Settings.ACTION_INTERNAL_STORAGE_SETTINGS)
     }
 
     @Test
diff --git a/tests/uitests/src/com/android/settings/ui/SyncSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/SyncSettingsTest.kt
index 384b386..5de5ba5 100644
--- a/tests/uitests/src/com/android/settings/ui/SyncSettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/SyncSettingsTest.kt
@@ -18,6 +18,7 @@
 
 import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
 import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
 import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
 
 @RunWith(AndroidJUnit4::class)
 class SyncSettingsTest {
-    private lateinit var device: UiDevice
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @Before
     fun setUp() {
-        device = startMainActivityFromHomeScreen(Settings.ACTION_SYNC_SETTINGS)
+        device.startMainActivityFromHomeScreen(Settings.ACTION_SYNC_SETTINGS)
     }
 
     @Test
diff --git a/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsTest.kt
new file mode 100644
index 0000000..d65efb7
--- /dev/null
+++ b/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsTest.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.ui.inputmethods
+
+import android.content.Intent
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
+import com.android.settings.ui.testutils.SettingsTestUtils.SETTINGS_PACKAGE
+import com.android.settings.ui.testutils.SettingsTestUtils.assertObject
+import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class SpellCheckerSettingsTest {
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+
+    @Before
+    fun setUp() {
+        device.startMainActivityFromHomeScreen(Intent().apply {
+            setClassName(
+                SETTINGS_PACKAGE,
+                "com.android.settings.Settings\$SpellCheckersSettingsActivity",
+            )
+        })
+    }
+
+    @Test
+    fun hasSwitchBar() {
+        device.assertObject(By.text("Use spell checker"))
+    }
+}
diff --git a/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsUITest.java b/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsUITest.java
deleted file mode 100644
index a46a00d..0000000
--- a/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsUITest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.ui.inputmethods;
-
-import static com.android.settings.ui.testutils.SettingsTestUtils.TIMEOUT;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Instrumentation;
-import android.content.Intent;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-import androidx.test.uiautomator.By;
-import androidx.test.uiautomator.UiDevice;
-import androidx.test.uiautomator.UiObject2;
-import androidx.test.uiautomator.Until;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class SpellCheckerSettingsUITest {
-
-    private Instrumentation mInstrumentation;
-    private Intent mIntent;
-    private UiDevice mUiDevice;
-
-    @Before
-    public void setUp() {
-        mInstrumentation = InstrumentationRegistry.getInstrumentation();
-        mUiDevice = UiDevice.getInstance(mInstrumentation);
-        mIntent = new Intent().setClassName("com.android.settings",
-                "com.android.settings.Settings$SpellCheckersSettingsActivity")
-                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-    }
-
-    @Test
-    public void launchSettings_hasSwitchBar() {
-        mInstrumentation.getContext().startActivity(mIntent);
-        final UiObject2 switchBar =
-                mUiDevice.wait(Until.findObject(By.text("Use spell checker")), TIMEOUT);
-
-        assertThat(switchBar).isNotNull();
-    }
-}
diff --git a/tests/uitests/src/com/android/settings/ui/testutils/SettingsTestUtils.kt b/tests/uitests/src/com/android/settings/ui/testutils/SettingsTestUtils.kt
index c749ff8..1dd07cd 100644
--- a/tests/uitests/src/com/android/settings/ui/testutils/SettingsTestUtils.kt
+++ b/tests/uitests/src/com/android/settings/ui/testutils/SettingsTestUtils.kt
@@ -20,14 +20,12 @@
 import android.content.Intent
 import android.view.KeyEvent
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.BySelector
 import androidx.test.uiautomator.Direction
 import androidx.test.uiautomator.UiDevice
 import androidx.test.uiautomator.UiObject2
 import androidx.test.uiautomator.Until
-import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 
 object SettingsTestUtils {
@@ -37,40 +35,45 @@
     fun UiDevice.waitObject(bySelector: BySelector): UiObject2? =
         wait(Until.findObject(bySelector), TIMEOUT)
 
-    fun UiDevice.clickObject(bySelector: BySelector) = checkNotNull(waitObject(bySelector)).click()
+    fun UiDevice.assertObject(bySelector: BySelector): UiObject2 =
+        checkNotNull(waitObject(bySelector)) { "$bySelector not found" }
 
-    fun startMainActivityFromHomeScreen(action: String): UiDevice {
-        // Initialize UiDevice instance
-        val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
-        device.pressKeyCodes(intArrayOf(KeyEvent.KEYCODE_MENU, KeyEvent.KEYCODE_MENU))  // unlock
+    fun UiDevice.clickObject(bySelector: BySelector) = assertObject(bySelector).click()
+
+    fun UiDevice.startMainActivityFromHomeScreen(action: String) {
+        startMainActivityFromHomeScreen(Intent(action))
+    }
+
+    fun UiDevice.startMainActivityFromHomeScreen(intent: Intent) {
+        pressKeyCodes(intArrayOf(KeyEvent.KEYCODE_MENU, KeyEvent.KEYCODE_MENU))  // unlock
 
         // Start from the home screen
-        device.pressHome()
+        pressHome()
 
         // Wait for launcher
-        val launcherPackage: String = device.launcherPackageName
-        assertThat(launcherPackage).isNotNull()
-        device.waitObject(By.pkg(launcherPackage).depth(0))
+        waitObject(By.pkg(launcherPackageName).depth(0))
 
         // Launch the app
-        val context = ApplicationProvider.getApplicationContext<Context>()
-        val intent = Intent(action).apply {
+        ApplicationProvider.getApplicationContext<Context>().startActivity(Intent(intent).apply {
             addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
             addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-        }
-        context.startActivity(intent)
+        })
 
         // Wait for the app to appear
-        device.waitObject(By.pkg(SETTINGS_PACKAGE).depth(0))
-
-        return device
+        waitObject(By.pkg(SETTINGS_PACKAGE).depth(0))
     }
 
     fun UiDevice.assertHasTexts(texts: List<String>) {
-        val scrollableObj = findObject(By.scrollable(true))
+        val scrollableObj =
+            findObject(By.res(SETTINGS_PACKAGE, "main_content"))
+                ?: findObject(By.scrollable(true))
         for (text in texts) {
-            scrollableObj.scrollUntil(Direction.DOWN, Until.findObject(By.text(text)))
-            assertWithMessage("Missing text: $text").that(waitObject(By.text(text))).isNotNull()
+            val selector = By.text(text)
+            assertWithMessage("Missing text: $text").that(
+                findObject(selector)
+                    ?: scrollableObj.scrollUntil(Direction.DOWN, Until.findObject(selector))
+                    ?: waitObject(selector)
+            ).isNotNull()
         }
     }
 }
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FakeFingerprintManagerInteractor.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FakeFingerprintManagerInteractor.kt
index 759306e..e2bdd17 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FakeFingerprintManagerInteractor.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FakeFingerprintManagerInteractor.kt
@@ -23,7 +23,7 @@
 import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
 import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.flowOf
 
 /** Fake to be used by other classes to easily fake the FingerprintManager implementation. */
 class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
@@ -53,15 +53,16 @@
   override suspend fun generateChallenge(gateKeeperPasswordHandle: Long): Pair<Long, ByteArray> {
     return challengeToGenerate
   }
-  override val enrolledFingerprints: Flow<List<FingerprintViewModel>> = flow {
-    emit(enrolledFingerprintsInternal)
-  }
+  override val enrolledFingerprints: Flow<List<FingerprintViewModel>> =
+    flowOf(enrolledFingerprintsInternal)
 
-  override fun canEnrollFingerprints(numFingerprints: Int): Flow<Boolean> = flow {
-    emit(numFingerprints < enrollableFingerprints)
-  }
+  override val canEnrollFingerprints: Flow<Boolean> =
+    flowOf(enrolledFingerprintsInternal.size < enrollableFingerprints)
 
-  override val maxEnrollableFingerprints: Flow<Int> = flow { emit(enrollableFingerprints) }
+  override val sensorPropertiesInternal: Flow<FingerprintSensorPropertiesInternal?> =
+    flowOf(sensorProps.first())
+
+  override val maxEnrollableFingerprints: Flow<Int> = flowOf(enrollableFingerprints)
 
   override suspend fun removeFingerprint(fp: FingerprintViewModel): Boolean {
     return enrolledFingerprintsInternal.remove(fp)
@@ -80,7 +81,4 @@
   override suspend fun pressToAuthEnabled(): Boolean {
     return pressToAuthEnabled
   }
-
-  override suspend fun sensorPropertiesInternal(): List<FingerprintSensorPropertiesInternal> =
-    sensorProps
 }
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
index cc6f42a..70943f0 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
@@ -18,7 +18,6 @@
 
 import android.content.Context
 import android.content.Intent
-import android.content.res.Resources
 import android.hardware.fingerprint.Fingerprint
 import android.hardware.fingerprint.FingerprintManager
 import android.hardware.fingerprint.FingerprintManager.CryptoObject
@@ -51,8 +50,11 @@
 import org.mockito.ArgumentMatchers.nullable
 import org.mockito.Mock
 import org.mockito.Mockito
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when`
 import org.mockito.junit.MockitoJUnit
 import org.mockito.junit.MockitoJUnitRunner
+import org.mockito.stubbing.OngoingStubbing
 
 @RunWith(MockitoJUnitRunner::class)
 class FingerprintManagerInteractorTest {
@@ -82,8 +84,7 @@
   @Test
   fun testEmptyFingerprints() =
     testScope.runTest {
-      Mockito.`when`(fingerprintManager.getEnrolledFingerprints(Mockito.anyInt()))
-        .thenReturn(emptyList())
+      whenever(fingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(emptyList())
 
       val emptyFingerprintList: List<Fingerprint> = emptyList()
       assertThat(underTest.enrolledFingerprints.last()).isEqualTo(emptyFingerprintList)
@@ -94,8 +95,7 @@
     testScope.runTest {
       val expected = Fingerprint("Finger 1,", 2, 3L)
       val fingerprintList: List<Fingerprint> = listOf(expected)
-      Mockito.`when`(fingerprintManager.getEnrolledFingerprints(Mockito.anyInt()))
-        .thenReturn(fingerprintList)
+      whenever(fingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(fingerprintList)
 
       val list = underTest.enrolledFingerprints.last()
       assertThat(list.size).isEqualTo(fingerprintList.size)
@@ -108,21 +108,22 @@
   @Test
   fun testCanEnrollFingerprint() =
     testScope.runTest {
-      val mockContext = Mockito.mock(Context::class.java)
-      val resources = Mockito.mock(Resources::class.java)
-      Mockito.`when`(mockContext.resources).thenReturn(resources)
-      Mockito.`when`(resources.getInteger(anyInt())).thenReturn(3)
-      underTest =
-        FingerprintManagerInteractorImpl(
-          mockContext,
-          backgroundDispatcher,
-          fingerprintManager,
-          gateKeeperPasswordProvider,
-          pressToAuthProvider,
+      val fingerprintList1: List<Fingerprint> =
+        listOf(
+          Fingerprint("Finger 1,", 2, 3L),
+          Fingerprint("Finger 2,", 3, 3L),
+          Fingerprint("Finger 3,", 4, 3L)
         )
+      val fingerprintList2: List<Fingerprint> =
+        fingerprintList1.plus(
+          listOf(Fingerprint("Finger 4,", 5, 3L), Fingerprint("Finger 5,", 6, 3L))
+        )
+      whenever(fingerprintManager.getEnrolledFingerprints(anyInt()))
+        .thenReturn(fingerprintList1)
+        .thenReturn(fingerprintList2)
 
-      assertThat(underTest.canEnrollFingerprints(2).last()).isTrue()
-      assertThat(underTest.canEnrollFingerprints(3).last()).isFalse()
+      assertThat(underTest.canEnrollFingerprints.last()).isTrue()
+      assertThat(underTest.canEnrollFingerprints.last()).isFalse()
     }
 
   @Test
@@ -132,7 +133,7 @@
       val challenge = 100L
       val intent = Intent()
       intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, challenge)
-      Mockito.`when`(
+      whenever(
           gateKeeperPasswordProvider.requestGatekeeperHat(
             any(Intent::class.java),
             anyLong(),
@@ -148,8 +149,7 @@
       val job = testScope.launch { result = underTest.generateChallenge(1L) }
       runCurrent()
 
-      Mockito.verify(fingerprintManager)
-        .generateChallenge(anyInt(), capture(generateChallengeCallback))
+      verify(fingerprintManager).generateChallenge(anyInt(), capture(generateChallengeCallback))
       generateChallengeCallback.value.onChallengeGenerated(1, 2, challenge)
 
       runCurrent()
@@ -173,7 +173,7 @@
         testScope.launch { result = underTest.removeFingerprint(fingerprintViewModelToRemove) }
       runCurrent()
 
-      Mockito.verify(fingerprintManager)
+      verify(fingerprintManager)
         .remove(any(Fingerprint::class.java), anyInt(), capture(removalCallback))
       removalCallback.value.onRemovalSucceeded(fingerprintToRemove, 1)
 
@@ -197,7 +197,7 @@
         testScope.launch { result = underTest.removeFingerprint(fingerprintViewModelToRemove) }
       runCurrent()
 
-      Mockito.verify(fingerprintManager)
+      verify(fingerprintManager)
         .remove(any(Fingerprint::class.java), anyInt(), capture(removalCallback))
       removalCallback.value.onRemovalError(
         fingerprintToRemove,
@@ -218,8 +218,7 @@
 
       underTest.renameFingerprint(fingerprintToRename, "Woo")
 
-      Mockito.verify(fingerprintManager)
-        .rename(eq(fingerprintToRename.fingerId), anyInt(), safeEq("Woo"))
+      verify(fingerprintManager).rename(eq(fingerprintToRename.fingerId), anyInt(), safeEq("Woo"))
     }
 
   @Test
@@ -235,7 +234,7 @@
 
       runCurrent()
 
-      Mockito.verify(fingerprintManager)
+      verify(fingerprintManager)
         .authenticate(
           nullable(CryptoObject::class.java),
           any(CancellationSignal::class.java),
@@ -263,7 +262,7 @@
 
       runCurrent()
 
-      Mockito.verify(fingerprintManager)
+      verify(fingerprintManager)
         .authenticate(
           nullable(CryptoObject::class.java),
           any(CancellationSignal::class.java),
@@ -284,4 +283,5 @@
   private fun <T : Any> safeEq(value: T): T = eq(value) ?: value
   private fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
   private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
+  private fun <T> whenever(methodCall: T): OngoingStubbing<T> = `when`(methodCall)
 }
diff --git a/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java
new file mode 100644
index 0000000..8fb3eae
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DeletePrivateSpaceControllerTest {
+    @Mock private PrivateSpaceMaintainer mPrivateSpaceMaintainer;
+    @Mock private Context mContext;
+
+    private Preference mPreference;
+    private DeletePrivateSpaceController mDeletePrivateSpaceController;
+
+    /** Required setup before a test. */
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = ApplicationProvider.getApplicationContext();
+        final String preferenceKey = "private_space_delete";
+
+        mPreference = new Preference(ApplicationProvider.getApplicationContext());
+        mPreference.setKey(preferenceKey);
+
+        mDeletePrivateSpaceController =
+                new DeletePrivateSpaceController(
+                        mContext,
+                        preferenceKey,
+                        new DeletePrivateSpaceController.Injector() {
+                            @Override
+                            PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
+                                return mPrivateSpaceMaintainer;
+                            }
+                        });
+    }
+
+    /** Tests that the controller is always available. */
+    @Test
+    public void getAvailabilityStatus_returnsAvailable() {
+        assertThat(mDeletePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    /** Tests that on click it attempts to delete the PS. */
+    @Test
+    public void handlePreferenceTreeClick_attemptsToDeletePrivateSpace() {
+        doReturn(DELETE_PS_ERROR_NONE).when(mPrivateSpaceMaintainer).deletePrivateSpace();
+        DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
+        doNothing().when(spy).showSuccessfulDeletionToast();
+        spy.handlePreferenceTreeClick(mPreference);
+
+        verify(mPrivateSpaceMaintainer).deletePrivateSpace();
+    }
+
+    /** Tests that on deletion of PS relevant toast is shown. */
+    @Test
+    public void handlePreferenceTreeClick_onDeletion_showsDeletedToast() {
+        doReturn(DELETE_PS_ERROR_NONE).when(mPrivateSpaceMaintainer).deletePrivateSpace();
+        DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
+        doNothing().when(spy).showSuccessfulDeletionToast();
+        spy.handlePreferenceTreeClick(mPreference);
+
+        verify(spy).showSuccessfulDeletionToast();
+    }
+
+    /** Tests that on failing to delete the PS relevant toast is shown. */
+    @Test
+    public void handlePreferenceTreeClick_onDeletionError_showsDeletionFailedToast() {
+        doReturn(DELETE_PS_ERROR_INTERNAL).when(mPrivateSpaceMaintainer).deletePrivateSpace();
+        DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
+        doNothing().when(spy).showDeletionInternalErrorToast();
+        spy.handlePreferenceTreeClick(mPreference);
+
+        verify(spy).showDeletionInternalErrorToast();
+    }
+}
diff --git a/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java
new file mode 100644
index 0000000..1a1769e
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+@RunWith(AndroidJUnit4.class)
+public class HidePrivateSpaceControllerTest {
+    @Mock private Context mContext;
+    private HidePrivateSpaceController mHidePrivateSpaceController;
+
+    /** Required setup before a test. */
+    @Before
+    public void setUp() {
+        mContext = ApplicationProvider.getApplicationContext();
+        final String preferenceKey = "private_space_hidden";
+
+        mHidePrivateSpaceController = new HidePrivateSpaceController(mContext, preferenceKey);
+    }
+
+    /** Tests that the controller is always available. */
+    @Test
+    public void getAvailabilityStatus_returnsAvailable() {
+        assertThat(mHidePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java
new file mode 100644
index 0000000..2dc00e1
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_DEVICE_REBOOTED;
+import static com.android.settings.privatespace.PrivateSpaceSafetySource.SAFETY_SOURCE_ID;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.safetycenter.SafetyEvent;
+import android.safetycenter.SafetySourceData;
+import android.safetycenter.SafetySourceStatus;
+import android.util.FeatureFlagUtils;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.safetycenter.SafetyCenterManagerWrapper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class PrivateSpaceSafetySourceTest {
+    private static final SafetyEvent EVENT_TYPE_DEVICE_REBOOTED =
+            new SafetyEvent.Builder(SAFETY_EVENT_TYPE_DEVICE_REBOOTED).build();
+    private Context mContext = ApplicationProvider.getApplicationContext();
+    @Mock private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
+
+    /** Required setup before a test. */
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        SafetyCenterManagerWrapper.sInstance = mSafetyCenterManagerWrapper;
+
+        FeatureFlagUtils
+                .setEnabled(mContext, FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS, true);
+    }
+
+    /** Required setup after a test. */
+    @After
+    public void tearDown() {
+        SafetyCenterManagerWrapper.sInstance = null;
+    }
+
+    /** Tests that when SC is disabled we don't set any data. */
+    @Test
+    public void onDeviceRebootedEvent_whenSafetyCenterDisabled_doesNotSetData() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(false);
+
+        PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
+    }
+
+    /** Tests that when SC is enabled we set data. */
+    @Test
+    public void onDeviceRebootedEvent_whenSafetyCenterEnabled_setsData() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
+
+        PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), eq(SAFETY_SOURCE_ID), any(), eq(EVENT_TYPE_DEVICE_REBOOTED));
+    }
+
+    // TODO(b/295516544): Modify this test for the new trunk stable flag instead when available.
+    /** Tests that when the feature is disabled null data is set. */
+    @Test
+    public void setSafetySourceData_whenFeatureDisabled_setsNullData() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
+        FeatureFlagUtils
+                .setEnabled(mContext, FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS, false);
+
+        PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), eq(SAFETY_SOURCE_ID), captor.capture(), eq(EVENT_TYPE_DEVICE_REBOOTED));
+        SafetySourceData safetySourceData = captor.getValue();
+        assertThat(safetySourceData).isNull();
+
+        FeatureFlagUtils
+                .setEnabled(mContext, FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS, true);
+    }
+
+    /** Tests that setSafetySourceData sets the source status enabled. */
+    @Test
+    public void setSafetySourceData_setsEnabled() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
+
+        PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), eq(SAFETY_SOURCE_ID), captor.capture(), eq(EVENT_TYPE_DEVICE_REBOOTED));
+        SafetySourceData safetySourceData = captor.getValue();
+        SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
+        assertThat(safetySourceStatus.isEnabled()).isTrue();
+    }
+
+    /** Tests that setSafetySourceData sets the PS settings page intent. */
+    @Test
+    public void setSafetySourceData_setsPsIntent() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
+
+        PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), eq(SAFETY_SOURCE_ID), captor.capture(), eq(EVENT_TYPE_DEVICE_REBOOTED));
+        SafetySourceData safetySourceData = captor.getValue();
+        SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
+        assertThat(safetySourceStatus.getPendingIntent().getIntent().getIdentifier())
+                .isEqualTo(SAFETY_SOURCE_ID);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java b/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
new file mode 100644
index 0000000..e7ebb37
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+@RunWith(AndroidJUnit4.class)
+public class UseOneLockControllerTest {
+    @Mock private Context mContext;
+    private UseOneLockController mUseOneLockController;
+
+    /** Required setup before a test. */
+    @Before
+    public void setUp() {
+        mContext = ApplicationProvider.getApplicationContext();
+        final String preferenceKey = "private_space_use_one_lock";
+
+        mUseOneLockController = new UseOneLockController(mContext, preferenceKey);
+    }
+
+    /** Tests that the controller is always available. */
+    @Test
+    public void getAvailabilityStatus_returnsAvailable() {
+        assertThat(mUseOneLockController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
index 3ad1874..caae44a 100644
--- a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
@@ -21,9 +21,7 @@
 import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS;
 import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_DEVICE_REBOOTED;
 import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED;
-
 import static com.google.common.truth.Truth.assertThat;
-
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
@@ -33,11 +31,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.safetycenter.SafetyEvent;
+import android.safetycenter.SafetySourceData;
+import android.util.FeatureFlagUtils;
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.privatespace.PrivateSpaceSafetySource;
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.After;
@@ -216,6 +217,62 @@
         assertThat(captor.getValue()).isEqualTo(BiometricsSafetySource.SAFETY_SOURCE_ID);
     }
 
+    /**
+     *  Tests that on receiving the refresh broadcast request with the PS source id, the PS data
+     * is set.
+     */
+    @Test
+    public void onReceive_onRefresh_withPrivateSpaceSourceId_setsPrivateSpaceData() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+        Intent intent =
+                new Intent()
+                        .setAction(ACTION_REFRESH_SAFETY_SOURCES)
+                        .putExtra(
+                                EXTRA_REFRESH_SAFETY_SOURCE_IDS,
+                                new String[] {PrivateSpaceSafetySource.SAFETY_SOURCE_ID})
+                        .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID, REFRESH_BROADCAST_ID);
+
+        new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+        verify(mSafetyCenterManagerWrapper, times(1))
+                .setSafetySourceData(any(), captor.capture(), any(), any());
+
+        assertThat(captor.getValue()).isEqualTo(PrivateSpaceSafetySource.SAFETY_SOURCE_ID);
+    }
+
+    /** Tests that the PS source sets null data when it's disabled. */
+    // TODO(b/295516544): Modify this test for the new trunk stable flag instead when available.
+    @Test
+    public void onReceive_onRefresh_withPrivateSpaceFeatureDisabled_setsNullData() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+        FeatureFlagUtils
+                .setEnabled(
+                        mApplicationContext,
+                        FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS,
+                        false);
+
+        Intent intent =
+                new Intent()
+                        .setAction(ACTION_REFRESH_SAFETY_SOURCES)
+                        .putExtra(
+                                EXTRA_REFRESH_SAFETY_SOURCE_IDS,
+                                new String[] {PrivateSpaceSafetySource.SAFETY_SOURCE_ID})
+                        .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID, REFRESH_BROADCAST_ID);
+
+        new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        verify(mSafetyCenterManagerWrapper, times(1))
+                .setSafetySourceData(any(), any(), captor.capture(), any());
+
+        assertThat(captor.getValue()).isEqualTo(null);
+
+        FeatureFlagUtils
+                .setEnabled(
+                        mApplicationContext,
+                        FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS,
+                        true);
+    }
+
     @Test
     public void onReceive_onBootCompleted_setsBootCompleteEvent() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
@@ -223,22 +280,22 @@
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
         ArgumentCaptor<SafetyEvent> captor = ArgumentCaptor.forClass(SafetyEvent.class);
-        verify(mSafetyCenterManagerWrapper, times(2))
+        verify(mSafetyCenterManagerWrapper, times(3))
                 .setSafetySourceData(any(), any(), any(), captor.capture());
 
         SafetyEvent bootEvent = new SafetyEvent.Builder(SAFETY_EVENT_TYPE_DEVICE_REBOOTED).build();
         assertThat(captor.getAllValues())
-                .containsExactlyElementsIn(Arrays.asList(bootEvent, bootEvent));
+                .containsExactlyElementsIn(Arrays.asList(bootEvent, bootEvent, bootEvent));
     }
 
     @Test
-    public void onReceive_onBootCompleted_sendsBiometricAndLockscreenData() {
+    public void onReceive_onBootCompleted_sendsAllSafetySourcesData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         Intent intent = new Intent().setAction(Intent.ACTION_BOOT_COMPLETED);
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
         ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
-        verify(mSafetyCenterManagerWrapper, times(2))
+        verify(mSafetyCenterManagerWrapper, times(3))
                 .setSafetySourceData(any(), captor.capture(), any(), any());
         List<String> safetySourceIdList = captor.getAllValues();
 
@@ -246,5 +303,7 @@
                 id -> id.equals(LockScreenSafetySource.SAFETY_SOURCE_ID))).isTrue();
         assertThat(safetySourceIdList.stream().anyMatch(
                 id -> id.equals(BiometricsSafetySource.SAFETY_SOURCE_ID))).isTrue();
+        assertThat(safetySourceIdList.stream().anyMatch(
+                id -> id.equals(PrivateSpaceSafetySource.SAFETY_SOURCE_ID))).isTrue();
     }
 }