diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b666881..c1e0c60 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -307,7 +307,7 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.wifi.SavedAccessPointsWifiSettings" />
+                android:value="com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
         </activity>
@@ -574,6 +574,12 @@
                 android:value="true" />
         </activity>
 
+        <activity android:name=".localepicker.LocalePickerWithRegionActivity"
+                  android:excludeFromRecents="true"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:exported="false">
+        </activity>
+
         <activity
             android:name=".Settings$LanguageAndInputSettingsActivity"
             android:label="@string/language_settings"
@@ -1923,7 +1929,7 @@
         <activity android:name=".bluetooth.RequestPermissionActivity"
                   android:excludeFromRecents="true"
                   android:permission="android.permission.BLUETOOTH"
-                  android:theme="@style/BluetoothPermission">
+                  android:theme="@style/Theme.BluetoothPermission">
             <intent-filter android:priority="1">
                 <action android:name="android.bluetooth.adapter.action.REQUEST_DISCOVERABLE" />
                 <action android:name="android.bluetooth.adapter.action.REQUEST_ENABLE" />
@@ -2520,9 +2526,6 @@
                 <action android:name="android.settings.ALL_APPS_NOTIFICATION_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <intent-filter android:priority="150">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.applications.manageapplications.ManageApplications" />
         </activity>
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 623f537..c2b8ed5 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -1353,22 +1353,6 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="                android:textColor=&quot;@color/red&quot;"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/credentials_dialog.xml"
-            line="36"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="        android:textColor=&quot;#FFFFFF&quot;"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2121,102 +2105,6 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="                android:textColor=&quot;#ffffb060&quot;"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/permission_settings.xml"
-            line="46"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="            android:background=&quot;#000000&quot; />"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/radio_info.xml"
-            line="116"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="            android:background=&quot;#000000&quot; />"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/radio_info.xml"
-            line="135"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="            android:background=&quot;#000000&quot; />"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/radio_info.xml"
-            line="165"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="            android:background=&quot;#000000&quot; />"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/layout/radio_info.xml"
-            line="303"
-            column="13"/>
-    </issue>
-
-    <issue
-            id="HardCodedColor"
-            severity="Error"
-            message="Avoid using hardcoded color"
-            category="Correctness"
-            priority="4"
-            summary="Using hardcoded color"
-            explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-            errorLine1="            android:background=&quot;#000000&quot; />"
-            errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-                file="res/layout/radio_info.xml"
-                line="303"
-                column="13"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="            android:src=&quot;@color/running_processes_system_ram&quot;"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2445,7 +2333,7 @@
         errorLine2="                                                                                                                                                                       ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rXC/strings.xml"
-            line="2531"
+            line="2559"
             column="168"/>
     </issue>
 
@@ -2461,7 +2349,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rAU/strings.xml"
-            line="2532"
+            line="2560"
             column="64"/>
     </issue>
 
@@ -2477,7 +2365,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rCA/strings.xml"
-            line="2532"
+            line="2560"
             column="64"/>
     </issue>
 
@@ -2493,7 +2381,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rGB/strings.xml"
-            line="2532"
+            line="2560"
             column="64"/>
     </issue>
 
@@ -2509,7 +2397,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values-en-rIN/strings.xml"
-            line="2532"
+            line="2560"
             column="64"/>
     </issue>
 
@@ -2525,7 +2413,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values/strings.xml"
-            line="5920"
+            line="5902"
             column="36"/>
     </issue>
 
@@ -2541,7 +2429,7 @@
         errorLine2="                                        ^">
         <location
             file="res/values/styles.xml"
-            line="248"
+            line="171"
             column="41"/>
     </issue>
 
@@ -2557,7 +2445,7 @@
         errorLine2="                                           ^">
         <location
             file="res/values/styles.xml"
-            line="465"
+            line="425"
             column="44"/>
     </issue>
 
@@ -2573,7 +2461,7 @@
         errorLine2="                                           ^">
         <location
             file="res/values/styles.xml"
-            line="471"
+            line="431"
             column="44"/>
     </issue>
 
@@ -2589,7 +2477,7 @@
         errorLine2="                                           ^">
         <location
             file="res/values/styles.xml"
-            line="472"
+            line="432"
             column="44"/>
     </issue>
 
@@ -2601,155 +2489,11 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_dark&lt;/item>"
-        errorLine2="                                       ^">
-        <location
-            file="res/values/themes.xml"
-            line="31"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_light&lt;/item>"
-        errorLine2="                                       ^">
-        <location
-            file="res/values/themes.xml"
-            line="49"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_dark&lt;/item>"
-        errorLine2="                                       ^">
-        <location
-            file="res/values/themes.xml"
-            line="67"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_light&lt;/item>"
-        errorLine2="                                       ^">
-        <location
-            file="res/values/themes.xml"
-            line="85"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_dark&lt;/item>"
-        errorLine2="                                       ^">
-        <location
-            file="res/values/themes.xml"
-            line="103"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_light&lt;/item>"
-        errorLine2="                                       ^">
-        <location
-            file="res/values/themes.xml"
-            line="121"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;android:colorPrimary&quot;>@color/material_grey_100&lt;/item>"
-        errorLine2="                                          ^">
-        <location
-            file="res/values/themes.xml"
-            line="197"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;android:colorAccent&quot;>@color/material_blue_700&lt;/item>"
-        errorLine2="                                         ^">
-        <location
-            file="res/values/themes.xml"
-            line="198"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
-        errorLine1="        &lt;item name=&quot;android:titleTextColor&quot;>@color/material_blue_700&lt;/item>"
-        errorLine2="                                            ^">
-        <location
-            file="res/values/themes.xml"
-            line="199"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="HardCodedColor"
-        severity="Error"
-        message="Avoid using hardcoded color"
-        category="Correctness"
-        priority="4"
-        summary="Using hardcoded color"
-        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="        &lt;item name=&quot;batteryGoodColor&quot;>@color/battery_good_color_light&lt;/item>"
         errorLine2="                                      ^">
         <location
             file="res/values/themes.xml"
-            line="240"
+            line="54"
             column="39"/>
     </issue>
 
@@ -2765,7 +2509,7 @@
         errorLine2="                                       ^">
         <location
             file="res/values/themes.xml"
-            line="241"
+            line="55"
             column="40"/>
     </issue>
 
@@ -2781,7 +2525,7 @@
         errorLine2="                                     ^">
         <location
             file="res/values/themes.xml"
-            line="242"
+            line="56"
             column="38"/>
     </issue>
 
@@ -2797,7 +2541,7 @@
         errorLine2="                                              ^">
         <location
             file="res/values/themes.xml"
-            line="280"
+            line="86"
             column="47"/>
     </issue>
 
@@ -2813,7 +2557,7 @@
         errorLine2="                                            ^">
         <location
             file="res/values/themes.xml"
-            line="349"
+            line="147"
             column="45"/>
     </issue>
 
@@ -2829,7 +2573,7 @@
         errorLine2="                                                ^">
         <location
             file="res/values/themes.xml"
-            line="350"
+            line="148"
             column="49"/>
     </issue>
 
@@ -2845,7 +2589,7 @@
         errorLine2="                                            ^">
         <location
             file="res/values/themes.xml"
-            line="358"
+            line="156"
             column="45"/>
     </issue>
 
@@ -2861,7 +2605,7 @@
         errorLine2="                                                ^">
         <location
             file="res/values/themes.xml"
-            line="359"
+            line="157"
             column="49"/>
     </issue>
 
@@ -2873,6 +2617,150 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_dark&lt;/item>"
+        errorLine2="                                       ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="29"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_light&lt;/item>"
+        errorLine2="                                       ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="48"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_dark&lt;/item>"
+        errorLine2="                                       ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="67"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_light&lt;/item>"
+        errorLine2="                                       ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="86"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_dark&lt;/item>"
+        errorLine2="                                       ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="105"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;wifi_signal_color&quot;>@color/setup_wizard_wifi_color_light&lt;/item>"
+        errorLine2="                                       ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="124"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;android:colorPrimary&quot;>@color/material_grey_100&lt;/item>"
+        errorLine2="                                          ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="187"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;android:colorAccent&quot;>@color/material_blue_700&lt;/item>"
+        errorLine2="                                         ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="188"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="        &lt;item name=&quot;android:titleTextColor&quot;>@color/material_blue_700&lt;/item>"
+        errorLine2="                                            ^">
+        <location
+            file="res/values/themes_suw.xml"
+            line="189"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="          android:background=&quot;@color/divider_color&quot; />"
         errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/res/drawable-hdpi/appwidget_item_bg_normal.9.png b/res/drawable-hdpi/appwidget_item_bg_normal.9.png
deleted file mode 100644
index 8dd4479..0000000
--- a/res/drawable-hdpi/appwidget_item_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/appwidget_item_bg_pressed.9.png b/res/drawable-hdpi/appwidget_item_bg_pressed.9.png
deleted file mode 100644
index fb64dfc..0000000
--- a/res/drawable-hdpi/appwidget_item_bg_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/bg_header_horizontal_tile.png b/res/drawable-hdpi/bg_header_horizontal_tile.png
deleted file mode 100644
index 4270099..0000000
--- a/res/drawable-hdpi/bg_header_horizontal_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/bg_internal_storage_header.png b/res/drawable-hdpi/bg_internal_storage_header.png
deleted file mode 100644
index 1c297d9..0000000
--- a/res/drawable-hdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/bg_portable_storage_header.png b/res/drawable-hdpi/bg_portable_storage_header.png
deleted file mode 100644
index 42fe2c1..0000000
--- a/res/drawable-hdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/bg_setup_header.png b/res/drawable-hdpi/bg_setup_header.png
deleted file mode 100644
index 0d30849..0000000
--- a/res/drawable-hdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/bg_tile_teal.png b/res/drawable-hdpi/bg_tile_teal.png
deleted file mode 100644
index 26538ec..0000000
--- a/res/drawable-hdpi/bg_tile_teal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_sync_grey.png b/res/drawable-hdpi/ic_sync_grey.png
deleted file mode 100644
index 3e9995a..0000000
--- a/res/drawable-hdpi/ic_sync_grey.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_sync_red.png b/res/drawable-hdpi/ic_sync_red.png
deleted file mode 100644
index 5abb707..0000000
--- a/res/drawable-hdpi/ic_sync_red.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_selected_all.png b/res/drawable-hdpi/ic_tab_selected_all.png
deleted file mode 100644
index c168869..0000000
--- a/res/drawable-hdpi/ic_tab_selected_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_selected_download.png b/res/drawable-hdpi/ic_tab_selected_download.png
deleted file mode 100644
index dd3f5f9..0000000
--- a/res/drawable-hdpi/ic_tab_selected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_selected_running.png b/res/drawable-hdpi/ic_tab_selected_running.png
deleted file mode 100644
index 17b71b4..0000000
--- a/res/drawable-hdpi/ic_tab_selected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_selected_sdcard.png b/res/drawable-hdpi/ic_tab_selected_sdcard.png
deleted file mode 100644
index 752c35d..0000000
--- a/res/drawable-hdpi/ic_tab_selected_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_unselected_all.png b/res/drawable-hdpi/ic_tab_unselected_all.png
deleted file mode 100644
index c168869..0000000
--- a/res/drawable-hdpi/ic_tab_unselected_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_unselected_download.png b/res/drawable-hdpi/ic_tab_unselected_download.png
deleted file mode 100644
index 1e71efb..0000000
--- a/res/drawable-hdpi/ic_tab_unselected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_unselected_running.png b/res/drawable-hdpi/ic_tab_unselected_running.png
deleted file mode 100644
index a73d078..0000000
--- a/res/drawable-hdpi/ic_tab_unselected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_unselected_sdcard.png b/res/drawable-hdpi/ic_tab_unselected_sdcard.png
deleted file mode 100644
index 752c35d..0000000
--- a/res/drawable-hdpi/ic_tab_unselected_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/illustration_horizontal.jpg b/res/drawable-hdpi/illustration_horizontal.jpg
deleted file mode 100644
index 428b2f4..0000000
--- a/res/drawable-hdpi/illustration_horizontal.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/illustration_tile.jpg b/res/drawable-hdpi/illustration_tile.jpg
deleted file mode 100644
index 9931a23..0000000
--- a/res/drawable-hdpi/illustration_tile.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_0.png b/res/drawable-hdpi/lock_anim_0.png
deleted file mode 100644
index 08732e4..0000000
--- a/res/drawable-hdpi/lock_anim_0.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_1.png b/res/drawable-hdpi/lock_anim_1.png
deleted file mode 100644
index 74a0628..0000000
--- a/res/drawable-hdpi/lock_anim_1.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_10.png b/res/drawable-hdpi/lock_anim_10.png
deleted file mode 100644
index adb981d..0000000
--- a/res/drawable-hdpi/lock_anim_10.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_11.png b/res/drawable-hdpi/lock_anim_11.png
deleted file mode 100644
index f8976a2..0000000
--- a/res/drawable-hdpi/lock_anim_11.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_12.png b/res/drawable-hdpi/lock_anim_12.png
deleted file mode 100644
index 3ccdc85..0000000
--- a/res/drawable-hdpi/lock_anim_12.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_13.png b/res/drawable-hdpi/lock_anim_13.png
deleted file mode 100644
index ccd38d5..0000000
--- a/res/drawable-hdpi/lock_anim_13.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_14.png b/res/drawable-hdpi/lock_anim_14.png
deleted file mode 100644
index 2f40d9e..0000000
--- a/res/drawable-hdpi/lock_anim_14.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_2.png b/res/drawable-hdpi/lock_anim_2.png
deleted file mode 100644
index 495b2da..0000000
--- a/res/drawable-hdpi/lock_anim_2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_3.png b/res/drawable-hdpi/lock_anim_3.png
deleted file mode 100644
index fa37813..0000000
--- a/res/drawable-hdpi/lock_anim_3.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_4.png b/res/drawable-hdpi/lock_anim_4.png
deleted file mode 100644
index 8201fd9..0000000
--- a/res/drawable-hdpi/lock_anim_4.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_5.png b/res/drawable-hdpi/lock_anim_5.png
deleted file mode 100644
index b08932d..0000000
--- a/res/drawable-hdpi/lock_anim_5.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_6.png b/res/drawable-hdpi/lock_anim_6.png
deleted file mode 100644
index dac09e1..0000000
--- a/res/drawable-hdpi/lock_anim_6.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_7.png b/res/drawable-hdpi/lock_anim_7.png
deleted file mode 100644
index f06c9d6..0000000
--- a/res/drawable-hdpi/lock_anim_7.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_8.png b/res/drawable-hdpi/lock_anim_8.png
deleted file mode 100644
index 07f7e34..0000000
--- a/res/drawable-hdpi/lock_anim_8.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/lock_anim_9.png b/res/drawable-hdpi/lock_anim_9.png
deleted file mode 100644
index 551bafa..0000000
--- a/res/drawable-hdpi/lock_anim_9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/nfc_payment_empty_state.png b/res/drawable-hdpi/nfc_payment_empty_state.png
deleted file mode 100644
index 7d20bc8..0000000
--- a/res/drawable-hdpi/nfc_payment_empty_state.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/spinner_default_holo_dark_am_no_underline.9.png b/res/drawable-hdpi/spinner_default_holo_dark_am_no_underline.9.png
deleted file mode 100644
index 267e7ba..0000000
--- a/res/drawable-hdpi/spinner_default_holo_dark_am_no_underline.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_tab_selected_running.png b/res/drawable-ldrtl-hdpi/ic_tab_selected_running.png
deleted file mode 100644
index 1cb9c8d..0000000
--- a/res/drawable-ldrtl-hdpi/ic_tab_selected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_tab_unselected_running.png b/res/drawable-ldrtl-hdpi/ic_tab_unselected_running.png
deleted file mode 100644
index 1cb9c8d..0000000
--- a/res/drawable-ldrtl-hdpi/ic_tab_unselected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_tab_selected_running.png b/res/drawable-ldrtl-mdpi/ic_tab_selected_running.png
deleted file mode 100644
index 740e709..0000000
--- a/res/drawable-ldrtl-mdpi/ic_tab_selected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_tab_unselected_running.png b/res/drawable-ldrtl-mdpi/ic_tab_unselected_running.png
deleted file mode 100644
index 740e709..0000000
--- a/res/drawable-ldrtl-mdpi/ic_tab_unselected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_tab_selected_running.png b/res/drawable-ldrtl-xhdpi/ic_tab_selected_running.png
deleted file mode 100644
index fcd6ab1..0000000
--- a/res/drawable-ldrtl-xhdpi/ic_tab_selected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_tab_unselected_running.png b/res/drawable-ldrtl-xhdpi/ic_tab_unselected_running.png
deleted file mode 100644
index fcd6ab1..0000000
--- a/res/drawable-ldrtl-xhdpi/ic_tab_unselected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/appwidget_item_bg_normal.9.png b/res/drawable-mdpi/appwidget_item_bg_normal.9.png
deleted file mode 100644
index 6af3493..0000000
--- a/res/drawable-mdpi/appwidget_item_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/appwidget_item_bg_pressed.9.png b/res/drawable-mdpi/appwidget_item_bg_pressed.9.png
deleted file mode 100644
index ebb7a99..0000000
--- a/res/drawable-mdpi/appwidget_item_bg_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/bg_header_horizontal_tile.png b/res/drawable-mdpi/bg_header_horizontal_tile.png
deleted file mode 100644
index be8512d..0000000
--- a/res/drawable-mdpi/bg_header_horizontal_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/bg_internal_storage_header.png b/res/drawable-mdpi/bg_internal_storage_header.png
deleted file mode 100644
index d93c6a2..0000000
--- a/res/drawable-mdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/bg_portable_storage_header.png b/res/drawable-mdpi/bg_portable_storage_header.png
deleted file mode 100644
index a39df23..0000000
--- a/res/drawable-mdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/bg_setup_header.png b/res/drawable-mdpi/bg_setup_header.png
deleted file mode 100644
index f07d3fa..0000000
--- a/res/drawable-mdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/bg_tile_teal.png b/res/drawable-mdpi/bg_tile_teal.png
deleted file mode 100644
index 01abedb..0000000
--- a/res/drawable-mdpi/bg_tile_teal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_sync_grey.png b/res/drawable-mdpi/ic_sync_grey.png
deleted file mode 100644
index 8f168d4..0000000
--- a/res/drawable-mdpi/ic_sync_grey.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_sync_red.png b/res/drawable-mdpi/ic_sync_red.png
deleted file mode 100644
index 5e38136..0000000
--- a/res/drawable-mdpi/ic_sync_red.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_selected_all.png b/res/drawable-mdpi/ic_tab_selected_all.png
deleted file mode 100644
index 3cc0dde..0000000
--- a/res/drawable-mdpi/ic_tab_selected_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_selected_download.png b/res/drawable-mdpi/ic_tab_selected_download.png
deleted file mode 100644
index a9d71ae..0000000
--- a/res/drawable-mdpi/ic_tab_selected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_selected_running.png b/res/drawable-mdpi/ic_tab_selected_running.png
deleted file mode 100644
index 714c5a4..0000000
--- a/res/drawable-mdpi/ic_tab_selected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_selected_sdcard.png b/res/drawable-mdpi/ic_tab_selected_sdcard.png
deleted file mode 100644
index 731aad5..0000000
--- a/res/drawable-mdpi/ic_tab_selected_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_unselected_all.png b/res/drawable-mdpi/ic_tab_unselected_all.png
deleted file mode 100644
index 3cc0dde..0000000
--- a/res/drawable-mdpi/ic_tab_unselected_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_unselected_download.png b/res/drawable-mdpi/ic_tab_unselected_download.png
deleted file mode 100644
index 59930fe..0000000
--- a/res/drawable-mdpi/ic_tab_unselected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_unselected_running.png b/res/drawable-mdpi/ic_tab_unselected_running.png
deleted file mode 100644
index b76a1d3..0000000
--- a/res/drawable-mdpi/ic_tab_unselected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_unselected_sdcard.png b/res/drawable-mdpi/ic_tab_unselected_sdcard.png
deleted file mode 100644
index 731aad5..0000000
--- a/res/drawable-mdpi/ic_tab_unselected_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/illustration_horizontal.jpg b/res/drawable-mdpi/illustration_horizontal.jpg
deleted file mode 100644
index 52e7993..0000000
--- a/res/drawable-mdpi/illustration_horizontal.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/illustration_tile.jpg b/res/drawable-mdpi/illustration_tile.jpg
deleted file mode 100644
index 7923fb4..0000000
--- a/res/drawable-mdpi/illustration_tile.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_0.png b/res/drawable-mdpi/lock_anim_0.png
deleted file mode 100644
index afdda8b..0000000
--- a/res/drawable-mdpi/lock_anim_0.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_1.png b/res/drawable-mdpi/lock_anim_1.png
deleted file mode 100644
index 6cae8e5..0000000
--- a/res/drawable-mdpi/lock_anim_1.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_10.png b/res/drawable-mdpi/lock_anim_10.png
deleted file mode 100644
index 5de840e..0000000
--- a/res/drawable-mdpi/lock_anim_10.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_11.png b/res/drawable-mdpi/lock_anim_11.png
deleted file mode 100644
index 35db815..0000000
--- a/res/drawable-mdpi/lock_anim_11.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_12.png b/res/drawable-mdpi/lock_anim_12.png
deleted file mode 100644
index 8778d98..0000000
--- a/res/drawable-mdpi/lock_anim_12.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_13.png b/res/drawable-mdpi/lock_anim_13.png
deleted file mode 100644
index d0b8cf0..0000000
--- a/res/drawable-mdpi/lock_anim_13.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_14.png b/res/drawable-mdpi/lock_anim_14.png
deleted file mode 100644
index ea1aa31..0000000
--- a/res/drawable-mdpi/lock_anim_14.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_2.png b/res/drawable-mdpi/lock_anim_2.png
deleted file mode 100644
index 0542b1d..0000000
--- a/res/drawable-mdpi/lock_anim_2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_3.png b/res/drawable-mdpi/lock_anim_3.png
deleted file mode 100644
index 7e2ba9a..0000000
--- a/res/drawable-mdpi/lock_anim_3.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_4.png b/res/drawable-mdpi/lock_anim_4.png
deleted file mode 100644
index a3ca629..0000000
--- a/res/drawable-mdpi/lock_anim_4.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_5.png b/res/drawable-mdpi/lock_anim_5.png
deleted file mode 100644
index 17e3839..0000000
--- a/res/drawable-mdpi/lock_anim_5.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_6.png b/res/drawable-mdpi/lock_anim_6.png
deleted file mode 100644
index 90205a6..0000000
--- a/res/drawable-mdpi/lock_anim_6.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_7.png b/res/drawable-mdpi/lock_anim_7.png
deleted file mode 100644
index 1d94a47..0000000
--- a/res/drawable-mdpi/lock_anim_7.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_8.png b/res/drawable-mdpi/lock_anim_8.png
deleted file mode 100644
index af7cd28..0000000
--- a/res/drawable-mdpi/lock_anim_8.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_9.png b/res/drawable-mdpi/lock_anim_9.png
deleted file mode 100644
index d401624..0000000
--- a/res/drawable-mdpi/lock_anim_9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/nfc_payment_empty_state.png b/res/drawable-mdpi/nfc_payment_empty_state.png
deleted file mode 100644
index 67ea0b7..0000000
--- a/res/drawable-mdpi/nfc_payment_empty_state.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/spinner_default_holo_dark_am_no_underline.9.png b/res/drawable-mdpi/spinner_default_holo_dark_am_no_underline.9.png
deleted file mode 100644
index db51f6b..0000000
--- a/res/drawable-mdpi/spinner_default_holo_dark_am_no_underline.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/bg_internal_storage_header.png b/res/drawable-sw600dp-hdpi/bg_internal_storage_header.png
deleted file mode 100644
index 5102e54..0000000
--- a/res/drawable-sw600dp-hdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/bg_portable_storage_header.png b/res/drawable-sw600dp-hdpi/bg_portable_storage_header.png
deleted file mode 100644
index 26fd248..0000000
--- a/res/drawable-sw600dp-hdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/bg_setup_header.png b/res/drawable-sw600dp-hdpi/bg_setup_header.png
deleted file mode 100644
index 2178602..0000000
--- a/res/drawable-sw600dp-hdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/bg_internal_storage_header.png b/res/drawable-sw600dp-mdpi/bg_internal_storage_header.png
deleted file mode 100644
index b39c652..0000000
--- a/res/drawable-sw600dp-mdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/bg_portable_storage_header.png b/res/drawable-sw600dp-mdpi/bg_portable_storage_header.png
deleted file mode 100644
index 1f5d10b..0000000
--- a/res/drawable-sw600dp-mdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/bg_setup_header.png b/res/drawable-sw600dp-mdpi/bg_setup_header.png
deleted file mode 100644
index 157b8aa..0000000
--- a/res/drawable-sw600dp-mdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/bg_internal_storage_header.png b/res/drawable-sw600dp-xhdpi/bg_internal_storage_header.png
deleted file mode 100644
index 38ea2a3..0000000
--- a/res/drawable-sw600dp-xhdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/bg_portable_storage_header.png b/res/drawable-sw600dp-xhdpi/bg_portable_storage_header.png
deleted file mode 100644
index 169ac25..0000000
--- a/res/drawable-sw600dp-xhdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/bg_setup_header.png b/res/drawable-sw600dp-xhdpi/bg_setup_header.png
deleted file mode 100644
index a4e1eb3..0000000
--- a/res/drawable-sw600dp-xhdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/bg_internal_storage_header.png b/res/drawable-sw600dp-xxhdpi/bg_internal_storage_header.png
deleted file mode 100644
index 8920af3..0000000
--- a/res/drawable-sw600dp-xxhdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/bg_portable_storage_header.png b/res/drawable-sw600dp-xxhdpi/bg_portable_storage_header.png
deleted file mode 100644
index 9190f38..0000000
--- a/res/drawable-sw600dp-xxhdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/bg_setup_header.png b/res/drawable-sw600dp-xxhdpi/bg_setup_header.png
deleted file mode 100644
index 6fce3df..0000000
--- a/res/drawable-sw600dp-xxhdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/bg_internal_storage_header.png b/res/drawable-sw600dp-xxxhdpi/bg_internal_storage_header.png
deleted file mode 100644
index a99ed1c..0000000
--- a/res/drawable-sw600dp-xxxhdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/bg_portable_storage_header.png b/res/drawable-sw600dp-xxxhdpi/bg_portable_storage_header.png
deleted file mode 100644
index d979bfb..0000000
--- a/res/drawable-sw600dp-xxxhdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/bg_setup_header.png b/res/drawable-sw600dp-xxxhdpi/bg_setup_header.png
deleted file mode 100644
index 7276b4e..0000000
--- a/res/drawable-sw600dp-xxxhdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/appwidget_item_bg_normal.9.png b/res/drawable-xhdpi/appwidget_item_bg_normal.9.png
deleted file mode 100644
index d752d5e..0000000
--- a/res/drawable-xhdpi/appwidget_item_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/appwidget_item_bg_pressed.9.png b/res/drawable-xhdpi/appwidget_item_bg_pressed.9.png
deleted file mode 100644
index e5941a6..0000000
--- a/res/drawable-xhdpi/appwidget_item_bg_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/bg_header_horizontal_tile.png b/res/drawable-xhdpi/bg_header_horizontal_tile.png
deleted file mode 100644
index 3b36902..0000000
--- a/res/drawable-xhdpi/bg_header_horizontal_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/bg_internal_storage_header.png b/res/drawable-xhdpi/bg_internal_storage_header.png
deleted file mode 100644
index f8b64e0..0000000
--- a/res/drawable-xhdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/bg_portable_storage_header.png b/res/drawable-xhdpi/bg_portable_storage_header.png
deleted file mode 100644
index 12c432d..0000000
--- a/res/drawable-xhdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/bg_setup_header.png b/res/drawable-xhdpi/bg_setup_header.png
deleted file mode 100644
index d7c4401..0000000
--- a/res/drawable-xhdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/bg_tile_teal.png b/res/drawable-xhdpi/bg_tile_teal.png
deleted file mode 100644
index e6f2f06..0000000
--- a/res/drawable-xhdpi/bg_tile_teal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sync_grey.png b/res/drawable-xhdpi/ic_sync_grey.png
deleted file mode 100644
index 8a17f37..0000000
--- a/res/drawable-xhdpi/ic_sync_grey.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sync_red.png b/res/drawable-xhdpi/ic_sync_red.png
deleted file mode 100644
index 92d02e1..0000000
--- a/res/drawable-xhdpi/ic_sync_red.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_selected_all.png b/res/drawable-xhdpi/ic_tab_selected_all.png
deleted file mode 100644
index b59933b..0000000
--- a/res/drawable-xhdpi/ic_tab_selected_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_selected_download.png b/res/drawable-xhdpi/ic_tab_selected_download.png
deleted file mode 100644
index 6c6d26b..0000000
--- a/res/drawable-xhdpi/ic_tab_selected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_selected_running.png b/res/drawable-xhdpi/ic_tab_selected_running.png
deleted file mode 100644
index 37084d2..0000000
--- a/res/drawable-xhdpi/ic_tab_selected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_selected_sdcard.png b/res/drawable-xhdpi/ic_tab_selected_sdcard.png
deleted file mode 100644
index 536326c..0000000
--- a/res/drawable-xhdpi/ic_tab_selected_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_unselected_all.png b/res/drawable-xhdpi/ic_tab_unselected_all.png
deleted file mode 100644
index b59933b..0000000
--- a/res/drawable-xhdpi/ic_tab_unselected_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_unselected_download.png b/res/drawable-xhdpi/ic_tab_unselected_download.png
deleted file mode 100644
index e8084c2..0000000
--- a/res/drawable-xhdpi/ic_tab_unselected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_unselected_running.png b/res/drawable-xhdpi/ic_tab_unselected_running.png
deleted file mode 100644
index 8eda83f..0000000
--- a/res/drawable-xhdpi/ic_tab_unselected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_unselected_sdcard.png b/res/drawable-xhdpi/ic_tab_unselected_sdcard.png
deleted file mode 100644
index 536326c..0000000
--- a/res/drawable-xhdpi/ic_tab_unselected_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/illustration_horizontal.jpg b/res/drawable-xhdpi/illustration_horizontal.jpg
deleted file mode 100644
index 2733f8e..0000000
--- a/res/drawable-xhdpi/illustration_horizontal.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/illustration_tile.jpg b/res/drawable-xhdpi/illustration_tile.jpg
deleted file mode 100644
index 57bccca..0000000
--- a/res/drawable-xhdpi/illustration_tile.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_0.png b/res/drawable-xhdpi/lock_anim_0.png
deleted file mode 100644
index 5e8e6dc..0000000
--- a/res/drawable-xhdpi/lock_anim_0.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_1.png b/res/drawable-xhdpi/lock_anim_1.png
deleted file mode 100644
index 96fbd03..0000000
--- a/res/drawable-xhdpi/lock_anim_1.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_10.png b/res/drawable-xhdpi/lock_anim_10.png
deleted file mode 100644
index e2e83b1..0000000
--- a/res/drawable-xhdpi/lock_anim_10.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_11.png b/res/drawable-xhdpi/lock_anim_11.png
deleted file mode 100644
index 68de396..0000000
--- a/res/drawable-xhdpi/lock_anim_11.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_12.png b/res/drawable-xhdpi/lock_anim_12.png
deleted file mode 100644
index 11e51c7..0000000
--- a/res/drawable-xhdpi/lock_anim_12.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_13.png b/res/drawable-xhdpi/lock_anim_13.png
deleted file mode 100644
index 86a6115..0000000
--- a/res/drawable-xhdpi/lock_anim_13.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_14.png b/res/drawable-xhdpi/lock_anim_14.png
deleted file mode 100644
index 5bff2fa..0000000
--- a/res/drawable-xhdpi/lock_anim_14.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_2.png b/res/drawable-xhdpi/lock_anim_2.png
deleted file mode 100644
index 68e59c8..0000000
--- a/res/drawable-xhdpi/lock_anim_2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_3.png b/res/drawable-xhdpi/lock_anim_3.png
deleted file mode 100644
index 16272ed..0000000
--- a/res/drawable-xhdpi/lock_anim_3.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_4.png b/res/drawable-xhdpi/lock_anim_4.png
deleted file mode 100644
index af6fbc4..0000000
--- a/res/drawable-xhdpi/lock_anim_4.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_5.png b/res/drawable-xhdpi/lock_anim_5.png
deleted file mode 100644
index 1e631b5..0000000
--- a/res/drawable-xhdpi/lock_anim_5.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_6.png b/res/drawable-xhdpi/lock_anim_6.png
deleted file mode 100644
index 93fcf39..0000000
--- a/res/drawable-xhdpi/lock_anim_6.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_7.png b/res/drawable-xhdpi/lock_anim_7.png
deleted file mode 100644
index b5c5277..0000000
--- a/res/drawable-xhdpi/lock_anim_7.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_8.png b/res/drawable-xhdpi/lock_anim_8.png
deleted file mode 100644
index bcaec0d..0000000
--- a/res/drawable-xhdpi/lock_anim_8.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/lock_anim_9.png b/res/drawable-xhdpi/lock_anim_9.png
deleted file mode 100644
index c481d1a..0000000
--- a/res/drawable-xhdpi/lock_anim_9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/nfc_payment_empty_state.png b/res/drawable-xhdpi/nfc_payment_empty_state.png
deleted file mode 100644
index 5291c22..0000000
--- a/res/drawable-xhdpi/nfc_payment_empty_state.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/spinner_default_holo_dark_am_no_underline.9.png b/res/drawable-xhdpi/spinner_default_holo_dark_am_no_underline.9.png
deleted file mode 100644
index 8d22ce2..0000000
--- a/res/drawable-xhdpi/spinner_default_holo_dark_am_no_underline.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/appwidget_item_bg_normal.9.png b/res/drawable-xxhdpi/appwidget_item_bg_normal.9.png
deleted file mode 100644
index 0d887c8..0000000
--- a/res/drawable-xxhdpi/appwidget_item_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/appwidget_item_bg_pressed.9.png b/res/drawable-xxhdpi/appwidget_item_bg_pressed.9.png
deleted file mode 100644
index d14eb23..0000000
--- a/res/drawable-xxhdpi/appwidget_item_bg_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/bg_header_horizontal_tile.png b/res/drawable-xxhdpi/bg_header_horizontal_tile.png
deleted file mode 100644
index a879fe2..0000000
--- a/res/drawable-xxhdpi/bg_header_horizontal_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/bg_internal_storage_header.png b/res/drawable-xxhdpi/bg_internal_storage_header.png
deleted file mode 100644
index 01fe761..0000000
--- a/res/drawable-xxhdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/bg_portable_storage_header.png b/res/drawable-xxhdpi/bg_portable_storage_header.png
deleted file mode 100644
index 4bacf7c..0000000
--- a/res/drawable-xxhdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/bg_setup_header.png b/res/drawable-xxhdpi/bg_setup_header.png
deleted file mode 100644
index 566cc5f..0000000
--- a/res/drawable-xxhdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/bg_tile_teal.png b/res/drawable-xxhdpi/bg_tile_teal.png
deleted file mode 100644
index 29d268a..0000000
--- a/res/drawable-xxhdpi/bg_tile_teal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_tab_selected_download.png b/res/drawable-xxhdpi/ic_tab_selected_download.png
deleted file mode 100644
index 3abb0f0..0000000
--- a/res/drawable-xxhdpi/ic_tab_selected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_tab_selected_running.png b/res/drawable-xxhdpi/ic_tab_selected_running.png
deleted file mode 100644
index bfc9b5c..0000000
--- a/res/drawable-xxhdpi/ic_tab_selected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_tab_unselected_download.png b/res/drawable-xxhdpi/ic_tab_unselected_download.png
deleted file mode 100644
index 7030f3e..0000000
--- a/res/drawable-xxhdpi/ic_tab_unselected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/illustration_horizontal.jpg b/res/drawable-xxhdpi/illustration_horizontal.jpg
deleted file mode 100644
index aec8d0f..0000000
--- a/res/drawable-xxhdpi/illustration_horizontal.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/illustration_tile.jpg b/res/drawable-xxhdpi/illustration_tile.jpg
deleted file mode 100644
index 2ba33fa..0000000
--- a/res/drawable-xxhdpi/illustration_tile.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/nfc_payment_empty_state.png b/res/drawable-xxhdpi/nfc_payment_empty_state.png
deleted file mode 100644
index e23b0a7..0000000
--- a/res/drawable-xxhdpi/nfc_payment_empty_state.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/spinner_default_holo_dark_am_no_underline.9.png b/res/drawable-xxhdpi/spinner_default_holo_dark_am_no_underline.9.png
deleted file mode 100644
index 29fb50f..0000000
--- a/res/drawable-xxhdpi/spinner_default_holo_dark_am_no_underline.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/appwidget_item_bg_normal.9.png b/res/drawable-xxxhdpi/appwidget_item_bg_normal.9.png
deleted file mode 100644
index a656a67..0000000
--- a/res/drawable-xxxhdpi/appwidget_item_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/appwidget_item_bg_pressed.9.png b/res/drawable-xxxhdpi/appwidget_item_bg_pressed.9.png
deleted file mode 100644
index 58e64be..0000000
--- a/res/drawable-xxxhdpi/appwidget_item_bg_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/bg_header_horizontal_tile.png b/res/drawable-xxxhdpi/bg_header_horizontal_tile.png
deleted file mode 100644
index f19306a..0000000
--- a/res/drawable-xxxhdpi/bg_header_horizontal_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/bg_internal_storage_header.png b/res/drawable-xxxhdpi/bg_internal_storage_header.png
deleted file mode 100644
index eb9f268..0000000
--- a/res/drawable-xxxhdpi/bg_internal_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/bg_portable_storage_header.png b/res/drawable-xxxhdpi/bg_portable_storage_header.png
deleted file mode 100644
index 311544a..0000000
--- a/res/drawable-xxxhdpi/bg_portable_storage_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/bg_setup_header.png b/res/drawable-xxxhdpi/bg_setup_header.png
deleted file mode 100644
index 0df665e..0000000
--- a/res/drawable-xxxhdpi/bg_setup_header.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/bg_tile_teal.png b/res/drawable-xxxhdpi/bg_tile_teal.png
deleted file mode 100644
index 3d1a97a..0000000
--- a/res/drawable-xxxhdpi/bg_tile_teal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_tab_selected_download.png b/res/drawable-xxxhdpi/ic_tab_selected_download.png
deleted file mode 100644
index a024704..0000000
--- a/res/drawable-xxxhdpi/ic_tab_selected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_tab_selected_running.png b/res/drawable-xxxhdpi/ic_tab_selected_running.png
deleted file mode 100644
index f7a329f..0000000
--- a/res/drawable-xxxhdpi/ic_tab_selected_running.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_tab_unselected_download.png b/res/drawable-xxxhdpi/ic_tab_unselected_download.png
deleted file mode 100644
index 1aa5f2e..0000000
--- a/res/drawable-xxxhdpi/ic_tab_unselected_download.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/nfc_payment_empty_state.png b/res/drawable-xxxhdpi/nfc_payment_empty_state.png
deleted file mode 100644
index 569bb07..0000000
--- a/res/drawable-xxxhdpi/nfc_payment_empty_state.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/appwidget_item_bg.xml b/res/drawable/appwidget_item_bg.xml
deleted file mode 100644
index b9de6d4..0000000
--- a/res/drawable/appwidget_item_bg.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:state_pressed="true"
-          android:drawable="@drawable/appwidget_item_bg_pressed" />
-
-    <item android:drawable="@drawable/appwidget_item_bg_normal" />
-</selector>
diff --git a/res/drawable/ic_menu_add_inset.xml b/res/drawable/ic_menu_add_inset.xml
deleted file mode 100644
index a4f0a65..0000000
--- a/res/drawable/ic_menu_add_inset.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-    Copyright (C) 2016 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<inset
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:insetLeft="5dp">
-    <vector
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorAccent">
-        <path
-            android:fillColor="#FF000000"
-            android:pathData="M19.0,13.0l-6.0,0.0l0.0,6.0l-2.0,0.0l0.0,-6.0L5.0,13.0l0.0,-2.0l6.0,0.0L11.0,5.0l2.0,0.0l0.0,6.0l6.0,0.0l0.0,2.0z"/>
-    </vector>
-</inset>
diff --git a/res/drawable/lock_anim.xml b/res/drawable/lock_anim.xml
deleted file mode 100644
index 8ec31a6..0000000
--- a/res/drawable/lock_anim.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* 
-** Copyright 2008, 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.
-*/
--->
-<animation-list
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:oneshot="false">
-    <item android:drawable="@drawable/lock_anim_0" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_1" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_2" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_3" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_4" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_5" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_6" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_7" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_8" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_9" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_10" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_11" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_12" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_13" android:duration="200" />
-    <item android:drawable="@drawable/lock_anim_14" android:duration="200" />
-</animation-list>
diff --git a/res/layout/dream_start_button.xml b/res/layout/dream_start_button.xml
index 7d5e0c9..a45e56f 100644
--- a/res/layout/dream_start_button.xml
+++ b/res/layout/dream_start_button.xml
@@ -27,7 +27,7 @@
 
     <Button
         android:id="@+id/dream_start_now_button"
-        style="@style/DreamStartButton"
+        style="@style/ActionSecondaryButton"
         android:layout_width="0dp"
         android:layout_weight="1"
         android:layout_height="wrap_content"
diff --git a/res/layout/fallback_home_finishing_boot.xml b/res/layout/fallback_home_finishing_boot.xml
index 2714409..333eb5e 100644
--- a/res/layout/fallback_home_finishing_boot.xml
+++ b/res/layout/fallback_home_finishing_boot.xml
@@ -38,11 +38,11 @@
             android:text="@*android:string/android_start_title"/>
 
         <ProgressBar
-            android:theme="@style/FallbackHomeProgressBar"
             style="@android:style/Widget.Material.ProgressBar.Horizontal"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="12.75dp"
+            android:colorControlActivated="?android:attr/textColorPrimary"
             android:indeterminate="true"/>
 
     </LinearLayout>
diff --git a/res/layout/keyguard_appwidget_item.xml b/res/layout/keyguard_appwidget_item.xml
deleted file mode 100755
index de0c855..0000000
--- a/res/layout/keyguard_appwidget_item.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:layout_width="match_parent"
-  android:layout_height="wrap_content" >
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="horizontal"
-    android:background="@drawable/appwidget_item_bg"
-    android:layout_marginTop="2dip"
-    android:layout_marginBottom="2dip"
-    android:layout_marginLeft="2dip"
-    android:layout_marginRight="2dip"
-    android:paddingLeft="16dip"
-    android:paddingRight="16dip"
-    android:paddingTop="16dip"
-    android:paddingBottom="16dip" >
-      <ImageView
-       android:id="@+id/icon"
-       android:layout_width="@dimen/appwidget_preview_width"
-       android:layout_height="@dimen/appwidget_preview_height"
-       android:scaleType="center" />
-      <TextView
-       android:id="@+id/label"
-       style="@style/KeyguardAppWidgetItem"
-       android:layout_width="match_parent"
-       android:layout_height="match_parent"
-       android:paddingLeft="24dip"
-       android:paddingBottom="8dip"
-       android:gravity="left|bottom" />
-  </LinearLayout>
-</FrameLayout>
diff --git a/res/layout/keyguard_appwidget_picker_layout.xml b/res/layout/keyguard_appwidget_picker_layout.xml
deleted file mode 100644
index e533672..0000000
--- a/res/layout/keyguard_appwidget_picker_layout.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/layout_root"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingLeft="@dimen/keyguard_appwidget_picker_margin_left"
-        android:paddingRight="@dimen/keyguard_appwidget_picker_margin_right"
-        android:paddingTop="2dip"
-        android:paddingBottom="2dip"
-        android:orientation="vertical" >
-  <GridView android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            android:numColumns="@integer/keyguard_appwidget_picker_cols"
-            android:layout_gravity="center_horizontal"
-            android:listSelector="@android:color/transparent"
-            android:id="@+id/widget_list" />
-</LinearLayout>
diff --git a/res/layout/nfc_payment.xml b/res/layout/nfc_payment.xml
index f56d2a4..c7039cf 100644
--- a/res/layout/nfc_payment.xml
+++ b/res/layout/nfc_payment.xml
@@ -48,15 +48,6 @@
             android:drawSelectorOnTop="false"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:clipToPadding="false"
-            android:scrollbarStyle="@integer/preference_scrollbar_style" />
-<!--
-        <ListView
-            android:id="@android:id/list"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:clipToPadding="false"
-            android:scrollbarStyle="@integer/preference_scrollbar_style" />
--->
+            android:clipToPadding="false" />
     </FrameLayout>
 </LinearLayout>
diff --git a/res/layout/ownerinfo.xml b/res/layout/ownerinfo.xml
index 29e0840..18ac461 100644
--- a/res/layout/ownerinfo.xml
+++ b/res/layout/ownerinfo.xml
@@ -28,8 +28,9 @@
         android:minHeight="@dimen/min_tap_target_size"
         android:gravity="top"
         android:hint="@string/owner_info_settings_edit_text_hint"
-        android:inputType="textMultiLine|textCapSentences"
-        />
+        android:inputType="textMultiLine|textCapSentences">
+        <requestFocus />
+    </EditText>
 
 </LinearLayout>
 
diff --git a/res/layout/permission_settings.xml b/res/layout/permission_settings.xml
deleted file mode 100644
index f08b9d6..0000000
--- a/res/layout/permission_settings.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 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.
--->
-
-<ScrollView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:clipToPadding="false"
-    android:scrollbarStyle="@integer/preference_scrollbar_style">
-
-    <LinearLayout
-        android:id="@+id/all_details"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-        android:paddingBottom="5dip"
-        android:orientation="vertical">
-
-        <!-- Permissions section -->
-        <LinearLayout
-            android:id="@+id/permissions_section"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical">
-            <TextView
-                style="?android:attr/listSeparatorTextViewStyle"
-                android:layout_marginTop="8dip"
-                android:text="@string/permissions_label" />
-            <TextView android:id="@+id/security_settings_billing_desc"
-                android:text="@string/security_settings_billing_desc"
-                android:textColor="#ffffb060"
-                android:textAppearance="?android:attr/textAppearanceSmall"
-                android:paddingTop="6dip"
-                android:paddingBottom="6dip"
-                android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-                android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content" />
-            <LinearLayout
-                android:id="@+id/security_settings_billing_list"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:orientation="vertical">
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/security_settings_premium_sms_desc" />
-                <Spinner
-                    android:id="@+id/security_settings_premium_sms_list"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:spinnerMode="dropdown" />
-            </LinearLayout>
-            <TextView android:id="@+id/security_settings_desc"
-                android:text="@string/security_settings_desc"
-                android:textAppearance="?android:attr/textAppearanceSmall"
-                android:paddingTop="6dip"
-                android:paddingBottom="6dip"
-                android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-                android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content" />
-            <LinearLayout
-                android:id="@+id/security_settings_list"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:orientation="vertical"/>
-        </LinearLayout>
-
-
-    </LinearLayout>
-</ScrollView>
diff --git a/res/layout/preference_list_fragment.xml b/res/layout/preference_list_fragment.xml
index eeea9c4..852ef6d 100644
--- a/res/layout/preference_list_fragment.xml
+++ b/res/layout/preference_list_fragment.xml
@@ -37,19 +37,6 @@
         android:paddingStart="@dimen/settings_side_margin"
         android:paddingEnd="@dimen/settings_side_margin">
 
-        <ListView android:id="@+id/backup_list"
-            style="@style/PreferenceFragmentListSinglePane"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:paddingTop="@dimen/dashboard_padding_top"
-            android:paddingBottom="@dimen/dashboard_padding_bottom"
-            android:scrollbarStyle="@*android:integer/preference_fragment_scrollbarStyle"
-            android:clipToPadding="false"
-            android:drawSelectorOnTop="false"
-            android:elevation="@dimen/dashboard_category_elevation"
-            android:visibility="gone"
-            android:scrollbarAlwaysDrawVerticalTrack="true" />
-
         <include layout="@layout/loading_container" />
 
     </FrameLayout>
@@ -74,8 +61,7 @@
             android:layout_height="wrap_content"
             android:layout_margin="5dip"
             android:layout_alignParentStart="true"
-            android:text="@*android:string/back_button_label"
-            />
+            android:text="@*android:string/back_button_label" />
 
         <LinearLayout
             android:orientation="horizontal"
@@ -89,16 +75,14 @@
                 android:layout_height="wrap_content"
                 android:layout_margin="5dip"
                 android:text="@*android:string/skip_button_label"
-                android:visibility="gone"
-                />
+                android:visibility="gone" />
 
             <Button android:id="@+id/next_button"
                 style="?android:attr/buttonBarButtonStyle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_margin="5dip"
-                android:text="@*android:string/next_button_label"
-                />
+                android:text="@*android:string/next_button_label" />
 
         </LinearLayout>
 
diff --git a/res/layout/private_dns_mode_dialog.xml b/res/layout/private_dns_mode_dialog.xml
index aaad941..641905d 100644
--- a/res/layout/private_dns_mode_dialog.xml
+++ b/res/layout/private_dns_mode_dialog.xml
@@ -14,61 +14,68 @@
      limitations under the License.
 -->
 
-<LinearLayout
+<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:padding="8dp">
+    android:layout_height="wrap_content">
 
-    <RadioGroup
-        android:id="@+id/private_dns_radio_group"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-        <RadioButton
-            android:id="@+id/private_dns_mode_off"
-            android:text="@string/private_dns_mode_off"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:minHeight="48dp"/>
-
-        <RadioButton
-            android:id="@+id/private_dns_mode_opportunistic"
-            android:text="@string/private_dns_mode_opportunistic"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:minHeight="48dp"/>
-
-        <RadioButton
-            android:id="@+id/private_dns_mode_provider"
-            android:text="@string/private_dns_mode_provider"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:minHeight="48dp"/>
-
-        <EditText
-            android:id="@+id/private_dns_mode_provider_hostname"
-            android:hint="@string/private_dns_mode_provider_hostname_hint"
-            style="@android:style/Widget.CompoundButton.RadioButton"
-            android:imeOptions="actionDone"
-            android:inputType="textFilter|textUri"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="40dp"
-            android:layout_marginEnd="8dp"
-            android:minHeight="48dp"/>
-    </RadioGroup>
-
-    <TextView
-        android:id="@+id/private_dns_help_info"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:minHeight="48dp"
-        android:paddingStart="16dp"
-        android:textAppearance="?android:attr/textAppearanceSmall"/>
-</LinearLayout>
+        android:orientation="vertical"
+        android:padding="8dp">
+
+        <RadioGroup
+            android:id="@+id/private_dns_radio_group"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <RadioButton
+                android:id="@+id/private_dns_mode_off"
+                android:text="@string/private_dns_mode_off"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:minHeight="48dp"/>
+
+            <RadioButton
+                android:id="@+id/private_dns_mode_opportunistic"
+                android:text="@string/private_dns_mode_opportunistic"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:minHeight="48dp"/>
+
+            <RadioButton
+                android:id="@+id/private_dns_mode_provider"
+                android:text="@string/private_dns_mode_provider"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:minHeight="48dp"/>
+
+            <EditText
+                android:id="@+id/private_dns_mode_provider_hostname"
+                android:hint="@string/private_dns_mode_provider_hostname_hint"
+                style="@android:style/Widget.CompoundButton.RadioButton"
+                android:imeOptions="actionDone"
+                android:inputType="textFilter|textUri"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="40dp"
+                android:layout_marginEnd="8dp"
+                android:minHeight="48dp"/>
+        </RadioGroup>
+
+        <TextView
+            android:id="@+id/private_dns_help_info"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:minHeight="48dp"
+            android:paddingStart="16dp"
+            android:textAppearance="?android:attr/textAppearanceSmall"/>
+    </LinearLayout>
+
+</ScrollView>
+
diff --git a/res/layout/running_service_details.xml b/res/layout/running_service_details.xml
index f618bdd..68ddb1c 100644
--- a/res/layout/running_service_details.xml
+++ b/res/layout/running_service_details.xml
@@ -20,8 +20,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:clipToPadding="false"
-    android:scrollbarStyle="@integer/preference_scrollbar_style">
+    android:clipToPadding="false">
 
     <LinearLayout
         android:id="@+id/all_details"
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 9569ae4..37e71e2 100755
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -17,11 +17,6 @@
 <resources>
     <dimen name="appwidget_width">421dip</dimen>
     <dimen name="appwidget_height">68dip</dimen>
-    <dimen name="appwidget_preview_width">120dip</dimen>
-    <dimen name="appwidget_preview_height">70dip</dimen>
-    <dimen name="keyguard_appwidget_picker_margin_left">2dip</dimen>
-    <dimen name="keyguard_appwidget_picker_margin_right">2dip</dimen>
-    <integer name="keyguard_appwidget_picker_cols">2</integer>
 
     <dimen name="captioning_preview_height">100dp</dimen>
 
diff --git a/res/values-land/styles.xml b/res/values-land/styles.xml
deleted file mode 100644
index 0903167..0000000
--- a/res/values-land/styles.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<resources>
-    <style name="KeyguardAppWidgetItem">
-        <item name="android:textSize">16sp</item>
-    </style>
-</resources>
diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml
index f6b4ad8..d5ea762 100755
--- a/res/values-sw600dp-land/dimens.xml
+++ b/res/values-sw600dp-land/dimens.xml
@@ -18,8 +18,6 @@
     <dimen name="screen_margin_sides">128dip</dimen>
     <dimen name="screen_margin_top">72dip</dimen>
     <dimen name="screen_margin_bottom">48dip</dimen>
-    <dimen name="appwidget_preview_height">80dip</dimen>
-    <dimen name="keyguard_appwidget_picker_width">720dip</dimen>
 
     <!-- CryptKeeper top margin for password/pin screen -->
     <dimen name="crypt_keeper_password_top_margin">116dip</dimen>
diff --git a/res/values-sw600dp-land/styles.xml b/res/values-sw600dp-land/styles.xml
deleted file mode 100644
index 645d1fe..0000000
--- a/res/values-sw600dp-land/styles.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<resources>
-    <style name="KeyguardAppWidgetItem">
-        <item name="android:textSize">18sp</item>
-    </style>
-</resources>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 8e47a62..58b05d8 100755
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -27,14 +27,6 @@
     <dimen name="appwidget_min_width">325dip</dimen>
     <dimen name="appwidget_min_height">50dip</dimen>
 
-    <dimen name="appwidget_preview_width">120dip</dimen>
-    <dimen name="appwidget_preview_height">70dip</dimen>
-    <dimen name="keyguard_appwidget_picker_margin_left">2dip</dimen>
-    <dimen name="keyguard_appwidget_picker_margin_right">2dip</dimen>
-    <integer name="keyguard_appwidget_picker_cols">2</integer>
-
-    <dimen name="settings_side_margin">0dip</dimen>
-
     <!-- ActionBar contentInsetStart -->
     <dimen name="actionbar_contentInsetStart">24dp</dimen>
     <dimen name="actionbar_subsettings_contentInsetStart">80dp</dimen>
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw600dp/styles.xml
index d428288..b132f9f 100644
--- a/res/values-sw600dp/styles.xml
+++ b/res/values-sw600dp/styles.xml
@@ -28,7 +28,4 @@
         <item name="android:textSize">20sp</item>
     </style>
 
-    <style name="KeyguardAppWidgetItem">
-        <item name="android:textSize">16sp</item>
-    </style>
 </resources>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index 981c936..ec4e22f 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -16,9 +16,6 @@
 
 <resources>
     <dimen name="pager_tabs_padding">0dp</dimen>
-    <dimen name="appwidget_preview_height">80dip</dimen>
-    <integer name="keyguard_appwidget_picker_cols">2</integer>
-    <dimen name="keyguard_appwidget_picker_width">720dip</dimen>
 
     <dimen name="settings_side_margin">64dp</dimen>
 
diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml
deleted file mode 100644
index 645d1fe..0000000
--- a/res/values-sw720dp/styles.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<resources>
-    <style name="KeyguardAppWidgetItem">
-        <item name="android:textSize">18sp</item>
-    </style>
-</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 33573ac..7bdbe6d 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -179,4 +179,10 @@
     <attr name="batteryBadColor" format="color" />
     <attr name="batteryMaybeColor" format="color" />
 
+    <attr name="fingerprint_layout_theme" format="reference" />
+    <attr name="face_layout_theme" format="reference" />
+    <attr name="ic_menu_moreoverflow" format="reference" />
+    <attr name="side_margin" format="reference|dimension" />
+    <attr name="wifi_signal_color" format="reference" />
+
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 02d3182..2341728 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -97,9 +97,6 @@
     <dimen name="dashboard_category_padding_start">0dp</dimen>
     <dimen name="dashboard_category_padding_end">0dp</dimen>
 
-    <!-- Dashboard category panel elevation -->
-    <dimen name="dashboard_category_elevation">2dp</dimen>
-
     <!-- Dashboard tile minimum height -->
     <dimen name="dashboard_tile_minimum_height">72dp</dimen>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 82ae090..41b3a80 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -27,10 +27,7 @@
 
     <!-- Strings for Dialog close button [CHAR LIMIT=20] -->
     <string name="dlg_close">Close</string>
-    <!-- Strings for Dialog switch button [CHAR LIMIT=20] -->
-    <string name="dlg_switch">Switch</string>
 
-    <!-- Device Info --> <skip />
     <!-- Device Info screen. Used for a status item's value when the proper value is not known -->
     <string name="device_info_default">Unknown</string>
     <!-- [CHAR LIMIT=NONE] Device Info screen. Countdown for user taps to enable development settings -->
@@ -49,14 +46,6 @@
     <!-- Category headings in left-pane header menu --> <skip />
     <!-- Settings main menu category heading. Wireless and networks (Wi-Fi, Bluetooth, data usage...). [CHAR LIMIT=40] -->
     <string name="header_category_wireless_networks">Wireless &amp; networks</string>
-    <!-- Settings main menu category heading. Wireless and networks (Wi-Fi, Bluetooth, data usage...). [CHAR LIMIT=40] -->
-    <string name="header_category_connections">Connections</string>
-    <!-- Settings main menu category heading. Device (Sound, display, battery, applications...). [CHAR LIMIT=40] -->
-    <string name="header_category_device">Device</string>
-    <!-- Settings main menu category heading. Personal (Accounts, security, language, backup...). [CHAR LIMIT=40] -->
-    <string name="header_category_personal">Personal</string>
-    <!-- Settings main menu category heading. Personal (Accounts, security, language, backup...). [CHAR LIMIT=40] -->
-    <string name="header_category_access">Access</string>
     <!-- Settings main menu category heading. System (Updates, data, accessibility, about phone). [CHAR LIMIT=40] -->
     <string name="header_category_system">System</string>
 
@@ -269,8 +258,6 @@
     <!-- Bluetooth broadcasting settings, option to enable/disable broadcasting -->
     <string name="bluetooth_broadcasting">Broadcasting</string>
 
-    <!-- Bluetooth settings.  Message when the device state is unknown -->
-    <string name="bluetooth_unknown" />
     <!--Bluetooth settings screen, summary text for Bluetooth device with no name -->
     <string name="bluetooth_device">Unnamed Bluetooth device</string>
     <!--Bluetooth settings screen, text that appears in heading bar when scanning for devices -->
@@ -347,9 +334,6 @@
     <!-- Strings for msg to display to user while bluetooth is turning off [CHAR LIMIT=60] -->
     <string name="bluetooth_turning_off">"Turning Bluetooth off\u2026"</string>
 
-    <!-- Strings for device profile auto connect setting -->
-    <string name="bluetooth_auto_connect">Auto-connect</string>
-
     <!-- Activity label of BluetoothPermissionActivity [CHAR LIMIT=none]-->
     <string name="bluetooth_connection_permission_request">"Bluetooth connection request"</string>
 
@@ -419,8 +403,6 @@
     <string name="connected_device_connected_title">Currently connected</string>
     <!-- Title for connected device group [CHAR LIMIT=none]-->
     <string name="connected_device_saved_title">Saved devices</string>
-    <!-- Title for preference to add a device [CHAR LIMIT=none] [BACKUP_MESSAGE_ID=7803521577708810621] -->
-    <string name="connected_device_add_device_title">Add device</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]-->
@@ -606,9 +588,6 @@
     <!-- Title for the locale picker activity -->
     <string name="language_picker_title">Languages</string>
 
-    <!-- Title for the language selection screen [CHAR LIMIT=25] -->
-    <string name="pref_title_lang_selection">Language preferences</string>
-
     <!-- Menu item in the locale menu. Will remove the selected locales. [CHAR LIMIT=30] -->
     <string name="locale_remove_menu">Remove</string>
 
@@ -662,10 +641,6 @@
     <!-- The title of the activity to adjust proxy settings -->
     <string name="proxy_settings_label">Proxy settings</string>
 
-    <!-- ======================================================================================= -->
-    <!-- NEW STUFF -->
-    <!-- ======================================================================================= -->
-
     <!-- Button label for generic cancel action [CHAR LIMIT=20] -->
     <string name="cancel">Cancel</string>
     <!-- Button label for generic OK action [CHAR LIMIT=20] -->
@@ -687,8 +662,6 @@
     <string name="settings_shortcut">Settings shortcut</string>
     <!-- Wireless controls settings screen, setting check box label -->
     <string name="airplane_mode">Airplane mode</string>
-    <!-- Main Settings screen settings title for things like airplane mode, tethering, NFC, VPN.  This will take you to another screen with those settings.  [CHAR LIMIT=30] -->
-    <string name="radio_controls_title">More</string>
     <!-- Wireless Settings screen title for things like Wi-Fi, bluetooth, airplane mode. -->
     <string name="wireless_networks_settings_title">Wireless &amp; networks</string>
     <!-- Main Settings screen settings summary text for the "Wireless controls" setting -->
@@ -727,7 +700,6 @@
     <!-- mobile network settings screen, setting option summary text -->
     <string name="sum_carrier_select">Choose a network operator</string>
 
-    <!-- Date and time settings --><skip />
     <!-- Main Settings screen setting option name to go into the date and time settings-->
     <string name="date_and_time_settings_title">Date &amp; time</string>
     <!-- Title for Date & Time settings screen in SetupWizard [CHAR LIMIT=40] -->
@@ -2140,8 +2112,6 @@
     <string name="wifi_forget_dialog_message">All passwords for this network will be deleted</string>
 
     <!-- Wi-Fi Advanced Settings --> <skip />
-    <!-- Wi-Fi settings screen, Saved networks, settings section.  This is a header shown above Saved networks wifi settings. [CHAR LIMIT=30] -->
-    <string name="wifi_saved_access_points_titlebar">Saved networks</string>
     <!-- Wi-Fi settings screen, Saved networks summary.  This shows below the "Saved networks" item and indicates the number of networks a user has saved. -->
     <plurals name="wifi_saved_access_points_summary">
         <item quantity="one">1 network</item>
@@ -4089,12 +4059,6 @@
     <string name="no_applications">No apps.</string>
     <!-- [CHAR LIMIT=15] Manage applications, label for chart showing internal storage use. -->
     <string name="internal_storage">Internal storage</string>
-    <!-- [CHAR LIMIT=30] Title for internal device storage that is capitalized for placement as a phrase into another sentence -->
-    <string name="internal_storage_sentence">internal storage</string>
-    <!-- [CHAR LIMIT=15] Manage applications, label for chart showing SD card storage use. -->
-    <string name="sd_card_storage" product="nosdcard">USB storage</string>
-    <!-- [CHAR LIMIT=15] Manage applications, label for chart showing SD card storage use. -->
-    <string name="sd_card_storage" product="default">SD card storage</string>
     <!-- Manage app screen, shown when the activity is busy recomputing the size of each app -->
     <string name="recompute_size">Recomputing size\u2026</string>
     <!-- Manage applications, individual application screen, confirmation dialog title. Displays when user selects to "Clear data". -->
@@ -4111,36 +4075,12 @@
     <string name="app_not_found_dlg_text"> The app wasn\u2019t found in the list of installed apps.</string>
     <!-- Manage applications, text for dialog if clear data fails-->
     <string name="clear_failed_dlg_text">Couldn\u2019t clear storage for app.</string>
-    <!-- Manage applications, individual application info screen, text that appears under the "Permissions" heading. This describes the permissions that the application has. -->
-    <string name="security_settings_desc" product="tablet">This app can access the following on your tablet:</string>
-    <!-- Manage applications, individual application info screen, text that appears under the "Permissions" heading. This describes the permissions that the application has. -->
-    <string name="security_settings_desc" product="default">This app can access the following on your phone:</string>
-    <!-- [CHAR_LIMIT=NONE] Manage applications, individual application info screen, text that appears under the "Permissions" heading.
-         This describes the permissions that the application has.  It is used when multiple packages are contributing
-         to the permissions and need to be listed here. -->
-    <string name="security_settings_desc_multi" product="tablet">This app can access the following on your tablet.
-         In order to improve performance and reduce memory usage, some of these permissions
-         are available to <xliff:g id="base_app_name">%1$s</xliff:g>
-         because it runs in the same process as <xliff:g id="additional_apps_list">%2$s</xliff:g>:</string>
-    <!-- [CHAR_LIMIT=NONE] Manage applications, individual application info screen, text that appears under the "Permissions" heading.
-         This describes the permissions that the application has.  It is used when multiple packages are contributing
-         to the permissions and need to be listed here. -->
-    <string name="security_settings_desc_multi" product="default">This app can access the following on your phone.
-         In order to improve performance and reduce memory usage, some of these permissions
-         are available to <xliff:g id="base_app_name">%1$s</xliff:g>
-         because it runs in the same process as <xliff:g id="additional_apps_list">%2$s</xliff:g>:</string>
     <!-- [CHAR_LIMIT=NONE] Format to put together two items in a list. -->
     <string name="join_two_items"><xliff:g id="first_item">%1$s</xliff:g> and <xliff:g id="second_item">%2$s</xliff:g></string>
     <!-- [CHAR_LIMIT=NONE] Format to put together two unrelated items in a list when "and" is not an appropriate conjunction for these 2 items -->
     <string name="join_two_unrelated_items"><xliff:g id="first_item">%1$s</xliff:g>, <xliff:g id="second_item">%2$s</xliff:g></string>
-    <!-- Manage applications, individual application info screen, text that appears under the "Permissions" heading after the app has tried to send to a premium SMS. [CHAR LIMIT=50] -->
-    <string name="security_settings_billing_desc">This app may charge you money:</string>
-    <!-- Manage applications, text for permission to send to premium SMS short codes. [CHAR LIMIT=40] -->
-    <string name="security_settings_premium_sms_desc">Send premium SMS</string>
     <string name="computing_size">Computing\u2026</string>
     <string name="invalid_size_value">Couldn\u2019t compute package size.</string>
-    <!-- String displayed when list is empty -->
-    <string name="empty_list_msg">You don\u2019t have any third-party apps installed.</string>
     <!-- Manage applications, version string displayed in app snippet -->
     <string name="version_text">version <xliff:g id="version_num">%1$s</xliff:g></string>
     <!-- Manage applications, text for Move button -->
@@ -4153,9 +4093,6 @@
     <string name="move_app_to_sdcard" product="nosdcard">Move to USB storage</string>
     <!-- Manage applications, text for Move button  to move app to sdcard -->
     <string name="move_app_to_sdcard" product="default">Move to SD card</string>
-    <!-- Manage applications, title for dialog when killing persistent apps-->
-    <!-- Manage applications, text for Move button when move is in progress -->
-    <string name="moving">Moving</string>
 
     <!-- Text of pop up message if the request for a "migrate primary storage" operation
          (see storage_menu_migrate) is denied as another is already in progress. [CHAR LIMIT=75] -->
@@ -4173,16 +4110,10 @@
     <string name="force_stop_dlg_title">Force stop?</string>
     <!-- [CHAR LIMIT=200] Manage applications, text for dialog when killing persistent apps-->
     <string name="force_stop_dlg_text">If you force stop an app, it may misbehave.</string>
-    <!-- Manage applications, text for dialog when moving an app -->
-    <string name="move_app_failed_dlg_title"></string>
-    <!-- Manage applications, text for dialog moving an app -->
-    <string name="move_app_failed_dlg_text">Couldn\u2019t move app. <xliff:g id="reason">%1$s</xliff:g></string>
     <!-- Manage applications, application installation location title -->
     <string name="app_install_location_title">Preferred install location</string>
     <!-- Manage applications. application installation location summary -->
     <string name="app_install_location_summary">Change the preferred installation location for new apps</string>
-    <!-- [CHAR LIMIT=30] Manage applications, title for dialog when disabling apps -->
-    <string name="app_disable_dlg_title">Disable built-in app?</string>
     <!-- [CHAR LIMIT=30] Manage applications, label for option to disable app -->
     <string name="app_disable_dlg_positive">Disable app</string>
     <!-- [CHAR LIMIT=200] Manage applications, text for dialog when disabling apps -->
@@ -4193,11 +4124,6 @@
     <string name="app_special_disable_dlg_text">If you disable this app, Android and other apps may no longer function as intended.  Your data will also be deleted.</string>
     <!-- [CHAR LIMIT=30] Manage applications, title for dialog when disabling notifications for an app -->
     <string name="app_disable_notifications_dlg_title">Turn off notifications?</string>
-    <!-- [CHAR LIMIT=200] Manage applications, text for dialog when disabling notifications for an app -->
-    <string name="app_disable_notifications_dlg_text">
-        If you turn off notifications for this app, you may miss important alerts and updates.
-    </string>
-
     <!-- Manage applications, individual application info screen, section heading for information about the app installer [CHAR_LIMIT=25] -->
     <string name="app_install_details_group_title">Store</string>
     <!-- Manage applications, individual application info screen, title for the option which will trigger application info in it's installer [CHAR_LIMIT=25] -->
@@ -4994,11 +4920,6 @@
 
     <!-- Title for the screen usage in power use UI [CHAR_LIMIT=60] -->
     <string name="device_screen_usage">Screen usage since full charge</string>
-    <!-- Title for the screen consumption in power use UI(i.e. Screen consumption: 30% of battery usage) [CHAR_LIMIT=40] -->
-    <string name="device_screen_consumption">Screen consumption</string>
-    <!-- Title for the cellular network in power use UI(i.e. Mobile network scanning: 30% of battery usage) [CHAR_LIMIT=40] -->
-    <string name="device_cellular_network">Mobile network scanning</string>
-
     <!-- Label for list of apps using battery in power use UI. Note: ^1 should be used in all translations[CHAR_LIMIT=120] -->
     <string name="power_usage_list_summary">Battery usage since full charge</string>
     <!-- Temp string used to debug new battery estimates [DO NOT TRANSLATE] -->
@@ -5056,18 +4977,6 @@
     <!-- Subtitle for list of packages -->
     <string name="packages_subtitle">Included packages</string>
 
-    <!-- Activity title for battery abnormal details page [CHAR LIMIT=60] -->
-    <string name="battery_abnormal_details_title">Apps draining battery</string>
-
-    <!-- Summary for wakelock anomaly, means device been kept awake [CHAR LIMIT=60] -->
-    <string name="battery_abnormal_wakelock_summary">Keeping device awake</string>
-    <!-- Summary for wakeup alarm anomaly, meaning device been wakeup in the background [CHAR LIMIT=60] -->
-    <string name="battery_abnormal_wakeup_alarm_summary">Waking up device in background</string>
-    <!-- Summary for location anomaly, meaning device is requesting location too frequently [CHAR LIMIT=60] -->
-    <string name="battery_abnormal_location_summary">Requesting location frequently</string>
-    <!-- Summary for anomalies, meaning some apps behaving abnormally  [CHAR LIMIT=80] -->
-    <string name="battery_abnormal_apps_summary"><xliff:g id="number">%1$d</xliff:g> apps misbehaving</string>
-
     <!-- Title for the battery summary tip [CHAR LIMIT=NONE] -->
     <string name="battery_tip_summary_title">Apps are running normally</string>
     <!-- Summary for the battery summary tip [CHAR LIMIT=NONE] -->
@@ -6034,8 +5943,8 @@
 
     <!-- Activity title for network data usage summary. [CHAR LIMIT=25] -->
     <string name="data_usage_summary_title">Data usage</string>
-    <!-- Activity title for Appk data usage summary. [CHAR LIMIT=25] -->
-    <string name="data_usage_app_summary_title">App data usage</string>
+    <!-- Activity title Mobile data & WI-FI summary. [CHAR LIMIT=25] -->
+    <string name="data_usage_app_summary_title">Mobile data &amp; Wi\u2011Fi</string>
     <!-- Message about carrier data accounting.  [CHAR LIMIT=100] -->
     <string name="data_usage_accounting">Carrier data accounting may differ from your device.</string>
     <!-- Title for app usage. [CHAR LIMIT=40] -->
@@ -6986,6 +6895,8 @@
     <string name="app_and_notification_dashboard_title">Apps &amp; notifications</string>
     <!-- Summary for Apps & Notification settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
     <string name="app_and_notification_dashboard_summary">Permissions, default apps</string>
+    <!-- Toast text for notification settings in the work profile. This is shown when an app in the work profile attempts to open notification settings. [CHAR LIMIT=NONE] -->
+    <string name="notification_settings_work_profile">Notification access is not available for apps in the work profile.</string>
     <!-- Title for setting tile leading to account settings [CHAR LIMIT=40]-->
     <string name="account_dashboard_title">Accounts</string>
     <!-- Summary for account settings tiles when there is no accounts on device [CHAR LIMIT=NONE]-->
@@ -8578,9 +8489,6 @@
     <!-- Label for menu to show app usage [CHAR LIMIT=30] -->
     <string name="hide_extra_apps">Show app usage</string>
 
-    <!-- Title for high usage item, which means power high usage [CHAR LIMIT=30] -->
-    <string name="power_high_usage_title">High usage</string>
-
     <!-- Summary for high usage item, showing app/apps are behaving abnormally [CHAR LIMIT=80] -->
     <plurals name="power_high_usage_summary">
         <item quantity="one"><xliff:g id="app">%1$s</xliff:g> behaving abnormally</item>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 2210904..88ff2bb 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -16,6 +16,14 @@
 
 <resources>
 
+    <style name="Theme.ActionBar" parent="@android:style/Widget.DeviceDefault.Light.ActionBar.Solid">
+        <item name="android:contentInsetStart">@dimen/actionbar_contentInsetStart</item>
+    </style>
+
+    <style name="Theme.ActionBar.SubSettings" parent="Theme.ActionBar">
+        <item name="android:contentInsetStart">@dimen/actionbar_subsettings_contentInsetStart</item>
+    </style>
+
     <style name="info_label">
         <item name="android:layout_height">wrap_content</item>
         <item name="android:layout_width">wrap_content</item>
@@ -56,71 +64,6 @@
         <item name="android:layout_width">match_parent</item>
     </style>
 
-
-    <style name="TextAppearance" parent="android:TextAppearance.Material">
-    </style>
-
-    <style name="TextAppearance.info_label">
-        <item name="android:textSize">14sp</item>
-        <item name="android:textStyle">bold</item>
-    </style>
-
-    <style name="TextAppearance.info_small">
-        <item name="android:textSize">12sp</item>
-        <item name="android:textStyle">normal</item>
-    </style>
-
-    <style name="TextAppearance.info_value">
-        <item name="android:textSize">14sp</item>
-        <item name="android:textStyle">normal</item>
-    </style>
-
-    <style name="TextAppearance.PasswordEntry" parent="android:TextAppearance.Material">
-        <item name="android:gravity">center</item>
-        <item name="android:singleLine">true</item>
-        <item name="android:textColor">?android:attr/textColorPrimary</item>
-        <item name="android:textSize">24sp</item>
-    </style>
-
-    <style name="TextAppearance.CryptKeeper_PasswordEntry" parent="android:TextAppearance.Material">
-        <item name="android:gravity">center_horizontal</item>
-        <item name="android:background">@null</item>
-        <item name="android:textCursorDrawable">@null</item>
-        <item name="android:singleLine">true</item>
-        <item name="android:imeOptions">flagForceAscii|actionDone</item>
-    </style>
-
-    <style name="TallTitleBarTheme" parent="android:Theme.NoTitleBar">
-        <item name="android:windowContentOverlay">@null</item>
-    </style>
-
-    <style name="PreferenceHeaderPanelSinglePane">
-        <item name="android:layout_marginStart">0dp</item>
-        <item name="android:layout_marginEnd">0dp</item>
-        <item name="android:background">@null</item>
-    </style>
-
-    <style name="PreferencePanelSinglePane" parent="@*android:style/PreferencePanel">
-        <item name="android:layout_marginStart">0dp</item>
-        <item name="android:layout_marginEnd">0dp</item>
-        <item name="android:paddingStart">0dp</item>
-        <item name="android:paddingEnd">0dp</item>
-        <item name="android:background">@null</item>
-        <item name="android:scrollbarStyle">outsideOverlay</item>
-    </style>
-
-    <style name="PreferenceHeaderListSinglePane" parent="@*android:style/PreferenceHeaderList">
-        <item name="android:paddingStart">@dimen/settings_side_margin</item>
-        <item name="android:paddingEnd">@dimen/settings_side_margin</item>
-        <item name="android:paddingTop">0dp</item>
-        <item name="android:paddingBottom">0dp</item>
-        <item name="android:layout_marginStart">0dp</item>
-        <item name="android:layout_marginEnd">0dp</item>
-        <item name="android:layout_marginTop">0dp</item>
-        <item name="android:layout_marginBottom">0dp</item>
-        <item name="android:scrollbarStyle">outsideOverlay</item>
-    </style>
-
     <style name="PreferenceFragmentListSinglePane" parent="@*android:style/PreferenceFragmentList">
         <item name="android:paddingStart">@dimen/settings_side_margin</item>
         <item name="android:paddingEnd">@dimen/settings_side_margin</item>
@@ -224,13 +167,6 @@
         <item name="android:activityOpenExitAnimation">@anim/confirm_credential_open_exit</item>
     </style>
 
-    <style name="Transparent">
-        <item name="android:alertDialogTheme">@style/Theme.AlertDialog</item>
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowNoTitle">true</item>
-        <item name="android:windowIsFloating">true</item>
-    </style>
-
     <style name="CryptKeeperBlankTheme" parent="@android:style/Theme.Material.NoActionBar">
         <item name="android:background">#ff000000</item>
     </style>
@@ -284,14 +220,37 @@
         <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
     </style>
 
-    <style name="TextAppearance.PagerTabs" parent="@android:style/TextAppearance.Material.Widget.TabWidget" />
+    <style name="TextAppearance" parent="android:TextAppearance.Material"/>
 
-    <style name="KeyguardAppWidgetItem">
-        <item name="android:textSize">18sp</item>
+    <style name="TextAppearance.info_label">
+        <item name="android:textSize">14sp</item>
+        <item name="android:textStyle">bold</item>
     </style>
 
-    <!-- Scrollbar style OUTSIDE_OVERLAY -->
-    <integer name="preference_scrollbar_style">33554432</integer>
+    <style name="TextAppearance.info_small">
+        <item name="android:textSize">12sp</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TextAppearance.info_value">
+        <item name="android:textSize">14sp</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TextAppearance.PasswordEntry" parent="android:TextAppearance.Material">
+        <item name="android:gravity">center</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
+        <item name="android:textSize">24sp</item>
+    </style>
+
+    <style name="TextAppearance.CryptKeeper_PasswordEntry" parent="android:TextAppearance.Material">
+        <item name="android:gravity">center_horizontal</item>
+        <item name="android:background">@null</item>
+        <item name="android:textCursorDrawable">@null</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:imeOptions">flagForceAscii|actionDone</item>
+    </style>
 
     <style name="TextAppearance.Medium" parent="@android:style/TextAppearance.Material.Medium" />
     <style name="TextAppearance.Small" parent="@android:style/TextAppearance.Material.Small" />
@@ -304,9 +263,44 @@
     </style>
 
     <style name="TextAppearance.TileTitle" parent="@android:style/TextAppearance.Material.Subhead" />
-    <style name="TextAppearance.TileSubTitle" parent="@android:style/TextAppearance.Material.Body1" />
-    <style name="TextAppearance.RecentsTitle" parent="TextAppearance.CategoryTitle" />
-    <style name="TextAppearance.ResultTitle" parent="TextAppearance.CategoryTitle" />
+
+    <style name="TextAppearance.SuggestionTitle"
+           parent="@android:style/TextAppearance.Material.Subhead">
+        <item name="android:textSize">16sp</item>
+    </style>
+
+    <style name="TextAppearance.SuggestionSummary" parent="TextAppearance.Small">
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
+    </style>
+
+    <style name="TextAppearance.FingerprintErrorText"
+           parent="android:TextAppearance.Material.Body1">
+        <item name="android:textColor">?android:attr/colorError</item>
+    </style>
+
+    <style name="TextAppearance.FaceErrorText"
+           parent="android:TextAppearance.Material.Body1">
+        <item name="android:textColor">?android:attr/colorError</item>
+    </style>
+
+    <style name="TextAppearance.ConfirmDeviceCredentialsErrorText"
+           parent="android:TextAppearance.Material.Body1">
+        <item name="android:textColor">?android:attr/colorError</item>
+    </style>
+
+    <style name="TextAppearance.Small.SwitchBar">
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TextAppearance.RemoveDialogContent" parent="@android:style/TextAppearance.Material">
+        <item name="android:textSize">16sp</item>
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
+    </style>
+
+    <style name="TextAppearance.SearchBar" parent="@android:style/TextAppearance.Material.Widget.Toolbar.Subtitle">
+        <item name="android:textSize">@dimen/search_bar_text_size</item>
+    </style>
 
     <style name="TextAppearance.SuggestionHeader"
            parent="@android:style/TextAppearance.Material.Subhead">
@@ -314,6 +308,35 @@
         <item name="android:textColor">?android:attr/colorAccent</item>
     </style>
 
+    <style name="TextAppearance.EntityHeaderTitle"
+           parent="@android:style/TextAppearance.Material.Subhead">
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
+        <item name="android:textSize">16sp</item>
+    </style>
+
+    <style name="TextAppearance.EntityHeaderSummary"
+           parent="@android:style/TextAppearance.Material.Body1">
+        <item name="android:textAlignment">viewStart</item>
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
+        <item name="android:gravity">start</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:ellipsize">marquee</item>
+    </style>
+
+    <style name="TextAppearance.ZenOnboardingButton">
+        <item name="android:fontFamily">sans-serif-medium</item>
+        <item name="android:textSize">14sp</item>
+        <item name="android:textColor">?android:attr/colorAccent</item>
+        <item name="android:background">@drawable/btn_borderless_rect</item>
+        <item name="android:gravity">center</item>
+        <item name="android:focusable">true</item>
+        <item name="android:padding">8dp</item>
+    </style>
+
+    <style name="SuggestionConditionStyle">
+        <item name="android:background">?android:attr/colorPrimary</item>
+    </style>
+
     <style name="SuggestionCardText">
         <item name="android:textAlignment">viewStart</item>
     </style>
@@ -333,48 +356,14 @@
         <item name="android:layout_marginBottom">@dimen/suggestion_card_button_bottom_margin</item>
     </style>
 
-    <style name="TextAppearance.SuggestionTitle"
-           parent="@android:style/TextAppearance.Material.Subhead">
-        <item name="android:textSize">16sp</item>
-    </style>
-
-    <style name="TextAppearance.SuggestionSummary" parent="TextAppearance.Small">
-        <item name="android:textColor">?android:attr/textColorSecondary</item>
-    </style>
-
-    <style name="TextAppearance.FingerprintErrorText"
-        parent="android:TextAppearance.Material.Body1">
-        <item name="android:textColor">?android:attr/colorError</item>
-    </style>
-
     <style name="FingerprintLayoutTheme">
         <item name="android:icon">@drawable/ic_fingerprint_header</item>
     </style>
 
-    <style name="TextAppearance.FaceErrorText"
-        parent="android:TextAppearance.Material.Body1">
-        <item name="android:textColor">?android:attr/colorError</item>
-    </style>
-
     <style name="FaceLayoutTheme">
         <item name="android:icon">@drawable/ic_face_header</item>
     </style>
 
-    <style name="TextAppearance.ConfirmDeviceCredentialsErrorText"
-        parent="android:TextAppearance.Material.Body1">
-        <item name="android:textColor">?android:attr/colorError</item>
-    </style>
-
-    <style name="TextAppearance.Small.SwitchBar">
-        <item name="android:textColor">?android:attr/textColorPrimary</item>
-        <item name="android:textStyle">normal</item>
-    </style>
-
-    <style name="TextAppearance.RemoveDialogContent" parent="@android:style/TextAppearance.Material">
-        <item name="android:textSize">16sp</item>
-        <item name="android:textColor">?android:attr/textColorPrimary</item>
-    </style>
-
     <style name="PreviewPagerPageIndicator">
         <item name="dotGap">8dp</item>
         <item name="pageIndicatorColor">?android:attr/colorControlNormal</item>
@@ -390,12 +379,6 @@
         <item name="android:gravity">center_vertical</item>
     </style>
 
-    <style name="RedactionItemAndLabel">
-        <item name="android:layout_marginTop">@dimen/redaction_vertical_margins</item>
-        <item name="android:paddingStart">@dimen/redaction_padding_start</item>
-        <item name="android:textAppearance">@android:style/TextAppearance.Material.Subhead</item>
-    </style>
-
     <style name="FingerprintHeaderStyle" parent="android:style/TextAppearance.Material.Subhead">
         <item name="android:paddingTop">16dp</item>
         <item name="android:textColor">@color/primary_dark_material_light</item>
@@ -424,37 +407,10 @@
         <item name="android:paddingBottom">8dp</item>
     </style>
 
-    <style name="TextAppearance.EntityHeaderTitle"
-           parent="@android:style/TextAppearance.Material.Subhead">
-        <item name="android:textColor">?android:attr/textColorPrimary</item>
-        <item name="android:textSize">16sp</item>
-    </style>
-
-    <style name="TextAppearance.EntityHeaderSummary"
-           parent="@android:style/TextAppearance.Material.Body1">
-        <item name="android:textAlignment">viewStart</item>
-        <item name="android:textColor">?android:attr/textColorSecondary</item>
-        <item name="android:gravity">start</item>
-        <item name="android:singleLine">true</item>
-        <item name="android:ellipsize">marquee</item>
-    </style>
-
-  <style name="TextAppearance.ZenOnboardingButton">
-        <item name="android:fontFamily">sans-serif-medium</item>
-        <item name="android:textSize">14sp</item>
-        <item name="android:textColor">?android:attr/colorAccent</item>
-        <item name="android:background">@drawable/btn_borderless_rect</item>
-        <item name="android:gravity">center</item>
-        <item name="android:focusable">true</item>
-        <item name="android:padding">8dp</item>
-    </style>
-
     <style name="ActionPrimaryButton" parent="android:Widget.DeviceDefault.Button.Colored"/>
 
     <style name="ActionSecondaryButton" parent="android:Widget.DeviceDefault.Button"/>
 
-    <style name="DreamStartButton" parent="android:Widget.DeviceDefault.Button" />
-
     <style name="LockPatternContainerStyle">
         <item name="android:maxHeight">400dp</item>
         <item name="android:maxWidth">420dp</item>
@@ -490,14 +446,6 @@
         <item name="*android:successColor">@color/setup_lock_pattern_view_success_color_light</item>
     </style>
 
-    <style name="SuggestionConditionStyle">
-        <item name="android:background">?android:attr/colorPrimary</item>
-    </style>
-
-    <style name="TextAppearance.SearchBar" parent="@android:style/TextAppearance.Material.Widget.Toolbar.Subtitle">
-        <item name="android:textSize">@dimen/search_bar_text_size</item>
-    </style>
-
     <style name="device_info_dialog_label">
         <item name="android:textAlignment">viewStart</item>
         <item name="android:textAppearance">@android:style/TextAppearance.Material.Body1</item>
diff --git a/res/values/styles_preference.xml b/res/values/styles_preference.xml
index 8fd38d6..0f7ecab 100644
--- a/res/values/styles_preference.xml
+++ b/res/values/styles_preference.xml
@@ -19,6 +19,17 @@
 <!-- Things unrelated to preference framework UI customization should go to other styles files -->
 <resources>
 
+    <style name="PreferenceTheme" parent="@style/PreferenceThemeOverlay.SettingsBase">
+        <item name="apnPreferenceStyle">@style/ApnPreference</item>
+        <item name="seekBarPreferenceStyle">@style/SettingsSeekBarPreference</item>
+        <item name="twoStateButtonPreferenceStyle">@style/TwoStateButtonPreference</item>
+    </style>
+
+    <style name="PreferenceTheme.SetupWizard">
+        <item name="preferenceFragmentCompatStyle">@style/SetupWizardPreferenceFragmentStyle</item>
+        <item name="preferenceStyle">@style/Preference.Material</item>
+    </style>
+
     <style name="ApnPreference" parent="@style/Preference.Material">
         <item name="android:layout">@layout/apn_preference_layout</item>
     </style>
@@ -40,4 +51,8 @@
         <item name="android:negativeButtonText">@android:string/cancel</item>
     </style>
 
+    <style name="SetupWizardPreferenceFragmentStyle" parent="PreferenceFragment.Material">
+        <item name="android:layout">@layout/setup_preference</item>
+    </style>
+
 </resources>
\ No newline at end of file
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 70cffa3..3bf36ba9 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -15,212 +15,19 @@
 -->
 
 <resources>
-    <attr name="fingerprint_layout_theme" format="reference" />
-    <attr name="face_layout_theme" format="reference" />
-    <attr name="ic_menu_moreoverflow" format="reference" />
-    <attr name="side_margin" format="reference|dimension" />
-    <attr name="wifi_signal_color" format="reference" />
 
-    <style name="GlifTheme" parent="SuwThemeGlif">
-        <!-- For all Alert Dialogs -->
-        <item name="android:alertDialogTheme">@style/ThemeOverlay.AlertDialog</item>
-        <item name="android:windowBackground">?android:attr/colorBackground</item>
-        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
-        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
-        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="side_margin">0dip</item>
-        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
-        <item name="wifi_signal">@drawable/wifi_signal</item>
-        <item name="wifi_friction">@drawable/wifi_friction</item>
-        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
-        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
-
-        <!-- LockPatternView colors -->
-        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
-    </style>
-
-    <style name="GlifTheme.Light" parent="SuwThemeGlif.Light">
-        <!-- For all Alert Dialogs -->
-        <item name="android:alertDialogTheme">@style/ThemeOverlay.AlertDialog</item>
-        <item name="android:windowBackground">?android:attr/colorBackground</item>
-        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
-        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
-        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="side_margin">0dip</item>
-        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
-        <item name="wifi_signal">@drawable/wifi_signal</item>
-        <item name="wifi_friction">@drawable/wifi_friction</item>
-        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
-        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
-
-        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
-        <item name="*android:colorError">@color/glif_error_color</item>
-    </style>
-
-    <style name="GlifV2Theme" parent="SuwThemeGlifV2">
-        <!-- For all Alert Dialogs -->
-        <item name="android:alertDialogTheme">@style/GlifV2ThemeAlertDialog</item>
-        <item name="android:windowBackground">?android:attr/colorBackground</item>
-        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
-        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
-        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="side_margin">0dip</item>
-        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
-        <item name="wifi_signal">@drawable/wifi_signal</item>
-        <item name="wifi_friction">@drawable/wifi_friction</item>
-        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
-        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
-
-        <!-- LockPatternView colors -->
-        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
-    </style>
-
-    <style name="GlifV2Theme.Light" parent="SuwThemeGlifV2.Light">
-        <!-- For all Alert Dialogs -->
-        <item name="android:alertDialogTheme">@style/GlifV2ThemeAlertDialog.Light</item>
-        <item name="android:windowBackground">?android:attr/colorBackground</item>
-        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
-        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
-        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="side_margin">0dip</item>
-        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
-        <item name="wifi_signal">@drawable/wifi_signal</item>
-        <item name="wifi_friction">@drawable/wifi_friction</item>
-        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
-        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
-
-        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
-        <item name="*android:colorError">@color/glif_error_color</item>
-    </style>
-
-    <style name="GlifV3Theme" parent="SuwThemeGlifV3">
-        <!-- For all Alert Dialogs -->
-        <item name="android:alertDialogTheme">@style/GlifV2ThemeAlertDialog</item>
-        <item name="android:windowBackground">?android:attr/colorBackground</item>
-        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
-        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
-        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="side_margin">0dip</item>
-        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
-        <item name="wifi_signal">@drawable/wifi_signal</item>
-        <item name="wifi_friction">@drawable/wifi_friction</item>
-        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
-        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
-
-        <!-- LockPatternView colors -->
-        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
-    </style>
-
-    <style name="GlifV3Theme.Light" parent="SuwThemeGlifV3.Light">
-        <!-- For all Alert Dialogs -->
-        <item name="android:alertDialogTheme">@style/GlifV2ThemeAlertDialog.Light</item>
-        <item name="android:windowBackground">?android:attr/colorBackground</item>
-        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
-        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
-        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
-        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="side_margin">0dip</item>
-        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
-        <item name="wifi_signal">@drawable/wifi_signal</item>
-        <item name="wifi_friction">@drawable/wifi_friction</item>
-        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
-        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
-
-        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
-        <item name="*android:colorError">@color/glif_error_color</item>
-    </style>
-
-    <style name="SetupWizardTheme.Transparent" parent="GlifTheme">
+    <style name="Transparent">
+        <item name="alertDialogTheme">@style/Theme.AlertDialog</item>
         <item name="android:windowBackground">@android:color/transparent</item>
         <item name="android:windowNoTitle">true</item>
         <item name="android:windowIsFloating">true</item>
-        <item name="android:windowAnimationStyle">@null</item>
     </style>
 
-    <style name="SetupWizardTheme.Light.Transparent" parent="GlifTheme.Light">
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowNoTitle">true</item>
-        <item name="android:windowIsFloating">true</item>
-        <item name="android:windowAnimationStyle">@null</item>
-    </style>
-
-    <style name="GlifV2Theme.Transparent">
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowNoTitle">true</item>
-        <item name="android:windowIsFloating">true</item>
-        <item name="android:windowAnimationStyle">@null</item>
-    </style>
-
-    <style name="GlifV2Theme.Light.Transparent">
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowNoTitle">true</item>
-        <item name="android:windowIsFloating">true</item>
-        <item name="android:windowAnimationStyle">@null</item>
-    </style>
-
-    <style name="GlifV3Theme.Transparent">
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowNoTitle">true</item>
-        <item name="android:windowIsFloating">true</item>
-        <item name="android:windowAnimationStyle">@null</item>
-    </style>
-
-    <style name="GlifV3Theme.Light.Transparent">
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowNoTitle">true</item>
-        <item name="android:windowIsFloating">true</item>
-        <item name="android:windowAnimationStyle">@null</item>
-    </style>
-
-
-    <style name="SuwSuggestionThemeGlif.Light" parent="SuwThemeGlif.Light">
-        <item name="android:windowAnimationStyle">@android:style/Animation.Activity</item>
-    </style>
-
-    <style name="PreferenceTheme" parent="@style/PreferenceThemeOverlay.SettingsBase">
-        <item name="apnPreferenceStyle">@style/ApnPreference</item>
-        <item name="seekBarPreferenceStyle">@style/SettingsSeekBarPreference</item>
-        <item name="twoStateButtonPreferenceStyle">@style/TwoStateButtonPreference</item>
-    </style>
-
-    <style name="PreferenceTheme.SetupWizard" parent="PreferenceTheme">
-        <item name="preferenceFragmentCompatStyle">@style/SetupWizardPreferenceFragmentStyle</item>
-        <item name="preferenceStyle">@style/Preference.Material</item>
-    </style>
-
-    <style name="SetupWizardPreferenceFragmentStyle" parent="PreferenceFragment.Material">
-        <item name="android:layout">@layout/setup_preference</item>
-    </style>
-
-    <!-- Accessibility portion of Setup Wizard -->
-    <style name="SetupWizardAccessibilityTheme" parent="Theme.SettingsBase">
-        <item name="android:windowLightStatusBar">false</item>
-        <item name="android:colorPrimary">@color/material_grey_100</item>
-        <item name="android:colorAccent">@color/material_blue_700</item>
-        <item name="android:titleTextColor">@color/material_blue_700</item>
-        <item name="preferenceTheme">@style/PreferenceTheme</item>
-        <item name="switchBarTheme">@style/ThemeOverlay.SwitchBar.Settings</item>
-    </style>
-
-    <!-- Theme with no local references, used by AccountPreferenceBase where we have to inflate
-         layouts against a remote context using our local theme colors. Due to the implementation
-         details of Theme, we can't reference any local resources and MUST instead use the values
-         directly. So use #ff263238 instead of @color/theme_primary and so on. -->
     <style name="Theme.SettingsBase" parent="@android:style/Theme.DeviceDefault.Settings" />
 
     <style name="Theme.Settings" parent="Theme.SettingsBase">
         <item name="preferenceTheme">@style/PreferenceTheme</item>
         <item name="android:listPreferredItemHeight">72dip</item>
-        <item name="*android:preferenceHeaderPanelStyle">@style/PreferenceHeaderPanelSinglePane</item>
-        <item name="*android:preferencePanelStyle">@style/PreferencePanelSinglePane</item>
-        <item name="*android:preferenceListStyle">@style/PreferenceHeaderListSinglePane</item>
-        <item name="*android:preferenceFragmentListStyle">@style/PreferenceFragmentListSinglePane</item>
-        <item name="*android:preferenceFragmentPaddingSide">@dimen/settings_side_margin</item>
 
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
         <item name="face_layout_theme">@style/FaceLayoutTheme</item>
@@ -238,8 +45,8 @@
 
         <item name="preferenceBackgroundColor">@drawable/preference_background</item>
 
-        <!-- For all androidx version of AlertDialogs -->
-        <item name="alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert</item>
+        <!-- For AndroidX AlertDialog -->
+        <item name="alertDialogTheme">@style/Theme.AlertDialog</item>
 
         <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
 
@@ -249,6 +56,12 @@
         <item name="batteryBadColor">@color/battery_bad_color_light</item>
     </style>
 
+    <!-- Variant of the settings theme with no action bar. -->
+    <style name="Theme.Settings.NoActionBar">
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowNoTitle">true</item>
+    </style>
+
     <style name="Theme.SubSettings" parent="Theme.Settings">
         <!-- Redefine the ActionBar style for contentInsetStart -->
         <item name="android:actionBarStyle">@style/Theme.ActionBar.SubSettings</item>
@@ -256,12 +69,6 @@
         <item name="switchBarTheme">@style/ThemeOverlay.SwitchBar.Settings</item>
     </style>
 
-    <!-- Variant of the settings theme with no action bar. -->
-    <style name="Theme.Settings.NoActionBar">
-        <item name="android:windowActionBar">false</item>
-        <item name="android:windowNoTitle">true</item>
-    </style>
-
     <style name="Theme.ProvisioningActivity" parent="@android:style/Theme.Translucent.NoTitleBar">
         <item name="android:windowAnimationStyle">@null</item>
         <item name="android:windowIsTranslucent">true</item>
@@ -272,14 +79,6 @@
         <item name="android:backgroundDimEnabled">false</item>
     </style>
 
-    <style name="Theme.ActionBar" parent="@android:style/Widget.DeviceDefault.Light.ActionBar.Solid">
-        <item name="android:contentInsetStart">@dimen/actionbar_contentInsetStart</item>
-    </style>
-
-    <style name="Theme.ActionBar.SubSettings" parent="Theme.ActionBar">
-        <item name="android:contentInsetStart">@dimen/actionbar_subsettings_contentInsetStart</item>
-    </style>
-
     <style name="ThemeOverlay.SwitchBar.Settings" parent="@android:style/ThemeOverlay.Material.ActionBar">
         <item name="android:textColorPrimary">@android:color/white</item>
         <item name="switchBarMarginStart">@dimen/switchbar_subsettings_margin_start</item>
@@ -307,19 +106,15 @@
         <item name="android:windowSoftInputMode">adjustResize</item>
     </style>
 
-    <style name="GlifV2ThemeAlertDialog" parent="SuwAlertDialogTheme">
-        <item name="android:windowSoftInputMode">adjustResize</item>
-    </style>
-
-    <style name="GlifV2ThemeAlertDialog.Light" parent="SuwAlertDialogTheme.Light">
-        <item name="android:windowSoftInputMode">adjustResize</item>
-    </style>
-
-    <style name="Theme.AlertDialog" parent="@*android:style/Theme.DeviceDefault.Settings.Dialog.Alert">
+    <style name="Theme.AlertDialog" parent="@style/Theme.AppCompat.DayNight.Dialog.Alert">
         <item name="android:windowSoftInputMode">adjustResize</item>
 
         <!-- Redefine the ActionBar style for contentInsetStart -->
         <item name="android:actionBarStyle">@style/Theme.ActionBar</item>
+
+        <!-- copied from Theme.DeviceDefault.Light.Dialog.Alert -->
+        <item name="colorAccent">@*android:color/accent_device_default_light</item>
+        <item name="dialogCornerRadius">@*android:dimen/config_dialogCornerRadius</item>
     </style>
 
     <style name="Theme.ConfirmDeviceCredentials" parent="Theme.SubSettings">
@@ -366,19 +161,16 @@
         <item name="android:navigationBarColor">#00000000</item>
     </style>
 
-    <style name="FallbackHomeProgressBar" parent="FallbackHome">
-        <item name="android:colorControlActivated">?android:attr/textColorPrimary</item>
-    </style>
-
-    <style name="BluetoothPermission" parent="@android:style/Theme.Material.Light.Dialog.Alert">
+    <style name="Theme.BluetoothPermission" parent="@android:style/Theme.Material.Light.Dialog.Alert">
         <item name="android:windowNoTitle">true</item>
     </style>
 
     <style name="Theme.Settings.Home" parent="Theme.AppCompat.Light.NoActionBar">
-        <!-- copied from frameworks/base/core/res/res/values/themes_device_defaults.xml -->
+        <!-- Color names copied from frameworks/base/core/res/res/values/themes_device_defaults.xml -->
         <item name="colorPrimary">@*android:color/primary_device_default_settings_light</item>
         <item name="colorPrimaryDark">@*android:color/primary_dark_device_default_settings_light</item>
         <item name="android:colorAccent">@*android:color/accent_device_default_light</item>
+        <item name="android:windowLightStatusBar">true</item>
     </style>
 
 </resources>
diff --git a/res/values/themes_suw.xml b/res/values/themes_suw.xml
new file mode 100644
index 0000000..11ef373
--- /dev/null
+++ b/res/values/themes_suw.xml
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<!-- SUW related themes -->
+<resources>
+    <style name="GlifTheme" parent="SuwThemeGlif">
+        <!-- For all Alert Dialogs -->
+        <item name="android:alertDialogTheme">@style/ThemeOverlay.AlertDialog</item>
+        <item name="android:windowBackground">?android:attr/colorBackground</item>
+        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
+        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
+        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
+        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
+        <item name="side_margin">0dip</item>
+        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifi_friction">@drawable/wifi_friction</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
+        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
+
+        <!-- LockPatternView colors -->
+        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+    </style>
+
+    <style name="GlifTheme.Light" parent="SuwThemeGlif.Light">
+        <!-- For all Alert Dialogs -->
+        <item name="android:alertDialogTheme">@style/ThemeOverlay.AlertDialog</item>
+        <item name="android:windowBackground">?android:attr/colorBackground</item>
+        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
+        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
+        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
+        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
+        <item name="side_margin">0dip</item>
+        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifi_friction">@drawable/wifi_friction</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
+        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
+
+        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+        <item name="*android:colorError">@color/glif_error_color</item>
+    </style>
+
+    <style name="GlifV2Theme" parent="SuwThemeGlifV2">
+        <!-- For all Alert Dialogs -->
+        <item name="android:alertDialogTheme">@style/GlifV2ThemeAlertDialog</item>
+        <item name="android:windowBackground">?android:attr/colorBackground</item>
+        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
+        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
+        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
+        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
+        <item name="side_margin">0dip</item>
+        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifi_friction">@drawable/wifi_friction</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
+        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
+
+        <!-- LockPatternView colors -->
+        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+    </style>
+
+    <style name="GlifV2Theme.Light" parent="SuwThemeGlifV2.Light">
+        <!-- For all Alert Dialogs -->
+        <item name="android:alertDialogTheme">@style/GlifV2ThemeAlertDialog.Light</item>
+        <item name="android:windowBackground">?android:attr/colorBackground</item>
+        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
+        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
+        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
+        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
+        <item name="side_margin">0dip</item>
+        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifi_friction">@drawable/wifi_friction</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
+        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
+
+        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+        <item name="*android:colorError">@color/glif_error_color</item>
+    </style>
+
+    <style name="GlifV3Theme" parent="SuwThemeGlifV3">
+        <!-- For all Alert Dialogs -->
+        <item name="android:alertDialogTheme">@style/GlifV2ThemeAlertDialog</item>
+        <item name="android:windowBackground">?android:attr/colorBackground</item>
+        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
+        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
+        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
+        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
+        <item name="side_margin">0dip</item>
+        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifi_friction">@drawable/wifi_friction</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
+        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
+
+        <!-- LockPatternView colors -->
+        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+    </style>
+
+    <style name="GlifV3Theme.Light" parent="SuwThemeGlifV3.Light">
+        <!-- For all Alert Dialogs -->
+        <item name="android:alertDialogTheme">@style/GlifV2ThemeAlertDialog.Light</item>
+        <item name="android:windowBackground">?android:attr/colorBackground</item>
+        <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
+        <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
+        <item name="face_layout_theme">@style/FaceLayoutTheme</item>
+        <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
+        <item name="side_margin">0dip</item>
+        <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifi_friction">@drawable/wifi_friction</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
+        <item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
+
+        <item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+        <item name="*android:colorError">@color/glif_error_color</item>
+    </style>
+
+    <style name="GlifV2Theme.Transparent">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowAnimationStyle">@null</item>
+    </style>
+
+    <style name="GlifV2Theme.Light.Transparent">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowAnimationStyle">@null</item>
+    </style>
+
+    <style name="GlifV2ThemeAlertDialog" parent="SuwAlertDialogTheme">
+        <item name="android:windowSoftInputMode">adjustResize</item>
+    </style>
+
+    <style name="GlifV2ThemeAlertDialog.Light" parent="SuwAlertDialogTheme.Light">
+        <item name="android:windowSoftInputMode">adjustResize</item>
+    </style>
+
+    <style name="GlifV3Theme.Transparent">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowAnimationStyle">@null</item>
+    </style>
+
+    <style name="GlifV3Theme.Light.Transparent">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowAnimationStyle">@null</item>
+    </style>
+
+    <style name="SetupWizardTheme.Transparent" parent="GlifTheme">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowAnimationStyle">@null</item>
+    </style>
+
+    <style name="SetupWizardTheme.Light.Transparent" parent="GlifTheme.Light">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowAnimationStyle">@null</item>
+    </style>
+
+    <!-- Accessibility portion of Setup Wizard -->
+    <style name="SetupWizardAccessibilityTheme" parent="Theme.SettingsBase">
+        <item name="android:windowLightStatusBar">false</item>
+        <item name="android:colorPrimary">@color/material_grey_100</item>
+        <item name="android:colorAccent">@color/material_blue_700</item>
+        <item name="android:titleTextColor">@color/material_blue_700</item>
+        <item name="preferenceTheme">@style/PreferenceTheme</item>
+        <item name="switchBarTheme">@style/ThemeOverlay.SwitchBar.Settings</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml
index 9d77e86..684d032 100644
--- a/res/xml/app_info_settings.xml
+++ b/res/xml/app_info_settings.xml
@@ -63,7 +63,7 @@
 
     <Preference
         android:key="data_settings"
-        android:title="@string/data_usage_summary_title"
+        android:title="@string/data_usage_app_summary_title"
         android:summary="@string/summary_placeholder"
         settings:controller="com.android.settings.applications.appinfo.AppDataUsagePreferenceController" />
 
diff --git a/res/xml/auto_brightness_detail.xml b/res/xml/auto_brightness_detail.xml
index 8b683f1..b10f1ad 100644
--- a/res/xml/auto_brightness_detail.xml
+++ b/res/xml/auto_brightness_detail.xml
@@ -23,8 +23,10 @@
 
     <com.android.settings.widget.VideoPreference
         android:key="auto_brightness_video"
+        android:title="@string/summary_placeholder"
         settings:animation="@raw/aab_brightness"
-        settings:preview="@drawable/aab_brightness"/>
+        settings:preview="@drawable/aab_brightness"
+        settings:controller="com.android.settings.widget.VideoPreferenceController"/>
 
     <!-- Cross-listed item, if you change this, also change it in power_usage_summary.xml -->
     <com.android.settingslib.RestrictedSwitchPreference
diff --git a/res/xml/power_abnormal_detail.xml b/res/xml/power_abnormal_detail.xml
deleted file mode 100644
index de918a9..0000000
--- a/res/xml/power_abnormal_detail.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:title="@string/battery_abnormal_details_title">
-
-    <PreferenceCategory
-        android:key="app_abnormal_list"/>
-
-</PreferenceScreen>
diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml
index 2be2a52..0493a51 100644
--- a/res/xml/power_usage_detail.xml
+++ b/res/xml/power_usage_detail.xml
@@ -43,11 +43,6 @@
 
     </PreferenceCategory>
 
-    <Preference
-        android:key="high_usage"
-        android:icon="@drawable/ic_battery_alert_24dp"
-        android:title="@string/power_high_usage_title"/>
-
     <PreferenceCategory
         android:title="@string/battery_detail_info_title">
 
diff --git a/res/xml/smart_battery_detail.xml b/res/xml/smart_battery_detail.xml
index 8af3e96..abf5e43 100644
--- a/res/xml/smart_battery_detail.xml
+++ b/res/xml/smart_battery_detail.xml
@@ -23,8 +23,10 @@
 
     <com.android.settings.widget.VideoPreference
         android:key="auto_awesome_battery"
+        android:title="@string/summary_placeholder"
         settings:animation="@raw/auto_awesome_battery"
-        settings:preview="@drawable/auto_awesome_battery"/>
+        settings:preview="@drawable/auto_awesome_battery"
+        settings:controller="com.android.settings.widget.VideoPreferenceController"/>
 
     <SwitchPreference
         android:key="smart_battery"
diff --git a/res/xml/wifi_display_saved_access_points.xml b/res/xml/wifi_display_saved_access_points.xml
index 81fb701..98b4dec 100644
--- a/res/xml/wifi_display_saved_access_points.xml
+++ b/res/xml/wifi_display_saved_access_points.xml
@@ -14,7 +14,15 @@
      limitations under the License.
 -->
 
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-    android:title="@string/wifi_saved_access_points_titlebar">
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:key="saved_access_points"
+    android:title="@string/wifi_saved_access_points_label">
+
+    <PreferenceCategory
+        android:key="saved_access_points_category"
+        android:layout="@layout/preference_category_no_label"
+        settings:controller="com.android.settings.wifi.savedaccesspoints.SavedAccessPointsPreferenceController"/>
 
 </PreferenceScreen>
diff --git a/res/xml/wifi_settings.xml b/res/xml/wifi_settings.xml
index 52aadcf..4ca9284 100644
--- a/res/xml/wifi_settings.xml
+++ b/res/xml/wifi_settings.xml
@@ -39,6 +39,6 @@
         <Preference
                 android:key="saved_networks"
                 android:title="@string/wifi_saved_access_points_label"
-                android:fragment="com.android.settings.wifi.SavedAccessPointsWifiSettings" />
+                android:fragment="com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings" />
     </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/com/android/settings/AllowBindAppWidgetActivity.java b/src/com/android/settings/AllowBindAppWidgetActivity.java
index 52e7870..7557d97 100644
--- a/src/com/android/settings/AllowBindAppWidgetActivity.java
+++ b/src/com/android/settings/AllowBindAppWidgetActivity.java
@@ -16,7 +16,6 @@
 
 package com.android.settings;
 
-import android.app.AlertDialog;
 import android.appwidget.AppWidgetManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -33,6 +32,8 @@
 import com.android.internal.app.AlertActivity;
 import com.android.internal.app.AlertController;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * This activity is displayed when an app launches the BIND_APPWIDGET intent. This allows apps
  * that don't have the BIND_APPWIDGET permission to bind specific widgets.
diff --git a/src/com/android/settings/BandMode.java b/src/com/android/settings/BandMode.java
index b130295..9728a5f 100644
--- a/src/com/android/settings/BandMode.java
+++ b/src/com/android/settings/BandMode.java
@@ -1,7 +1,6 @@
 package com.android.settings;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.os.AsyncResult;
 import android.os.Bundle;
@@ -18,6 +17,7 @@
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
 
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * Radio Band Mode Selection Class
diff --git a/src/com/android/settings/CredentialStorage.java b/src/com/android/settings/CredentialStorage.java
index 7b39e4f..03a9203 100644
--- a/src/com/android/settings/CredentialStorage.java
+++ b/src/com/android/settings/CredentialStorage.java
@@ -17,7 +17,6 @@
 package com.android.settings;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -49,6 +48,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentActivity;
 import sun.security.util.ObjectIdentifier;
 import sun.security.x509.AlgorithmId;
diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java
index 9558d75..f710852 100644
--- a/src/com/android/settings/EncryptionInterstitial.java
+++ b/src/com/android/settings/EncryptionInterstitial.java
@@ -18,7 +18,6 @@
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
@@ -42,6 +41,8 @@
 
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
+
 public class EncryptionInterstitial extends SettingsActivity {
     private static final String TAG = EncryptionInterstitial.class.getSimpleName();
 
diff --git a/src/com/android/settings/MonitoringCertInfoActivity.java b/src/com/android/settings/MonitoringCertInfoActivity.java
index aea2a37..d181f7a 100644
--- a/src/com/android/settings/MonitoringCertInfoActivity.java
+++ b/src/com/android/settings/MonitoringCertInfoActivity.java
@@ -17,7 +17,6 @@
 package com.android.settings;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
@@ -29,6 +28,8 @@
 
 import com.android.settingslib.RestrictedLockUtils;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Activity that shows a dialog explaining that a CA cert is allowing someone to monitor network
  * traffic. This activity should be launched for the user into which the CA cert is installed
diff --git a/src/com/android/settings/ProxySelector.java b/src/com/android/settings/ProxySelector.java
index 1c51a98..a681b94 100644
--- a/src/com/android/settings/ProxySelector.java
+++ b/src/com/android/settings/ProxySelector.java
@@ -17,7 +17,6 @@
 package com.android.settings;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
@@ -43,6 +42,8 @@
 import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
 import com.android.settings.core.InstrumentedFragment;
 
+import androidx.appcompat.app.AlertDialog;
+
 public class ProxySelector extends InstrumentedFragment implements DialogCreatable {
     private static final String TAG = "ProxySelector";
 
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index ee20c58..3db9935 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -20,7 +20,6 @@
 import static android.provider.Settings.Global.PREFERRED_NETWORK_MODE;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.QueuedWork;
 import android.content.ComponentName;
 import android.content.Context;
@@ -91,6 +90,8 @@
 import java.net.URL;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
+
 public class RadioInfo extends Activity {
     private static final String TAG = "RadioInfo";
 
diff --git a/src/com/android/settings/RegulatoryInfoDisplayActivity.java b/src/com/android/settings/RegulatoryInfoDisplayActivity.java
index 2b47c86..6430a13 100644
--- a/src/com/android/settings/RegulatoryInfoDisplayActivity.java
+++ b/src/com/android/settings/RegulatoryInfoDisplayActivity.java
@@ -17,7 +17,6 @@
 package com.android.settings;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -34,6 +33,7 @@
 import java.util.Locale;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * {@link Activity} that displays regulatory information for the "Regulatory information"
diff --git a/src/com/android/settings/RemoteBugreportActivity.java b/src/com/android/settings/RemoteBugreportActivity.java
index 7069175..2c88ec3 100644
--- a/src/com/android/settings/RemoteBugreportActivity.java
+++ b/src/com/android/settings/RemoteBugreportActivity.java
@@ -17,7 +17,6 @@
 
 import android.annotation.Nullable;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -25,6 +24,8 @@
 import android.os.UserHandle;
 import android.util.Log;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * UI for the remote bugreport dialog. Shows one of 3 possible dialogs:
  * <ul>
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
index 1ecc8d7..88a7049 100644
--- a/src/com/android/settings/ResetNetworkConfirm.java
+++ b/src/com/android/settings/ResetNetworkConfirm.java
@@ -18,7 +18,6 @@
 
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
-import android.app.AlertDialog;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothManager;
 import android.content.ContentResolver;
@@ -50,6 +49,7 @@
 import com.android.settingslib.RestrictedLockUtils;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * Confirm and execute a reset of the network settings to a clean "just out of the box"
@@ -150,7 +150,8 @@
                 }
             }
 
-            ImsManager.factoryReset(context);
+            ImsManager.getInstance(context,
+                     SubscriptionManager.getPhoneId(mSubId)).factoryReset();
             restoreDefaultApn(context);
             esimFactoryReset(context, context.getPackageName());
             // There has been issues when Sms raw table somehow stores orphan
diff --git a/src/com/android/settings/RestrictedListPreference.java b/src/com/android/settings/RestrictedListPreference.java
index a5d241c..e79f03e 100644
--- a/src/com/android/settings/RestrictedListPreference.java
+++ b/src/com/android/settings/RestrictedListPreference.java
@@ -18,7 +18,6 @@
 
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
-import android.app.AlertDialog;
 import android.app.KeyguardManager;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -41,6 +40,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AlertDialog.Builder;
 import androidx.preference.ListPreferenceDialogFragmentCompat;
 import androidx.preference.PreferenceViewHolder;
diff --git a/src/com/android/settings/RestrictedSettingsFragment.java b/src/com/android/settings/RestrictedSettingsFragment.java
index 3bf9f85..2894366 100644
--- a/src/com/android/settings/RestrictedSettingsFragment.java
+++ b/src/com/android/settings/RestrictedSettingsFragment.java
@@ -19,7 +19,6 @@
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -37,6 +36,7 @@
 import com.android.settingslib.RestrictedLockUtils;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * Base class for settings screens that should be pin protected when in restricted mode or
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index cafe5cf..cacd04e 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -46,6 +46,7 @@
 import com.android.settings.Settings.WifiSettingsActivity;
 import com.android.settings.applications.manageapplications.ManageApplications;
 import com.android.settings.backup.BackupSettingsActivity;
+import com.android.settings.core.OnActivityResultListener;
 import com.android.settings.core.SettingsBaseActivity;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.core.gateway.SettingsGateway;
@@ -64,6 +65,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
@@ -375,6 +377,19 @@
         }
     }
 
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        final List<Fragment> fragments = getSupportFragmentManager().getFragments();
+        if (fragments != null) {
+            for (Fragment fragment : fragments) {
+                if (fragment instanceof OnActivityResultListener) {
+                    fragment.onActivityResult(requestCode, resultCode, data);
+                }
+            }
+        }
+    }
+
     @VisibleForTesting
     void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) {
         if (!mIsShowingDashboard && initialFragmentName != null) {
diff --git a/src/com/android/settings/TrustedCredentialsDialogBuilder.java b/src/com/android/settings/TrustedCredentialsDialogBuilder.java
index 03414bd..76bf861 100644
--- a/src/com/android/settings/TrustedCredentialsDialogBuilder.java
+++ b/src/com/android/settings/TrustedCredentialsDialogBuilder.java
@@ -17,7 +17,6 @@
 
 import android.annotation.NonNull;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.DialogInterface;
 import android.content.pm.UserInfo;
@@ -41,6 +40,8 @@
 import java.util.List;
 import java.util.function.IntConsumer;
 
+import androidx.appcompat.app.AlertDialog;
+
 class TrustedCredentialsDialogBuilder extends AlertDialog.Builder {
     public interface DelegateInterface {
         List<X509Certificate> getX509CertsFromCertHolder(CertHolder certHolder);
diff --git a/src/com/android/settings/UserCredentialsSettings.java b/src/com/android/settings/UserCredentialsSettings.java
index 20defb3..06d0be6 100644
--- a/src/com/android/settings/UserCredentialsSettings.java
+++ b/src/com/android/settings/UserCredentialsSettings.java
@@ -18,7 +18,6 @@
 
 import android.annotation.LayoutRes;
 import android.annotation.Nullable;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -57,6 +56,7 @@
 import java.util.SortedMap;
 import java.util.TreeMap;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.RecyclerView;
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 55ec159..9d5f96f 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -389,9 +389,7 @@
      */
     public static UserHandle getManagedProfile(UserManager userManager) {
         List<UserHandle> userProfiles = userManager.getUserProfiles();
-        final int count = userProfiles.size();
-        for (int i = 0; i < count; i++) {
-            final UserHandle profile = userProfiles.get(i);
+        for (UserHandle profile : userProfiles) {
             if (profile.getIdentifier() == userManager.getUserHandle()) {
                 continue;
             }
diff --git a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
index 4890011..95e1643 100644
--- a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
+++ b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
@@ -20,7 +20,6 @@
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -41,6 +40,8 @@
 import java.util.List;
 import java.util.Locale;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Utility class for creating the dialog that asks users for explicit permission to grant
  * all of the requested capabilities to an accessibility service before the service is enabled
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index b910130..22cff3e 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -633,8 +633,14 @@
                     mCategoryToPrefCategoryMap.get(CATEGORY_DISPLAY);
             experimentalCategory.removePreference(mToggleInversionPreference);
             experimentalCategory.removePreference(mDisplayDaltonizerPreferenceScreen);
-            mToggleInversionPreference.setOrder(mToggleLargePointerIconPreference.getOrder());
-            mDisplayDaltonizerPreferenceScreen.setOrder(mToggleInversionPreference.getOrder());
+            mDisplayDaltonizerPreferenceScreen.setOrder(
+                    mDisplayMagnificationPreferenceScreen.getOrder() + 1);
+            mToggleInversionPreference.setOrder(
+                    mDisplayDaltonizerPreferenceScreen.getOrder() + 1);
+            mToggleLargePointerIconPreference.setOrder(
+                    mToggleInversionPreference.getOrder() + 1);
+            mToggleDisableAnimationsPreference.setOrder(
+                    mToggleLargePointerIconPreference.getOrder() + 1);
             mToggleInversionPreference.setSummary(R.string.summary_empty);
             displayCategory.addPreference(mToggleInversionPreference);
             displayCategory.addPreference(mDisplayDaltonizerPreferenceScreen);
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index b345e05..6738736 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -18,7 +18,6 @@
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
@@ -46,6 +45,8 @@
 
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
+
 public class ToggleAccessibilityServicePreferenceFragment
         extends ToggleFeaturePreferenceFragment implements DialogInterface.OnClickListener {
 
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index f90c3c6..58624cd 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -19,7 +19,6 @@
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -53,6 +52,7 @@
 import java.util.Date;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 
 public class AccountSyncSettings extends AccountPreferenceBase {
diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
index 8df485c..3520116 100644
--- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
+++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
@@ -22,7 +22,6 @@
 import android.accounts.AuthenticatorException;
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -45,6 +44,7 @@
 
 import java.io.IOException;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.preference.PreferenceScreen;
 
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 4ee2fd8..0acb046 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -19,7 +19,6 @@
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
@@ -51,6 +50,7 @@
 
 import java.util.ArrayList;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 
diff --git a/src/com/android/settings/applications/AppLaunchSettings.java b/src/com/android/settings/applications/AppLaunchSettings.java
index 6b527a7..82ac1b0 100644
--- a/src/com/android/settings/applications/AppLaunchSettings.java
+++ b/src/com/android/settings/applications/AppLaunchSettings.java
@@ -21,7 +21,6 @@
 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
 
-import android.app.AlertDialog;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
@@ -42,6 +41,7 @@
 
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.DropDownPreference;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index 897cbc7..ed5397a 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -22,7 +22,6 @@
 import static android.os.storage.StorageVolume.ScopedAccessProviderContract.TABLE_PERMISSIONS;
 
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.app.AppGlobals;
 import android.app.GrantedUriPermission;
 import android.content.ContentResolver;
@@ -64,6 +63,7 @@
 import java.util.TreeMap;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.loader.app.LoaderManager;
 import androidx.loader.content.Loader;
 import androidx.preference.Preference;
diff --git a/src/com/android/settings/applications/DirectoryAccessDetails.java b/src/com/android/settings/applications/DirectoryAccessDetails.java
index 02c33c0..8325f0d 100644
--- a/src/com/android/settings/applications/DirectoryAccessDetails.java
+++ b/src/com/android/settings/applications/DirectoryAccessDetails.java
@@ -34,7 +34,6 @@
 
 import android.annotation.Nullable;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -60,6 +59,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceScreen;
diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java
index 3331b1c..e57808f 100644
--- a/src/com/android/settings/applications/ProcessStatsDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsDetail.java
@@ -21,7 +21,6 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityManager.RunningServiceInfo;
-import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -59,6 +58,7 @@
 import java.util.HashMap;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 
diff --git a/src/com/android/settings/applications/RunningServiceDetails.java b/src/com/android/settings/applications/RunningServiceDetails.java
index 0461343..66fdb08 100644
--- a/src/com/android/settings/applications/RunningServiceDetails.java
+++ b/src/com/android/settings/applications/RunningServiceDetails.java
@@ -2,7 +2,6 @@
 
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.app.ApplicationErrorReport;
 import android.app.Dialog;
 import android.app.PendingIntent;
@@ -44,6 +43,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 
 public class RunningServiceDetails extends InstrumentedFragment
diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java
index 8c76e71..c14ddbc 100644
--- a/src/com/android/settings/applications/UsageAccessDetails.java
+++ b/src/com/android/settings/applications/UsageAccessDetails.java
@@ -15,7 +15,6 @@
  */
 package com.android.settings.applications;
 
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
@@ -32,6 +31,7 @@
 import com.android.settings.overlay.FeatureFactory;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.Preference.OnPreferenceClickListener;
diff --git a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
index 32fcef5..4dab72b 100644
--- a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
@@ -99,13 +99,11 @@
                     (UserManager) mContext.getSystemService(Context.USER_SERVICE);
             final BatteryEntry entry = new BatteryEntry(mContext, null, userManager, mSipper);
             entry.defaultPackageName = mPackageName;
-            AdvancedPowerUsageDetail.startBatteryDetailPage(
-                    (SettingsActivity) mParent.getActivity(), mParent, mBatteryHelper,
-                    BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent,
-                    null /* mAnomalies */);
+            AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent,
+                    mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent);
         } else {
-            AdvancedPowerUsageDetail.startBatteryDetailPage(
-                    (SettingsActivity) mParent.getActivity(), mParent, mPackageName);
+            AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent,
+                    mPackageName);
         }
         return true;
     }
diff --git a/src/com/android/settings/applications/appinfo/ButtonActionDialogFragment.java b/src/com/android/settings/applications/appinfo/ButtonActionDialogFragment.java
index f6e0472..eeeb205 100644
--- a/src/com/android/settings/applications/appinfo/ButtonActionDialogFragment.java
+++ b/src/com/android/settings/applications/appinfo/ButtonActionDialogFragment.java
@@ -15,7 +15,6 @@
  */
 package com.android.settings.applications.appinfo;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -30,6 +29,7 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * Fragment to show the dialog for uninstall or forcestop. This fragment uses function in
diff --git a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
index 94111cf..8c572af 100644
--- a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
+++ b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
@@ -17,7 +17,6 @@
 
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
 
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.content.Intent;
@@ -38,6 +37,7 @@
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.Preference.OnPreferenceClickListener;
diff --git a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
index dc9ab7e..224072c 100644
--- a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
+++ b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
@@ -18,7 +18,6 @@
 import static android.app.Activity.RESULT_CANCELED;
 import static android.app.Activity.RESULT_OK;
 
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.os.Bundle;
@@ -34,6 +33,7 @@
 import com.android.settingslib.RestrictedSwitchPreference;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 
diff --git a/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragment.java b/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragment.java
index 2e668ef..683a764 100644
--- a/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragment.java
+++ b/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragment.java
@@ -15,7 +15,6 @@
  */
 package com.android.settings.applications.appinfo;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -28,6 +27,8 @@
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.overlay.FeatureFactory;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Fragment to show the dialog for clearing the instant app.
  */
diff --git a/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java b/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java
index 7f9f359..aed263f 100644
--- a/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java
+++ b/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java
@@ -15,7 +15,6 @@
  */
 package com.android.settings.applications.appinfo;
 
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.content.Intent;
@@ -33,6 +32,7 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.Preference.OnPreferenceClickListener;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
index d0493e9..395ea64 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.applications.defaultapps;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -28,11 +27,13 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.widget.RadioButtonPickerFragment;
 import com.android.settings.widget.RadioButtonPreference;
 import com.android.settingslib.applications.DefaultAppInfo;
 import com.android.settingslib.widget.CandidateInfo;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
@@ -43,11 +44,13 @@
 public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment {
 
     protected PackageManager mPm;
+    protected BatteryUtils mBatteryUtils;
 
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
         mPm = context.getPackageManager();
+        mBatteryUtils = BatteryUtils.getInstance(context);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
index e462ab8..0bda2ec 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
@@ -80,6 +80,7 @@
     @Override
     protected boolean setDefaultKey(String key) {
         if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
+            mBatteryUtils.clearForceAppStandby(key);
             return mDefaultKeyUpdater.setDefaultDialerApplication(getContext(), key, mUserId);
         }
         return false;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
index 91f9caf..b5a2880 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.applications.defaultapps;
 
+import android.app.AppOpsManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -25,6 +26,7 @@
 import com.android.internal.telephony.SmsApplication;
 import com.android.settings.R;
 import com.android.settings.Utils;
+import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settingslib.applications.DefaultAppInfo;
 import com.android.settingslib.widget.CandidateInfo;
 
@@ -74,6 +76,7 @@
     protected boolean setDefaultKey(String key) {
         if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
             mDefaultKeyUpdater.setDefaultApplication(getContext(), key);
+            mBatteryUtils.clearForceAppStandby(key);
             return true;
         }
         return false;
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index de4558e..a64f461 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -54,6 +54,7 @@
 import android.preference.PreferenceFrameLayout;
 import android.text.TextUtils;
 import android.util.ArraySet;
+import android.util.IconDrawableFactory;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -862,6 +863,7 @@
         private final Context mContext;
         private final AppStateBaseBridge mExtraInfoBridge;
         private final LoadingViewController mLoadingViewController;
+        private final IconDrawableFactory mIconDrawableFactory;
 
         private AppFilterItem mAppFilter;
         private ArrayList<ApplicationsState.AppEntry> mEntries;
@@ -894,6 +896,7 @@
                     mManageApplications.mListContainer
             );
             mContext = manageApplications.getActivity();
+            mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
             mAppFilter = appFilter;
             if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
                 mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this,
@@ -1318,8 +1321,7 @@
                 ApplicationsState.AppEntry entry = mEntries.get(position);
                 synchronized (entry) {
                     holder.setTitle(entry.label);
-                    mState.ensureIcon(entry);
-                    holder.setIcon(entry.icon);
+                    holder.setIcon(mIconDrawableFactory.getBadgedIcon(entry.info));
                     updateSummary(holder, entry);
                     updateSwitch(holder, entry);
                     holder.updateDisableView(entry.info);
diff --git a/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java b/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
index 686e027..4e38f4e 100644
--- a/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
+++ b/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
@@ -19,7 +19,6 @@
 import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
 
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.app.INotificationManager;
 import android.content.Context;
@@ -39,6 +38,8 @@
 
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
+
 public class ResetAppsHelper implements DialogInterface.OnClickListener,
         DialogInterface.OnDismissListener {
 
diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
index 6e0f915..c7e93b8 100644
--- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
+++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
@@ -18,7 +18,6 @@
 
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.app.Dialog;
 import android.app.admin.DeviceAdminInfo;
@@ -74,6 +73,8 @@
 import java.util.List;
 import java.util.Optional;
 
+import androidx.appcompat.app.AlertDialog;
+
 public class DeviceAdminAdd extends Activity {
     static final String TAG = "DeviceAdminAdd";
 
@@ -455,10 +456,7 @@
     void unrestrictAppIfPossible(BatteryUtils batteryUtils) {
         // Unrestrict admin app if it is already been restricted
         final String packageName = mDeviceAdmin.getComponent().getPackageName();
-        final int uid = batteryUtils.getPackageUid(packageName);
-        if (batteryUtils.isForceAppStandbyEnabled(uid, packageName)) {
-            batteryUtils.setForceAppStandby(uid, packageName, AppOpsManager.MODE_ALLOWED);
-        }
+        batteryUtils.clearForceAppStandby(packageName);
     }
 
     void continueRemoveAction(CharSequence msg) {
diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java
index 6af4f81..79606ee 100644
--- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java
+++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java
@@ -19,7 +19,6 @@
 import static android.app.AppOpsManager.MODE_ERRORED;
 import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE;
 
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.os.Bundle;
@@ -30,6 +29,7 @@
 import com.android.settings.overlay.FeatureFactory;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.SwitchPreference;
diff --git a/src/com/android/settings/backup/ToggleBackupSettingFragment.java b/src/com/android/settings/backup/ToggleBackupSettingFragment.java
index 0d1c33e..fb24542 100644
--- a/src/com/android/settings/backup/ToggleBackupSettingFragment.java
+++ b/src/com/android/settings/backup/ToggleBackupSettingFragment.java
@@ -1,6 +1,5 @@
 package com.android.settings.backup;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.backup.IBackupManager;
 import android.content.Context;
@@ -20,6 +19,7 @@
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.widget.ToggleSwitch;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 import androidx.preference.PreferenceViewHolder;
diff --git a/src/com/android/settings/biometrics/BiometricErrorDialog.java b/src/com/android/settings/biometrics/BiometricErrorDialog.java
index 4e073f1..5c4e891 100644
--- a/src/com/android/settings/biometrics/BiometricErrorDialog.java
+++ b/src/com/android/settings/biometrics/BiometricErrorDialog.java
@@ -20,7 +20,6 @@
 import static com.android.settings.biometrics.BiometricSettings.RESULT_TIMEOUT;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.hardware.biometrics.BiometricConstants;
@@ -28,6 +27,8 @@
 
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Abstract dialog, shown when an error occurs during biometric enrollment.
  */
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index 56d96ce..38ef2c1 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -18,7 +18,6 @@
 
 import android.animation.Animator;
 import android.animation.ObjectAnimator;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -47,6 +46,8 @@
 import com.android.settings.biometrics.BiometricsEnrollEnrolling;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Activity which handles the actual enrolling for fingerprint.
  */
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index 76ee78b..d318fef 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -18,7 +18,6 @@
 
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
@@ -57,6 +56,7 @@
 import java.util.List;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.PreferenceGroup;
diff --git a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensor.java
index 4529277..febffa6 100644
--- a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensor.java
@@ -17,7 +17,6 @@
 package com.android.settings.biometrics.fingerprint;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -32,6 +31,7 @@
 import com.android.settings.password.ChooseLockSettingsHelper;
 
 import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentManager;
 
 public class SetupFingerprintEnrollFindSensor extends FingerprintEnrollFindSensor {
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index 8590392..eb1cd52 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -18,7 +18,6 @@
 
 import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
 
-import android.app.AlertDialog;
 import android.bluetooth.BluetoothDevice;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -39,6 +38,7 @@
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
diff --git a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
index 0eb9746..6f737e0 100644
--- a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.bluetooth;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -38,6 +37,8 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Dialog fragment for renaming a Bluetooth device.
  */
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java
index 580a26f..e5d2aa7 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java
@@ -15,7 +15,6 @@
  */
 package com.android.settings.bluetooth;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -40,6 +39,7 @@
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * A dialogFragment used by {@link BluetoothPairingDialog} to create an appropriately styled dialog
diff --git a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
index 32edb23..e660691 100644
--- a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
+++ b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
@@ -17,7 +17,6 @@
 package com.android.settings.bluetooth;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.bluetooth.BluetoothDevice;
 import android.content.Context;
@@ -31,6 +30,7 @@
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /** Implements an AlertDialog for confirming that a user wishes to unpair or "forget" a paired
  *  device*/
diff --git a/src/com/android/settings/bluetooth/RequestPermissionActivity.java b/src/com/android/settings/bluetooth/RequestPermissionActivity.java
index 0c9ab37..5f6fc39 100644
--- a/src/com/android/settings/bluetooth/RequestPermissionActivity.java
+++ b/src/com/android/settings/bluetooth/RequestPermissionActivity.java
@@ -18,7 +18,6 @@
 
 import android.annotation.NonNull;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
@@ -38,6 +37,8 @@
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * RequestPermissionActivity asks the user whether to enable discovery. This is
  * usually started by an application wanted to start bluetooth and or discovery
@@ -49,7 +50,7 @@
     // adb shell am start -a android.bluetooth.adapter.action.REQUEST_DISCOVERABLE
     // adb shell am start -a android.bluetooth.adapter.action.REQUEST_DISABLE
 
-    private static final String TAG = "RequestPermissionActivity";
+    private static final String TAG = "BtRequestPermission";
 
     private static final int MAX_DISCOVERABLE_TIMEOUT = 3600; // 1 hr
 
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index 96f5da5..567aa93 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.bluetooth;
 
-import android.app.AlertDialog;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
@@ -34,6 +33,7 @@
 import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * Utils is a helper class that contains constants for various
diff --git a/src/com/android/settings/core/OnActivityResultListener.java b/src/com/android/settings/core/OnActivityResultListener.java
new file mode 100644
index 0000000..5832c7f
--- /dev/null
+++ b/src/com/android/settings/core/OnActivityResultListener.java
@@ -0,0 +1,30 @@
+/*
+ * 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.core;
+
+import android.app.Activity;
+import android.content.Intent;
+
+/**
+ * This interface marks a class that it wants to listen to
+ * {@link Activity#onActivityResult(int, int, Intent)}.
+ *
+ * Whenever {@link com.android.settings.SettingsActivity} receives an activity result, it will
+ * propagate the data to this interface so it has a chance to inspect and handle activity results.
+ */
+public interface OnActivityResultListener {
+}
diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java
index 2cce467..9672694 100644
--- a/src/com/android/settings/core/SettingsBaseActivity.java
+++ b/src/com/android/settings/core/SettingsBaseActivity.java
@@ -35,15 +35,14 @@
 import android.view.WindowManager.LayoutParams;
 import android.widget.Toolbar;
 
+import androidx.fragment.app.FragmentActivity;
+
 import com.android.settings.R;
 import com.android.settingslib.drawer.CategoryManager;
-import com.android.settingslib.drawer.TileUtils;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import androidx.fragment.app.FragmentActivity;
-
 public class SettingsBaseActivity extends FragmentActivity {
 
     protected static final boolean DEBUG_TIMING = false;
@@ -174,7 +173,7 @@
     }
 
     public String getSettingPkg() {
-        return TileUtils.SETTING_PKG;
+        return CategoryManager.SETTING_PKG;
     }
 
     public interface CategoryListener {
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 1569ff0..219c92c 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -38,7 +38,6 @@
 import com.android.settings.applications.ProcessStatsSummary;
 import com.android.settings.applications.ProcessStatsUi;
 import com.android.settings.applications.UsageAccessDetails;
-import com.android.settings.applications.specialaccess.vrlistener.VrListenerSettings;
 import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
 import com.android.settings.applications.appinfo.DrawOverlayDetails;
 import com.android.settings.applications.appinfo.ExternalSourcesDetails;
@@ -50,6 +49,7 @@
 import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminSettings;
 import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails;
 import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureSettings;
+import com.android.settings.applications.specialaccess.vrlistener.VrListenerSettings;
 import com.android.settings.backup.PrivacySettings;
 import com.android.settings.backup.ToggleBackupSettingFragment;
 import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
@@ -127,12 +127,12 @@
 import com.android.settings.webview.WebViewAppPicker;
 import com.android.settings.wfd.WifiDisplaySettings;
 import com.android.settings.wifi.ConfigureWifiSettings;
-import com.android.settings.wifi.SavedAccessPointsWifiSettings;
 import com.android.settings.wifi.WifiAPITest;
 import com.android.settings.wifi.WifiInfo;
 import com.android.settings.wifi.WifiSettings;
 import com.android.settings.wifi.calling.WifiCallingSettings;
 import com.android.settings.wifi.p2p.WifiP2pSettings;
+import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
 import com.android.settings.wifi.tether.WifiTetherSettings;
 
 public class SettingsGateway {
diff --git a/src/com/android/settings/dashboard/DashboardData.java b/src/com/android/settings/dashboard/DashboardData.java
index 9f66731..182d79b 100644
--- a/src/com/android/settings/dashboard/DashboardData.java
+++ b/src/com/android/settings/dashboard/DashboardData.java
@@ -20,6 +20,9 @@
 import android.service.settings.suggestions.Suggestion;
 import android.text.TextUtils;
 
+import androidx.annotation.VisibleForTesting;
+import androidx.recyclerview.widget.DiffUtil;
+
 import com.android.settings.R;
 import com.android.settings.dashboard.conditional.Condition;
 import com.android.settingslib.drawer.DashboardCategory;
@@ -31,9 +34,6 @@
 import java.util.List;
 import java.util.Objects;
 
-import androidx.annotation.VisibleForTesting;
-import androidx.recyclerview.widget.DiffUtil;
-
 /**
  * Description about data list used in the DashboardAdapter. In the data list each item can be
  * Condition, suggestion or category tile.
@@ -411,16 +411,7 @@
                         && TextUtils.equals(localTile.summary, targetTile.summary);
                 case TYPE_SUGGESTION_CONTAINER:
                 case TYPE_CONDITION_CONTAINER:
-                    // If entity is suggestion and contains remote view, force refresh
-                    final List entities = (List) entity;
-                    if (!entities.isEmpty()) {
-                        Object firstEntity = entities.get(0);
-                        if (firstEntity instanceof Tile
-                                && ((Tile) firstEntity).remoteViews != null) {
-                            return false;
-                        }
-                    }
-                    // Otherwise Fall through to default
+                    // Fall through to default
                 default:
                     return entity == null ? targetItem.entity == null
                             : entity.equals(targetItem.entity);
diff --git a/src/com/android/settings/dashboard/RestrictedDashboardFragment.java b/src/com/android/settings/dashboard/RestrictedDashboardFragment.java
index 8258678..927385b 100644
--- a/src/com/android/settings/dashboard/RestrictedDashboardFragment.java
+++ b/src/com/android/settings/dashboard/RestrictedDashboardFragment.java
@@ -19,7 +19,6 @@
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -37,6 +36,8 @@
 import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper;
 import com.android.settingslib.RestrictedLockUtils;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Base class for settings screens that should be pin protected when in restricted mode or
  * that will display an admin support message in case an admin has disabled the options.
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index 2e89e59..1d1ec6d 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -17,7 +17,6 @@
 import static android.net.NetworkPolicy.LIMIT_DISABLED;
 import static android.net.NetworkPolicy.WARNING_DISABLED;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -47,6 +46,7 @@
 import java.util.List;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
diff --git a/src/com/android/settings/deletionhelper/ActivationWarningFragment.java b/src/com/android/settings/deletionhelper/ActivationWarningFragment.java
index 1618e2a..9bfe032 100644
--- a/src/com/android/settings/deletionhelper/ActivationWarningFragment.java
+++ b/src/com/android/settings/deletionhelper/ActivationWarningFragment.java
@@ -16,12 +16,12 @@
 
 package com.android.settings.deletionhelper;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.os.Bundle;
 
 import com.android.settings.R;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 
 /**
diff --git a/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java b/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java
index 03e1143..ba05910 100644
--- a/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java
+++ b/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.development;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -26,6 +25,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentManager;
 
 public class BluetoothA2dpHwOffloadRebootDialog extends InstrumentedDialogFragment
diff --git a/src/com/android/settings/development/ClearAdbKeysWarningDialog.java b/src/com/android/settings/development/ClearAdbKeysWarningDialog.java
index e930759..3d81f1a 100644
--- a/src/com/android/settings/development/ClearAdbKeysWarningDialog.java
+++ b/src/com/android/settings/development/ClearAdbKeysWarningDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.development;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -25,6 +24,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/development/DisableLogPersistWarningDialog.java b/src/com/android/settings/development/DisableLogPersistWarningDialog.java
index fbe2b05..b25e5ff 100644
--- a/src/com/android/settings/development/DisableLogPersistWarningDialog.java
+++ b/src/com/android/settings/development/DisableLogPersistWarningDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.development;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -25,6 +24,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/development/EnableAdbWarningDialog.java b/src/com/android/settings/development/EnableAdbWarningDialog.java
index e1354ce..e191f30 100644
--- a/src/com/android/settings/development/EnableAdbWarningDialog.java
+++ b/src/com/android/settings/development/EnableAdbWarningDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.development;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -25,6 +24,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/development/EnableDevelopmentSettingWarningDialog.java b/src/com/android/settings/development/EnableDevelopmentSettingWarningDialog.java
index 51532f3..ebc195e 100644
--- a/src/com/android/settings/development/EnableDevelopmentSettingWarningDialog.java
+++ b/src/com/android/settings/development/EnableDevelopmentSettingWarningDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.development;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -25,6 +24,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentManager;
 
 public class EnableDevelopmentSettingWarningDialog extends InstrumentedDialogFragment
diff --git a/src/com/android/settings/development/EnableOemUnlockSettingWarningDialog.java b/src/com/android/settings/development/EnableOemUnlockSettingWarningDialog.java
index 09d2ffe..cf077ca 100644
--- a/src/com/android/settings/development/EnableOemUnlockSettingWarningDialog.java
+++ b/src/com/android/settings/development/EnableOemUnlockSettingWarningDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.development;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -25,6 +24,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/development/OemLockInfoDialog.java b/src/com/android/settings/development/OemLockInfoDialog.java
index 74babf2..f197c6a 100644
--- a/src/com/android/settings/development/OemLockInfoDialog.java
+++ b/src/com/android/settings/development/OemLockInfoDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.development;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.os.Bundle;
 
@@ -24,6 +23,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/deviceinfo/HardwareInfoDialogFragment.java b/src/com/android/settings/deviceinfo/HardwareInfoDialogFragment.java
index 51964a9..3057fa0 100644
--- a/src/com/android/settings/deviceinfo/HardwareInfoDialogFragment.java
+++ b/src/com/android/settings/deviceinfo/HardwareInfoDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.deviceinfo;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.os.Build;
 import android.os.Bundle;
@@ -31,6 +30,7 @@
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 public class HardwareInfoDialogFragment extends InstrumentedDialogFragment {
 
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java
index 8c7fa09..ebd976b 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.deviceinfo;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -38,6 +37,7 @@
 import com.android.settings.search.actionbar.SearchMenuController;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 public class PrivateVolumeForget extends InstrumentedFragment {
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index 8d6714d..997f0d2 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.deviceinfo;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -65,6 +64,7 @@
 import java.util.List;
 import java.util.Objects;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index 90da85c..f4ea580 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -18,7 +18,6 @@
 
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -61,6 +60,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java
index 85e5929..e09e89d 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java
@@ -20,7 +20,6 @@
 import static com.android.settings.deviceinfo.StorageWizardBase.EXTRA_FORMAT_FORGET_UUID;
 import static com.android.settings.deviceinfo.StorageWizardBase.EXTRA_FORMAT_PRIVATE;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.Intent;
@@ -33,6 +32,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentActivity;
 
 public class StorageWizardFormatConfirm extends InstrumentedDialogFragment {
diff --git a/src/com/android/settings/deviceinfo/aboutphone/DeviceNameWarningDialog.java b/src/com/android/settings/deviceinfo/aboutphone/DeviceNameWarningDialog.java
index 45f39d9..0224040 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/DeviceNameWarningDialog.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/DeviceNameWarningDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.deviceinfo.aboutphone;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -25,6 +24,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentManager;
 
 /**
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java
index 17a9692..9c6075e 100644
--- a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java
+++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.deviceinfo.firmwareversion;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -27,6 +26,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogFragment.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogFragment.java
index 01fb04a..808edd4 100644
--- a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogFragment.java
+++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.deviceinfo.imei;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.os.Bundle;
 import android.text.TextUtils;
@@ -30,6 +29,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java
index ef51185..2dd3785 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.deviceinfo.simstatus;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.os.Bundle;
 import android.text.TextUtils;
@@ -28,6 +27,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
index 6de3a92..6a4ca92 100644
--- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
+++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
@@ -17,7 +17,6 @@
 package com.android.settings.enterprise;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -43,6 +42,7 @@
 import java.util.Objects;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * Helper class for {@link ActionDisabledByAdminDialog} which sets up the dialog.
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index c71468b..2c48c3d 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -42,11 +42,6 @@
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
-import com.android.settings.fuelgauge.anomaly.AnomalyLoader;
-import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
-import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.widget.EntityHeaderController;
@@ -71,8 +66,6 @@
  */
 public class AdvancedPowerUsageDetail extends DashboardFragment implements
         ButtonActionDialogFragment.AppButtonsDialogListener,
-        AnomalyDialogFragment.AnomalyDialogListener,
-        LoaderManager.LoaderCallbacks<List<Anomaly>>,
         BatteryTipPreferenceController.BatteryTipListener {
 
     public static final String TAG = "AdvancedPowerDetail";
@@ -84,7 +77,6 @@
     public static final String EXTRA_ICON_ID = "extra_icon_id";
     public static final String EXTRA_POWER_USAGE_PERCENT = "extra_power_usage_percent";
     public static final String EXTRA_POWER_USAGE_AMOUNT = "extra_power_usage_amount";
-    public static final String EXTRA_ANOMALY_LIST = "extra_anomaly_list";
 
     private static final String KEY_PREF_FOREGROUND = "app_usage_foreground";
     private static final String KEY_PREF_BACKGROUND = "app_usage_background";
@@ -93,8 +85,6 @@
     private static final int REQUEST_UNINSTALL = 0;
     private static final int REQUEST_REMOVE_DEVICE_ADMIN = 1;
 
-    private static final int ANOMALY_LOADER = 0;
-
     @VisibleForTesting
     LayoutPreference mHeaderPreference;
     @VisibleForTesting
@@ -108,18 +98,15 @@
     Preference mForegroundPreference;
     @VisibleForTesting
     Preference mBackgroundPreference;
-    @VisibleForTesting
-    AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
     private AppButtonsPreferenceController mAppButtonsPreferenceController;
     private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController;
 
-    private List<Anomaly> mAnomalies;
     private String mPackageName;
 
     @VisibleForTesting
     static void startBatteryDetailPage(Activity caller, BatteryUtils batteryUtils,
             InstrumentedPreferenceFragment fragment, BatteryStatsHelper helper, int which,
-            BatteryEntry entry, String usagePercent, List<Anomaly> anomalies) {
+            BatteryEntry entry, String usagePercent) {
         // Initialize mStats if necessary.
         helper.getStats();
 
@@ -150,7 +137,6 @@
         args.putLong(EXTRA_FOREGROUND_TIME, foregroundTimeMs);
         args.putString(EXTRA_POWER_USAGE_PERCENT, usagePercent);
         args.putInt(EXTRA_POWER_USAGE_AMOUNT, (int) sipper.totalPowerMah);
-        args.putParcelableList(EXTRA_ANOMALY_LIST, anomalies);
 
         new SubSettingLauncher(caller)
                 .setDestination(AdvancedPowerUsageDetail.class.getName())
@@ -171,9 +157,9 @@
 
     public static void startBatteryDetailPage(Activity caller,
             InstrumentedPreferenceFragment fragment, BatteryStatsHelper helper, int which,
-            BatteryEntry entry, String usagePercent, List<Anomaly> anomalies) {
+            BatteryEntry entry, String usagePercent) {
         startBatteryDetailPage(caller, BatteryUtils.getInstance(caller), fragment, helper, which,
-                entry, usagePercent, anomalies);
+                entry, usagePercent);
     }
 
     public static void startBatteryDetailPage(Activity caller,
@@ -209,15 +195,12 @@
         super.onCreate(icicle);
 
         mPackageName = getArguments().getString(EXTRA_PACKAGE_NAME);
-        mAnomalySummaryPreferenceController = new AnomalySummaryPreferenceController(
-                (SettingsActivity) getActivity(), this);
         mForegroundPreference = findPreference(KEY_PREF_FOREGROUND);
         mBackgroundPreference = findPreference(KEY_PREF_BACKGROUND);
         mHeaderPreference = (LayoutPreference) findPreference(KEY_PREF_HEADER);
 
         if (mPackageName != null) {
             mAppEntry = mState.getEntry(mPackageName, UserHandle.myUserId());
-            initAnomalyInfo();
         }
     }
 
@@ -230,16 +213,6 @@
     }
 
     @VisibleForTesting
-    void initAnomalyInfo() {
-        mAnomalies = getArguments().getParcelableArrayList(EXTRA_ANOMALY_LIST);
-        if (mAnomalies == null) {
-            getLoaderManager().initLoader(ANOMALY_LOADER, Bundle.EMPTY, this);
-        } else if (mAnomalies != null) {
-            mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(mAnomalies);
-        }
-    }
-
-    @VisibleForTesting
     void initHeader() {
         final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header);
         final Activity context = getActivity();
@@ -280,8 +253,6 @@
 
         final long foregroundTimeMs = bundle.getLong(EXTRA_FOREGROUND_TIME);
         final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME);
-        final String usagePercent = bundle.getString(EXTRA_POWER_USAGE_PERCENT);
-        final int powerMah = bundle.getInt(EXTRA_POWER_USAGE_AMOUNT);
         mForegroundPreference.setSummary(
                 TextUtils.expandTemplate(getText(R.string.battery_used_for),
                         StringUtil.formatElapsedTime(context, foregroundTimeMs, false)));
@@ -291,15 +262,6 @@
     }
 
     @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (TextUtils.equals(preference.getKey(), AnomalySummaryPreferenceController.ANOMALY_KEY)) {
-            mAnomalySummaryPreferenceController.onPreferenceTreeClick(preference);
-            return true;
-        }
-        return super.onPreferenceTreeClick(preference);
-    }
-
-    @Override
     public int getMetricsCategory() {
         return MetricsEvent.FUELGAUGE_POWER_USAGE_DETAIL;
     }
@@ -350,29 +312,6 @@
     }
 
     @Override
-    public void onAnomalyHandled(Anomaly anomaly) {
-        mAnomalySummaryPreferenceController.hideHighUsagePreference();
-    }
-
-    @Override
-    public Loader<List<Anomaly>> onCreateLoader(int id, Bundle args) {
-        return new AnomalyLoader(getContext(), mPackageName);
-    }
-
-    @Override
-    public void onLoadFinished(Loader<List<Anomaly>> loader, List<Anomaly> data) {
-        final AnomalyUtils anomalyUtils = AnomalyUtils.getInstance(getContext());
-        anomalyUtils.logAnomalies(mMetricsFeatureProvider, data,
-                MetricsEvent.FUELGAUGE_POWER_USAGE_DETAIL);
-        mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(data);
-    }
-
-    @Override
-    public void onLoaderReset(Loader<List<Anomaly>> loader) {
-
-    }
-
-    @Override
     public void onBatteryTipHandled(BatteryTip batteryTip) {
         mBackgroundActivityPreferenceController.updateSummary(
                 findPreference(mBackgroundActivityPreferenceController.getPreferenceKey()));
diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
index f14b1c9..7f0cb88 100644
--- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
@@ -41,7 +41,6 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -79,7 +78,6 @@
     private SettingsActivity mActivity;
     private InstrumentedPreferenceFragment mFragment;
     private Context mPrefContext;
-    SparseArray<List<Anomaly>> mAnomalySparseArray;
 
     private Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
@@ -162,30 +160,13 @@
         if (preference instanceof PowerGaugePreference) {
             PowerGaugePreference pgp = (PowerGaugePreference) preference;
             BatteryEntry entry = pgp.getInfo();
-            AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity,
-                    mFragment, mBatteryStatsHelper, STATS_TYPE, entry, pgp.getPercent(),
-                    mAnomalySparseArray != null ? mAnomalySparseArray.get(entry.sipper.getUid())
-                            : null);
+            AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils,
+                    mFragment, mBatteryStatsHelper, STATS_TYPE, entry, pgp.getPercent());
             return true;
         }
         return false;
     }
 
-    public void refreshAnomalyIcon(final SparseArray<List<Anomaly>> anomalySparseArray) {
-        if (!isAvailable()) {
-            return;
-        }
-        mAnomalySparseArray = anomalySparseArray;
-        for (int i = 0, size = anomalySparseArray.size(); i < size; i++) {
-            final String key = extractKeyFromUid(anomalySparseArray.keyAt(i));
-            final PowerGaugePreference pref = (PowerGaugePreference) mAppListGroup.findPreference(
-                    key);
-            if (pref != null) {
-                pref.shouldShowAnomalyIcon(true);
-            }
-        }
-    }
-
     public void refreshAppListGroup(BatteryStatsHelper statsHelper, boolean showAllApps) {
         if (!isAvailable()) {
             return;
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 83b0e1b..9e920c4 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -38,7 +38,6 @@
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.R;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
 import com.android.settings.fuelgauge.batterytip.StatsManagerConfig;
 import com.android.settings.overlay.FeatureFactory;
@@ -392,20 +391,6 @@
         }
     }
 
-    @StringRes
-    public int getSummaryResIdFromAnomalyType(@Anomaly.AnomalyType int type) {
-        switch (type) {
-            case Anomaly.AnomalyType.WAKE_LOCK:
-                return R.string.battery_abnormal_wakelock_summary;
-            case Anomaly.AnomalyType.WAKEUP_ALARM:
-                return R.string.battery_abnormal_wakeup_alarm_summary;
-            case Anomaly.AnomalyType.BLUETOOTH_SCAN:
-                return R.string.battery_abnormal_location_summary;
-            default:
-                throw new IllegalArgumentException("Incorrect anomaly type: " + type);
-        }
-    }
-
     public void setForceAppStandby(int uid, String packageName,
             int mode) {
         final boolean isPreOApp = isPreOApp(packageName);
@@ -422,6 +407,16 @@
                 packageName) == AppOpsManager.MODE_IGNORED;
     }
 
+    public boolean clearForceAppStandby(String packageName) {
+        final int uid = getPackageUid(packageName);
+        if (uid != UID_NULL && isForceAppStandbyEnabled(uid, packageName)) {
+            setForceAppStandby(uid, packageName, AppOpsManager.MODE_ALLOWED);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
             UserManager userManager) {
         statsHelper.create(bundle);
diff --git a/src/com/android/settings/fuelgauge/HighPowerDetail.java b/src/com/android/settings/fuelgauge/HighPowerDetail.java
index 84120d7..f5df452 100644
--- a/src/com/android/settings/fuelgauge/HighPowerDetail.java
+++ b/src/com/android/settings/fuelgauge/HighPowerDetail.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.fuelgauge;
 
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.app.Dialog;
 import android.content.Context;
@@ -38,6 +37,7 @@
 import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 public class HighPowerDetail extends InstrumentedDialogFragment implements OnClickListener,
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java b/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
deleted file mode 100644
index 68412c7..0000000
--- a/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.util.IconDrawableFactory;
-
-import androidx.annotation.VisibleForTesting;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.Utils;
-import com.android.settings.core.InstrumentedPreferenceFragment;
-import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
-import com.android.settings.fuelgauge.anomaly.AnomalyPreference;
-import com.android.settingslib.core.AbstractPreferenceController;
-
-import java.util.List;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
-
-/**
- * Fragment to show a list of anomaly apps, where user could handle these anomalies
- */
-public class PowerUsageAnomalyDetails extends DashboardFragment implements
-        AnomalyDialogFragment.AnomalyDialogListener {
-
-    public static final String TAG = "PowerAbnormalUsageDetail";
-    @VisibleForTesting
-    static final String EXTRA_ANOMALY_LIST = "anomaly_list";
-    private static final int REQUEST_ANOMALY_ACTION = 0;
-    private static final String KEY_PREF_ANOMALY_LIST = "app_abnormal_list";
-
-    @VisibleForTesting
-    List<Anomaly> mAnomalies;
-    @VisibleForTesting
-    PreferenceGroup mAbnormalListGroup;
-    @VisibleForTesting
-    PackageManager mPackageManager;
-    @VisibleForTesting
-    BatteryUtils mBatteryUtils;
-    @VisibleForTesting
-    IconDrawableFactory mIconDrawableFactory;
-
-    public static void startBatteryAbnormalPage(SettingsActivity caller,
-            InstrumentedPreferenceFragment fragment, List<Anomaly> anomalies) {
-        Bundle args = new Bundle();
-        args.putParcelableList(EXTRA_ANOMALY_LIST, anomalies);
-
-        new SubSettingLauncher(caller)
-                .setDestination(PowerUsageAnomalyDetails.class.getName())
-                .setTitleRes(R.string.battery_abnormal_details_title)
-                .setArguments(args)
-                .setSourceMetricsCategory(fragment.getMetricsCategory())
-                .launch();
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        final Context context = getContext();
-
-        mAnomalies = getArguments().getParcelableArrayList(EXTRA_ANOMALY_LIST);
-        mAbnormalListGroup = (PreferenceGroup) findPreference(KEY_PREF_ANOMALY_LIST);
-        mPackageManager = context.getPackageManager();
-        mIconDrawableFactory = IconDrawableFactory.newInstance(context);
-        mBatteryUtils = BatteryUtils.getInstance(context);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        refreshUi();
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (preference instanceof AnomalyPreference) {
-            AnomalyPreference anomalyPreference = (AnomalyPreference) preference;
-            final Anomaly anomaly = anomalyPreference.getAnomaly();
-
-            AnomalyDialogFragment dialogFragment = AnomalyDialogFragment.newInstance(anomaly,
-                    MetricsProto.MetricsEvent.FUELGAUGE_ANOMALY_DETAIL);
-            dialogFragment.setTargetFragment(this, REQUEST_ANOMALY_ACTION);
-            dialogFragment.show(getFragmentManager(), TAG);
-
-            return true;
-        }
-
-        return super.onPreferenceTreeClick(preference);
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.power_abnormal_detail;
-    }
-
-    @Override
-    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        return null;
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsProto.MetricsEvent.FUELGAUGE_ANOMALY_DETAIL;
-    }
-
-    void refreshUi() {
-        mAbnormalListGroup.removeAll();
-        for (int i = 0, size = mAnomalies.size(); i < size; i++) {
-            final Anomaly anomaly = mAnomalies.get(i);
-            Preference pref = new AnomalyPreference(getPrefContext(), anomaly);
-            pref.setSummary(mBatteryUtils.getSummaryResIdFromAnomalyType(anomaly.type));
-            Drawable icon = getBadgedIcon(anomaly.packageName, UserHandle.getUserId(anomaly.uid));
-            if (icon != null) {
-                pref.setIcon(icon);
-            }
-
-            mAbnormalListGroup.addPreference(pref);
-        }
-    }
-
-    @Override
-    public void onAnomalyHandled(Anomaly anomaly) {
-        mAnomalies.remove(anomaly);
-        refreshUi();
-    }
-
-    @VisibleForTesting
-    Drawable getBadgedIcon(String packageName, int userId) {
-        return Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager, packageName, userId);
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 3d13d04..843aeec 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -41,8 +41,6 @@
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.display.BatteryPercentagePreferenceController;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
 import com.android.settings.fuelgauge.batterytip.BatteryTipLoader;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
@@ -104,11 +102,6 @@
     @VisibleForTesting
     BatteryInfo mBatteryInfo;
 
-    /**
-     * SparseArray that maps uid to {@link Anomaly}, so we could find {@link Anomaly} by uid
-     */
-    @VisibleForTesting
-    SparseArray<List<Anomaly>> mAnomalySparseArray;
     @VisibleForTesting
     BatteryHeaderPreferenceController mBatteryHeaderPreferenceController;
     @VisibleForTesting
@@ -217,7 +210,6 @@
                 KEY_TIME_SINCE_LAST_FULL_CHARGE);
         mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.battery_footer_summary);
         mBatteryUtils = BatteryUtils.getInstance(getContext());
-        mAnomalySparseArray = new SparseArray<>();
 
         restartBatteryInfoLoader();
         mBatteryTipPreferenceController.restoreInstanceState(icicle);
@@ -328,11 +320,6 @@
     }
 
     @VisibleForTesting
-    AnomalyDetectionPolicy getAnomalyDetectionPolicy() {
-        return new AnomalyDetectionPolicy(getContext());
-    }
-
-    @VisibleForTesting
     void updateLastFullChargePreference() {
         if (mBatteryInfo != null && mBatteryInfo.averageTimeToDischarge
                 != Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN) {
@@ -369,17 +356,6 @@
     }
 
     @VisibleForTesting
-    void updateAnomalySparseArray(List<Anomaly> anomalies) {
-        mAnomalySparseArray.clear();
-        for (final Anomaly anomaly : anomalies) {
-            if (mAnomalySparseArray.get(anomaly.uid) == null) {
-                mAnomalySparseArray.append(anomaly.uid, new ArrayList<>());
-            }
-            mAnomalySparseArray.get(anomaly.uid).add(anomaly);
-        }
-    }
-
-    @VisibleForTesting
     void restartBatteryInfoLoader() {
         getLoaderManager().restartLoader(BATTERY_INFO_LOADER, Bundle.EMPTY,
                 mBatteryInfoLoaderCallbacks);
diff --git a/src/com/android/settings/fuelgauge/anomaly/Anomaly.java b/src/com/android/settings/fuelgauge/anomaly/Anomaly.java
deleted file mode 100644
index 5ff21cb..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/Anomaly.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-import androidx.annotation.IntDef;
-
-/**
- * Data that represents an app has been detected as anomaly. It contains
- *
- * 1. Basic information of the app(i.e. uid, package name)
- * 2. Type of anomaly
- * 3. Data that has been detected as anomaly(i.e wakelock time)
- */
-public class Anomaly implements Parcelable {
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({AnomalyType.WAKE_LOCK,
-            AnomalyType.WAKEUP_ALARM,
-            AnomalyType.BLUETOOTH_SCAN})
-    public @interface AnomalyType {
-        int WAKE_LOCK = 0;
-        int WAKEUP_ALARM = 1;
-        int BLUETOOTH_SCAN = 2;
-    }
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({AnomalyActionType.FORCE_STOP,
-            AnomalyActionType.BACKGROUND_CHECK,
-            AnomalyActionType.LOCATION_CHECK,
-            AnomalyActionType.STOP_AND_BACKGROUND_CHECK})
-    public @interface AnomalyActionType {
-        int FORCE_STOP = 0;
-        int BACKGROUND_CHECK = 1;
-        int LOCATION_CHECK = 2;
-        int STOP_AND_BACKGROUND_CHECK = 3;
-    }
-
-    @AnomalyType
-    public static final int[] ANOMALY_TYPE_LIST = {
-            AnomalyType.WAKE_LOCK,
-            AnomalyType.WAKEUP_ALARM,
-            AnomalyType.BLUETOOTH_SCAN};
-
-    /**
-     * Type of this this anomaly
-     */
-    public final int type;
-    public final int uid;
-    public final int targetSdkVersion;
-    public final long wakelockTimeMs;
-    public final long bluetoothScanningTimeMs;
-    public final int wakeupAlarmCount;
-    /**
-     * {@code true} if background restriction is enabled
-     *
-     * @see android.app.AppOpsManager.OP_RUN_IN_BACKGROUND
-     */
-    public final boolean backgroundRestrictionEnabled;
-    /**
-     * Display name of this anomaly, usually it is the app name
-     */
-    public final CharSequence displayName;
-    public final String packageName;
-
-    private Anomaly(Builder builder) {
-        type = builder.mType;
-        uid = builder.mUid;
-        displayName = builder.mDisplayName;
-        packageName = builder.mPackageName;
-        wakelockTimeMs = builder.mWakeLockTimeMs;
-        targetSdkVersion = builder.mTargetSdkVersion;
-        backgroundRestrictionEnabled = builder.mBgRestrictionEnabled;
-        bluetoothScanningTimeMs = builder.mBluetoothScanningTimeMs;
-        wakeupAlarmCount = builder.mWakeupAlarmCount;
-    }
-
-    private Anomaly(Parcel in) {
-        type = in.readInt();
-        uid = in.readInt();
-        displayName = in.readCharSequence();
-        packageName = in.readString();
-        wakelockTimeMs = in.readLong();
-        targetSdkVersion = in.readInt();
-        backgroundRestrictionEnabled = in.readBoolean();
-        wakeupAlarmCount = in.readInt();
-        bluetoothScanningTimeMs = in.readLong();
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(type);
-        dest.writeInt(uid);
-        dest.writeCharSequence(displayName);
-        dest.writeString(packageName);
-        dest.writeLong(wakelockTimeMs);
-        dest.writeInt(targetSdkVersion);
-        dest.writeBoolean(backgroundRestrictionEnabled);
-        dest.writeInt(wakeupAlarmCount);
-        dest.writeLong(bluetoothScanningTimeMs);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof Anomaly)) {
-            return false;
-        }
-
-        Anomaly other = (Anomaly) obj;
-        return type == other.type
-                && uid == other.uid
-                && wakelockTimeMs == other.wakelockTimeMs
-                && TextUtils.equals(displayName, other.displayName)
-                && TextUtils.equals(packageName, other.packageName)
-                && targetSdkVersion == other.targetSdkVersion
-                && backgroundRestrictionEnabled == other.backgroundRestrictionEnabled
-                && wakeupAlarmCount == other.wakeupAlarmCount
-                && bluetoothScanningTimeMs == other.bluetoothScanningTimeMs;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(type, uid, displayName, packageName, wakelockTimeMs, targetSdkVersion,
-                backgroundRestrictionEnabled, wakeupAlarmCount, bluetoothScanningTimeMs);
-    }
-
-    @Override
-    public String toString() {
-        return "type=" + toAnomalyTypeText(type) + " uid=" + uid + " package=" + packageName +
-                " displayName=" + displayName + " wakelockTimeMs=" + wakelockTimeMs +
-                " wakeupAlarmCount=" + wakeupAlarmCount + " bluetoothTimeMs="
-                + bluetoothScanningTimeMs;
-    }
-
-    private String toAnomalyTypeText(@AnomalyType int type) {
-        switch (type) {
-            case AnomalyType.WAKEUP_ALARM:
-                return "wakeupAlarm";
-            case AnomalyType.WAKE_LOCK:
-                return "wakelock";
-            case AnomalyType.BLUETOOTH_SCAN:
-                return "unoptimizedBluetoothScan";
-        }
-
-        return "";
-    }
-
-    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
-        public Anomaly createFromParcel(Parcel in) {
-            return new Anomaly(in);
-        }
-
-        public Anomaly[] newArray(int size) {
-            return new Anomaly[size];
-        }
-    };
-
-    public static final class Builder {
-        @AnomalyType
-        private int mType;
-        private int mUid;
-        private int mTargetSdkVersion;
-        private CharSequence mDisplayName;
-        private String mPackageName;
-        private long mWakeLockTimeMs;
-        private boolean mBgRestrictionEnabled;
-        private int mWakeupAlarmCount;
-        private long mBluetoothScanningTimeMs;
-
-        public Builder setType(@AnomalyType int type) {
-            mType = type;
-            return this;
-        }
-
-        public Builder setUid(int uid) {
-            mUid = uid;
-            return this;
-        }
-
-        public Builder setDisplayName(CharSequence displayName) {
-            mDisplayName = displayName;
-            return this;
-        }
-
-        public Builder setPackageName(String packageName) {
-            mPackageName = packageName;
-            return this;
-        }
-
-        public Builder setWakeLockTimeMs(long wakeLockTimeMs) {
-            mWakeLockTimeMs = wakeLockTimeMs;
-            return this;
-        }
-
-        public Builder setTargetSdkVersion(int targetSdkVersion) {
-            mTargetSdkVersion = targetSdkVersion;
-            return this;
-        }
-
-        public Builder setBackgroundRestrictionEnabled(boolean bgRestrictionEnabled) {
-            mBgRestrictionEnabled = bgRestrictionEnabled;
-            return this;
-        }
-
-        public Builder setWakeupAlarmCount(int wakeupAlarmCount) {
-            mWakeupAlarmCount = wakeupAlarmCount;
-            return this;
-        }
-
-        public Builder setBluetoothScanningTimeMs(long bluetoothScanningTimeMs) {
-            mBluetoothScanningTimeMs = bluetoothScanningTimeMs;
-            return this;
-        }
-
-        public Anomaly build() {
-            return new Anomaly(this);
-        }
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicy.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicy.java
deleted file mode 100644
index 712fe93..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicy.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import android.content.Context;
-import android.net.Uri;
-import android.provider.Settings;
-import android.text.format.DateUtils;
-import android.util.KeyValueListParser;
-import android.util.Log;
-
-import java.util.Arrays;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Class to store the policy for anomaly detection, which comes from
- * {@link android.provider.Settings.Global}
- */
-public class AnomalyDetectionPolicy {
-    public static final String TAG = "AnomalyDetectionPolicy";
-
-    @VisibleForTesting
-    static final String KEY_ANOMALY_DETECTION_ENABLED = "anomaly_detection_enabled";
-    @VisibleForTesting
-    static final String KEY_WAKELOCK_DETECTION_ENABLED = "wakelock_enabled";
-    @VisibleForTesting
-    static final String KEY_WAKEUP_ALARM_DETECTION_ENABLED = "wakeup_alarm_enabled";
-    @VisibleForTesting
-    static final String KEY_BLUETOOTH_SCAN_DETECTION_ENABLED = "bluetooth_scan_enabled";
-    @VisibleForTesting
-    static final String KEY_WAKELOCK_THRESHOLD = "wakelock_threshold";
-    @VisibleForTesting
-    static final String KEY_WAKEUP_ALARM_THRESHOLD = "wakeup_alarm_threshold";
-    @VisibleForTesting
-    static final String KEY_WAKEUP_BLACKLISTED_TAGS = "wakeup_blacklisted_tags";
-    @VisibleForTesting
-    static final String KEY_BLUETOOTH_SCAN_THRESHOLD = "bluetooth_scan_threshold";
-
-    /**
-     * {@code true} if general anomaly detection is enabled
-     *
-     * @see Settings.Global#ANOMALY_DETECTION_CONSTANTS
-     * @see #KEY_ANOMALY_DETECTION_ENABLED
-     */
-    final boolean anomalyDetectionEnabled;
-
-    /**
-     * {@code true} if wakelock anomaly detection is enabled
-     *
-     * @see Settings.Global#ANOMALY_DETECTION_CONSTANTS
-     * @see #KEY_WAKELOCK_DETECTION_ENABLED
-     */
-    final boolean wakeLockDetectionEnabled;
-
-    /**
-     * {@code true} if wakeup alarm detection is enabled
-     *
-     * @see Settings.Global#ANOMALY_DETECTION_CONSTANTS
-     * @see #KEY_WAKEUP_ALARM_DETECTION_ENABLED
-     */
-    final boolean wakeupAlarmDetectionEnabled;
-
-    /**
-     * {@code true} if bluetooth scanning detection is enabled
-     *
-     * @see Settings.Global#ANOMALY_DETECTION_CONSTANTS
-     * @see #KEY_BLUETOOTH_SCAN_THRESHOLD
-     */
-    final boolean bluetoothScanDetectionEnabled;
-
-    /**
-     * Threshold for wakelock time in milli seconds
-     *
-     * @see Settings.Global#ANOMALY_DETECTION_CONSTANTS
-     * @see #KEY_WAKELOCK_THRESHOLD
-     */
-    public final long wakeLockThreshold;
-
-    /**
-     * Threshold for wakeup alarm count per hour
-     *
-     * @see Settings.Global#ANOMALY_DETECTION_CONSTANTS
-     * @see #KEY_WAKEUP_ALARM_THRESHOLD
-     */
-    public final long wakeupAlarmThreshold;
-
-    /**
-     * Array of blacklisted wakeups, by tag.
-     *
-     * @see Settings.Global#ANOMALY_DETECTION_CONSTANTS
-     * @see #KEY_WAKEUP_BLACKLISTED_TAGS
-     */
-    public final Set<String> wakeupBlacklistedTags;
-
-    /**
-     * Threshold for bluetooth unoptimized scanning time in milli seconds
-     *
-     * @see Settings.Global#ANOMALY_DETECTION_CONSTANTS
-     * @see #KEY_BLUETOOTH_SCAN_THRESHOLD
-     */
-    public final long bluetoothScanThreshold;
-
-    private final KeyValueListParser mParser;
-
-    public AnomalyDetectionPolicy(Context context) {
-        mParser = new KeyValueListParser(',');
-        final String value = Settings.Global.getString(context.getContentResolver(),
-                Settings.Global.ANOMALY_DETECTION_CONSTANTS);
-
-        try {
-            mParser.setString(value);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Bad anomaly detection constants");
-        }
-
-        anomalyDetectionEnabled =
-                mParser.getBoolean(KEY_ANOMALY_DETECTION_ENABLED, false);
-        wakeLockDetectionEnabled =
-                mParser.getBoolean(KEY_WAKELOCK_DETECTION_ENABLED,false);
-        wakeupAlarmDetectionEnabled =
-                mParser.getBoolean(KEY_WAKEUP_ALARM_DETECTION_ENABLED,false);
-        bluetoothScanDetectionEnabled = mParser.getBoolean(
-                KEY_BLUETOOTH_SCAN_DETECTION_ENABLED, false);
-        wakeLockThreshold = mParser.getLong(KEY_WAKELOCK_THRESHOLD,
-                DateUtils.HOUR_IN_MILLIS);
-        wakeupAlarmThreshold = mParser.getLong(KEY_WAKEUP_ALARM_THRESHOLD, 10);
-        wakeupBlacklistedTags = parseStringSet(KEY_WAKEUP_BLACKLISTED_TAGS, null);
-        bluetoothScanThreshold = mParser.getLong(KEY_BLUETOOTH_SCAN_THRESHOLD,
-                30 * DateUtils.MINUTE_IN_MILLIS);
-    }
-
-    public boolean isAnomalyDetectionEnabled() {
-        return anomalyDetectionEnabled;
-    }
-
-    public boolean isAnomalyDetectorEnabled(@Anomaly.AnomalyType int type) {
-        switch (type) {
-            case Anomaly.AnomalyType.WAKE_LOCK:
-                return wakeLockDetectionEnabled;
-            case Anomaly.AnomalyType.WAKEUP_ALARM:
-                return wakeupAlarmDetectionEnabled;
-            case Anomaly.AnomalyType.BLUETOOTH_SCAN:
-                return bluetoothScanDetectionEnabled;
-            default:
-                return false; // Disabled when no this type
-        }
-    }
-
-    private Set<String> parseStringSet(final String key, final Set<String> defaultSet) {
-        final String value = mParser.getString(key, null);
-        if (value != null) {
-            return Arrays.stream(value.split(":"))
-                    .map(String::trim).map(Uri::decode).collect(Collectors.toSet());
-        } else {
-            return defaultSet;
-        }
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java
deleted file mode 100644
index d1d14b5..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Dialog Fragment to show action dialog for each anomaly
- */
-public class AnomalyDialogFragment extends InstrumentedDialogFragment implements
-        DialogInterface.OnClickListener {
-
-    private static final String ARG_ANOMALY = "anomaly";
-    private static final String ARG_METRICS_KEY = "metrics_key";
-
-    @VisibleForTesting
-    Anomaly mAnomaly;
-    @VisibleForTesting
-    AnomalyUtils mAnomalyUtils;
-
-    /**
-     * Listener to give the control back to target fragment
-     */
-    public interface AnomalyDialogListener {
-        /**
-         * This method is invoked once anomaly is handled, then target fragment could do
-         * extra work. One example is that fragment could remove the anomaly preference
-         * since it has been handled
-         *
-         * @param anomaly that has been handled
-         */
-        void onAnomalyHandled(Anomaly anomaly);
-    }
-
-    public static AnomalyDialogFragment newInstance(Anomaly anomaly, int metricsKey) {
-        AnomalyDialogFragment dialogFragment = new AnomalyDialogFragment();
-
-        Bundle args = new Bundle(2);
-        args.putParcelable(ARG_ANOMALY, anomaly);
-        args.putInt(ARG_METRICS_KEY, metricsKey);
-        dialogFragment.setArguments(args);
-
-        return dialogFragment;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        initAnomalyUtils();
-    }
-
-    @VisibleForTesting
-    void initAnomalyUtils() {
-        mAnomalyUtils = AnomalyUtils.getInstance(getContext());
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsProto.MetricsEvent.DIALOG_HANDLE_ANOMALY;
-    }
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        final AnomalyDialogListener lsn = (AnomalyDialogListener) getTargetFragment();
-        if (lsn == null) {
-            return;
-        }
-
-        final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly);
-        final int metricsKey = getArguments().getInt(ARG_METRICS_KEY);
-
-        anomalyAction.handlePositiveAction(mAnomaly, metricsKey);
-        lsn.onAnomalyHandled(mAnomaly);
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        final Bundle bundle = getArguments();
-        final Context context = getContext();
-        final AnomalyUtils anomalyUtils = AnomalyUtils.getInstance(context);
-
-        mAnomaly = bundle.getParcelable(ARG_ANOMALY);
-        anomalyUtils.logAnomaly(mMetricsFeatureProvider, mAnomaly,
-                MetricsProto.MetricsEvent.DIALOG_HANDLE_ANOMALY);
-
-        final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly);
-        switch (anomalyAction.getActionType()) {
-            case Anomaly.AnomalyActionType.FORCE_STOP:
-                return new AlertDialog.Builder(context)
-                        .setTitle(R.string.dialog_stop_title)
-                        .setMessage(getString(mAnomaly.type == Anomaly.AnomalyType.WAKE_LOCK
-                                ? R.string.dialog_stop_message
-                                : R.string.dialog_stop_message_wakeup_alarm, mAnomaly.displayName))
-                        .setPositiveButton(R.string.dialog_stop_ok, this)
-                        .setNegativeButton(R.string.dlg_cancel, null)
-                        .create();
-            case Anomaly.AnomalyActionType.STOP_AND_BACKGROUND_CHECK:
-                return new AlertDialog.Builder(context)
-                        .setTitle(R.string.dialog_background_check_title)
-                        .setMessage(getString(R.string.dialog_background_check_message,
-                                mAnomaly.displayName))
-                        .setPositiveButton(R.string.dialog_background_check_ok, this)
-                        .setNegativeButton(R.string.dlg_cancel, null)
-                        .create();
-            case Anomaly.AnomalyActionType.LOCATION_CHECK:
-                return new AlertDialog.Builder(context)
-                        .setTitle(R.string.dialog_location_title)
-                        .setMessage(getString(R.string.dialog_location_message,
-                                mAnomaly.displayName))
-                        .setPositiveButton(R.string.dialog_location_ok, this)
-                        .setNegativeButton(R.string.dlg_cancel, null)
-                        .create();
-            default:
-                throw new IllegalArgumentException("unknown type " + mAnomaly.type);
-        }
-    }
-
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyLoader.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyLoader.java
deleted file mode 100644
index c7d6ba4..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyLoader.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.BatteryStats;
-import android.os.Bundle;
-import android.os.UserManager;
-import android.util.Log;
-
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settingslib.utils.AsyncLoaderCompat;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Loader to compute which apps are anomaly and return a anomaly list. It will return
- * an empty list if there is no anomaly.
- */
-public class AnomalyLoader extends AsyncLoaderCompat<List<Anomaly>> {
-    private static final String TAG = "AnomalyLoader";
-
-    private static final boolean USE_FAKE_DATA = false;
-    private BatteryStatsHelper mBatteryStatsHelper;
-    private String mPackageName;
-    private UserManager mUserManager;
-    @VisibleForTesting
-    AnomalyUtils mAnomalyUtils;
-    @VisibleForTesting
-    AnomalyDetectionPolicy mPolicy;
-
-    /**
-     * Create {@link AnomalyLoader} that runs anomaly check for all apps.
-     */
-    public AnomalyLoader(Context context, BatteryStatsHelper batteryStatsHelper) {
-        this(context, batteryStatsHelper, null, new AnomalyDetectionPolicy(context));
-
-    }
-
-    /**
-     * Create {@link AnomalyLoader} with {@code packageName}, so this loader will only
-     * detect anomalies related to {@code packageName}, or check all apps if {@code packageName}
-     * is {@code null}.
-     *
-     * This constructor will create {@link BatteryStatsHelper} in background thread.
-     *
-     * @param packageName if set, only finds anomalies for this package. If {@code null},
-     *                    detects all anomalies of this type.
-     */
-    public AnomalyLoader(Context context, String packageName) {
-        this(context, null, packageName, new AnomalyDetectionPolicy(context));
-    }
-
-    @VisibleForTesting
-    AnomalyLoader(Context context, BatteryStatsHelper batteryStatsHelper,
-            String packageName, AnomalyDetectionPolicy policy) {
-        super(context);
-        mBatteryStatsHelper = batteryStatsHelper;
-        mPackageName = packageName;
-        mAnomalyUtils = AnomalyUtils.getInstance(context);
-        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        mPolicy = policy;
-    }
-
-    @Override
-    protected void onDiscardResult(List<Anomaly> result) {
-    }
-
-    @Override
-    public List<Anomaly> loadInBackground() {
-        if (USE_FAKE_DATA) {
-            return generateFakeData();
-        }
-        if (mBatteryStatsHelper == null) {
-            mBatteryStatsHelper = new BatteryStatsHelper(getContext());
-            mBatteryStatsHelper.create((Bundle) null);
-            mBatteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED,
-                    mUserManager.getUserProfiles());
-        }
-
-        return mAnomalyUtils.detectAnomalies(mBatteryStatsHelper, mPolicy, mPackageName);
-    }
-
-    @VisibleForTesting
-    List<Anomaly> generateFakeData() {
-        final List<Anomaly> anomalies = new ArrayList<>();
-        final Context context = getContext();
-        final String packageName = "com.android.settings";
-        final CharSequence displayName = "Settings";
-        try {
-            final int uid = context.getPackageManager().getPackageUid(packageName, 0);
-
-            anomalies.add(new Anomaly.Builder()
-                    .setUid(uid)
-                    .setType(Anomaly.AnomalyType.WAKE_LOCK)
-                    .setPackageName(packageName)
-                    .setDisplayName(displayName)
-                    .build());
-            anomalies.add(new Anomaly.Builder()
-                    .setUid(uid)
-                    .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                    .setPackageName(packageName)
-                    .setDisplayName(displayName)
-                    .build());
-            anomalies.add(new Anomaly.Builder()
-                    .setUid(uid)
-                    .setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
-                    .setPackageName(packageName)
-                    .setDisplayName(displayName)
-                    .build());
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Cannot find package by name: " + packageName, e);
-        }
-        return anomalies;
-    }
-
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyPreference.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyPreference.java
deleted file mode 100644
index ba06147..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyPreference.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.android.settings.fuelgauge.anomaly;
-
-import android.content.Context;
-
-import androidx.preference.Preference;
-
-/**
- * Preference that stores {@link Anomaly}
- */
-public class AnomalyPreference extends Preference {
-    private Anomaly mAnomaly;
-
-    public AnomalyPreference(Context context, Anomaly anomaly) {
-        super(context);
-        mAnomaly = anomaly;
-
-        if (anomaly != null) {
-            setTitle(anomaly.displayName);
-        }
-    }
-
-    public Anomaly getAnomaly() {
-        return mAnomaly;
-    }
-
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java b/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java
deleted file mode 100644
index 70c83bc..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import android.content.Context;
-
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.core.InstrumentedPreferenceFragment;
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.PowerUsageAnomalyDetails;
-
-import java.util.List;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-
-/**
- * Manager that responsible for updating high usage preference and handling preference click.
- */
-public class AnomalySummaryPreferenceController {
-    private static final String TAG = "HighUsagePreferenceController";
-
-    public static final String ANOMALY_KEY = "high_usage";
-
-    private static final int REQUEST_ANOMALY_ACTION = 0;
-    private InstrumentedPreferenceFragment mFragment;
-    @VisibleForTesting
-    Preference mAnomalyPreference;
-    @VisibleForTesting
-    List<Anomaly> mAnomalies;
-    @VisibleForTesting
-    BatteryUtils mBatteryUtils;
-    private SettingsActivity mSettingsActivity;
-
-    /**
-     * Metrics key about fragment that create this controller
-     *
-     * @see com.android.internal.logging.nano.MetricsProto.MetricsEvent
-     */
-    private int mMetricsKey;
-
-    public AnomalySummaryPreferenceController(SettingsActivity activity,
-            InstrumentedPreferenceFragment fragment) {
-        mFragment = fragment;
-        mSettingsActivity = activity;
-        mAnomalyPreference = mFragment.getPreferenceScreen().findPreference(ANOMALY_KEY);
-        mMetricsKey = fragment.getMetricsCategory();
-        mBatteryUtils = BatteryUtils.getInstance(activity.getApplicationContext());
-        hideHighUsagePreference();
-    }
-
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (mAnomalies != null && ANOMALY_KEY.equals(preference.getKey())) {
-            if (mAnomalies.size() == 1) {
-                final Anomaly anomaly = mAnomalies.get(0);
-                AnomalyDialogFragment dialogFragment = AnomalyDialogFragment.newInstance(anomaly,
-                        mMetricsKey);
-                dialogFragment.setTargetFragment(mFragment, REQUEST_ANOMALY_ACTION);
-                dialogFragment.show(mFragment.getFragmentManager(), TAG);
-            } else {
-                PowerUsageAnomalyDetails.startBatteryAbnormalPage(mSettingsActivity, mFragment,
-                        mAnomalies);
-            }
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Update anomaly preference based on {@code anomalies}, also store a reference
-     * of {@paramref anomalies}, which would be used in {@link #onPreferenceTreeClick(Preference)}
-     *
-     * @param anomalies used to update the summary, this method will store a reference of it
-     */
-    public void updateAnomalySummaryPreference(List<Anomaly> anomalies) {
-        final Context context = mFragment.getContext();
-        mAnomalies = anomalies;
-
-        if (!mAnomalies.isEmpty()) {
-            mAnomalyPreference.setVisible(true);
-            final int count = mAnomalies.size();
-            final String title = context.getResources().getQuantityString(
-                    R.plurals.power_high_usage_title, count, mAnomalies.get(0).displayName);
-            final String summary = count > 1 ?
-                    context.getString(R.string.battery_abnormal_apps_summary, count)
-                    : context.getString(
-                            mBatteryUtils.getSummaryResIdFromAnomalyType(mAnomalies.get(0).type));
-
-            mAnomalyPreference.setTitle(title);
-            mAnomalyPreference.setSummary(summary);
-        } else {
-            mAnomalyPreference.setVisible(false);
-        }
-    }
-
-    public void hideHighUsagePreference() {
-        mAnomalyPreference.setVisible(false);
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
deleted file mode 100644
index dc4bee0..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import android.content.Context;
-import android.os.Build;
-import android.util.Pair;
-import android.util.SparseIntArray;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
-import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
-import com.android.settings.fuelgauge.anomaly.action.LocationCheckAction;
-import com.android.settings.fuelgauge.anomaly.action.StopAndBackgroundCheckAction;
-import com.android.settings.fuelgauge.anomaly.checker.AnomalyDetector;
-import com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector;
-import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
-import com.android.settings.fuelgauge.anomaly.checker.WakeupAlarmAnomalyDetector;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Utility class for anomaly detection
- */
-public class AnomalyUtils {
-    private Context mContext;
-    private static AnomalyUtils sInstance;
-
-    private static final SparseIntArray mMetricArray;
-    static {
-        mMetricArray = new SparseIntArray();
-        mMetricArray.append(Anomaly.AnomalyType.WAKE_LOCK,
-                MetricsProto.MetricsEvent.ANOMALY_TYPE_WAKELOCK);
-        mMetricArray.append(Anomaly.AnomalyType.WAKEUP_ALARM,
-                MetricsProto.MetricsEvent.ANOMALY_TYPE_WAKEUP_ALARM);
-        mMetricArray.append(Anomaly.AnomalyType.BLUETOOTH_SCAN,
-                MetricsProto.MetricsEvent.ANOMALY_TYPE_UNOPTIMIZED_BT);
-    }
-
-    @VisibleForTesting
-    AnomalyUtils(Context context) {
-        mContext = context.getApplicationContext();
-    }
-
-    public static AnomalyUtils getInstance(Context context) {
-        if (sInstance == null) {
-            sInstance = new AnomalyUtils(context);
-        }
-        return sInstance;
-    }
-
-    /**
-     * Return the corresponding {@link AnomalyAction} according to
-     * {@link com.android.settings.fuelgauge.anomaly.Anomaly}
-     *
-     * @return corresponding {@link AnomalyAction}, or null if cannot find it.
-     */
-    public AnomalyAction getAnomalyAction(Anomaly anomaly) {
-        switch (anomaly.type) {
-            case Anomaly.AnomalyType.WAKE_LOCK:
-                return new ForceStopAction(mContext);
-            case Anomaly.AnomalyType.WAKEUP_ALARM:
-                if (anomaly.targetSdkVersion >= Build.VERSION_CODES.O
-                        || (anomaly.targetSdkVersion < Build.VERSION_CODES.O
-                                && anomaly.backgroundRestrictionEnabled)) {
-                    return new ForceStopAction(mContext);
-                } else {
-                    return new StopAndBackgroundCheckAction(mContext);
-                }
-            case Anomaly.AnomalyType.BLUETOOTH_SCAN:
-                return new LocationCheckAction(mContext);
-            default:
-                return null;
-        }
-    }
-
-    /**
-     * Return the corresponding {@link AnomalyDetector} according to
-     * {@link com.android.settings.fuelgauge.anomaly.Anomaly.AnomalyType}
-     *
-     * @return corresponding {@link AnomalyDetector}, or null if cannot find it.
-     */
-    public AnomalyDetector getAnomalyDetector(@Anomaly.AnomalyType int anomalyType) {
-        switch (anomalyType) {
-            case Anomaly.AnomalyType.WAKE_LOCK:
-                return new WakeLockAnomalyDetector(mContext);
-            case Anomaly.AnomalyType.WAKEUP_ALARM:
-                return new WakeupAlarmAnomalyDetector(mContext);
-            case Anomaly.AnomalyType.BLUETOOTH_SCAN:
-                return new BluetoothScanAnomalyDetector(mContext);
-            default:
-                return null;
-        }
-    }
-
-    /**
-     * Detect whether application with {@code targetPackageName} has anomaly. When
-     * {@code targetPackageName} is null, start detection among all the applications.
-     *
-     * @param batteryStatsHelper contains battery stats, used to detect anomaly
-     * @param policy             contains configuration about anomaly check
-     * @param targetPackageName  represents the app need to be detected
-     * @return the list of anomalies
-     */
-    public List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper,
-            AnomalyDetectionPolicy policy, String targetPackageName) {
-        final List<Anomaly> anomalies = new ArrayList<>();
-        for (@Anomaly.AnomalyType int type : Anomaly.ANOMALY_TYPE_LIST) {
-            if (policy.isAnomalyDetectorEnabled(type)) {
-                anomalies.addAll(getAnomalyDetector(type).detectAnomalies(
-                        batteryStatsHelper, targetPackageName));
-            }
-        }
-
-        return anomalies;
-    }
-
-    /**
-     * Log the list of {@link Anomaly} using {@link MetricsFeatureProvider}, which contains
-     * anomaly type, package name, field_context, field_action_type
-     *
-     * @param provider  provider to do the logging
-     * @param anomalies contains the data to log
-     * @param contextId which page invoke this logging
-     * @see #logAnomaly(MetricsFeatureProvider, Anomaly, int)
-     */
-    public void logAnomalies(MetricsFeatureProvider provider, List<Anomaly> anomalies,
-            int contextId) {
-        for (int i = 0, size = anomalies.size(); i < size; i++) {
-            logAnomaly(provider, anomalies.get(i), contextId);
-        }
-    }
-
-    /**
-     * Log the {@link Anomaly} using {@link MetricsFeatureProvider}, which contains
-     * anomaly type, package name, field_context, field_action_type
-     *
-     * @param provider  provider to do the logging
-     * @param anomaly   contains the data to log
-     * @param contextId which page invoke this logging
-     * @see #logAnomalies(MetricsFeatureProvider, List, int)
-     */
-    public void logAnomaly(MetricsFeatureProvider provider, Anomaly anomaly, int contextId) {
-        provider.action(
-                mContext,
-                mMetricArray.get(anomaly.type, MetricsProto.MetricsEvent.VIEW_UNKNOWN),
-                anomaly.packageName,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, contextId),
-                Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_ACTION_TYPE,
-                        getAnomalyAction(anomaly).getActionType()));
-    }
-
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/AnomalyAction.java b/src/com/android/settings/fuelgauge/anomaly/action/AnomalyAction.java
deleted file mode 100644
index d7de5a7..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/action/AnomalyAction.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import android.content.Context;
-import android.util.Pair;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-/**
- * Abstract class for anomaly action, which is triggered if we need to handle the anomaly
- */
-public abstract class AnomalyAction {
-    protected Context mContext;
-    protected int mActionMetricKey;
-
-    private MetricsFeatureProvider mMetricsFeatureProvider;
-
-    public AnomalyAction(Context context) {
-        mContext = context;
-        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
-    }
-
-    /**
-     * handle the action when user clicks positive button
-     *
-     * @param anomaly    about the app that we need to handle
-     * @param contextMetricsKey key for the page that invokes the action
-     * @see com.android.internal.logging.nano.MetricsProto
-     */
-    public void handlePositiveAction(Anomaly anomaly, int contextMetricsKey) {
-        mMetricsFeatureProvider.action(mContext, mActionMetricKey, anomaly.packageName,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, contextMetricsKey));
-    }
-
-    /**
-     * Check whether the action is active for {@code anomaly}
-     *
-     * @param anomaly about the app that we need to handle
-     * @return {@code true} if action is active, otherwise return {@code false}
-     */
-    public abstract boolean isActionActive(Anomaly anomaly);
-
-    @Anomaly.AnomalyActionType
-    public abstract int getActionType();
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java b/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java
deleted file mode 100644
index ed2387c..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.os.Build;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Background check action for anomaly app, which means to stop app running in the background
- */
-public class BackgroundCheckAction extends AnomalyAction {
-
-    private AppOpsManager mAppOpsManager;
-    @VisibleForTesting
-    BatteryUtils mBatteryUtils;
-
-    public BackgroundCheckAction(Context context) {
-        super(context);
-        mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
-        mActionMetricKey = MetricsProto.MetricsEvent.ACTION_APP_BACKGROUND_CHECK;
-        mBatteryUtils = BatteryUtils.getInstance(context);
-    }
-
-    @Override
-    public void handlePositiveAction(Anomaly anomaly, int contextMetricsKey) {
-        super.handlePositiveAction(anomaly, contextMetricsKey);
-        if (anomaly.targetSdkVersion < Build.VERSION_CODES.O) {
-            mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, anomaly.uid,
-                    anomaly.packageName,
-                    AppOpsManager.MODE_IGNORED);
-        }
-    }
-
-    @Override
-    public boolean isActionActive(Anomaly anomaly) {
-        return !mBatteryUtils.isBackgroundRestrictionEnabled(anomaly.targetSdkVersion, anomaly.uid,
-                anomaly.packageName);
-    }
-
-    @Override
-    public int getActionType() {
-        return Anomaly.AnomalyActionType.BACKGROUND_CHECK;
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/ForceStopAction.java b/src/com/android/settings/fuelgauge/anomaly/action/ForceStopAction.java
deleted file mode 100644
index fb7306a..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/action/ForceStopAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.util.Log;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-
-/**
- * Force stop action for anomaly app, which means to stop the app which causes anomaly
- */
-public class ForceStopAction extends AnomalyAction {
-    private static final String TAG = "ForceStopAction";
-
-    private ActivityManager mActivityManager;
-    private PackageManager mPackageManager;
-
-    public ForceStopAction(Context context) {
-        super(context);
-        mActivityManager = (ActivityManager) context.getSystemService(
-                Context.ACTIVITY_SERVICE);
-        mPackageManager = context.getPackageManager();
-        mActionMetricKey = MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP;
-    }
-
-    @Override
-    public void handlePositiveAction(Anomaly anomaly, int contextMetricsKey) {
-        super.handlePositiveAction(anomaly, contextMetricsKey);
-
-        mActivityManager.forceStopPackage(anomaly.packageName);
-    }
-
-    @Override
-    public boolean isActionActive(Anomaly anomaly) {
-        try {
-            ApplicationInfo info = mPackageManager.getApplicationInfo(anomaly.packageName,
-                    PackageManager.GET_META_DATA);
-            return (info.flags & ApplicationInfo.FLAG_STOPPED) == 0;
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Cannot find info for app: " + anomaly.packageName);
-        }
-        return false;
-    }
-
-    @Override
-    public int getActionType() {
-        return Anomaly.AnomalyActionType.FORCE_STOP;
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckAction.java b/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckAction.java
deleted file mode 100644
index cdeab5d..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckAction.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import android.Manifest;
-import android.content.Context;
-import android.content.pm.permission.RuntimePermissionPresenter;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.core.content.PermissionChecker;
-
-/**
- * Location action for anomaly app, which means to turn off location permission for this app
- */
-public class LocationCheckAction extends AnomalyAction {
-
-    private static final String TAG = "LocationCheckAction";
-
-    private final RuntimePermissionPresenter mRuntimePermissionPresenter;
-
-    public LocationCheckAction(Context context) {
-        this(context, RuntimePermissionPresenter.getInstance(context));
-    }
-
-    @VisibleForTesting
-    LocationCheckAction(Context context, RuntimePermissionPresenter runtimePermissionPresenter) {
-        super(context);
-        mRuntimePermissionPresenter = runtimePermissionPresenter;
-        mActionMetricKey = MetricsProto.MetricsEvent.ACTION_APP_LOCATION_CHECK;
-    }
-
-    @Override
-    public void handlePositiveAction(Anomaly anomaly, int contextMetricsKey) {
-        super.handlePositiveAction(anomaly, contextMetricsKey);
-        mRuntimePermissionPresenter.revokeRuntimePermission(anomaly.packageName,
-                Manifest.permission.ACCESS_COARSE_LOCATION);
-        mRuntimePermissionPresenter.revokeRuntimePermission(anomaly.packageName,
-                Manifest.permission.ACCESS_FINE_LOCATION);
-    }
-
-    @Override
-    public boolean isActionActive(Anomaly anomaly) {
-        return isPermissionGranted(anomaly, Manifest.permission.ACCESS_COARSE_LOCATION)
-                || isPermissionGranted(anomaly, Manifest.permission.ACCESS_FINE_LOCATION);
-    }
-
-    @Override
-    public int getActionType() {
-        return Anomaly.AnomalyActionType.LOCATION_CHECK;
-    }
-
-    private boolean isPermissionGranted(Anomaly anomaly, String permission) {
-        return PermissionChecker.checkPermission(mContext, permission, -1, anomaly.uid,
-                anomaly.packageName) == PermissionChecker.PERMISSION_GRANTED;
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java b/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java
deleted file mode 100644
index a89e128..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import android.content.Context;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Force stop and background check action for anomaly app, this action will
- * 1. Force stop the app
- * 2. Turn on background check
- */
-public class StopAndBackgroundCheckAction extends AnomalyAction {
-    @VisibleForTesting
-    ForceStopAction mForceStopAction;
-    @VisibleForTesting
-    BackgroundCheckAction mBackgroundCheckAction;
-
-    public StopAndBackgroundCheckAction(Context context) {
-        this(context, new ForceStopAction(context), new BackgroundCheckAction(context));
-        mActionMetricKey = MetricsProto.MetricsEvent.ACTION_APP_STOP_AND_BACKGROUND_CHECK;
-    }
-
-    @VisibleForTesting
-    StopAndBackgroundCheckAction(Context context, ForceStopAction forceStopAction,
-            BackgroundCheckAction backgroundCheckAction) {
-        super(context);
-        mForceStopAction = forceStopAction;
-        mBackgroundCheckAction = backgroundCheckAction;
-    }
-
-    @Override
-    public void handlePositiveAction(Anomaly anomaly, int metricsKey) {
-        super.handlePositiveAction(anomaly, metricsKey);
-        mForceStopAction.handlePositiveAction(anomaly, metricsKey);
-        mBackgroundCheckAction.handlePositiveAction(anomaly, metricsKey);
-    }
-
-    @Override
-    public boolean isActionActive(Anomaly anomaly) {
-        return mForceStopAction.isActionActive(anomaly)
-                && mBackgroundCheckAction.isActionActive(anomaly);
-    }
-
-    @Override
-    public int getActionType() {
-        return Anomaly.AnomalyActionType.STOP_AND_BACKGROUND_CHECK;
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/AnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/AnomalyDetector.java
deleted file mode 100644
index 1921bef..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/checker/AnomalyDetector.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-
-package com.android.settings.fuelgauge.anomaly.checker;
-
-import android.annotation.Nullable;
-
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-
-import java.util.List;
-
-public interface AnomalyDetector {
-    /**
-     * Detect whether there is anomaly among all the applications in the device
-     *
-     * @param batteryStatsHelper used to detect the anomaly
-     * @return anomaly list
-     */
-    List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper);
-
-    /**
-     * Detect whether application with {@code targetPackageName} has anomaly. When
-     * {@code targetPackageName} is null, start detection among all the applications.
-     *
-     * @param batteryStatsHelper used to detect the anomaly
-     * @param targetPackageName  represents the app need to be detected
-     * @return anomaly list
-     */
-    List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper,
-            @Nullable String targetPackageName);
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java
deleted file mode 100644
index 0641a85..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.checker;
-
-import android.content.Context;
-import android.os.BatteryStats;
-import android.os.SystemClock;
-
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.Utils;
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
-import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Check whether apps have unoptimized bluetooth scanning in the background
- */
-public class BluetoothScanAnomalyDetector implements AnomalyDetector {
-    private static final String TAG = "BluetoothScanAnomalyDetector";
-    @VisibleForTesting
-    BatteryUtils mBatteryUtils;
-    private long mBluetoothScanningThreshold;
-    private Context mContext;
-    private AnomalyUtils mAnomalyUtils;
-
-    public BluetoothScanAnomalyDetector(Context context) {
-        this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
-    }
-
-    @VisibleForTesting
-    BluetoothScanAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
-            AnomalyUtils anomalyUtils) {
-        mContext = context;
-        mBatteryUtils = BatteryUtils.getInstance(context);
-        mBluetoothScanningThreshold = policy.bluetoothScanThreshold;
-        mAnomalyUtils = anomalyUtils;
-    }
-
-    @Override
-    public List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper) {
-        // Detect all apps if targetPackageName is null
-        return detectAnomalies(batteryStatsHelper, null /* targetPackageName */);
-    }
-
-    @Override
-    public List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper,
-            String targetPackageName) {
-        final List<BatterySipper> batterySippers = batteryStatsHelper.getUsageList();
-        final List<Anomaly> anomalies = new ArrayList<>();
-        final int targetUid = mBatteryUtils.getPackageUid(targetPackageName);
-        final long elapsedRealtimeMs = SystemClock.elapsedRealtime();
-
-        for (int i = 0, size = batterySippers.size(); i < size; i++) {
-            final BatterySipper sipper = batterySippers.get(i);
-            final BatteryStats.Uid uid = sipper.uidObj;
-            if (uid == null
-                    || mBatteryUtils.shouldHideSipper(sipper)
-                    || (targetUid != BatteryUtils.UID_NULL && targetUid != uid.getUid())) {
-                continue;
-            }
-
-            final long bluetoothTimeMs = getBluetoothUnoptimizedBgTimeMs(uid, elapsedRealtimeMs);
-            if (bluetoothTimeMs > mBluetoothScanningThreshold) {
-                final String packageName = mBatteryUtils.getPackageName(uid.getUid());
-                final CharSequence displayName = Utils.getApplicationLabel(mContext,
-                        packageName);
-
-                Anomaly anomaly = new Anomaly.Builder()
-                        .setUid(uid.getUid())
-                        .setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
-                        .setDisplayName(displayName)
-                        .setPackageName(packageName)
-                        .setBluetoothScanningTimeMs(bluetoothTimeMs)
-                        .build();
-
-                if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
-                    anomalies.add(anomaly);
-                }
-            }
-        }
-
-        return anomalies;
-    }
-
-    @VisibleForTesting
-    public long getBluetoothUnoptimizedBgTimeMs(BatteryStats.Uid uid, long elapsedRealtimeMs) {
-        BatteryStats.Timer timer = uid.getBluetoothUnoptimizedScanBackgroundTimer();
-
-        return timer != null ? timer.getTotalDurationMsLocked(elapsedRealtimeMs) : 0;
-    }
-
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
deleted file mode 100644
index ffed1e8..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.checker;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.BatteryStats;
-import android.os.SystemClock;
-
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.Utils;
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
-import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Check whether apps holding wakelock too long
- */
-public class WakeLockAnomalyDetector implements AnomalyDetector {
-    private static final String TAG = "WakeLockAnomalyChecker";
-    @VisibleForTesting
-    BatteryUtils mBatteryUtils;
-    @VisibleForTesting
-    long mWakeLockThresholdMs;
-    private PackageManager mPackageManager;
-    private Context mContext;
-    private AnomalyUtils mAnomalyUtils;
-
-    public WakeLockAnomalyDetector(Context context) {
-        this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
-    }
-
-    @VisibleForTesting
-    WakeLockAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
-            AnomalyUtils anomalyUtils) {
-        mContext = context;
-        mPackageManager = context.getPackageManager();
-        mBatteryUtils = BatteryUtils.getInstance(context);
-        mAnomalyUtils = anomalyUtils;
-        mWakeLockThresholdMs = policy.wakeLockThreshold;
-    }
-
-    @Override
-    public List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper) {
-        // Detect all apps if targetPackageName is null
-        return detectAnomalies(batteryStatsHelper, null /* targetPackageName */);
-    }
-
-    @Override
-    public List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper,
-            String targetPackageName) {
-        final List<BatterySipper> batterySippers = batteryStatsHelper.getUsageList();
-        final List<Anomaly> anomalies = new ArrayList<>();
-        final long rawRealtime = SystemClock.elapsedRealtime();
-        final int targetUid = mBatteryUtils.getPackageUid(targetPackageName);
-
-        // Check the app one by one
-        for (int i = 0, size = batterySippers.size(); i < size; i++) {
-            final BatterySipper sipper = batterySippers.get(i);
-            final BatteryStats.Uid uid = sipper.uidObj;
-            if (uid == null
-                    || mBatteryUtils.shouldHideSipper(sipper)
-                    || (targetUid != BatteryUtils.UID_NULL && targetUid != uid.getUid())) {
-                continue;
-            }
-
-            final long currentDurationMs = getCurrentDurationMs(uid, rawRealtime);
-            final long backgroundDurationMs = getBackgroundTotalDurationMs(uid, rawRealtime);
-
-            if (backgroundDurationMs > mWakeLockThresholdMs && currentDurationMs != 0) {
-                final String packageName = mBatteryUtils.getPackageName(uid.getUid());
-                final CharSequence displayName = Utils.getApplicationLabel(mContext,
-                        packageName);
-
-                Anomaly anomaly = new Anomaly.Builder()
-                        .setUid(uid.getUid())
-                        .setType(Anomaly.AnomalyType.WAKE_LOCK)
-                        .setDisplayName(displayName)
-                        .setPackageName(packageName)
-                        .setWakeLockTimeMs(backgroundDurationMs)
-                        .build();
-
-                if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
-                    anomalies.add(anomaly);
-                }
-            }
-        }
-        return anomalies;
-    }
-
-    @VisibleForTesting
-    long getCurrentDurationMs(BatteryStats.Uid uid, long elapsedRealtimeMs) {
-        BatteryStats.Timer timer = uid.getAggregatedPartialWakelockTimer();
-
-        return timer != null ? timer.getCurrentDurationMsLocked(elapsedRealtimeMs) : 0;
-    }
-
-    @VisibleForTesting
-    long getBackgroundTotalDurationMs(BatteryStats.Uid uid, long elapsedRealtimeMs) {
-        BatteryStats.Timer timer = uid.getAggregatedPartialWakelockTimer();
-        BatteryStats.Timer subTimer = timer != null ? timer.getSubTimer() : null;
-
-        return subTimer != null ? subTimer.getTotalDurationMsLocked(elapsedRealtimeMs) : 0;
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java
deleted file mode 100644
index f6c3aff..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.checker;
-
-import android.content.Context;
-import android.os.BatteryStats;
-import android.text.format.DateUtils;
-import android.util.ArrayMap;
-
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.Utils;
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
-import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import androidx.annotation.VisibleForTesting;
-
-/**
- * Check whether apps has too many wakeup alarms
- */
-public class WakeupAlarmAnomalyDetector implements AnomalyDetector {
-    private static final String TAG = "WakeupAlarmAnomalyDetector";
-    @VisibleForTesting
-    BatteryUtils mBatteryUtils;
-    private long mWakeupAlarmThreshold;
-    private Set<String> mWakeupBlacklistedTags;
-    private Context mContext;
-    private AnomalyUtils mAnomalyUtils;
-
-    public WakeupAlarmAnomalyDetector(Context context) {
-        this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
-    }
-
-    @VisibleForTesting
-    WakeupAlarmAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
-            AnomalyUtils anomalyUtils) {
-        mContext = context;
-        mBatteryUtils = BatteryUtils.getInstance(context);
-        mAnomalyUtils = anomalyUtils;
-        mWakeupAlarmThreshold = policy.wakeupAlarmThreshold;
-        mWakeupBlacklistedTags = policy.wakeupBlacklistedTags;
-    }
-
-    @Override
-    public List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper) {
-        // Detect all apps if targetPackageName is null
-        return detectAnomalies(batteryStatsHelper, null /* targetPackageName */);
-    }
-
-    @Override
-    public List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper,
-            String targetPackageName) {
-        final List<BatterySipper> batterySippers = batteryStatsHelper.getUsageList();
-        final List<Anomaly> anomalies = new ArrayList<>();
-        final double totalRunningHours = mBatteryUtils.calculateRunningTimeBasedOnStatsType(
-                batteryStatsHelper, BatteryStats.STATS_SINCE_CHARGED)
-                / (double) DateUtils.HOUR_IN_MILLIS;
-        final int targetUid = mBatteryUtils.getPackageUid(targetPackageName);
-
-        if (totalRunningHours >= 1) {
-            for (int i = 0, size = batterySippers.size(); i < size; i++) {
-                final BatterySipper sipper = batterySippers.get(i);
-                final BatteryStats.Uid uid = sipper.uidObj;
-                if (uid == null
-                        || mBatteryUtils.shouldHideSipper(sipper)
-                        || (targetUid != BatteryUtils.UID_NULL && targetUid != uid.getUid())) {
-                    continue;
-                }
-
-                final int wakeupAlarmCount = (int) (getWakeupAlarmCountFromUid(uid)
-                        / totalRunningHours);
-                if (wakeupAlarmCount > mWakeupAlarmThreshold) {
-                    final String packageName = mBatteryUtils.getPackageName(uid.getUid());
-                    final CharSequence displayName = Utils.getApplicationLabel(mContext,
-                            packageName);
-                    final int targetSdkVersion = mBatteryUtils.getTargetSdkVersion(packageName);
-
-                    Anomaly anomaly = new Anomaly.Builder()
-                            .setUid(uid.getUid())
-                            .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                            .setDisplayName(displayName)
-                            .setPackageName(packageName)
-                            .setTargetSdkVersion(targetSdkVersion)
-                            .setBackgroundRestrictionEnabled(
-                                    mBatteryUtils.isBackgroundRestrictionEnabled(targetSdkVersion,
-                                            uid.getUid(), packageName))
-                            .setWakeupAlarmCount(wakeupAlarmCount)
-                            .build();
-
-                    if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
-                        anomalies.add(anomaly);
-                    }
-                }
-            }
-        }
-
-        return anomalies;
-    }
-
-    @VisibleForTesting
-    int getWakeupAlarmCountFromUid(BatteryStats.Uid uid) {
-        int wakeups = 0;
-        final ArrayMap<String, ? extends BatteryStats.Uid.Pkg> packageStats
-                = uid.getPackageStats();
-        for (int ipkg = packageStats.size() - 1; ipkg >= 0; ipkg--) {
-            final BatteryStats.Uid.Pkg ps = packageStats.valueAt(ipkg);
-            final ArrayMap<String, ? extends BatteryStats.Counter> alarms =
-                    ps.getWakeupAlarmStats();
-            for (Map.Entry<String, ? extends BatteryStats.Counter> alarm : alarms.entrySet()) {
-                if (mWakeupBlacklistedTags != null
-                        && mWakeupBlacklistedTags.contains(alarm.getKey())) {
-                    continue;
-                }
-                int count = alarm.getValue().getCountLocked(BatteryStats.STATS_SINCE_CHARGED);
-                wakeups += count;
-            }
-        }
-
-        return wakeups;
-    }
-
-}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
index d5f8794..bc332b6 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
@@ -21,8 +21,6 @@
 import android.database.sqlite.SQLiteOpenHelper;
 import android.util.Log;
 
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -62,7 +60,7 @@
         String UID = "uid";
         /**
          * The type of the anomaly app
-         * @see Anomaly.AnomalyType
+         * @see StatsManagerConfig.AnomalyType
          */
         String ANOMALY_TYPE = "anomaly_type";
         /**
diff --git a/src/com/android/settings/fuelgauge/batterytip/AppInfo.java b/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
index 34aefd6..73d3b86 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
@@ -21,8 +21,6 @@
 import android.text.TextUtils;
 import android.util.ArraySet;
 
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-
 import java.util.Objects;
 
 import androidx.annotation.VisibleForTesting;
@@ -34,7 +32,7 @@
     public final String packageName;
     /**
      * Anomaly type of the app
-     * @see Anomaly.AnomalyType
+     * @see StatsManagerConfig.AnomalyType
      */
     public final ArraySet<Integer> anomalyTypes;
     public final long screenOnTimeMs;
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index 2411db4..910b368 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -40,6 +40,8 @@
 import java.util.List;
 import java.util.Map;
 
+import androidx.annotation.VisibleForTesting;
+
 /**
  * Database manager for battery data. Now it only contains anomaly data stored in {@link AppInfo}.
  *
@@ -62,6 +64,11 @@
         return sSingleton;
     }
 
+    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+    public static void setUpForTest(BatteryDatabaseManager batteryDatabaseManager) {
+        sSingleton = batteryDatabaseManager;
+    }
+
     /**
      * Insert an anomaly log to database.
      *
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
index 4b08626..66d9f2c 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.fuelgauge.batterytip;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -39,6 +38,7 @@
 import java.util.List;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
index 22c90e3..4bd8cd7 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
@@ -40,6 +40,7 @@
     private static final String KEY_HIGH_USAGE_PERIOD_MS = "high_usage_period_ms";
     private static final String KEY_HIGH_USAGE_BATTERY_DRAINING = "high_usage_battery_draining";
     private static final String KEY_APP_RESTRICTION_ENABLED = "app_restriction_enabled";
+    private static final String KEY_APP_RESTRICTION_ACTIVE_HOUR = "app_restriction_active_hour";
     private static final String KEY_REDUCED_BATTERY_ENABLED = "reduced_battery_enabled";
     private static final String KEY_REDUCED_BATTERY_PERCENT = "reduced_battery_percent";
     private static final String KEY_LOW_BATTERY_ENABLED = "low_battery_enabled";
@@ -119,6 +120,15 @@
     public final boolean appRestrictionEnabled;
 
     /**
+     * Period(hour) to show anomaly apps. If it is 24 hours, it means only show anomaly apps
+     * happened in last 24 hours.
+     *
+     * @see Settings.Global#BATTERY_TIP_CONSTANTS
+     * @see #KEY_APP_RESTRICTION_ACTIVE_HOUR
+     */
+    public final int appRestrictionActiveHour;
+
+    /**
      * {@code true} if reduced battery tip is enabled
      *
      * @see Settings.Global#BATTERY_TIP_CONSTANTS
@@ -228,6 +238,7 @@
                 Duration.ofHours(2).toMillis());
         highUsageBatteryDraining = mParser.getInt(KEY_HIGH_USAGE_BATTERY_DRAINING, 25);
         appRestrictionEnabled = mParser.getBoolean(KEY_APP_RESTRICTION_ENABLED, true);
+        appRestrictionActiveHour = mParser.getInt(KEY_APP_RESTRICTION_ACTIVE_HOUR, 24);
         reducedBatteryEnabled = mParser.getBoolean(KEY_REDUCED_BATTERY_ENABLED, false);
         reducedBatteryPercent = mParser.getInt(KEY_REDUCED_BATTERY_PERCENT, 50);
         lowBatteryEnabled = mParser.getBoolean(KEY_LOW_BATTERY_ENABLED, true);
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
index df6fa5a..8debf6b 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
@@ -34,6 +34,8 @@
 import com.android.settings.fuelgauge.batterytip.actions.RestrictAppAction;
 import com.android.settings.fuelgauge.batterytip.actions.SmartBatteryAction;
 import com.android.settings.fuelgauge.batterytip.actions.UnrestrictAppAction;
+import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
+import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
 import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
@@ -126,4 +128,17 @@
         statsManager.setBroadcastSubscriber(pendingIntent,
                 StatsManagerConfig.ANOMALY_CONFIG_KEY, StatsManagerConfig.SUBSCRIBER_ID);
     }
+
+    /**
+     * Detect and return anomaly apps after {@code timeAfterMs}
+     */
+    public static List<AppInfo> detectAnomalies(Context context, long timeAfterMs) {
+        final List<AppInfo> highUsageApps = BatteryDatabaseManager.getInstance(context)
+                .queryAllAnomalies(timeAfterMs, AnomalyDatabaseHelper.State.NEW);
+        // Remove it if it doesn't have label or been restricted
+        highUsageApps.removeIf(AppLabelPredicate.getInstance(context)
+                .or(AppRestrictionPredicate.getInstance(context)));
+
+        return highUsageApps;
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
index 312eeb8..e6c0837 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
@@ -23,6 +23,7 @@
 import com.android.settings.fuelgauge.batterytip.AppInfo;
 import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
+import com.android.settings.fuelgauge.batterytip.BatteryTipUtils;
 import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
 import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
@@ -30,6 +31,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -52,8 +54,8 @@
         mContext = context;
         mPolicy = policy;
         mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context);
-        mAppRestrictionPredicate = new AppRestrictionPredicate(context);
-        mAppLabelPredicate = new AppLabelPredicate(context);
+        mAppRestrictionPredicate = AppRestrictionPredicate.getInstance(context);
+        mAppLabelPredicate = AppLabelPredicate.getInstance(context);
     }
 
     @Override
@@ -62,12 +64,10 @@
             return getFakeData();
         }
         if (mPolicy.appRestrictionEnabled) {
-            // TODO(b/72385333): hook up the query timestamp to server side
-            final long oneDayBeforeMs = System.currentTimeMillis() - DateUtils.DAY_IN_MILLIS;
-            final List<AppInfo> highUsageApps = mBatteryDatabaseManager.queryAllAnomalies(
-                    oneDayBeforeMs, AnomalyDatabaseHelper.State.NEW);
-            // Remove it if it doesn't have label or been restricted
-            highUsageApps.removeIf(mAppLabelPredicate.or(mAppRestrictionPredicate));
+            final long oneDayBeforeMs = System.currentTimeMillis()
+                    - TimeUnit.HOURS.toMillis(mPolicy.appRestrictionActiveHour);
+            final List<AppInfo> highUsageApps = BatteryTipUtils.detectAnomalies(mContext,
+                    oneDayBeforeMs);
             if (!highUsageApps.isEmpty()) {
                 // If there are new anomalies, show them
                 return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java b/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java
index 13a2452..1444b12 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.fuelgauge.batterytip.tips;
 
-import android.app.AppOpsManager;
 import android.content.Context;
 
 import com.android.settings.Utils;
@@ -28,12 +27,20 @@
  * {@link Predicate} for {@link AppInfo} to check whether it has label
  */
 public class AppLabelPredicate implements Predicate<AppInfo> {
-    private Context mContext;
-    private AppOpsManager mAppOpsManager;
 
-    public AppLabelPredicate(Context context) {
+    private static AppLabelPredicate sInstance;
+    private Context mContext;
+
+    public static AppLabelPredicate getInstance(Context context) {
+        if (sInstance == null) {
+            sInstance = new AppLabelPredicate(context.getApplicationContext());
+        }
+
+        return sInstance;
+    }
+
+    private AppLabelPredicate(Context context) {
         mContext = context;
-        mAppOpsManager = context.getSystemService(AppOpsManager.class);
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java b/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java
index 3650fe3..43a4d90 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java
@@ -27,9 +27,19 @@
  * {@link Predicate} for {@link AppInfo} to check whether it is restricted.
  */
 public class AppRestrictionPredicate implements Predicate<AppInfo> {
+
+    private static AppRestrictionPredicate sInstance;
     private AppOpsManager mAppOpsManager;
 
-    public AppRestrictionPredicate(Context context) {
+    public static AppRestrictionPredicate getInstance(Context context) {
+        if (sInstance == null) {
+            sInstance = new AppRestrictionPredicate(context.getApplicationContext());
+        }
+
+        return sInstance;
+    }
+
+    private AppRestrictionPredicate(Context context) {
         mAppOpsManager = context.getSystemService(AppOpsManager.class);
     }
 
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
index 61a1157..1d5143f 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.fuelgauge.batterytip.tips;
 
-import android.content.ContentResolver;
 import android.content.Context;
 import android.os.Parcel;
 import android.os.Parcelable;
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
index 8a2d86d..0d91c74 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
@@ -112,7 +112,7 @@
         super.sanityCheck(context);
 
         // Set it invisible if there is no valid app
-        mRestrictAppList.removeIf(new AppLabelPredicate(context));
+        mRestrictAppList.removeIf(AppLabelPredicate.getInstance(context));
         if (mRestrictAppList.isEmpty()) {
             mState = StateType.INVISIBLE;
         }
diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java b/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
index 1a7fe22..388e16c 100644
--- a/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
+++ b/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
@@ -17,7 +17,6 @@
 package com.android.settings.inputmethod;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -43,6 +42,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.loader.app.LoaderManager.LoaderCallbacks;
 import androidx.loader.content.AsyncTaskLoader;
 import androidx.loader.content.Loader;
diff --git a/src/com/android/settings/inputmethod/SpellCheckersSettings.java b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
index 1a828ce..c8eb109 100644
--- a/src/com/android/settings/inputmethod/SpellCheckersSettings.java
+++ b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.inputmethod;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.ApplicationInfo;
@@ -35,6 +34,7 @@
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.Preference.OnPreferenceClickListener;
diff --git a/src/com/android/settings/language/PhoneLanguagePreferenceController.java b/src/com/android/settings/language/PhoneLanguagePreferenceController.java
index 0f9b419..8045fc0 100644
--- a/src/com/android/settings/language/PhoneLanguagePreferenceController.java
+++ b/src/com/android/settings/language/PhoneLanguagePreferenceController.java
@@ -75,7 +75,7 @@
         new SubSettingLauncher(mContext)
                 .setDestination(LocaleListEditor.class.getName())
                 .setSourceMetricsCategory(MetricsProto.MetricsEvent.SETTINGS_LANGUAGE_CATEGORY)
-                .setTitleRes(R.string.pref_title_lang_selection)
+                .setTitleRes(R.string.language_picker_title)
                 .launch();
         return true;
     }
diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java
index 87c19dd..dada1c8 100644
--- a/src/com/android/settings/localepicker/LocaleListEditor.java
+++ b/src/com/android/settings/localepicker/LocaleListEditor.java
@@ -18,8 +18,9 @@
 
 import static android.os.UserManager.DISALLOW_CONFIG_LOCALE;
 
-import android.app.AlertDialog;
+import android.app.Activity;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.LocaleList;
 import android.view.LayoutInflater;
@@ -40,18 +41,19 @@
 import java.util.List;
 import java.util.Locale;
 
-import androidx.fragment.app.FragmentTransaction;
+import androidx.appcompat.app.AlertDialog;
 import androidx.recyclerview.widget.RecyclerView;
 
 /**
  * Drag-and-drop editor for the user-ordered locale lists.
  */
-public class LocaleListEditor extends RestrictedSettingsFragment
-        implements LocalePickerWithRegion.LocaleSelectedListener {
+public class LocaleListEditor extends RestrictedSettingsFragment {
 
+    protected static final String INTENT_LOCALE_KEY = "localeInfo";
     private static final String CFGKEY_REMOVE_MODE = "localeRemoveMode";
     private static final String CFGKEY_REMOVE_DIALOG = "showingLocaleRemoveDialog";
     private static final int MENU_ID_REMOVE = Menu.FIRST + 1;
+    private static final int REQUEST_LOCALE_PICKER = 0;
 
     private LocaleDragAndDropAdapter mAdapter;
     private Menu mMenu;
@@ -150,6 +152,19 @@
         return super.onOptionsItemSelected(menuItem);
     }
 
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == REQUEST_LOCALE_PICKER && resultCode == Activity.RESULT_OK
+                && data != null) {
+            final LocaleStore.LocaleInfo locale =
+                    (LocaleStore.LocaleInfo) data.getSerializableExtra(
+                            INTENT_LOCALE_KEY);
+            mAdapter.addLocale(locale);
+            updateVisibilityOfRemoveMenu();
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
     private void setRemoveMode(boolean mRemoveMode) {
         this.mRemoveMode = mRemoveMode;
         mAdapter.setRemoveMode(mRemoveMode);
@@ -267,24 +282,13 @@
         mAddLanguage.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                final LocalePickerWithRegion selector = LocalePickerWithRegion.createLanguagePicker(
-                        getContext(), LocaleListEditor.this, false /* translate only */);
-                getFragmentManager()
-                        .beginTransaction()
-                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
-                        .replace(getId(), selector)
-                        .addToBackStack("localeListEditor")
-                        .commit();
+                final Intent intent = new Intent(getActivity(),
+                        LocalePickerWithRegionActivity.class);
+                startActivityForResult(intent, REQUEST_LOCALE_PICKER);
             }
         });
     }
 
-    @Override
-    public void onLocaleSelected(LocaleStore.LocaleInfo locale) {
-        mAdapter.addLocale(locale);
-        updateVisibilityOfRemoveMenu();
-    }
-
     // Hide the "Remove" menu if there is only one locale in the list, show it otherwise
     // This is called when the menu is first created, and then one add / remove locale
     private void updateVisibilityOfRemoveMenu() {
diff --git a/src/com/android/settings/localepicker/LocalePickerWithRegion.java b/src/com/android/settings/localepicker/LocalePickerWithRegion.java
deleted file mode 100644
index e8a91bc..0000000
--- a/src/com/android/settings/localepicker/LocalePickerWithRegion.java
+++ /dev/null
@@ -1,278 +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.localepicker;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.LocaleList;
-import android.text.TextUtils;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.ListView;
-import android.widget.SearchView;
-
-import com.android.internal.R;
-import com.android.internal.app.LocaleHelper;
-import com.android.internal.app.LocalePicker;
-import com.android.internal.app.LocaleStore;
-import com.android.internal.app.SuggestedLocaleAdapter;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import androidx.fragment.app.ListFragment;
-
-/**
- * A two-step locale picker. It shows a language, then a country.
- *
- * <p>It shows suggestions at the top, then the rest of the locales.
- * Allows the user to search for locales using both their native name and their name in the
- * default locale.</p>
- */
-public class LocalePickerWithRegion extends ListFragment implements SearchView.OnQueryTextListener {
-    private static final String PARENT_FRAGMENT_NAME = "localeListEditor";
-
-    private SuggestedLocaleAdapter mAdapter;
-    private LocaleSelectedListener mListener;
-    private Set<LocaleStore.LocaleInfo> mLocaleList;
-    private LocaleStore.LocaleInfo mParentLocale;
-    private boolean mTranslatedOnly = false;
-    private SearchView mSearchView = null;
-    private CharSequence mPreviousSearch = null;
-    private boolean mPreviousSearchHadFocus = false;
-    private int mFirstVisiblePosition = 0;
-    private int mTopDistance = 0;
-
-    /**
-     * Other classes can register to be notified when a locale was selected.
-     *
-     * <p>This is the mechanism to "return" the result of the selection.</p>
-     */
-    public interface LocaleSelectedListener {
-        /**
-         * The classes that want to retrieve the locale picked should implement this method.
-         * @param locale    the locale picked.
-         */
-        void onLocaleSelected(LocaleStore.LocaleInfo locale);
-    }
-
-    private static LocalePickerWithRegion createCountryPicker(Context context,
-            LocaleSelectedListener listener, LocaleStore.LocaleInfo parent,
-            boolean translatedOnly) {
-        LocalePickerWithRegion
-                localePicker = new LocalePickerWithRegion();
-        boolean shouldShowTheList = localePicker.setListener(context, listener, parent,
-                translatedOnly);
-        return shouldShowTheList ? localePicker : null;
-    }
-
-    public static LocalePickerWithRegion createLanguagePicker(Context context,
-            LocaleSelectedListener listener, boolean translatedOnly) {
-        LocalePickerWithRegion
-                localePicker = new LocalePickerWithRegion();
-        localePicker.setListener(context, listener, /* parent */ null, translatedOnly);
-        return localePicker;
-    }
-
-    /**
-     * Sets the listener and initializes the locale list.
-     *
-     * <p>Returns true if we need to show the list, false if not.</p>
-     *
-     * <p>Can return false because of an error, trying to show a list of countries,
-     * but no parent locale was provided.</p>
-     *
-     * <p>It can also return false if the caller tries to show the list in country mode and
-     * there is only one country available (i.e. Japanese => Japan).
-     * In this case we don't even show the list, we call the listener with that locale,
-     * "pretending" it was selected, and return false.</p>
-     */
-    private boolean setListener(Context context, LocaleSelectedListener listener,
-            LocaleStore.LocaleInfo parent, boolean translatedOnly) {
-        this.mParentLocale = parent;
-        this.mListener = listener;
-        this.mTranslatedOnly = translatedOnly;
-        setRetainInstance(true);
-
-        final HashSet<String> langTagsToIgnore = new HashSet<>();
-        if (!translatedOnly) {
-            final LocaleList userLocales = LocalePicker.getLocales();
-            final String[] langTags = userLocales.toLanguageTags().split(",");
-            Collections.addAll(langTagsToIgnore, langTags);
-        }
-
-        if (parent != null) {
-            mLocaleList = LocaleStore.getLevelLocales(context,
-                    langTagsToIgnore, parent, translatedOnly);
-            if (mLocaleList.size() <= 1) {
-                if (listener != null && (mLocaleList.size() == 1)) {
-                    listener.onLocaleSelected(mLocaleList.iterator().next());
-                }
-                return false;
-            }
-        } else {
-            mLocaleList = LocaleStore.getLevelLocales(context, langTagsToIgnore,
-                    null /* no parent */, translatedOnly);
-        }
-
-        return true;
-    }
-
-    private void returnToParentFrame() {
-        getFragmentManager().popBackStack(PARENT_FRAGMENT_NAME,
-                FragmentManager.POP_BACK_STACK_INCLUSIVE);
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setHasOptionsMenu(true);
-
-        if (mLocaleList == null) {
-            // The fragment was killed and restored by the FragmentManager.
-            // At this point we have no data, no listener. Just return, to prevend a NPE.
-            // Fixes b/28748150. Created b/29400003 for a cleaner solution.
-            returnToParentFrame();
-            return;
-        }
-
-        final boolean countryMode = mParentLocale != null;
-        final Locale sortingLocale = countryMode ? mParentLocale.getLocale() : Locale.getDefault();
-        mAdapter = new SuggestedLocaleAdapter(mLocaleList, countryMode);
-        final LocaleHelper.LocaleInfoComparator comp =
-                new LocaleHelper.LocaleInfoComparator(sortingLocale, countryMode);
-        mAdapter.sort(comp);
-        setListAdapter(mAdapter);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem menuItem) {
-        int id = menuItem.getItemId();
-        switch (id) {
-            case android.R.id.home:
-                getFragmentManager().popBackStack();
-                return true;
-        }
-        return super.onOptionsItemSelected(menuItem);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        if (mParentLocale != null) {
-            getActivity().setTitle(mParentLocale.getFullNameNative());
-        } else {
-            getActivity().setTitle(R.string.language_selection_title);
-        }
-
-        getListView().requestFocus();
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-
-        // Save search status
-        if (mSearchView != null) {
-            mPreviousSearchHadFocus = mSearchView.hasFocus();
-            mPreviousSearch = mSearchView.getQuery();
-        } else {
-            mPreviousSearchHadFocus = false;
-            mPreviousSearch = null;
-        }
-
-        // Save scroll position
-        final ListView list = getListView();
-        final View firstChild = list.getChildAt(0);
-        mFirstVisiblePosition = list.getFirstVisiblePosition();
-        mTopDistance = (firstChild == null) ? 0 : (firstChild.getTop() - list.getPaddingTop());
-    }
-
-    @Override
-    public void onListItemClick(ListView l, View v, int position, long id) {
-        final LocaleStore.LocaleInfo locale =
-                (LocaleStore.LocaleInfo) getListAdapter().getItem(position);
-
-        if (locale.getParent() != null) {
-            if (mListener != null) {
-                mListener.onLocaleSelected(locale);
-            }
-            returnToParentFrame();
-        } else {
-            LocalePickerWithRegion
-                    selector = LocalePickerWithRegion.createCountryPicker(
-                    getContext(), mListener, locale, mTranslatedOnly /* translate only */);
-            if (selector != null) {
-                getFragmentManager().beginTransaction()
-                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
-                        .replace(getId(), selector).addToBackStack(null)
-                        .commit();
-            } else {
-                returnToParentFrame();
-            }
-        }
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        if (mParentLocale == null) {
-            inflater.inflate(R.menu.language_selection_list, menu);
-
-            final MenuItem searchMenuItem = menu.findItem(R.id.locale_search_menu);
-            mSearchView = (SearchView) searchMenuItem.getActionView();
-
-            mSearchView.setQueryHint(getText(R.string.search_language_hint));
-            mSearchView.setOnQueryTextListener(this);
-
-            // Restore previous search status
-            if (!TextUtils.isEmpty(mPreviousSearch)) {
-                searchMenuItem.expandActionView();
-                mSearchView.setIconified(false);
-                mSearchView.setActivated(true);
-                if (mPreviousSearchHadFocus) {
-                    mSearchView.requestFocus();
-                }
-                mSearchView.setQuery(mPreviousSearch, true /* submit */);
-            } else {
-                mSearchView.setQuery(null, false /* submit */);
-            }
-
-            // Restore previous scroll position
-            getListView().setSelectionFromTop(mFirstVisiblePosition, mTopDistance);
-        }
-    }
-
-    @Override
-    public boolean onQueryTextSubmit(String query) {
-        return false;
-    }
-
-    @Override
-    public boolean onQueryTextChange(String newText) {
-        if (mAdapter != null) {
-            mAdapter.getFilter().filter(newText);
-        }
-        return false;
-    }
-}
diff --git a/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java b/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java
new file mode 100644
index 0000000..6ddcf23
--- /dev/null
+++ b/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java
@@ -0,0 +1,79 @@
+/*
+ * 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.localepicker;
+
+import android.app.Activity;
+import android.app.FragmentTransaction;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.MenuItem;
+
+import com.android.internal.app.LocalePickerWithRegion;
+import com.android.internal.app.LocaleStore;
+
+public class LocalePickerWithRegionActivity extends Activity
+        implements LocalePickerWithRegion.LocaleSelectedListener {
+
+    private static final String PARENT_FRAGMENT_NAME = "localeListEditor";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getActionBar().setDisplayHomeAsUpEnabled(true);
+
+        final LocalePickerWithRegion selector = LocalePickerWithRegion.createLanguagePicker(
+                this, LocalePickerWithRegionActivity.this, false /* translate only */);
+        getFragmentManager()
+                .beginTransaction()
+                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+                .replace(android.R.id.content, selector)
+                .addToBackStack(PARENT_FRAGMENT_NAME)
+                .commit();
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            handleBackPressed();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public void onLocaleSelected(LocaleStore.LocaleInfo locale) {
+        final Intent intent = new Intent();
+        intent.putExtra(LocaleListEditor.INTENT_LOCALE_KEY, locale);
+        setResult(RESULT_OK, intent);
+        finish();
+    }
+
+    @Override
+    public void onBackPressed() {
+        handleBackPressed();
+    }
+
+    private void handleBackPressed() {
+        if (getFragmentManager().getBackStackEntryCount() > 1) {
+            super.onBackPressed();
+        } else {
+            setResult(RESULT_CANCELED);
+            finish();
+        }
+    }
+}
+
diff --git a/src/com/android/settings/location/AppSettingsInjector.java b/src/com/android/settings/location/AppSettingsInjector.java
new file mode 100644
index 0000000..6b79a7e
--- /dev/null
+++ b/src/com/android/settings/location/AppSettingsInjector.java
@@ -0,0 +1,46 @@
+/*
+ * 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.location;
+
+import android.content.Context;
+import android.text.TextUtils;
+
+import androidx.preference.Preference;
+
+import com.android.settings.widget.AppPreference;
+import com.android.settings.widget.RestrictedAppPreference;
+import com.android.settingslib.location.InjectedSetting;
+import com.android.settingslib.location.SettingsInjector;
+
+import java.util.List;
+
+/**
+ * Adds the preferences specified by the {@link InjectedSetting} objects to a preference group.
+ */
+public class AppSettingsInjector extends SettingsInjector {
+
+    public AppSettingsInjector(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected Preference createPreference(Context prefContext, InjectedSetting setting) {
+        return TextUtils.isEmpty(setting.userRestriction)
+                ? new AppPreference(prefContext)
+                : new RestrictedAppPreference(prefContext, setting.userRestriction);
+    }
+}
diff --git a/src/com/android/settings/location/InjectedSetting.java b/src/com/android/settings/location/InjectedSetting.java
deleted file mode 100644
index 4877cb4..0000000
--- a/src/com/android/settings/location/InjectedSetting.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2013 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.location;
-
-import android.content.Intent;
-import android.os.UserHandle;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.annotations.Immutable;
-
-import java.util.Objects;
-
-/**
- * Specifies a setting that is being injected into Settings &gt; Location &gt; Location services.
- *
- * @see android.location.SettingInjectorService
- */
-@Immutable
-class InjectedSetting {
-
-    /**
-     * Package for the subclass of {@link android.location.SettingInjectorService} and for the
-     * settings activity.
-     */
-    public final String packageName;
-
-    /**
-     * Class name for the subclass of {@link android.location.SettingInjectorService} that
-     * specifies dynamic values for the location setting.
-     */
-    public final String className;
-
-    /**
-     * The {@link androidx.preference.Preference#getTitle()} value.
-     */
-    public final String title;
-
-    /**
-     * The {@link androidx.preference.Preference#getIcon()} value.
-     */
-    public final int iconId;
-
-    /**
-     * The user/profile associated with this setting (e.g. managed profile)
-     */
-    public final UserHandle mUserHandle;
-
-    /**
-     * The activity to launch to allow the user to modify the settings value. Assumed to be in the
-     * {@link #packageName} package.
-     */
-    public final String settingsActivity;
-
-    /**
-     * The user restriction associated with this setting.
-     */
-    public final String userRestriction;
-
-    private InjectedSetting(Builder builder) {
-        this.packageName = builder.mPackageName;
-        this.className = builder.mClassName;
-        this.title = builder.mTitle;
-        this.iconId = builder.mIconId;
-        this.mUserHandle = builder.mUserHandle;
-        this.settingsActivity = builder.mSettingsActivity;
-        this.userRestriction = builder.mUserRestriction;
-    }
-
-    @Override
-    public String toString() {
-        return "InjectedSetting{" +
-                "mPackageName='" + packageName + '\'' +
-                ", mClassName='" + className + '\'' +
-                ", label=" + title +
-                ", iconId=" + iconId +
-                ", userId=" + mUserHandle.getIdentifier() +
-                ", settingsActivity='" + settingsActivity + '\'' +
-                ", userRestriction='" + userRestriction +
-                '}';
-    }
-
-    /**
-     * Returns the intent to start the {@link #className} service.
-     */
-    public Intent getServiceIntent() {
-        Intent intent = new Intent();
-        intent.setClassName(packageName, className);
-        return intent;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof InjectedSetting)) return false;
-
-        InjectedSetting that = (InjectedSetting) o;
-
-        return Objects.equals(packageName, that.packageName)
-                && Objects.equals(className, that.className)
-                && Objects.equals(title, that.title)
-                && Objects.equals(iconId, that.iconId)
-                && Objects.equals(mUserHandle, that.mUserHandle)
-                && Objects.equals(settingsActivity, that.settingsActivity)
-                && Objects.equals(userRestriction, that.userRestriction);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = packageName.hashCode();
-        result = 31 * result + className.hashCode();
-        result = 31 * result + title.hashCode();
-        result = 31 * result + iconId;
-        result = 31 * result + (mUserHandle == null ? 0 : mUserHandle.hashCode());
-        result = 31 * result + settingsActivity.hashCode();
-        result = 31 * result + (userRestriction == null ? 0 : userRestriction.hashCode());
-        return result;
-    }
-
-    public static class Builder {
-        private String mPackageName;
-        private String mClassName;
-        private String mTitle;
-        private int mIconId;
-        private UserHandle mUserHandle;
-        private String mSettingsActivity;
-        private String mUserRestriction;
-
-        public Builder setPackageName(String packageName) {
-            mPackageName = packageName;
-            return this;
-        }
-
-        public Builder setClassName(String className) {
-            mClassName = className;
-            return this;
-        }
-
-        public Builder setTitle(String title) {
-            mTitle = title;
-            return this;
-        }
-
-        public Builder setIconId(int iconId) {
-            mIconId = iconId;
-            return this;
-        }
-
-        public Builder setUserHandle(UserHandle userHandle) {
-            mUserHandle = userHandle;
-            return this;
-        }
-
-        public Builder setSettingsActivity(String settingsActivity) {
-            mSettingsActivity = settingsActivity;
-            return this;
-        }
-
-        public Builder setUserRestriction(String userRestriction) {
-            mUserRestriction = userRestriction;
-            return this;
-        }
-
-        public InjectedSetting build() {
-            if (mPackageName == null || mClassName == null || TextUtils.isEmpty(mTitle)
-                    || TextUtils.isEmpty(mSettingsActivity)) {
-                if (Log.isLoggable(SettingsInjector.TAG, Log.WARN)) {
-                    Log.w(SettingsInjector.TAG, "Illegal setting specification: package="
-                            + mPackageName + ", class=" + mClassName
-                            + ", title=" + mTitle + ", settingsActivity=" + mSettingsActivity);
-                }
-                return null;
-            }
-            return new InjectedSetting(this);
-        }
-    }
-}
diff --git a/src/com/android/settings/location/LocationServicePreferenceController.java b/src/com/android/settings/location/LocationServicePreferenceController.java
index 67ec152..035faad 100644
--- a/src/com/android/settings/location/LocationServicePreferenceController.java
+++ b/src/com/android/settings/location/LocationServicePreferenceController.java
@@ -47,19 +47,19 @@
 
     private PreferenceCategory mCategoryLocationServices;
     private final LocationSettings mFragment;
-    private final SettingsInjector mInjector;
+    private final AppSettingsInjector mInjector;
     /** Receives UPDATE_INTENT  */
     @VisibleForTesting
     BroadcastReceiver mInjectedSettingsReceiver;
 
     public LocationServicePreferenceController(Context context, LocationSettings fragment,
             Lifecycle lifecycle) {
-        this(context, fragment, lifecycle, new SettingsInjector(context));
+        this(context, fragment, lifecycle, new AppSettingsInjector(context));
     }
 
     @VisibleForTesting
     LocationServicePreferenceController(Context context, LocationSettings fragment,
-            Lifecycle lifecycle, SettingsInjector injector) {
+            Lifecycle lifecycle, AppSettingsInjector injector) {
         super(context, lifecycle);
         mFragment = fragment;
         mInjector = injector;
diff --git a/src/com/android/settings/location/SettingsInjector.java b/src/com/android/settings/location/SettingsInjector.java
deleted file mode 100644
index 1206e85..0000000
--- a/src/com/android/settings/location/SettingsInjector.java
+++ /dev/null
@@ -1,577 +0,0 @@
-/*
- * Copyright (C) 2013 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.location;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageItemInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.graphics.drawable.Drawable;
-import android.location.SettingInjectorService;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.IconDrawableFactory;
-import android.util.Log;
-import android.util.Xml;
-
-import com.android.settings.widget.AppPreference;
-import com.android.settings.widget.RestrictedAppPreference;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import androidx.preference.Preference;
-
-/**
- * Adds the preferences specified by the {@link InjectedSetting} objects to a preference group.
- *
- * Duplicates some code from {@link android.content.pm.RegisteredServicesCache}. We do not use that
- * class directly because it is not a good match for our use case: we do not need the caching, and
- * so do not want the additional resource hit at app install/upgrade time; and we would have to
- * suppress the tie-breaking between multiple services reporting settings with the same name.
- * Code-sharing would require extracting {@link
- * android.content.pm.RegisteredServicesCache#parseServiceAttributes(android.content.res.Resources,
- * String, android.util.AttributeSet)} into an interface, which didn't seem worth it.
- */
-class SettingsInjector {
-    static final String TAG = "SettingsInjector";
-
-    /**
-     * If reading the status of a setting takes longer than this, we go ahead and start reading
-     * the next setting.
-     */
-    private static final long INJECTED_STATUS_UPDATE_TIMEOUT_MILLIS = 1000;
-
-    /**
-     * {@link Message#what} value for starting to load status values
-     * in case we aren't already in the process of loading them.
-     */
-    private static final int WHAT_RELOAD = 1;
-
-    /**
-     * {@link Message#what} value sent after receiving a status message.
-     */
-    private static final int WHAT_RECEIVED_STATUS = 2;
-
-    /**
-     * {@link Message#what} value sent after the timeout waiting for a status message.
-     */
-    private static final int WHAT_TIMEOUT = 3;
-
-    private final Context mContext;
-
-    /**
-     * The settings that were injected
-     */
-    private final Set<Setting> mSettings;
-
-    private final Handler mHandler;
-
-    public SettingsInjector(Context context) {
-        mContext = context;
-        mSettings = new HashSet<Setting>();
-        mHandler = new StatusLoadingHandler();
-    }
-
-    /**
-     * Returns a list for a profile with one {@link InjectedSetting} object for each
-     * {@link android.app.Service} that responds to
-     * {@link SettingInjectorService#ACTION_SERVICE_INTENT} and provides the expected setting
-     * metadata.
-     *
-     * Duplicates some code from {@link android.content.pm.RegisteredServicesCache}.
-     *
-     * TODO: unit test
-     */
-    private List<InjectedSetting> getSettings(final UserHandle userHandle) {
-        PackageManager pm = mContext.getPackageManager();
-        Intent intent = new Intent(SettingInjectorService.ACTION_SERVICE_INTENT);
-
-        final int profileId = userHandle.getIdentifier();
-        List<ResolveInfo> resolveInfos =
-                pm.queryIntentServicesAsUser(intent, PackageManager.GET_META_DATA, profileId);
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Found services for profile id " + profileId + ": " + resolveInfos);
-        }
-        List<InjectedSetting> settings = new ArrayList<InjectedSetting>(resolveInfos.size());
-        for (ResolveInfo resolveInfo : resolveInfos) {
-            try {
-                InjectedSetting setting = parseServiceInfo(resolveInfo, userHandle, pm);
-                if (setting == null) {
-                    Log.w(TAG, "Unable to load service info " + resolveInfo);
-                } else {
-                    settings.add(setting);
-                }
-            } catch (XmlPullParserException e) {
-                Log.w(TAG, "Unable to load service info " + resolveInfo, e);
-            } catch (IOException e) {
-                Log.w(TAG, "Unable to load service info " + resolveInfo, e);
-            }
-        }
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Loaded settings for profile id " + profileId + ": " + settings);
-        }
-
-        return settings;
-    }
-
-    /**
-     * Returns the settings parsed from the attributes of the
-     * {@link SettingInjectorService#META_DATA_NAME} tag, or null.
-     *
-     * Duplicates some code from {@link android.content.pm.RegisteredServicesCache}.
-     */
-    private static InjectedSetting parseServiceInfo(ResolveInfo service, UserHandle userHandle,
-            PackageManager pm) throws XmlPullParserException, IOException {
-
-        ServiceInfo si = service.serviceInfo;
-        ApplicationInfo ai = si.applicationInfo;
-
-        if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
-            if (Log.isLoggable(TAG, Log.WARN)) {
-                Log.w(TAG, "Ignoring attempt to inject setting from app not in system image: "
-                        + service);
-                return null;
-            }
-        }
-
-        XmlResourceParser parser = null;
-        try {
-            parser = si.loadXmlMetaData(pm, SettingInjectorService.META_DATA_NAME);
-            if (parser == null) {
-                throw new XmlPullParserException("No " + SettingInjectorService.META_DATA_NAME
-                        + " meta-data for " + service + ": " + si);
-            }
-
-            AttributeSet attrs = Xml.asAttributeSet(parser);
-
-            int type;
-            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                    && type != XmlPullParser.START_TAG) {
-            }
-
-            String nodeName = parser.getName();
-            if (!SettingInjectorService.ATTRIBUTES_NAME.equals(nodeName)) {
-                throw new XmlPullParserException("Meta-data does not start with "
-                        + SettingInjectorService.ATTRIBUTES_NAME + " tag");
-            }
-
-            Resources res = pm.getResourcesForApplicationAsUser(si.packageName,
-                    userHandle.getIdentifier());
-            return parseAttributes(si.packageName, si.name, userHandle, res, attrs);
-        } catch (PackageManager.NameNotFoundException e) {
-            throw new XmlPullParserException(
-                    "Unable to load resources for package " + si.packageName);
-        } finally {
-            if (parser != null) {
-                parser.close();
-            }
-        }
-    }
-
-    /**
-     * Returns an immutable representation of the static attributes for the setting, or null.
-     */
-    private static InjectedSetting parseAttributes(String packageName, String className,
-            UserHandle userHandle, Resources res, AttributeSet attrs) {
-
-        TypedArray sa = res.obtainAttributes(attrs, android.R.styleable.SettingInjectorService);
-        try {
-            // Note that to help guard against malicious string injection, we do not allow dynamic
-            // specification of the label (setting title)
-            final String title = sa.getString(android.R.styleable.SettingInjectorService_title);
-            final int iconId =
-                    sa.getResourceId(android.R.styleable.SettingInjectorService_icon, 0);
-            final String settingsActivity =
-                    sa.getString(android.R.styleable.SettingInjectorService_settingsActivity);
-            final String userRestriction = sa.getString(
-                    android.R.styleable.SettingInjectorService_userRestriction);
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "parsed title: " + title + ", iconId: " + iconId
-                        + ", settingsActivity: " + settingsActivity);
-            }
-            return new InjectedSetting.Builder()
-                    .setPackageName(packageName)
-                    .setClassName(className)
-                    .setTitle(title)
-                    .setIconId(iconId)
-                    .setUserHandle(userHandle)
-                    .setSettingsActivity(settingsActivity)
-                    .setUserRestriction(userRestriction)
-                    .build();
-        } finally {
-            sa.recycle();
-        }
-    }
-
-    /**
-     * Gets a list of preferences that other apps have injected.
-     *
-     * @param profileId Identifier of the user/profile to obtain the injected settings for or
-     *                  UserHandle.USER_CURRENT for all profiles associated with current user.
-     */
-    public List<Preference> getInjectedSettings(Context prefContext, final int profileId) {
-        final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-        final List<UserHandle> profiles = um.getUserProfiles();
-        ArrayList<Preference> prefs = new ArrayList<>();
-        final int profileCount = profiles.size();
-        for (int i = 0; i < profileCount; ++i) {
-            final UserHandle userHandle = profiles.get(i);
-            if (profileId == UserHandle.USER_CURRENT || profileId == userHandle.getIdentifier()) {
-                Iterable<InjectedSetting> settings = getSettings(userHandle);
-                for (InjectedSetting setting : settings) {
-                    Preference pref = addServiceSetting(prefContext, prefs, setting);
-                    mSettings.add(new Setting(setting, pref));
-                }
-            }
-        }
-
-        reloadStatusMessages();
-
-        return prefs;
-    }
-
-    /**
-     * Checks wheteher there is any preference that other apps have injected.
-     *
-     * @param profileId Identifier of the user/profile to obtain the injected settings for or
-     *                  UserHandle.USER_CURRENT for all profiles associated with current user.
-     */
-    public boolean hasInjectedSettings(final int profileId) {
-        final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-        final List<UserHandle> profiles = um.getUserProfiles();
-        final int profileCount = profiles.size();
-        for (int i = 0; i < profileCount; ++i) {
-            final UserHandle userHandle = profiles.get(i);
-            if (profileId == UserHandle.USER_CURRENT || profileId == userHandle.getIdentifier()) {
-                Iterable<InjectedSetting> settings = getSettings(userHandle);
-                for (InjectedSetting setting : settings) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Reloads the status messages for all the preference items.
-     */
-    public void reloadStatusMessages() {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "reloadingStatusMessages: " + mSettings);
-        }
-        mHandler.sendMessage(mHandler.obtainMessage(WHAT_RELOAD));
-    }
-
-    /**
-     * Adds an injected setting to the root.
-     */
-    private Preference addServiceSetting(Context prefContext, List<Preference> prefs,
-            InjectedSetting info) {
-        final PackageManager pm = mContext.getPackageManager();
-        Drawable appIcon = null;
-        try {
-            final PackageItemInfo itemInfo = new PackageItemInfo();
-            itemInfo.icon = info.iconId;
-            itemInfo.packageName = info.packageName;
-            final ApplicationInfo appInfo = pm.getApplicationInfo(info.packageName,
-                PackageManager.GET_META_DATA);
-            appIcon = IconDrawableFactory.newInstance(mContext)
-                .getBadgedIcon(itemInfo, appInfo, info.mUserHandle.getIdentifier());
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Can't get ApplicationInfo for " + info.packageName, e);
-        }
-        Preference pref = TextUtils.isEmpty(info.userRestriction)
-                ? new AppPreference(prefContext)
-                : new RestrictedAppPreference(prefContext, info.userRestriction);
-        pref.setTitle(info.title);
-        pref.setSummary(null);
-        pref.setIcon(appIcon);
-        pref.setOnPreferenceClickListener(new ServiceSettingClickedListener(info));
-        prefs.add(pref);
-        return pref;
-    }
-
-    private class ServiceSettingClickedListener
-            implements Preference.OnPreferenceClickListener {
-        private InjectedSetting mInfo;
-
-        public ServiceSettingClickedListener(InjectedSetting info) {
-            mInfo = info;
-        }
-
-        @Override
-        public boolean onPreferenceClick(Preference preference) {
-            // Activity to start if they click on the preference. Must start in new task to ensure
-            // that "android.settings.LOCATION_SOURCE_SETTINGS" brings user back to
-            // Settings > Location.
-            Intent settingIntent = new Intent();
-            settingIntent.setClassName(mInfo.packageName, mInfo.settingsActivity);
-            // Sometimes the user may navigate back to "Settings" and launch another different
-            // injected setting after one injected setting has been launched.
-            //
-            // FLAG_ACTIVITY_CLEAR_TOP allows multiple Activities to stack on each other. When
-            // "back" button is clicked, the user will navigate through all the injected settings
-            // launched before. Such behavior could be quite confusing sometimes.
-            //
-            // In order to avoid such confusion, we use FLAG_ACTIVITY_CLEAR_TASK, which always clear
-            // up all existing injected settings and make sure that "back" button always brings the
-            // user back to "Settings" directly.
-            settingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-            mContext.startActivityAsUser(settingIntent, mInfo.mUserHandle);
-            return true;
-        }
-    }
-
-    /**
-     * Loads the setting status values one at a time. Each load starts a subclass of {@link
-     * SettingInjectorService}, so to reduce memory pressure we don't want to load too many at
-     * once.
-     */
-    private final class StatusLoadingHandler extends Handler {
-
-        /**
-         * Settings whose status values need to be loaded. A set is used to prevent redundant loads.
-         */
-        private Set<Setting> mSettingsToLoad = new HashSet<Setting>();
-
-        /**
-         * Settings that are being loaded now and haven't timed out. In practice this should have
-         * zero or one elements.
-         */
-        private Set<Setting> mSettingsBeingLoaded = new HashSet<Setting>();
-
-        /**
-         * Settings that are being loaded but have timed out. If only one setting has timed out, we
-         * will go ahead and start loading the next setting so that one slow load won't delay the
-         * load of the other settings.
-         */
-        private Set<Setting> mTimedOutSettings = new HashSet<Setting>();
-
-        private boolean mReloadRequested;
-
-        private StatusLoadingHandler() {
-            super(Looper.getMainLooper());
-        }
-        @Override
-        public void handleMessage(Message msg) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "handleMessage start: " + msg + ", " + this);
-            }
-
-            // Update state in response to message
-            switch (msg.what) {
-                case WHAT_RELOAD:
-                    mReloadRequested = true;
-                    break;
-                case WHAT_RECEIVED_STATUS:
-                    final Setting receivedSetting = (Setting) msg.obj;
-                    receivedSetting.maybeLogElapsedTime();
-                    mSettingsBeingLoaded.remove(receivedSetting);
-                    mTimedOutSettings.remove(receivedSetting);
-                    removeMessages(WHAT_TIMEOUT, receivedSetting);
-                    break;
-                case WHAT_TIMEOUT:
-                    final Setting timedOutSetting = (Setting) msg.obj;
-                    mSettingsBeingLoaded.remove(timedOutSetting);
-                    mTimedOutSettings.add(timedOutSetting);
-                    if (Log.isLoggable(TAG, Log.WARN)) {
-                        Log.w(TAG, "Timed out after " + timedOutSetting.getElapsedTime()
-                                + " millis trying to get status for: " + timedOutSetting);
-                    }
-                    break;
-                default:
-                    Log.wtf(TAG, "Unexpected what: " + msg);
-            }
-
-            // Decide whether to load additional settings based on the new state. Start by seeing
-            // if we have headroom to load another setting.
-            if (mSettingsBeingLoaded.size() > 0 || mTimedOutSettings.size() > 1) {
-                // Don't load any more settings until one of the pending settings has completed.
-                // To reduce memory pressure, we want to be loading at most one setting (plus at
-                // most one timed-out setting) at a time. This means we'll be responsible for
-                // bringing in at most two services.
-                if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, "too many services already live for " + msg + ", " + this);
-                }
-                return;
-            }
-
-            if (mReloadRequested && mSettingsToLoad.isEmpty() && mSettingsBeingLoaded.isEmpty()
-                    && mTimedOutSettings.isEmpty()) {
-                if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, "reloading because idle and reload requesteed " + msg + ", " + this);
-                }
-                // Reload requested, so must reload all settings
-                mSettingsToLoad.addAll(mSettings);
-                mReloadRequested = false;
-            }
-
-            // Remove the next setting to load from the queue, if any
-            Iterator<Setting> iter = mSettingsToLoad.iterator();
-            if (!iter.hasNext()) {
-                if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, "nothing left to do for " + msg + ", " + this);
-                }
-                return;
-            }
-            Setting setting = iter.next();
-            iter.remove();
-
-            // Request the status value
-            setting.startService();
-            mSettingsBeingLoaded.add(setting);
-
-            // Ensure that if receiving the status value takes too long, we start loading the
-            // next value anyway
-            Message timeoutMsg = obtainMessage(WHAT_TIMEOUT, setting);
-            sendMessageDelayed(timeoutMsg, INJECTED_STATUS_UPDATE_TIMEOUT_MILLIS);
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "handleMessage end " + msg + ", " + this
-                        + ", started loading " + setting);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return "StatusLoadingHandler{" +
-                    "mSettingsToLoad=" + mSettingsToLoad +
-                    ", mSettingsBeingLoaded=" + mSettingsBeingLoaded +
-                    ", mTimedOutSettings=" + mTimedOutSettings +
-                    ", mReloadRequested=" + mReloadRequested +
-                    '}';
-        }
-    }
-
-    /**
-     * Represents an injected setting and the corresponding preference.
-     */
-    private final class Setting {
-
-        public final InjectedSetting setting;
-        public final Preference preference;
-        public long startMillis;
-
-        private Setting(InjectedSetting setting, Preference preference) {
-            this.setting = setting;
-            this.preference = preference;
-        }
-
-        @Override
-        public String toString() {
-            return "Setting{" +
-                    "setting=" + setting +
-                    ", preference=" + preference +
-                    '}';
-        }
-
-        /**
-         * Returns true if they both have the same {@link #setting} value. Ignores mutable
-         * {@link #preference} and {@link #startMillis} so that it's safe to use in sets.
-         */
-        @Override
-        public boolean equals(Object o) {
-            return this == o || o instanceof Setting && setting.equals(((Setting) o).setting);
-        }
-
-        @Override
-        public int hashCode() {
-            return setting.hashCode();
-        }
-
-        /**
-         * Starts the service to fetch for the current status for the setting, and updates the
-         * preference when the service replies.
-         */
-        public void startService() {
-            final ActivityManager am = (ActivityManager)
-                    mContext.getSystemService(Context.ACTIVITY_SERVICE);
-            if (!am.isUserRunning(setting.mUserHandle.getIdentifier())) {
-                if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, "Cannot start service as user "
-                            + setting.mUserHandle.getIdentifier() + " is not running");
-                }
-                return;
-            }
-            Handler handler = new Handler() {
-                @Override
-                public void handleMessage(Message msg) {
-                    Bundle bundle = msg.getData();
-                    boolean enabled = bundle.getBoolean(SettingInjectorService.ENABLED_KEY, true);
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, setting + ": received " + msg + ", bundle: " + bundle);
-                    }
-                    preference.setSummary(null);
-                    preference.setEnabled(enabled);
-                    mHandler.sendMessage(
-                            mHandler.obtainMessage(WHAT_RECEIVED_STATUS, Setting.this));
-                }
-            };
-            Messenger messenger = new Messenger(handler);
-
-            Intent intent = setting.getServiceIntent();
-            intent.putExtra(SettingInjectorService.MESSENGER_KEY, messenger);
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, setting + ": sending update intent: " + intent
-                        + ", handler: " + handler);
-                startMillis = SystemClock.elapsedRealtime();
-            } else {
-                startMillis = 0;
-            }
-
-            // Start the service, making sure that this is attributed to the user associated with
-            // the setting rather than the system user.
-            mContext.startServiceAsUser(intent, setting.mUserHandle);
-        }
-
-        public long getElapsedTime() {
-            long end = SystemClock.elapsedRealtime();
-            return end - startMillis;
-        }
-
-        public void maybeLogElapsedTime() {
-            if (Log.isLoggable(TAG, Log.DEBUG) && startMillis != 0) {
-                long elapsed = getElapsedTime();
-                Log.d(TAG, this + " update took " + elapsed + " millis");
-            }
-        }
-    }
-}
diff --git a/src/com/android/settings/network/ApnEditor.java b/src/com/android/settings/network/ApnEditor.java
index 3b4189b..91a094f 100644
--- a/src/com/android/settings/network/ApnEditor.java
+++ b/src/com/android/settings/network/ApnEditor.java
@@ -18,7 +18,6 @@
 
 import static android.content.Context.TELEPHONY_SERVICE;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.ContentValues;
 import android.content.Context;
@@ -55,6 +54,7 @@
 import java.util.Set;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.EditTextPreference;
 import androidx.preference.ListPreference;
 import androidx.preference.MultiSelectListPreference;
diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java
index 31a8435..27e1a98 100644
--- a/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -19,7 +19,6 @@
         .MANAGE_MOBILE_PLAN_DIALOG_ID;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.icu.text.ListFormatter;
@@ -44,6 +43,7 @@
 import java.util.List;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 @SearchIndexable
diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
index 3a04ade..ad90e72 100644
--- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
+++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
@@ -22,7 +22,6 @@
 import static android.system.OsConstants.AF_INET;
 import static android.system.OsConstants.AF_INET6;
 
-import android.app.AlertDialog;
 import android.content.ActivityNotFoundException;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -52,6 +51,7 @@
 import java.util.Map;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * Dialog to set the Private DNS
@@ -72,7 +72,7 @@
         PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME, R.id.private_dns_mode_provider);
     }
 
-    private static final int[] ADDRESS_FAMILIES = new int[]{AF_INET, AF_INET6};
+    private static final int[] ADDRESS_FAMILIES = new int[] {AF_INET, AF_INET6};
 
     @VisibleForTesting
     static final String MODE_KEY = Settings.Global.PRIVATE_DNS_MODE;
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index 2b5a8ab..7120cf6 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -27,6 +27,7 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.RingtonePreference;
+import com.android.settings.core.OnActivityResultListener;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -44,7 +45,8 @@
 import androidx.preference.Preference;
 
 @SearchIndexable
-public class ConfigureNotificationSettings extends DashboardFragment {
+public class ConfigureNotificationSettings extends DashboardFragment implements
+        OnActivityResultListener {
     private static final String TAG = "ConfigNotiSettings";
 
     @VisibleForTesting
diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java
index 17739f9..9bfbd2c 100644
--- a/src/com/android/settings/notification/NotificationAccessSettings.java
+++ b/src/com/android/settings/notification/NotificationAccessSettings.java
@@ -16,17 +16,18 @@
 
 package com.android.settings.notification;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.NotificationManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService;
 
+import android.widget.Toast;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
@@ -40,6 +41,7 @@
 import java.util.List;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 /**
@@ -62,6 +64,18 @@
     private NotificationManager mNm;
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        final Context ctx = getContext();
+        if (UserManager.get(ctx).isManagedProfile()) {
+            // Apps in the work profile do not support notification listeners.
+            Toast.makeText(ctx, R.string.notification_settings_work_profile, Toast.LENGTH_SHORT)
+                .show();
+            finish();
+        }
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsEvent.NOTIFICATION_ACCESS;
     }
diff --git a/src/com/android/settings/notification/NotificationLockscreenPreference.java b/src/com/android/settings/notification/NotificationLockscreenPreference.java
index af912af..3370f3e 100644
--- a/src/com/android/settings/notification/NotificationLockscreenPreference.java
+++ b/src/com/android/settings/notification/NotificationLockscreenPreference.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.notification;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -36,6 +35,7 @@
 import com.android.settings.Utils;
 import com.android.settingslib.RestrictedLockUtils;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AlertDialog.Builder;
 
 public class NotificationLockscreenPreference extends RestrictedListPreference {
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index dafc538..cc3b7c9 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -31,6 +31,7 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.RingtonePreference;
+import com.android.settings.core.OnActivityResultListener;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.sound.HandsFreeProfileOutputPreferenceController;
@@ -51,7 +52,7 @@
 import androidx.preference.Preference;
 
 @SearchIndexable
-public class SoundSettings extends DashboardFragment {
+public class SoundSettings extends DashboardFragment implements OnActivityResultListener {
     private static final String TAG = "SoundSettings";
 
     private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
diff --git a/src/com/android/settings/notification/WorkSoundPreferenceController.java b/src/com/android/settings/notification/WorkSoundPreferenceController.java
index 44796f8..26cd8aa 100644
--- a/src/com/android/settings/notification/WorkSoundPreferenceController.java
+++ b/src/com/android/settings/notification/WorkSoundPreferenceController.java
@@ -17,7 +17,6 @@
 package com.android.settings.notification;
 
 import android.annotation.UserIdInt;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -47,6 +46,7 @@
 import java.util.List;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentManager;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
diff --git a/src/com/android/settings/notification/ZenAccessSettings.java b/src/com/android/settings/notification/ZenAccessSettings.java
index 4af8158..2e4bb4e 100644
--- a/src/com/android/settings/notification/ZenAccessSettings.java
+++ b/src/com/android/settings/notification/ZenAccessSettings.java
@@ -18,7 +18,6 @@
 
 import android.annotation.Nullable;
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.app.AppGlobals;
 import android.app.Dialog;
 import android.app.NotificationManager;
@@ -58,6 +57,7 @@
 import java.util.List;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.PreferenceScreen;
diff --git a/src/com/android/settings/notification/ZenDeleteRuleDialog.java b/src/com/android/settings/notification/ZenDeleteRuleDialog.java
index 2783e3b..c460d84 100644
--- a/src/com/android/settings/notification/ZenDeleteRuleDialog.java
+++ b/src/com/android/settings/notification/ZenDeleteRuleDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.notification;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -26,6 +25,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 public class ZenDeleteRuleDialog extends InstrumentedDialogFragment {
diff --git a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
index 56f9081..3cfd13d 100644
--- a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
+++ b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.notification;
 
-import android.app.AlertDialog;
 import android.app.AutomaticZenRule;
 import android.app.Dialog;
 import android.app.TimePickerDialog;
@@ -42,6 +41,7 @@
 import java.util.Calendar;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentManager;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceClickListener;
diff --git a/src/com/android/settings/notification/ZenRuleNameDialog.java b/src/com/android/settings/notification/ZenRuleNameDialog.java
index 4314454..62c83cd 100644
--- a/src/com/android/settings/notification/ZenRuleNameDialog.java
+++ b/src/com/android/settings/notification/ZenRuleNameDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.notification;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -32,6 +31,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 public class ZenRuleNameDialog extends InstrumentedDialogFragment {
diff --git a/src/com/android/settings/notification/ZenRuleSelectionDialog.java b/src/com/android/settings/notification/ZenRuleSelectionDialog.java
index 40b79f7..b1a3939 100644
--- a/src/com/android/settings/notification/ZenRuleSelectionDialog.java
+++ b/src/com/android/settings/notification/ZenRuleSelectionDialog.java
@@ -18,7 +18,6 @@
 
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.NotificationManager;
 import android.content.Context;
@@ -47,6 +46,7 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 public class ZenRuleSelectionDialog extends InstrumentedDialogFragment {
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 3e478d1..3dc4068 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -23,7 +23,6 @@
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
@@ -63,6 +62,7 @@
 
 import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.preference.Preference;
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
index fc1fab0..0f6eeb3 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
@@ -20,7 +20,6 @@
 import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.app.ActivityOptions;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.IActivityManager;
 import android.app.KeyguardManager;
@@ -53,6 +52,7 @@
 import com.android.settings.biometrics.fingerprint.FingerprintUiHelper;
 import com.android.settings.core.InstrumentedFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/settings/password/SetupSkipDialog.java b/src/com/android/settings/password/SetupSkipDialog.java
index 98a2482..c93d12d 100644
--- a/src/com/android/settings/password/SetupSkipDialog.java
+++ b/src/com/android/settings/password/SetupSkipDialog.java
@@ -17,7 +17,6 @@
 package com.android.settings.password;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -27,6 +26,7 @@
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
 import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentManager;
 
 public class SetupSkipDialog extends InstrumentedDialogFragment
diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java
index 4629360..1311be0 100644
--- a/src/com/android/settings/print/PrintServiceSettingsFragment.java
+++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java
@@ -22,9 +22,6 @@
 import android.content.Intent;
 import android.content.IntentSender.SendIntentException;
 import android.content.pm.ResolveInfo;
-import android.database.DataSetObserver;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.print.PrintManager;
@@ -44,13 +41,10 @@
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityManager;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
 import android.widget.Filter;
 import android.widget.Filterable;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.ListView;
 import android.widget.SearchView;
 import android.widget.Switch;
 import android.widget.TextView;
@@ -67,8 +61,11 @@
 import java.util.List;
 import java.util.Map;
 
+import androidx.annotation.NonNull;
 import androidx.loader.app.LoaderManager;
 import androidx.loader.content.Loader;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;
 
 /**
  * Fragment with print service settings.
@@ -77,23 +74,18 @@
         implements SwitchBar.OnSwitchChangeListener,
         LoaderManager.LoaderCallbacks<List<PrintServiceInfo>> {
 
-    private static final String LOG_TAG = "PrintServiceSettingsFragment";
+    private static final String LOG_TAG = "PrintServiceSettings";
 
     private static final int LOADER_ID_PRINTERS_LOADER = 1;
     private static final int LOADER_ID_PRINT_SERVICE_LOADER = 2;
 
-    private final DataSetObserver mDataObserver = new DataSetObserver() {
+    private final AdapterDataObserver mDataObserver = new AdapterDataObserver() {
         @Override
         public void onChanged() {
             invalidateOptionsMenuIfNeeded();
             updateEmptyView();
         }
 
-        @Override
-        public void onInvalidated() {
-            invalidateOptionsMenuIfNeeded();
-        }
-
         private void invalidateOptionsMenuIfNeeded() {
             final int unfilteredItemCount = mPrintersAdapter.getUnfilteredCount();
             if ((mLastUnfilteredItemCount <= 0 && unfilteredItemCount > 0)
@@ -173,8 +165,6 @@
         super.onViewCreated(view, savedInstanceState);
         initComponents();
         updateUiForArguments();
-        getListView().setVisibility(View.GONE);
-        getBackupListView().setVisibility(View.VISIBLE);
     }
 
     @Override
@@ -189,15 +179,11 @@
                 .setPrintServiceEnabled(mComponentName, enabled);
     }
 
-    private ListView getBackupListView() {
-        return (ListView) getView().findViewById(R.id.backup_list);
-    }
-
     private void updateEmptyView() {
         ViewGroup contentRoot = (ViewGroup) getListView().getParent();
-        View emptyView = getBackupListView().getEmptyView();
+        View emptyView = getEmptyView();
         if (!mToggleSwitch.isChecked()) {
-            if (emptyView != null && emptyView.getId() != R.id.empty_print_state) {
+            if (emptyView != null) {
                 contentRoot.removeView(emptyView);
                 emptyView = null;
             }
@@ -209,11 +195,10 @@
                 TextView textView = (TextView) emptyView.findViewById(R.id.message);
                 textView.setText(R.string.print_service_disabled);
                 contentRoot.addView(emptyView);
-                getBackupListView().setEmptyView(emptyView);
+                setEmptyView(emptyView);
             }
         } else if (mPrintersAdapter.getUnfilteredCount() <= 0) {
-            if (emptyView != null
-                    && emptyView.getId() != R.id.empty_printers_list_service_enabled) {
+            if (emptyView != null) {
                 contentRoot.removeView(emptyView);
                 emptyView = null;
             }
@@ -221,10 +206,10 @@
                 emptyView = getActivity().getLayoutInflater().inflate(
                         R.layout.empty_printers_list_service_enabled, contentRoot, false);
                 contentRoot.addView(emptyView);
-                getBackupListView().setEmptyView(emptyView);
+                setEmptyView(emptyView);
             }
-        } else if (mPrintersAdapter.getCount() <= 0) {
-            if (emptyView != null && emptyView.getId() != R.id.empty_print_state) {
+        } else if (mPrintersAdapter.getItemCount() <= 0) {
+            if (emptyView != null) {
                 contentRoot.removeView(emptyView);
                 emptyView = null;
             }
@@ -236,7 +221,11 @@
                 TextView textView = (TextView) emptyView.findViewById(R.id.message);
                 textView.setText(R.string.print_no_printers_found);
                 contentRoot.addView(emptyView);
-                getBackupListView().setEmptyView(emptyView);
+                setEmptyView(emptyView);
+            }
+        } else if (mPrintersAdapter.getItemCount() > 0) {
+            if (emptyView != null) {
+                contentRoot.removeView(emptyView);
             }
         }
     }
@@ -254,7 +243,7 @@
 
     private void initComponents() {
         mPrintersAdapter = new PrintersAdapter();
-        mPrintersAdapter.registerDataSetObserver(mDataObserver);
+        mPrintersAdapter.registerAdapterDataObserver(mDataObserver);
 
         final SettingsActivity activity = (SettingsActivity) getActivity();
 
@@ -263,31 +252,12 @@
         mSwitchBar.show();
 
         mToggleSwitch = mSwitchBar.getSwitch();
-        mToggleSwitch.setOnBeforeCheckedChangeListener(new ToggleSwitch.OnBeforeCheckedChangeListener() {
-            @Override
-            public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
-                onPreferenceToggled(mPreferenceKey, checked);
-                return false;
-            }
+        mToggleSwitch.setOnBeforeCheckedChangeListener((toggleSwitch, checked) -> {
+            onPreferenceToggled(mPreferenceKey, checked);
+            return false;
         });
 
-        getBackupListView().setSelector(new ColorDrawable(Color.TRANSPARENT));
-        getBackupListView().setAdapter(mPrintersAdapter);
-        getBackupListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                PrinterInfo printer = (PrinterInfo) mPrintersAdapter.getItem(position);
-
-                if (printer.getInfoIntent() != null) {
-                    try {
-                        getActivity().startIntentSender(printer.getInfoIntent().getIntentSender(),
-                                null, 0, 0, 0);
-                    } catch (SendIntentException e) {
-                        Log.e(LOG_TAG, "Could not execute info intent: %s", e);
-                    }
-                }
-            }
-        });
+        getListView().setAdapter(mPrintersAdapter);
     }
 
 
@@ -446,8 +416,17 @@
         }
     }
 
-    private final class PrintersAdapter extends BaseAdapter
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+
+        public ViewHolder(@NonNull View itemView) {
+            super(itemView);
+        }
+    }
+
+
+    private final class PrintersAdapter extends RecyclerView.Adapter<ViewHolder>
             implements LoaderManager.LoaderCallbacks<List<PrinterInfo>>, Filterable {
+
         private final Object mLock = new Object();
 
         private final List<PrinterInfo> mPrinters = new ArrayList<PrinterInfo>();
@@ -509,19 +488,19 @@
                         }
                     }
                     notifyDataSetChanged();
+
                 }
             };
         }
 
         @Override
-        public int getCount() {
+        public int getItemCount() {
             synchronized (mLock) {
                 return mFilteredPrinters.size();
             }
         }
 
-        @Override
-        public Object getItem(int position) {
+        private Object getItem(int position) {
             synchronized (mLock) {
                 return mFilteredPrinters.get(position);
             }
@@ -543,24 +522,27 @@
             return printer.getStatus() != PrinterInfo.STATUS_UNAVAILABLE;
         }
 
+        @NonNull
         @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            if (convertView == null) {
-                convertView = getActivity().getLayoutInflater().inflate(
-                        R.layout.printer_dropdown_item, parent, false);
-            }
+        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+            final View view = LayoutInflater.from(parent.getContext())
+                    .inflate(R.layout.printer_dropdown_item, parent, false);
+            return new ViewHolder(view);
+        }
 
-            convertView.setEnabled(isActionable(position));
+        @Override
+        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+            holder.itemView.setEnabled(isActionable(position));
 
             final PrinterInfo printer = (PrinterInfo) getItem(position);
             CharSequence title = printer.getName();
             CharSequence subtitle = printer.getDescription();
             Drawable icon = printer.loadIcon(getActivity());
 
-            TextView titleView = (TextView) convertView.findViewById(R.id.title);
+            TextView titleView = holder.itemView.findViewById(R.id.title);
             titleView.setText(title);
 
-            TextView subtitleView = (TextView) convertView.findViewById(R.id.subtitle);
+            TextView subtitleView = holder.itemView.findViewById(R.id.subtitle);
             if (!TextUtils.isEmpty(subtitle)) {
                 subtitleView.setText(subtitle);
                 subtitleView.setVisibility(View.VISIBLE);
@@ -569,7 +551,7 @@
                 subtitleView.setVisibility(View.GONE);
             }
 
-            LinearLayout moreInfoView = (LinearLayout) convertView.findViewById(R.id.more_info);
+            LinearLayout moreInfoView = holder.itemView.findViewById(R.id.more_info);
             if (printer.getInfoIntent() != null) {
                 moreInfoView.setVisibility(View.VISIBLE);
                 moreInfoView.setOnClickListener(new OnClickListener() {
@@ -587,7 +569,7 @@
                 moreInfoView.setVisibility(View.GONE);
             }
 
-            ImageView iconView = (ImageView) convertView.findViewById(R.id.icon);
+            ImageView iconView = holder.itemView.findViewById(R.id.icon);
             if (icon != null) {
                 iconView.setVisibility(View.VISIBLE);
                 if (!isActionable(position)) {
@@ -603,7 +585,18 @@
                 iconView.setVisibility(View.GONE);
             }
 
-            return convertView;
+            holder.itemView.setOnClickListener(v -> {
+                PrinterInfo pi = (PrinterInfo) getItem(position);
+
+                if (pi.getInfoIntent() != null) {
+                    try {
+                        getActivity().startIntentSender(pi.getInfoIntent().getIntentSender(),
+                                null, 0, 0, 0);
+                    } catch (SendIntentException e) {
+                        Log.e(LOG_TAG, "Could not execute info intent: %s", e);
+                    }
+                }
+            });
         }
 
         @Override
@@ -642,7 +635,7 @@
                 mFilteredPrinters.clear();
                 mLastSearchString = null;
             }
-            notifyDataSetInvalidated();
+            notifyDataSetChanged();
         }
     }
 
diff --git a/src/com/android/settings/security/ConfigureKeyGuardDialog.java b/src/com/android/settings/security/ConfigureKeyGuardDialog.java
index 3bcfb89..f09e077 100644
--- a/src/com/android/settings/security/ConfigureKeyGuardDialog.java
+++ b/src/com/android/settings/security/ConfigureKeyGuardDialog.java
@@ -17,7 +17,6 @@
 package com.android.settings.security;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.DialogInterface;
@@ -31,6 +30,7 @@
 import com.android.settings.password.ChooseLockGeneric;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 /**
  * Prompt for key guard configuration confirmation.
diff --git a/src/com/android/settings/security/CryptKeeperSettings.java b/src/com/android/settings/security/CryptKeeperSettings.java
index 9766911..b7c5db7 100644
--- a/src/com/android/settings/security/CryptKeeperSettings.java
+++ b/src/com/android/settings/security/CryptKeeperSettings.java
@@ -17,7 +17,6 @@
 package com.android.settings.security;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -42,6 +41,7 @@
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.password.ConfirmLockPattern;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 
 public class CryptKeeperSettings extends InstrumentedPreferenceFragment {
diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java
index e214720..71130ea 100644
--- a/src/com/android/settings/security/LockscreenDashboardFragment.java
+++ b/src/com/android/settings/security/LockscreenDashboardFragment.java
@@ -19,6 +19,8 @@
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.internal.hardware.AmbientDisplayConfiguration;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
@@ -29,6 +31,7 @@
 import com.android.settings.gestures.PickupGesturePreferenceController;
 import com.android.settings.notification.LockScreenNotificationPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.security.screenlock.LockScreenPreferenceController;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.search.SearchIndexable;
@@ -37,8 +40,6 @@
 import java.util.Arrays;
 import java.util.List;
 
-import androidx.annotation.VisibleForTesting;
-
 /**
  * Settings screen for lock screen preference
  */
@@ -157,5 +158,11 @@
                     niks.add(KEY_LOCK_SCREEN_NOTIFICATON_WORK_PROFILE_HEADER);
                     return niks;
                 }
+
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    return new LockScreenPreferenceController(context, "anykey")
+                            .isAvailable();
+                }
             };
 }
diff --git a/src/com/android/settings/security/UnificationConfirmationDialog.java b/src/com/android/settings/security/UnificationConfirmationDialog.java
index f82ece6..e862bd0 100644
--- a/src/com/android/settings/security/UnificationConfirmationDialog.java
+++ b/src/com/android/settings/security/UnificationConfirmationDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.security;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -25,6 +24,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentManager;
 
 public class UnificationConfirmationDialog extends InstrumentedDialogFragment {
diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java
index 853f80d..803e1cf 100644
--- a/src/com/android/settings/sim/SimDialogActivity.java
+++ b/src/com/android/settings/sim/SimDialogActivity.java
@@ -17,7 +17,6 @@
 package com.android.settings.sim;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -45,6 +44,8 @@
 import java.util.Iterator;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
+
 public class SimDialogActivity extends Activity {
     private static String TAG = "SimDialogActivity";
 
diff --git a/src/com/android/settings/sim/SimPreferenceDialog.java b/src/com/android/settings/sim/SimPreferenceDialog.java
index 2b6ebe3..a657a6b 100644
--- a/src/com/android/settings/sim/SimPreferenceDialog.java
+++ b/src/com/android/settings/sim/SimPreferenceDialog.java
@@ -16,7 +16,6 @@
 package com.android.settings.sim;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
@@ -42,6 +41,8 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 
+import androidx.appcompat.app.AlertDialog;
+
 public class SimPreferenceDialog extends Activity {
 
     private Context mContext;
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index da705c9..f6c08ce 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -32,15 +32,15 @@
 import android.util.Log;
 import android.util.Pair;
 
+import com.android.settings.bluetooth.BluetoothSliceBuilder;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.flashlight.FlashlightSliceBuilder;
 import com.android.settings.location.LocationSliceBuilder;
 import com.android.settings.mobilenetwork.Enhanced4gLteSliceHelper;
 import com.android.settings.notification.ZenModeSliceBuilder;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.core.BasePreferenceController;
 import com.android.settings.wifi.WifiSliceBuilder;
 import com.android.settings.wifi.calling.WifiCallingSliceHelper;
-import com.android.settings.bluetooth.BluetoothSliceBuilder;
 import com.android.settingslib.SliceBroadcastRelay;
 import com.android.settingslib.utils.ThreadUtils;
 
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index a56a290..c1c3b8e8 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -49,6 +49,7 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.slice.Slice;
 import androidx.slice.builders.ListBuilder;
@@ -242,7 +243,7 @@
     private static Slice buildToggleSlice(Context context, SliceData sliceData,
             BasePreferenceController controller) {
         final PendingIntent contentIntent = getContentPendingIntent(context, sliceData);
-        final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource());
+        final IconCompat icon = getSafeIcon(context, sliceData);
         final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
         @ColorInt final int color = Utils.getColorAccentDefaultColor(context);
         final TogglePreferenceController toggleController =
@@ -266,7 +267,7 @@
     private static Slice buildIntentSlice(Context context, SliceData sliceData,
             BasePreferenceController controller) {
         final PendingIntent contentIntent = getContentPendingIntent(context, sliceData);
-        final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource());
+        final IconCompat icon = getSafeIcon(context, sliceData);
         final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
         @ColorInt final int color = Utils.getColorAccentDefaultColor(context);
         final List<String> keywords = buildSliceKeywords(sliceData);
@@ -287,7 +288,7 @@
         final SliderPreferenceController sliderController = (SliderPreferenceController) controller;
         final PendingIntent actionIntent = getSliderAction(context, sliceData);
         final PendingIntent contentIntent = getContentPendingIntent(context, sliceData);
-        final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource());
+        final IconCompat icon = getSafeIcon(context, sliceData);
         @ColorInt final int color = Utils.getColorAccentDefaultColor(context);
         final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
         final SliceAction primaryAction = new SliceAction(contentIntent, icon,
@@ -382,4 +383,14 @@
                 .setKeywords(keywords)
                 .build();
     }
+
+    @VisibleForTesting
+    static IconCompat getSafeIcon(Context context, SliceData data) {
+        int iconResource = data.getIconResource();
+
+        if (iconResource == 0) {
+            iconResource = R.drawable.ic_settings;
+        }
+        return IconCompat.createWithResource(context, iconResource);
+    }
 }
diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java
index c13d12c..d21d0c8 100644
--- a/src/com/android/settings/tts/TextToSpeechSettings.java
+++ b/src/com/android/settings/tts/TextToSpeechSettings.java
@@ -20,7 +20,6 @@
 import static android.provider.Settings.Secure.TTS_DEFAULT_RATE;
 import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH;
 
-import android.app.AlertDialog;
 import android.content.ActivityNotFoundException;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -57,6 +56,7 @@
 import java.util.Objects;
 import java.util.Set;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 
diff --git a/src/com/android/settings/tts/TtsEnginePreference.java b/src/com/android/settings/tts/TtsEnginePreference.java
index 84f5b7e..41684c5 100644
--- a/src/com/android/settings/tts/TtsEnginePreference.java
+++ b/src/com/android/settings/tts/TtsEnginePreference.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.tts;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -29,6 +28,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
diff --git a/src/com/android/settings/users/AutoSyncDataPreferenceController.java b/src/com/android/settings/users/AutoSyncDataPreferenceController.java
index 7d840ca..5856f71 100644
--- a/src/com/android/settings/users/AutoSyncDataPreferenceController.java
+++ b/src/com/android/settings/users/AutoSyncDataPreferenceController.java
@@ -16,7 +16,6 @@
 package com.android.settings.users;
 
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -33,6 +32,7 @@
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settingslib.core.AbstractPreferenceController;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
diff --git a/src/com/android/settings/users/EditUserInfoController.java b/src/com/android/settings/users/EditUserInfoController.java
index 072c8cd..6045516 100644
--- a/src/com/android/settings/users/EditUserInfoController.java
+++ b/src/com/android/settings/users/EditUserInfoController.java
@@ -17,7 +17,6 @@
 package com.android.settings.users;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -41,6 +40,7 @@
 
 import java.io.File;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 /**
diff --git a/src/com/android/settings/users/OwnerInfoSettings.java b/src/com/android/settings/users/OwnerInfoSettings.java
index 0f99360..7576917 100644
--- a/src/com/android/settings/users/OwnerInfoSettings.java
+++ b/src/com/android/settings/users/OwnerInfoSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.users;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
@@ -33,6 +32,7 @@
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.security.OwnerInfoPreferenceController.OwnerInfoCallback;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 public class OwnerInfoSettings extends InstrumentedDialogFragment implements OnClickListener {
diff --git a/src/com/android/settings/users/UserDialogs.java b/src/com/android/settings/users/UserDialogs.java
index 3ed383a..137c938 100644
--- a/src/com/android/settings/users/UserDialogs.java
+++ b/src/com/android/settings/users/UserDialogs.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.users;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -34,6 +33,8 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Helper class for displaying dialogs related to user settings.
  */
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 7d84d99..9aa56c2 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -18,7 +18,6 @@
 
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
@@ -79,6 +78,7 @@
 
 import androidx.annotation.VisibleForTesting;
 import androidx.annotation.WorkerThread;
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceScreen;
diff --git a/src/com/android/settings/utils/ManagedServiceSettings.java b/src/com/android/settings/utils/ManagedServiceSettings.java
index 87c6b8e..e222e56 100644
--- a/src/com/android/settings/utils/ManagedServiceSettings.java
+++ b/src/com/android/settings/utils/ManagedServiceSettings.java
@@ -18,7 +18,6 @@
 
 import android.annotation.Nullable;
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
@@ -43,6 +42,7 @@
 
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.preference.PreferenceScreen;
 import androidx.preference.SwitchPreference;
diff --git a/src/com/android/settings/utils/PreferenceGroupChildrenCache.java b/src/com/android/settings/utils/PreferenceGroupChildrenCache.java
new file mode 100644
index 0000000..dcbf4fd
--- /dev/null
+++ b/src/com/android/settings/utils/PreferenceGroupChildrenCache.java
@@ -0,0 +1,59 @@
+/*
+ * 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.utils;
+
+import android.text.TextUtils;
+import android.util.ArrayMap;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+/**
+ * Class that helps track which {@link Preference}s in a {@link PreferenceGroup} are still being
+ * used, and remove unused ones.
+ */
+public class PreferenceGroupChildrenCache {
+
+    private ArrayMap<String, Preference> mPreferenceCache;
+
+    public void cacheRemoveAllPrefs(PreferenceGroup group) {
+        mPreferenceCache = new ArrayMap<>();
+        final int N = group.getPreferenceCount();
+        for (int i = 0; i < N; i++) {
+            Preference p = group.getPreference(i);
+            if (TextUtils.isEmpty(p.getKey())) {
+                continue;
+            }
+            mPreferenceCache.put(p.getKey(), p);
+        }
+    }
+
+    public void removeCachedPrefs(PreferenceGroup group) {
+        for (Preference p : mPreferenceCache.values()) {
+            group.removePreference(p);
+        }
+        mPreferenceCache = null;
+    }
+
+    public Preference getCachedPreference(String key) {
+        return mPreferenceCache != null ? mPreferenceCache.remove(key) : null;
+    }
+
+    public int getCachedCount() {
+        return mPreferenceCache != null ? mPreferenceCache.size() : 0;
+    }
+}
diff --git a/src/com/android/settings/vpn2/AppDialog.java b/src/com/android/settings/vpn2/AppDialog.java
index e41ffef..6641bf3 100644
--- a/src/com/android/settings/vpn2/AppDialog.java
+++ b/src/com/android/settings/vpn2/AppDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.vpn2;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.PackageInfo;
@@ -24,6 +23,8 @@
 
 import com.android.settings.R;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * UI for managing the connection controlled by an app.
  *
diff --git a/src/com/android/settings/vpn2/AppDialogFragment.java b/src/com/android/settings/vpn2/AppDialogFragment.java
index 2f7a6bb..759adbf 100644
--- a/src/com/android/settings/vpn2/AppDialogFragment.java
+++ b/src/com/android/settings/vpn2/AppDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.vpn2;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -34,6 +33,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 /**
diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java
index 145e86f..a141919 100644
--- a/src/com/android/settings/vpn2/AppManagementFragment.java
+++ b/src/com/android/settings/vpn2/AppManagementFragment.java
@@ -18,7 +18,6 @@
 import static android.app.AppOpsManager.OP_ACTIVATE_VPN;
 
 import android.annotation.NonNull;
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.app.Dialog;
 import android.content.Context;
@@ -49,6 +48,7 @@
 import java.util.List;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 import androidx.preference.Preference;
 
diff --git a/src/com/android/settings/vpn2/ConfigDialog.java b/src/com/android/settings/vpn2/ConfigDialog.java
index 4eecd28..376dba7 100644
--- a/src/com/android/settings/vpn2/ConfigDialog.java
+++ b/src/com/android/settings/vpn2/ConfigDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.vpn2;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -39,6 +38,8 @@
 
 import java.net.InetAddress;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Dialog showing information about a VPN configuration. The dialog
  * can be launched to either edit or prompt for credentials to connect
diff --git a/src/com/android/settings/vpn2/ConfigDialogFragment.java b/src/com/android/settings/vpn2/ConfigDialogFragment.java
index 00b22bb..1517bf7 100644
--- a/src/com/android/settings/vpn2/ConfigDialogFragment.java
+++ b/src/com/android/settings/vpn2/ConfigDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.vpn2;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -38,6 +37,8 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
+
 /**
  * Fragment wrapper around a {@link ConfigDialog}.
  */
diff --git a/src/com/android/settings/vpn2/ConfirmLockdownFragment.java b/src/com/android/settings/vpn2/ConfirmLockdownFragment.java
index 5c2c9d7..d73e928 100644
--- a/src/com/android/settings/vpn2/ConfirmLockdownFragment.java
+++ b/src/com/android/settings/vpn2/ConfirmLockdownFragment.java
@@ -15,7 +15,6 @@
  */
 package com.android.settings.vpn2;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -24,6 +23,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 public class ConfirmLockdownFragment extends InstrumentedDialogFragment
diff --git a/src/com/android/settings/wfd/WifiDisplaySettings.java b/src/com/android/settings/wfd/WifiDisplaySettings.java
index 3d8dbde..dbb4e21 100755
--- a/src/com/android/settings/wfd/WifiDisplaySettings.java
+++ b/src/com/android/settings/wfd/WifiDisplaySettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.wfd;
 
-import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -63,6 +62,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
diff --git a/src/com/android/settings/widget/SingleTargetGearPreference.java b/src/com/android/settings/widget/SingleTargetGearPreference.java
index 8def647..b770b6d 100644
--- a/src/com/android/settings/widget/SingleTargetGearPreference.java
+++ b/src/com/android/settings/widget/SingleTargetGearPreference.java
@@ -17,13 +17,13 @@
 package com.android.settings.widget;
 
 import android.content.Context;
-
-import androidx.core.content.res.TypedArrayUtils;
-import androidx.preference.Preference;
 import android.util.AttributeSet;
 
 import com.android.settings.R;
 
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.Preference;
+
 /**
  * A preference with single target and a gear icon on the side.
  */
diff --git a/src/com/android/settings/widget/ValidatedEditTextPreference.java b/src/com/android/settings/widget/ValidatedEditTextPreference.java
index aec362f..76d8bcc 100644
--- a/src/com/android/settings/widget/ValidatedEditTextPreference.java
+++ b/src/com/android/settings/widget/ValidatedEditTextPreference.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.widget;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.text.Editable;
 import android.text.InputType;
@@ -30,6 +29,7 @@
 import com.android.settingslib.CustomEditTextPreferenceCompat;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.PreferenceViewHolder;
 
 /**
diff --git a/src/com/android/settings/widget/VideoPreferenceController.java b/src/com/android/settings/widget/VideoPreferenceController.java
new file mode 100644
index 0000000..457c6df
--- /dev/null
+++ b/src/com/android/settings/widget/VideoPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * 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.widget;
+
+import android.content.Context;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnPause;
+import com.android.settingslib.core.lifecycle.events.OnResume;
+
+import androidx.preference.PreferenceScreen;
+
+public class VideoPreferenceController extends BasePreferenceController implements
+        LifecycleObserver, OnResume, OnPause {
+
+    private VideoPreference mVideoPreference;
+    private boolean mVideoPaused;
+
+    public VideoPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE_UNSEARCHABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mVideoPreference = (VideoPreference) screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public void onPause() {
+        if (mVideoPreference != null) {
+            mVideoPaused = mVideoPreference.isVideoPaused();
+            mVideoPreference.onViewInvisible();
+        }
+    }
+
+    @Override
+    public void onResume() {
+        if (mVideoPreference != null) {
+            mVideoPreference.onViewVisible(mVideoPaused);
+        }
+    }
+
+}
diff --git a/src/com/android/settings/wifi/ChangeWifiStateDetails.java b/src/com/android/settings/wifi/ChangeWifiStateDetails.java
index fbf0d63..899b35d 100644
--- a/src/com/android/settings/wifi/ChangeWifiStateDetails.java
+++ b/src/com/android/settings/wifi/ChangeWifiStateDetails.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.wifi;
 
-import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.os.Bundle;
@@ -29,6 +28,7 @@
 import com.android.settings.wifi.AppStateChangeWifiStateBridge.WifiSettingsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
 import androidx.preference.SwitchPreference;
diff --git a/src/com/android/settings/wifi/LongPressAccessPointPreference.java b/src/com/android/settings/wifi/LongPressAccessPointPreference.java
index 579d848..85fd800 100644
--- a/src/com/android/settings/wifi/LongPressAccessPointPreference.java
+++ b/src/com/android/settings/wifi/LongPressAccessPointPreference.java
@@ -28,12 +28,6 @@
     private final Fragment mFragment;
 
     public LongPressAccessPointPreference(AccessPoint accessPoint, Context context,
-            UserBadgeCache cache, boolean forSavedNetworks, Fragment fragment) {
-        super(accessPoint, context, cache, forSavedNetworks);
-        mFragment = fragment;
-    }
-
-    public LongPressAccessPointPreference(AccessPoint accessPoint, Context context,
             UserBadgeCache cache, boolean forSavedNetworks, int iconResId, Fragment fragment) {
         super(accessPoint, context, cache, iconResId, forSavedNetworks);
         mFragment = fragment;
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
deleted file mode 100644
index ebb493c..0000000
--- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright (C) 2014 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.wifi;
-
-import android.annotation.Nullable;
-import android.app.Activity;
-import android.app.Dialog;
-import android.content.Context;
-import android.icu.text.Collator;
-import android.net.wifi.WifiManager;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.search.Indexable;
-import com.android.settingslib.wifi.AccessPoint;
-import com.android.settingslib.wifi.AccessPointPreference;
-import com.android.settingslib.wifi.WifiSavedConfigUtils;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-/**
- * UI to manage saved networks/access points.
- * TODO(b/64806699): convert to {@link DashboardFragment} with {@link PreferenceController}s
- */
-public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
-        implements Indexable, WifiDialog.WifiDialogListener {
-    private static final String TAG = "SavedAccessPoints";
-    @VisibleForTesting
-    static final int MSG_UPDATE_PREFERENCES = 1;
-    private static final Comparator<AccessPoint> SAVED_NETWORK_COMPARATOR =
-            new Comparator<AccessPoint>() {
-        final Collator mCollator = Collator.getInstance();
-        @Override
-        public int compare(AccessPoint ap1, AccessPoint ap2) {
-            return mCollator.compare(
-                    nullToEmpty(ap1.getConfigName()), nullToEmpty(ap2.getConfigName()));
-        }
-
-        private String nullToEmpty(String string) {
-            return (string == null) ? "" : string;
-        }
-    };
-
-    @VisibleForTesting
-    final WifiManager.ActionListener mForgetListener = new WifiManager.ActionListener() {
-        @Override
-        public void onSuccess() {
-            postUpdatePreference();
-        }
-
-        @Override
-        public void onFailure(int reason) {
-            postUpdatePreference();
-        }
-    };
-
-    @VisibleForTesting
-    final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(android.os.Message msg) {
-            if (msg.what == MSG_UPDATE_PREFERENCES) {
-                initPreferences();
-            }
-        }
-    };
-
-    private final WifiManager.ActionListener mSaveListener = new WifiManager.ActionListener() {
-        @Override
-        public void onSuccess() {
-            postUpdatePreference();
-        }
-        @Override
-        public void onFailure(int reason) {
-            Activity activity = getActivity();
-            if (activity != null) {
-                Toast.makeText(activity,
-                    R.string.wifi_failed_save_message,
-                    Toast.LENGTH_SHORT).show();
-            }
-        }
-    };
-
-    private WifiDialog mDialog;
-    private WifiManager mWifiManager;
-    private AccessPoint mDlgAccessPoint;
-    private Bundle mAccessPointSavedState;
-    private AccessPoint mSelectedAccessPoint;
-    private Preference mAddNetworkPreference;
-
-    private AccessPointPreference.UserBadgeCache mUserBadgeCache;
-
-    // Instance state key
-    private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsEvent.WIFI_SAVED_ACCESS_POINTS;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        addPreferencesFromResource(R.xml.wifi_display_saved_access_points);
-        mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager());
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        initPreferences();
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
-
-        if (savedInstanceState != null) {
-            if (savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
-                mAccessPointSavedState =
-                    savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
-            }
-        }
-    }
-
-    private void initPreferences() {
-        PreferenceScreen preferenceScreen = getPreferenceScreen();
-        final Context context = getPrefContext();
-
-        final List<AccessPoint> accessPoints =
-                WifiSavedConfigUtils.getAllConfigs(context, mWifiManager);
-        Collections.sort(accessPoints, SAVED_NETWORK_COMPARATOR);
-        cacheRemoveAllPrefs(preferenceScreen);
-
-        final int accessPointsSize = accessPoints.size();
-        for (int i = 0; i < accessPointsSize; ++i) {
-            AccessPoint ap = accessPoints.get(i);
-            String key = ap.getKey();
-            LongPressAccessPointPreference preference =
-                    (LongPressAccessPointPreference) getCachedPreference(key);
-            if (preference == null) {
-                preference = new LongPressAccessPointPreference(
-                        ap, context, mUserBadgeCache, true, this);
-                preference.setKey(key);
-                preference.setIcon(null);
-                preferenceScreen.addPreference(preference);
-            }
-            preference.setOrder(i);
-        }
-
-        removeCachedPrefs(preferenceScreen);
-
-        if (mAddNetworkPreference == null) {
-            mAddNetworkPreference = new Preference(getPrefContext());
-            mAddNetworkPreference.setIcon(R.drawable.ic_menu_add_inset);
-            mAddNetworkPreference.setTitle(R.string.wifi_add_network);
-        }
-        mAddNetworkPreference.setOrder(accessPointsSize);
-        preferenceScreen.addPreference(mAddNetworkPreference);
-
-        if(getPreferenceScreen().getPreferenceCount() < 1) {
-            Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!");
-        }
-    }
-
-    private void postUpdatePreference() {
-        if (!mHandler.hasMessages(MSG_UPDATE_PREFERENCES)) {
-            mHandler.sendEmptyMessage(MSG_UPDATE_PREFERENCES);
-        }
-    }
-
-    private void showWifiDialog(@Nullable LongPressAccessPointPreference accessPoint) {
-        if (mDialog != null) {
-            removeDialog(WifiSettings.WIFI_DIALOG_ID);
-            mDialog = null;
-        }
-
-        if (accessPoint != null) {
-            // Save the access point and edit mode
-            mDlgAccessPoint = accessPoint.getAccessPoint();
-        } else {
-            // No access point is selected. Clear saved state.
-            mDlgAccessPoint = null;
-            mAccessPointSavedState = null;
-        }
-
-        showDialog(WifiSettings.WIFI_DIALOG_ID);
-    }
-
-    @Override
-    public Dialog onCreateDialog(int dialogId) {
-        switch (dialogId) {
-            case WifiSettings.WIFI_DIALOG_ID:
-                if (mDlgAccessPoint == null && mAccessPointSavedState == null) {
-                    // Add new network
-                    mDialog = WifiDialog.createFullscreen(getActivity(), this, null,
-                            WifiConfigUiBase.MODE_CONNECT);
-                } else {
-                    // Modify network
-                    if (mDlgAccessPoint == null) {
-                        // Restore AP from save state
-                        mDlgAccessPoint = new AccessPoint(getActivity(), mAccessPointSavedState);
-                        // Reset the saved access point data
-                        mAccessPointSavedState = null;
-                    }
-                    mDialog = WifiDialog.createModal(getActivity(), this, mDlgAccessPoint,
-                            WifiConfigUiBase.MODE_VIEW);
-                }
-                mSelectedAccessPoint = mDlgAccessPoint;
-
-                return mDialog;
-        }
-        return super.onCreateDialog(dialogId);
-    }
-
-    @Override
-    public int getDialogMetricsCategory(int dialogId) {
-        switch (dialogId) {
-            case WifiSettings.WIFI_DIALOG_ID:
-                return MetricsProto.MetricsEvent.DIALOG_WIFI_SAVED_AP_EDIT;
-            default:
-                return 0;
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-
-        // If the dialog is showing, save its state.
-        if (mDialog != null && mDialog.isShowing()) {
-            if (mDlgAccessPoint != null) {
-                mAccessPointSavedState = new Bundle();
-                mDlgAccessPoint.saveWifiState(mAccessPointSavedState);
-                outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
-            }
-        }
-    }
-
-    @Override
-    public void onForget(WifiDialog dialog) {
-        if (mSelectedAccessPoint != null) {
-            if (mSelectedAccessPoint.isPasspointConfig()) {
-                try {
-                    mWifiManager.removePasspointConfiguration(
-                            mSelectedAccessPoint.getPasspointFqdn());
-                } catch (RuntimeException e) {
-                    Log.e(TAG, "Failed to remove Passpoint configuration for "
-                            + mSelectedAccessPoint.getConfigName());
-                }
-                postUpdatePreference();
-            } else {
-                // mForgetListener will call initPreferences upon completion
-                mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, mForgetListener);
-            }
-            mSelectedAccessPoint = null;
-        }
-    }
-
-    @Override
-    public void onSubmit(WifiDialog dialog) {
-        mWifiManager.save(dialog.getController().getConfig(), mSaveListener);
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (preference instanceof LongPressAccessPointPreference) {
-            showWifiDialog((LongPressAccessPointPreference) preference);
-            return true;
-        } else if (preference == mAddNetworkPreference) {
-            showWifiDialog(null);
-            return true;
-        } else {
-            return super.onPreferenceTreeClick(preference);
-        }
-    }
-}
diff --git a/src/com/android/settings/wifi/WifiAPITest.java b/src/com/android/settings/wifi/WifiAPITest.java
index 9fc5ec4..52a54b7 100644
--- a/src/com/android/settings/wifi/WifiAPITest.java
+++ b/src/com/android/settings/wifi/WifiAPITest.java
@@ -18,7 +18,6 @@
 
 import static android.content.Context.WIFI_SERVICE;
 
-import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
@@ -29,6 +28,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
diff --git a/src/com/android/settings/wifi/WifiDialog.java b/src/com/android/settings/wifi/WifiDialog.java
index 79500e0..a487017 100644
--- a/src/com/android/settings/wifi/WifiDialog.java
+++ b/src/com/android/settings/wifi/WifiDialog.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.wifi;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -27,11 +26,17 @@
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.wifi.AccessPoint;
 
-public class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogInterface.OnClickListener {
+import androidx.appcompat.app.AlertDialog;
+
+public class WifiDialog extends AlertDialog implements WifiConfigUiBase,
+        DialogInterface.OnClickListener {
 
     public interface WifiDialogListener {
-        void onForget(WifiDialog dialog);
-        void onSubmit(WifiDialog dialog);
+        default void onForget(WifiDialog dialog) {
+        }
+
+        default void onSubmit(WifiDialog dialog) {
+        }
     }
 
     private static final int BUTTON_SUBMIT = DialogInterface.BUTTON_POSITIVE;
@@ -64,7 +69,7 @@
     }
 
     /* package */ WifiDialog(Context context, WifiDialogListener listener, AccessPoint accessPoint,
-        int mode, int style, boolean hideSubmitButton) {
+            int mode, int style, boolean hideSubmitButton) {
         super(context, style);
         mMode = mode;
         mListener = listener;
@@ -81,7 +86,6 @@
     protected void onCreate(Bundle savedInstanceState) {
         mView = getLayoutInflater().inflate(R.layout.wifi_dialog, null);
         setView(mView);
-        setInverseBackgroundForced(true);
         mController = new WifiConfigController(this, mView, mAccessPoint, mMode);
         super.onCreate(savedInstanceState);
 
@@ -99,8 +103,8 @@
     }
 
     public void onRestoreInstanceState(Bundle savedInstanceState) {
-            super.onRestoreInstanceState(savedInstanceState);
-            mController.updatePassword();
+        super.onRestoreInstanceState(savedInstanceState);
+        mController.updatePassword();
     }
 
     @Override
diff --git a/src/com/android/settings/wifi/WifiPickerActivity.java b/src/com/android/settings/wifi/WifiPickerActivity.java
index ca392ce..f7c4f79 100644
--- a/src/com/android/settings/wifi/WifiPickerActivity.java
+++ b/src/com/android/settings/wifi/WifiPickerActivity.java
@@ -21,6 +21,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.wifi.p2p.WifiP2pSettings;
+import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
 
 import androidx.preference.PreferenceFragmentCompat;
 
diff --git a/src/com/android/settings/wifi/WifiScanModeActivity.java b/src/com/android/settings/wifi/WifiScanModeActivity.java
index 4742f63..cdd4f5f 100644
--- a/src/com/android/settings/wifi/WifiScanModeActivity.java
+++ b/src/com/android/settings/wifi/WifiScanModeActivity.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.wifi;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -30,6 +29,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.FragmentActivity;
 
diff --git a/src/com/android/settings/wifi/WifiScanningRequiredFragment.java b/src/com/android/settings/wifi/WifiScanningRequiredFragment.java
index 77636ae..a2e8b0e 100644
--- a/src/com/android/settings/wifi/WifiScanningRequiredFragment.java
+++ b/src/com/android/settings/wifi/WifiScanningRequiredFragment.java
@@ -16,7 +16,6 @@
 package com.android.settings.wifi;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.ActivityNotFoundException;
 import android.content.ContentResolver;
@@ -35,6 +34,7 @@
 import com.android.settingslib.HelpUtils;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
 
 public class WifiScanningRequiredFragment extends InstrumentedDialogFragment implements
         DialogInterface.OnClickListener {
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index e5ff3d9..28e10b2 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -231,7 +231,7 @@
 
         Context prefContext = getPrefContext();
         mAddPreference = new Preference(prefContext);
-        mAddPreference.setIcon(R.drawable.ic_menu_add_inset);
+        mAddPreference.setIcon(R.drawable.ic_menu_add);
         mAddPreference.setTitle(R.string.wifi_add_network);
         mStatusMessagePreference = new LinkablePreference(prefContext);
 
diff --git a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java
index 3fe22c2..55ad183 100644
--- a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java
+++ b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java
@@ -17,7 +17,6 @@
 package com.android.settings.wifi;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.net.wifi.WifiManager;
@@ -46,6 +45,8 @@
 
 import java.io.IOException;
 
+import androidx.appcompat.app.AlertDialog;
+
 class WriteWifiConfigToNfcDialog extends AlertDialog
         implements TextWatcher, View.OnClickListener, CompoundButton.OnCheckedChangeListener {
 
@@ -96,7 +97,6 @@
         mView = getLayoutInflater().inflate(R.layout.write_wifi_config_to_nfc, null);
 
         setView(mView);
-        setInverseBackgroundForced(true);
         setTitle(R.string.setup_wifi_nfc_tag);
         setCancelable(true);
         setButton(DialogInterface.BUTTON_NEUTRAL,
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index e0868c7..6d34029 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -17,7 +17,6 @@
 package com.android.settings.wifi.calling;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -47,6 +46,7 @@
 import com.android.settings.Utils;
 import com.android.settings.widget.SwitchBar;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceClickListener;
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index d291f9c..bda3b76 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -542,11 +542,6 @@
     }
 
     @Override
-    public void onForget(WifiDialog dialog) {
-        // can't forget network from a 'modify' dialog
-    }
-
-    @Override
     public void onSubmit(WifiDialog dialog) {
         if (dialog.getController() != null) {
             mWifiManager.save(dialog.getController().getConfig(), new WifiManager.ActionListener() {
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index 7ab43c7..3c2fa08 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -17,7 +17,6 @@
 package com.android.settings.wifi.p2p;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -55,6 +54,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java
new file mode 100644
index 0000000..dea4443
--- /dev/null
+++ b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java
@@ -0,0 +1,144 @@
+/*
+ * 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.wifi.savedaccesspoints;
+
+
+import android.content.Context;
+import android.net.wifi.WifiManager;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.utils.PreferenceGroupChildrenCache;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.utils.ThreadUtils;
+import com.android.settingslib.wifi.AccessPoint;
+import com.android.settingslib.wifi.AccessPointPreference;
+import com.android.settingslib.wifi.AccessPointPreference.UserBadgeCache;
+import com.android.settingslib.wifi.WifiSavedConfigUtils;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Controller that manages a PreferenceGroup, which contains a list of saved access points.
+ */
+public class SavedAccessPointsPreferenceController extends BasePreferenceController implements
+        LifecycleObserver, OnStart, Preference.OnPreferenceClickListener,
+        WifiManager.ActionListener {
+
+    private static final String TAG = "SavedAPPrefCtrl";
+
+    private final WifiManager mWifiManager;
+    private final PreferenceGroupChildrenCache mChildrenCache;
+
+    private final UserBadgeCache mUserBadgeCache;
+    private PreferenceGroup mPreferenceGroup;
+    private SavedAccessPointsWifiSettings mHost;
+
+    public SavedAccessPointsPreferenceController(Context context,
+            String preferenceKey) {
+        super(context, preferenceKey);
+        mUserBadgeCache = new AccessPointPreference.UserBadgeCache(context.getPackageManager());
+        mWifiManager = context.getSystemService(WifiManager.class);
+        mChildrenCache = new PreferenceGroupChildrenCache();
+    }
+
+    public SavedAccessPointsPreferenceController setHost(SavedAccessPointsWifiSettings host) {
+        mHost = host;
+        return this;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreferenceGroup = (PreferenceGroup) screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public void onStart() {
+        refreshSavedAccessPoints();
+    }
+
+    public void postRefreshSavedAccessPoints() {
+        ThreadUtils.postOnMainThread(() -> refreshSavedAccessPoints());
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        if (mHost != null) {
+            mHost.showWifiDialog((AccessPointPreference) preference);
+        }
+        return false;
+    }
+
+    @Override
+    public void onSuccess() {
+        postRefreshSavedAccessPoints();
+    }
+
+    @Override
+    public void onFailure(int reason) {
+        postRefreshSavedAccessPoints();
+    }
+
+    @VisibleForTesting
+    void refreshSavedAccessPoints() {
+        if (mPreferenceGroup == null) {
+            Log.w(TAG, "PreferenceGroup is null, skipping.");
+            return;
+        }
+        final Context prefContext = mPreferenceGroup.getContext();
+
+        final List<AccessPoint> accessPoints =
+                WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager);
+        Collections.sort(accessPoints, SavedNetworkComparator.INSTANCE);
+        mChildrenCache.cacheRemoveAllPrefs(mPreferenceGroup);
+
+        final int accessPointsSize = accessPoints.size();
+        for (int i = 0; i < accessPointsSize; ++i) {
+            AccessPoint ap = accessPoints.get(i);
+            String key = ap.getKey();
+            AccessPointPreference preference =
+                    (AccessPointPreference) mChildrenCache.getCachedPreference(key);
+            if (preference == null) {
+                preference = new AccessPointPreference(ap, prefContext, mUserBadgeCache, true);
+                preference.setKey(key);
+                preference.setIcon(null);
+                preference.setOnPreferenceClickListener(this);
+                mPreferenceGroup.addPreference(preference);
+            }
+            preference.setOrder(i);
+        }
+
+        mChildrenCache.removeCachedPrefs(mPreferenceGroup);
+
+        if (mPreferenceGroup.getPreferenceCount() < 1) {
+            Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!");
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java
new file mode 100644
index 0000000..8f14ec2
--- /dev/null
+++ b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2014 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.wifi.savedaccesspoints;
+
+import android.annotation.Nullable;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.wifi.WifiConfigUiBase;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settings.wifi.WifiSettings;
+import com.android.settingslib.wifi.AccessPoint;
+import com.android.settingslib.wifi.AccessPointPreference;
+
+/**
+ * UI to manage saved networks/access points.
+ */
+public class SavedAccessPointsWifiSettings extends DashboardFragment
+        implements WifiDialog.WifiDialogListener, DialogInterface.OnCancelListener {
+
+    private static final String TAG = "SavedAccessPoints";
+
+    private WifiManager mWifiManager;
+    private Bundle mAccessPointSavedState;
+    private AccessPoint mSelectedAccessPoint;
+
+    // Instance state key
+    private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.WIFI_SAVED_ACCESS_POINTS;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.wifi_display_saved_access_points;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mWifiManager = (WifiManager) getContext()
+                .getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+        use(SavedAccessPointsPreferenceController.class)
+                .setHost(this);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState != null) {
+            if (savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
+                mAccessPointSavedState =
+                        savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
+            }
+        }
+    }
+
+    public void showWifiDialog(@Nullable AccessPointPreference accessPoint) {
+        removeDialog(WifiSettings.WIFI_DIALOG_ID);
+
+        if (accessPoint != null) {
+            // Save the access point and edit mode
+            mSelectedAccessPoint = accessPoint.getAccessPoint();
+        } else {
+            // No access point is selected. Clear saved state.
+            mSelectedAccessPoint = null;
+            mAccessPointSavedState = null;
+        }
+
+        showDialog(WifiSettings.WIFI_DIALOG_ID);
+    }
+
+    @Override
+    public Dialog onCreateDialog(int dialogId) {
+        switch (dialogId) {
+            case WifiSettings.WIFI_DIALOG_ID:
+                // Modify network
+                if (mSelectedAccessPoint == null) {
+                    // Restore AP from save state
+                    mSelectedAccessPoint = new AccessPoint(getActivity(), mAccessPointSavedState);
+                    // Reset the saved access point data
+                    mAccessPointSavedState = null;
+                }
+                final WifiDialog dialog = WifiDialog.createModal(
+                        getActivity(), this, mSelectedAccessPoint, WifiConfigUiBase.MODE_VIEW);
+                dialog.setOnCancelListener(this);
+
+                return dialog;
+        }
+        return super.onCreateDialog(dialogId);
+    }
+
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case WifiSettings.WIFI_DIALOG_ID:
+                return MetricsProto.MetricsEvent.DIALOG_WIFI_SAVED_AP_EDIT;
+            default:
+                return 0;
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        // If the dialog is showing (indicated by the existence of mSelectedAccessPoint), then we
+        // save its state.
+        if (mSelectedAccessPoint != null) {
+            mAccessPointSavedState = new Bundle();
+            mSelectedAccessPoint.saveWifiState(mAccessPointSavedState);
+            outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
+        }
+    }
+
+    @Override
+    public void onForget(WifiDialog dialog) {
+        if (mSelectedAccessPoint != null) {
+            if (mSelectedAccessPoint.isPasspointConfig()) {
+                try {
+                    mWifiManager.removePasspointConfiguration(
+                            mSelectedAccessPoint.getPasspointFqdn());
+                } catch (RuntimeException e) {
+                    Log.e(TAG, "Failed to remove Passpoint configuration for "
+                            + mSelectedAccessPoint.getConfigName());
+                }
+                use(SavedAccessPointsPreferenceController.class)
+                        .postRefreshSavedAccessPoints();
+            } else {
+                // mForgetListener will call initPreferences upon completion
+                mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId,
+                        use(SavedAccessPointsPreferenceController.class));
+            }
+            mSelectedAccessPoint = null;
+        }
+    }
+
+    @Override
+    public void onCancel(DialogInterface dialog) {
+        mSelectedAccessPoint = null;
+    }
+}
diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedNetworkComparator.java b/src/com/android/settings/wifi/savedaccesspoints/SavedNetworkComparator.java
new file mode 100644
index 0000000..cff4387
--- /dev/null
+++ b/src/com/android/settings/wifi/savedaccesspoints/SavedNetworkComparator.java
@@ -0,0 +1,40 @@
+/*
+ * 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.wifi.savedaccesspoints;
+
+import android.icu.text.Collator;
+
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.Comparator;
+
+public final class SavedNetworkComparator {
+    public static final Comparator<AccessPoint> INSTANCE =
+            new Comparator<AccessPoint>() {
+                final Collator mCollator = Collator.getInstance();
+
+                @Override
+                public int compare(AccessPoint ap1, AccessPoint ap2) {
+                    return mCollator.compare(
+                            nullToEmpty(ap1.getConfigName()), nullToEmpty(ap2.getConfigName()));
+                }
+
+                private String nullToEmpty(String string) {
+                    return (string == null) ? "" : string;
+                }
+            };
+}
diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider
index a662f2f..37869e9 100644
--- a/tests/robotests/assets/grandfather_not_implementing_index_provider
+++ b/tests/robotests/assets/grandfather_not_implementing_index_provider
@@ -41,7 +41,6 @@
 com.android.settings.fuelgauge.AdvancedPowerUsageDetail
 com.android.settings.fuelgauge.BatteryHistoryDetail
 com.android.settings.fuelgauge.InactiveApps
-com.android.settings.fuelgauge.PowerUsageAnomalyDetails
 com.android.settings.fuelgauge.RestrictedAppDetails
 com.android.settings.IccLockSettings
 com.android.settings.inputmethod.InputMethodAndSubtypeEnabler
@@ -74,5 +73,5 @@
 com.android.settings.wifi.ChangeWifiStateDetails
 com.android.settings.wifi.details.WifiNetworkDetailsFragment
 com.android.settings.wifi.p2p.WifiP2pSettings
-com.android.settings.wifi.SavedAccessPointsWifiSettings
+com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings
 com.android.settings.wifi.WifiInfo
diff --git a/tests/robotests/assets/grandfather_not_implementing_instrumentable b/tests/robotests/assets/grandfather_not_implementing_instrumentable
index 27ab65c..2c8ae5d 100644
--- a/tests/robotests/assets/grandfather_not_implementing_instrumentable
+++ b/tests/robotests/assets/grandfather_not_implementing_instrumentable
@@ -5,5 +5,4 @@
 com.android.settings.password.ChooseLockPattern$SaveAndFinishWorker
 com.android.settings.RestrictedListPreference$RestrictedListPreferenceDialogFragment
 com.android.settings.password.ConfirmDeviceCredentialBaseFragment$LastTryDialog
-com.android.settings.password.CredentialCheckResultTracker
-com.android.settings.localepicker.LocalePickerWithRegion
+com.android.settings.password.CredentialCheckResultTracker
\ No newline at end of file
diff --git a/tests/robotests/res/values/themes.xml b/tests/robotests/res/values/themes.xml
index 74bdd9b..9a247f6 100644
--- a/tests/robotests/res/values/themes.xml
+++ b/tests/robotests/res/values/themes.xml
@@ -1,5 +1,8 @@
 <resources>
-    <style name="Theme.Settings" parent="@android:style/Theme.DeviceDefault.Settings" />
+    <style name="Theme.Settings" parent="@android:style/Theme.DeviceDefault.Settings">
+        <!-- For AndroidX AlertDialogs -->
+        <item name="alertDialogTheme">@style/Theme.AppCompat.DayNight.Dialog.Alert</item>
+    </style>
 
     <!-- Override the main app's style for ActionPrimaryButton to get around lack of new style
          support in robolectric  -->
diff --git a/tests/robotests/src/com/android/settings/RestrictedSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/RestrictedSettingsFragmentTest.java
index 35f9e28..73be107 100644
--- a/tests/robotests/src/com/android/settings/RestrictedSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/RestrictedSettingsFragmentTest.java
@@ -21,7 +21,6 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -31,6 +30,8 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import androidx.appcompat.app.AlertDialog;
+
 @RunWith(SettingsRobolectricTestRunner.class)
 public class RestrictedSettingsFragmentTest {
 
diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
index 1966467..d1033ea 100644
--- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
@@ -26,6 +27,7 @@
 import android.app.ActivityManager;
 import android.content.Intent;
 
+import com.android.settings.core.OnActivityResultListener;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
@@ -35,6 +37,10 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
@@ -65,9 +71,34 @@
     }
 
     @Test
-    public void testSetTaskDescription_IconChanged() {
+    public void setTaskDescription_shouldUpdateIcon() {
         mActivity.setTaskDescription(mTaskDescription);
 
         verify(mTaskDescription).setIcon(anyInt());
     }
+
+    @Test
+    public void onActivityResult_shouldDelegateToListener() {
+        final List<Fragment> fragments = new ArrayList<>();
+        fragments.add(new Fragment());
+        fragments.add(new ListenerFragment());
+
+        final FragmentManager manager = mock(FragmentManager.class);
+        when(mActivity.getSupportFragmentManager()).thenReturn(manager);
+        when(manager.getFragments()).thenReturn(fragments);
+
+        mActivity.onActivityResult(0, 0, new Intent());
+
+        assertThat(((ListenerFragment) fragments.get(1)).mOnActivityResultCalled).isTrue();
+    }
+
+    public static class ListenerFragment extends Fragment implements OnActivityResultListener {
+
+        public boolean mOnActivityResultCalled;
+
+        @Override
+        public void onActivityResult(int requestCode, int resultCode, Intent data) {
+            mOnActivityResultCalled = true;
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/SettingsLicenseActivityTest.java b/tests/robotests/src/com/android/settings/SettingsLicenseActivityTest.java
index 3b3a287..281a6c9 100644
--- a/tests/robotests/src/com/android/settings/SettingsLicenseActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsLicenseActivityTest.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
@@ -30,7 +29,6 @@
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -84,9 +82,7 @@
     }
 
     @Test
-    @Ignore("b/111194177")
     public void testOnCreateWithGeneratedHtmlFile() {
-        doReturn(null).when(mActivity).onCreateLoader(anyInt(), any());
         doReturn(Uri.parse("content://com.android.settings.files/my_cache/generated_test.html"))
                 .when(mActivity).getUriFromGeneratedHtmlFile(any());
 
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
index afbf532..40dcf7a 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
@@ -31,6 +31,7 @@
 import com.android.settings.R;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.Robolectric;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.accounts.AuthenticatorHelper;
 import com.android.settingslib.drawer.CategoryKey;
 
@@ -38,7 +39,6 @@
 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;
 import org.robolectric.annotation.Implementation;
@@ -49,7 +49,7 @@
 
 import androidx.fragment.app.FragmentActivity;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class AccountDashboardFragmentTest {
 
     private AccountDashboardFragment mFragment;
diff --git a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
index 035d74e..0d905aa 100644
--- a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
@@ -22,7 +22,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -52,6 +51,7 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
index de2479a..dac9409 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.applications.appinfo;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
@@ -44,6 +45,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.widget.ActionButtonPreference;
 import com.android.settings.widget.ActionButtonPreferenceTest;
 import com.android.settingslib.applications.AppUtils;
@@ -59,12 +61,11 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.mockito.stubbing.Answer;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.util.ReflectionHelpers;
 
 import androidx.fragment.app.Fragment;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class AppButtonsPreferenceControllerTest {
 
     private static final String PACKAGE_NAME = "com.android.settings";
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/ButtonActionDialogFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/ButtonActionDialogFragmentTest.java
index 98bfcd5..80a696a 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/ButtonActionDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/ButtonActionDialogFragmentTest.java
@@ -21,12 +21,13 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settingslib.testutils.FragmentTestUtils;
 
 import org.junit.Before;
@@ -35,13 +36,13 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.annotation.Config;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class})
 public class ButtonActionDialogFragmentTest {
 
     private static final int FORCE_STOP_ID = ButtonActionDialogFragment.DialogType.FORCE_STOP;
@@ -73,12 +74,12 @@
     @Test
     public void testOnCreateDialog_forceStopDialog() {
         ButtonActionDialogFragment fragment = ButtonActionDialogFragment.newInstance(FORCE_STOP_ID);
-
         FragmentTestUtils.startFragment(fragment);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
         assertThat(dialog).isNotNull();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getMessage()).isEqualTo(
                 mShadowContext.getString(R.string.force_stop_dlg_text));
@@ -93,12 +94,12 @@
     @Test
     public void testOnCreateDialog_disableDialog() {
         ButtonActionDialogFragment fragment = ButtonActionDialogFragment.newInstance(DISABLE_ID);
-
         FragmentTestUtils.startFragment(fragment);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
         assertThat(dialog).isNotNull();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getMessage()).isEqualTo(
                 mShadowContext.getString(R.string.app_disable_dlg_text));
@@ -111,13 +112,13 @@
     @Test
     public void testOnCreateDialog_specialDisableDialog() {
         ButtonActionDialogFragment fragment =
-            ButtonActionDialogFragment.newInstance(SPECIAL_DISABLE_ID);
-
+                ButtonActionDialogFragment.newInstance(SPECIAL_DISABLE_ID);
         FragmentTestUtils.startFragment(fragment);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
         assertThat(dialog).isNotNull();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getMessage()).isEqualTo(
                 mShadowContext.getString(R.string.app_disable_dlg_text));
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 1281b74..6b4a641 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java
@@ -25,24 +25,27 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.PackageManager;
 
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.testutils.FragmentTestUtils;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.annotation.Config;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class})
 public class InstantAppButtonDialogFragmentTest {
 
     private static final String TEST_PACKAGE = "testPackage";
@@ -52,8 +55,10 @@
 
     @Before
     public void setUp() {
+        final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class);
         mContext = spy(RuntimeEnvironment.application);
         mFragment = spy(InstantAppButtonDialogFragment.newInstance(TEST_PACKAGE));
+        mFragment.show(activity.getSupportFragmentManager(), "InstantAppButtonDialogFragment");
         doReturn(mContext).when(mFragment).getContext();
     }
 
@@ -61,7 +66,6 @@
     public void onClick_shouldDeleteApp() {
         final PackageManager packageManager = mock(PackageManager.class);
         when(mContext.getPackageManager()).thenReturn(packageManager);
-        FragmentTestUtils.startFragment(mFragment);
 
         mFragment.onClick(null /* dialog */, 0  /* which */);
 
@@ -71,11 +75,11 @@
 
     @Test
     public void onCreateDialog_clearAppDialog_shouldShowClearAppDataConfirmation() {
-        FragmentTestUtils.startFragment(mFragment);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
         assertThat(dialog).isNotNull();
-        final ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+
+        final ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getMessage()).isEqualTo(
                 mContext.getString(R.string.clear_instant_app_confirmation));
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
index f304b49..57d31cf 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
@@ -29,6 +29,7 @@
 import android.content.pm.PackageManager;
 import android.os.UserManager;
 
+import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
@@ -53,6 +54,8 @@
     private DefaultPhonePicker.DefaultKeyUpdater mDefaultKeyUpdater;
     @Mock
     private PackageManager mPackageManager;
+    @Mock
+    private BatteryUtils mBatteryUtils;
 
     private DefaultPhonePicker mPicker;
 
@@ -66,6 +69,7 @@
 
         ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
         ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater);
+        ReflectionHelpers.setField(mPicker, "mBatteryUtils", mBatteryUtils);
         doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
     }
 
@@ -87,6 +91,14 @@
     @Test
     public void getDefaultAppKey_shouldReturnDefault() {
         mPicker.getDefaultKey();
+
         verify(mDefaultKeyUpdater).getDefaultDialerApplication(any(Context.class), anyInt());
     }
+
+    @Test
+    public void setDefaultKey_shouldUnrestrictApp() {
+        mPicker.setDefaultKey(TEST_APP_KEY);
+
+        verify(mBatteryUtils).clearForceAppStandby(TEST_APP_KEY);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
index 18bb60e..ade62a1 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
@@ -28,6 +28,7 @@
 import android.content.pm.PackageManager;
 import android.os.UserManager;
 
+import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
@@ -52,6 +53,8 @@
     private DefaultSmsPicker.DefaultKeyUpdater mDefaultKeyUpdater;
     @Mock
     private PackageManager mPackageManager;
+    @Mock
+    private BatteryUtils mBatteryUtils;
 
     private DefaultSmsPicker mPicker;
 
@@ -64,6 +67,7 @@
 
         ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
         ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater);
+        ReflectionHelpers.setField(mPicker, "mBatteryUtils", mBatteryUtils);
         doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
     }
 
@@ -80,4 +84,11 @@
 
         verify(mDefaultKeyUpdater).getDefaultApplication(any(Context.class));
     }
+
+    @Test
+    public void setDefaultKey_shouldUnrestrictApp() {
+        mPicker.setDefaultKey(TEST_APP_KEY);
+
+        verify(mBatteryUtils).clearForceAppStandby(TEST_APP_KEY);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index d31e3e0..cc0308c 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -37,6 +37,9 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Looper;
 import android.os.UserManager;
@@ -74,6 +77,14 @@
     private ApplicationsState.Session mSession;
     @Mock
     private Menu mMenu;
+    @Mock
+    private FragmentActivity mActivity;
+    @Mock
+    private Resources mResources;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private PackageManager mPackageManager;
     private MenuItem mAppReset;
     private MenuItem mSortRecent;
     private MenuItem mSortFrequent;
@@ -89,7 +100,11 @@
         when(mState.newSession(any())).thenReturn(mSession);
         when(mState.getBackgroundLooper()).thenReturn(Looper.myLooper());
 
-        mFragment = new ManageApplications();
+        mFragment = spy(new ManageApplications());
+        when(mFragment.getActivity()).thenReturn(mActivity);
+        when(mActivity.getResources()).thenReturn(mResources);
+        when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
+        when(mActivity.getPackageManager()).thenReturn(mPackageManager);
     }
 
     @Test
@@ -126,10 +141,8 @@
 
     @Test
     public void onCreateView_shouldNotShowLoadingContainer() {
-        final ManageApplications fragment = spy(new ManageApplications());
-        ReflectionHelpers.setField(fragment, "mResetAppsHelper",
-                mock(ResetAppsHelper.class));
-        doNothing().when(fragment).createHeader();
+        ReflectionHelpers.setField(mFragment, "mResetAppsHelper", mock(ResetAppsHelper.class));
+        doNothing().when(mFragment).createHeader();
 
         final LayoutInflater layoutInflater = mock(LayoutInflater.class);
         final View view = mock(View.class);
@@ -137,19 +150,17 @@
         when(layoutInflater.inflate(anyInt(), eq(null))).thenReturn(view);
         when(view.findViewById(R.id.loading_container)).thenReturn(loadingContainer);
 
-        fragment.onCreateView(layoutInflater, mock(ViewGroup.class), null);
+        mFragment.onCreateView(layoutInflater, mock(ViewGroup.class), null);
 
         verify(loadingContainer, never()).setVisibility(View.VISIBLE);
     }
 
     @Test
     public void updateLoading_appLoaded_shouldNotDelayCallToHandleLoadingContainer() {
-        final ManageApplications fragment = mock(ManageApplications.class);
-        ReflectionHelpers.setField(fragment, "mLoadingContainer", mock(View.class));
-        ReflectionHelpers.setField(fragment, "mListContainer", mock(View.class));
-        when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class));
+        ReflectionHelpers.setField(mFragment, "mLoadingContainer", mock(View.class));
+        ReflectionHelpers.setField(mFragment, "mListContainer", mock(View.class));
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState, fragment,
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
         final LoadingViewController loadingViewController =
                 mock(LoadingViewController.class);
@@ -168,12 +179,10 @@
 
     @Test
     public void updateLoading_appNotLoaded_shouldDelayCallToHandleLoadingContainer() {
-        final ManageApplications fragment = mock(ManageApplications.class);
-        ReflectionHelpers.setField(fragment, "mLoadingContainer", mock(View.class));
-        ReflectionHelpers.setField(fragment, "mListContainer", mock(View.class));
-        when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class));
+        ReflectionHelpers.setField(mFragment, "mLoadingContainer", mock(View.class));
+        ReflectionHelpers.setField(mFragment, "mListContainer", mock(View.class));
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState, fragment,
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
         final LoadingViewController loadingViewController =
                 mock(LoadingViewController.class);
@@ -200,21 +209,19 @@
     @Test
     public void onRebuildComplete_shouldHideLoadingView() {
         final Context context = RuntimeEnvironment.application;
-        final ManageApplications fragment = mock(ManageApplications.class);
         final RecyclerView recyclerView = mock(RecyclerView.class);
         final View emptyView = mock(View.class);
-        ReflectionHelpers.setField(fragment, "mRecyclerView", recyclerView);
-        ReflectionHelpers.setField(fragment, "mEmptyView", emptyView);
+        ReflectionHelpers.setField(mFragment, "mRecyclerView", recyclerView);
+        ReflectionHelpers.setField(mFragment, "mEmptyView", emptyView);
         final View loadingContainer = mock(View.class);
         when(loadingContainer.getContext()).thenReturn(context);
         final View listContainer = mock(View.class);
         when(listContainer.getVisibility()).thenReturn(View.INVISIBLE);
         when(listContainer.getContext()).thenReturn(context);
-        ReflectionHelpers.setField(fragment, "mLoadingContainer", loadingContainer);
-        ReflectionHelpers.setField(fragment, "mListContainer", listContainer);
-        when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class));
+        ReflectionHelpers.setField(mFragment, "mLoadingContainer", loadingContainer);
+        ReflectionHelpers.setField(mFragment, "mListContainer", listContainer);
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState, fragment,
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
         final LoadingViewController loadingViewController =
                 mock(LoadingViewController.class);
@@ -231,6 +238,8 @@
         final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
         appList.add(mock(ApplicationsState.AppEntry.class));
         when(mSession.getAllApps()).thenReturn(appList);
+        ReflectionHelpers.setField(
+                mFragment, "mFilterAdapter", mock(ManageApplications.FilterSpinnerAdapter.class));
 
         adapter.onRebuildComplete(null);
 
@@ -241,8 +250,7 @@
     public void notifyItemChange_recyclerViewIdle_shouldNotify() {
         final RecyclerView recyclerView = mock(RecyclerView.class);
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState,
-                        mock(ManageApplications.class),
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
 
         adapter.onAttachedToRecyclerView(recyclerView);
@@ -256,8 +264,7 @@
     public void notifyItemChange_recyclerViewScrolling_shouldNotifyWhenIdle() {
         final RecyclerView recyclerView = mock(RecyclerView.class);
         final ManageApplications.ApplicationsAdapter adapter =
-                spy(new ManageApplications.ApplicationsAdapter(mState,
-                        mock(ManageApplications.class),
+                spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
                         AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle()));
 
         adapter.onAttachedToRecyclerView(recyclerView);
@@ -273,20 +280,19 @@
 
     @Test
     public void applicationsAdapter_onBindViewHolder_updateSwitch_notifications() {
-        ManageApplications manageApplications = mock(ManageApplications.class);
-        when(manageApplications.getActivity()).thenReturn(mock(FragmentActivity.class));
-        UserManager um = mock(UserManager.class);
-        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
-        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
-        manageApplications.mListType = LIST_TYPE_NOTIFICATION;
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        mFragment.mListType = LIST_TYPE_NOTIFICATION;
         ApplicationViewHolder holder = mock(ApplicationViewHolder.class);
         ReflectionHelpers.setField(holder, "itemView", mock(View.class));
         ManageApplications.ApplicationsAdapter adapter =
                 new ManageApplications.ApplicationsAdapter(mState,
-                        manageApplications, mock(AppFilterItem.class),
+                    mFragment, mock(AppFilterItem.class),
                         mock(Bundle.class));
         final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
-        appList.add(mock(ApplicationsState.AppEntry.class));
+        final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+        appEntry.info = mock(ApplicationInfo.class);
+        appList.add(appEntry);
         ReflectionHelpers.setField(adapter, "mEntries", appList);
 
         adapter.onBindViewHolder(holder, 0);
@@ -295,19 +301,17 @@
 
     @Test
     public void applicationsAdapter_onBindViewHolder_updateSwitch_notNotifications() {
-        ManageApplications manageApplications = mock(ManageApplications.class);
-        manageApplications.mListType = LIST_TYPE_MAIN;
+        mFragment.mListType = LIST_TYPE_MAIN;
         ApplicationViewHolder holder = mock(ApplicationViewHolder.class);
         ReflectionHelpers.setField(holder, "itemView", mock(View.class));
-        UserManager um = mock(UserManager.class);
-        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
-        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
-        ManageApplications.ApplicationsAdapter adapter =
-                new ManageApplications.ApplicationsAdapter(mState,
-                        manageApplications, mock(AppFilterItem.class),
-                        mock(Bundle.class));
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        ManageApplications.ApplicationsAdapter adapter = new ManageApplications.ApplicationsAdapter(
+                mState, mFragment, mock(AppFilterItem.class), mock(Bundle.class));
         final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
-        appList.add(mock(ApplicationsState.AppEntry.class));
+        final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+        appEntry.info = mock(ApplicationInfo.class);
+        appList.add(appEntry);
         ReflectionHelpers.setField(adapter, "mEntries", appList);
 
         adapter.onBindViewHolder(holder, 0);
@@ -316,23 +320,18 @@
 
     @Test
     public void sortOrderSavedOnRebuild() {
-        ManageApplications manageApplications = mock(ManageApplications.class);
-        when(manageApplications.getActivity()).thenReturn(mock(FragmentActivity.class));
-        UserManager um = mock(UserManager.class);
-        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
-        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
-        manageApplications.mListType = LIST_TYPE_NOTIFICATION;
-        manageApplications.mSortOrder = -1;
-        ManageApplications.ApplicationsAdapter adapter =
-                new ManageApplications.ApplicationsAdapter(mState,
-                        manageApplications, mock(AppFilterItem.class),
-                        mock(Bundle.class));
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        mFragment.mListType = LIST_TYPE_NOTIFICATION;
+        mFragment.mSortOrder = -1;
+        ManageApplications.ApplicationsAdapter adapter = new ManageApplications.ApplicationsAdapter(
+                mState, mFragment, mock(AppFilterItem.class), mock(Bundle.class));
 
         adapter.rebuild(mSortRecent.getItemId());
-        assertThat(manageApplications.mSortOrder).isEqualTo(mSortRecent.getItemId());
+        assertThat(mFragment.mSortOrder).isEqualTo(mSortRecent.getItemId());
 
         adapter.rebuild(mSortFrequent.getItemId());
-        assertThat(manageApplications.mSortOrder).isEqualTo(mSortFrequent.getItemId());
+        assertThat(mFragment.mSortOrder).isEqualTo(mSortFrequent.getItemId());
     }
 
     private void setUpOptionMenus() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
index e85f3f6..6bc143c 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
@@ -17,9 +17,13 @@
 package com.android.settings.applications.specialaccess.deviceadmin;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -39,6 +43,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 public class DeviceAdminAddTest {
@@ -47,7 +52,6 @@
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private DeviceAdminInfo mDeviceAdmin;
-    @Mock
     private BatteryUtils mBatteryUtils;
     private FakeFeatureFactory mFeatureFactory;
     private DeviceAdminAdd mDeviceAdminAdd;
@@ -56,6 +60,8 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
+        mBatteryUtils = spy(BatteryUtils.getInstance(RuntimeEnvironment.application));
+        doNothing().when(mBatteryUtils).setForceAppStandby(anyInt(), anyString(), anyInt());
         mFeatureFactory = FakeFeatureFactory.setupForTest();
         mDeviceAdminAdd = Robolectric.buildActivity(DeviceAdminAdd.class).get();
 
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/DeleteFingerprintDialogTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/DeleteFingerprintDialogTest.java
index cf416d8..9479771 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/DeleteFingerprintDialogTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/DeleteFingerprintDialogTest.java
@@ -26,6 +26,7 @@
 import com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment;
 import com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.DeleteFingerprintDialog;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
 import com.android.settings.testutils.shadow.ShadowFragment;
 import com.android.settingslib.testutils.FragmentTestUtils;
 
@@ -37,7 +38,7 @@
 import org.robolectric.annotation.Config;
 
 @RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = ShadowFragment.class)
+@Config(shadows = {ShadowFragment.class, SettingsShadowResourcesImpl.class})
 public class DeleteFingerprintDialogTest {
 
     @Mock
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 38127ef..797a202 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java
@@ -16,11 +16,9 @@
 
 package com.android.settings.biometrics.fingerprint;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static com.google.common.truth.Truth.assertThat;
 import static org.robolectric.RuntimeEnvironment.application;
 
-import android.app.AlertDialog;
 import android.content.Intent;
 import android.hardware.fingerprint.FingerprintManager;
 import android.widget.Button;
@@ -30,6 +28,8 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowUtils;
 
 import org.junit.After;
@@ -39,12 +39,17 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
+
+import androidx.appcompat.app.AlertDialog;
 
 @RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = {SettingsShadowResources.SettingsShadowTheme.class, ShadowUtils.class})
+@Config(shadows = {
+        SettingsShadowResources.SettingsShadowTheme.class,
+        ShadowUtils.class,
+        ShadowAlertDialogCompat.class,
+        SettingsShadowResourcesImpl.class
+})
 public class SetupFingerprintEnrollFindSensorTest {
 
     @Mock
@@ -75,11 +80,12 @@
         final Button skipButton = activity.findViewById(R.id.skip_button);
         skipButton.performClick();
 
-        final AlertDialog alertDialog = ShadowAlertDialog.getLatestAlertDialog();
-        assertNotNull(alertDialog);
+        final AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
 
-        final ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(alertDialog);
+        final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(
+                alertDialog);
         final int titleRes = R.string.setup_fingerprint_enroll_skip_title;
-        assertEquals(application.getString(titleRes), shadowAlertDialog.getTitle());
+        assertThat(application.getString(titleRes)).isEqualTo(shadowAlertDialog.getTitle());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
index 1162f8e..6256a3d 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
@@ -27,11 +27,14 @@
 import android.bluetooth.BluetoothDevice;
 import android.content.Context;
 import android.os.UserManager;
+import android.view.ContextThemeWrapper;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
@@ -41,9 +44,11 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class})
 public class BluetoothDevicePreferenceTest {
     private static final boolean SHOW_DEVICES_WITHOUT_NAMES = true;
 
@@ -58,7 +63,8 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application.getApplicationContext());
+        Context context = spy(RuntimeEnvironment.application.getApplicationContext());
+        mContext = new ContextThemeWrapper(context, R.style.Theme_Settings);
         mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
         mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
         mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
index ede0b04..6cd924a 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.text.SpannableStringBuilder;
@@ -38,6 +37,8 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settingslib.testutils.FragmentTestUtils;
 
 import org.junit.Before;
@@ -46,9 +47,12 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.annotation.Config;
+
+import androidx.appcompat.app.AlertDialog;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class})
 public class BluetoothPairingDialogTest {
 
     private static final String FILLER = "text that goes in a view";
@@ -434,7 +438,7 @@
         BluetoothPairingDialogFragment fragment = spy(new BluetoothPairingDialogFragment());
         when(fragment.getPairingViewText()).thenReturn(existingText);
         setupFragment(fragment);
-        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
         assertThat(dialog).isNotNull();
         boolean expected = !TextUtils.isEmpty(existingText);
         assertThat(dialog.getButton(Dialog.BUTTON_POSITIVE).isEnabled()).isEqualTo(expected);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
index 37abdcc..8532cc1 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
@@ -24,10 +24,9 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.AlertDialog;
-
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 
 import org.junit.Before;
@@ -37,11 +36,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowDialog;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentActivity;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResourcesImpl.class)
 public class ForgetDeviceDialogFragmentTest {
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
diff --git a/tests/robotests/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragmentTest.java
index d41475f..2533341 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragmentTest.java
@@ -22,13 +22,14 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 import com.android.settingslib.testutils.FragmentTestUtils;
@@ -40,11 +41,15 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
+import androidx.appcompat.app.AlertDialog;
+
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class})
 public class LocalDeviceNameDialogFragmentTest {
+
     @Mock
     private LocalBluetoothManager mManager;
     @Mock
@@ -75,7 +80,7 @@
     @Test
     public void diaglogTriggersShowSoftInput() {
         FragmentTestUtils.startFragment(mFragment);
-        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
         assertThat(dialog).isNotNull();
         View view = dialog.findViewById(R.id.edittext);
         verify(mInputMethodManager).showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/RemoteDeviceNameDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/RemoteDeviceNameDialogFragmentTest.java
index e257a88..0ecd295 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/RemoteDeviceNameDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/RemoteDeviceNameDialogFragmentTest.java
@@ -25,7 +25,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.widget.Button;
 import android.widget.EditText;
@@ -33,6 +32,7 @@
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.testutils.FragmentTestUtils;
 
@@ -42,9 +42,13 @@
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowDialog;
 
+import androidx.appcompat.app.AlertDialog;
+
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResourcesImpl.class)
 public class RemoteDeviceNameDialogFragmentTest {
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
index a4cbc9d..3d7eb13 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
@@ -20,7 +20,9 @@
 import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_FOOTER;
 import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONDITION_DIVIDER;
 import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONTAINER;
+
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -29,6 +31,7 @@
 
 import com.android.settings.dashboard.conditional.AirplaneModeCondition;
 import com.android.settings.dashboard.conditional.Condition;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
 
@@ -37,7 +40,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -48,7 +50,7 @@
 import androidx.recyclerview.widget.DiffUtil;
 import androidx.recyclerview.widget.ListUpdateCallback;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class DashboardDataTest {
 
     private static final String TEST_SUGGESTION_TITLE = "Use fingerprint";
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/HardwareInfoDialogFragmentTest.java b/tests/robotests/src/com/android/settings/deviceinfo/HardwareInfoDialogFragmentTest.java
index e17f6be..23ca244 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/HardwareInfoDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/HardwareInfoDialogFragmentTest.java
@@ -29,14 +29,17 @@
 import com.android.settings.R;
 import com.android.settings.testutils.Robolectric;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
 
 import androidx.fragment.app.FragmentActivity;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResourcesImpl.class)
 public class HardwareInfoDialogFragmentTest {
 
     private FragmentActivity mActivity;
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java
index d1215ec..49025a8 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
 import android.os.storage.VolumeRecord;
@@ -28,6 +27,7 @@
 import com.android.settings.deviceinfo.PrivateVolumeForget.ForgetConfirmFragment;
 import com.android.settings.testutils.Robolectric;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
 import com.android.settings.testutils.shadow.ShadowStorageManager;
 
 import org.junit.After;
@@ -36,10 +36,11 @@
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentActivity;
 
 @RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = ShadowStorageManager.class)
+@Config(shadows = {ShadowStorageManager.class, SettingsShadowResourcesImpl.class})
 public class PrivateVolumeForgetTest {
 
     private PrivateVolumeForget mFragment;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index e6b3499..e486807 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -45,8 +45,6 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.applications.LayoutPreference;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.ShadowActivityManager;
@@ -70,9 +68,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import androidx.fragment.app.FragmentActivity;
 import androidx.loader.app.LoaderManager;
 import androidx.preference.Preference;
@@ -129,8 +124,6 @@
     @Mock
     private LoaderManager mLoaderManager;
     @Mock
-    private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
-    @Mock
     private BatteryStats.Timer mForegroundActivityTimer;
     @Mock
     private BatteryUtils mBatteryUtils;
@@ -139,7 +132,6 @@
     private Preference mBackgroundPreference;
     private AdvancedPowerUsageDetail mFragment;
     private SettingsActivity mTestActivity;
-    private List<Anomaly> mAnomalies;
 
     @Before
     public void setUp() {
@@ -216,11 +208,6 @@
         mBackgroundPreference = new Preference(mContext);
         mFragment.mForegroundPreference = mForegroundPreference;
         mFragment.mBackgroundPreference = mBackgroundPreference;
-        mFragment.mAnomalySummaryPreferenceController = mAnomalySummaryPreferenceController;
-
-        mAnomalies = new ArrayList<>();
-        mAnomalies.add(new Anomaly.Builder().setUid(UID).setType(
-                Anomaly.AnomalyType.WAKE_LOCK).build());
     }
 
     @After
@@ -275,7 +262,7 @@
     @Test
     public void testStartBatteryDetailPage_hasBasicData() {
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
-                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, mAnomalies);
+                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT);
 
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
         assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME))
@@ -284,8 +271,6 @@
             .isEqualTo(FOREGROUND_TIME_MS);
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT))
             .isEqualTo(USAGE_PERCENT);
-        assertThat(mBundle.getParcelableArrayList(
-                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isEqualTo(mAnomalies);
     }
 
     @Test
@@ -294,7 +279,7 @@
         mBatterySipper.usageTimeMs = PHONE_FOREGROUND_TIME_MS;
 
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
-                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
+                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT);
 
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
         assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME))
@@ -303,8 +288,6 @@
             .isEqualTo(PHONE_BACKGROUND_TIME_MS);
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT))
             .isEqualTo(USAGE_PERCENT);
-        assertThat(mBundle.getParcelableArrayList(
-                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isNull();
     }
 
     @Test
@@ -312,25 +295,21 @@
         mBatterySipper.mPackages = PACKAGE_NAME;
         mBatteryEntry.defaultPackageName = PACKAGE_NAME[0];
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
-                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, mAnomalies);
+                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT);
 
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
                 PACKAGE_NAME[0]);
-        assertThat(mBundle.getParcelableArrayList(
-                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isEqualTo(mAnomalies);
     }
 
     @Test
     public void testStartBatteryDetailPage_SystemApp() {
         mBatterySipper.mPackages = null;
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
-                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
+                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT);
 
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_LABEL)).isEqualTo(APP_LABEL);
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_ICON_ID)).isEqualTo(ICON_ID);
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isNull();
-        assertThat(mBundle.getParcelableArrayList(
-                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isNull();
     }
 
     @Test
@@ -339,8 +318,7 @@
         mBatterySipper.mPackages = PACKAGE_NAME;
         doReturn(appUid).when(mBatterySipper).getUid();
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
-                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
-
+                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT);
 
         verify(mActivity).startActivityAsUser(any(Intent.class), eq(new UserHandle(10)));
     }
@@ -353,7 +331,7 @@
         final int currentUser = 20;
         ShadowActivityManager.setCurrentUser(currentUser);
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
-                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
+                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT);
 
         verify(mActivity).startActivityAsUser(any(Intent.class), eq(new UserHandle(currentUser)));
     }
@@ -391,7 +369,7 @@
         mBatteryEntry.sipper.mPackages = PACKAGE_NAME;
 
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
-                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
+                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT);
 
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME))
             .isEqualTo(PACKAGE_NAME[0]);
@@ -416,24 +394,4 @@
         assertThat(mForegroundPreference.getSummary().toString()).isEqualTo("Used for 0 min");
         assertThat(mBackgroundPreference.getSummary().toString()).isEqualTo("Active for 0 min");
     }
-
-    @Test
-    public void testInitAnomalyInfo_anomalyNull_startAnomalyLoader() {
-        doReturn(null).when(mBundle)
-            .getParcelableArrayList(AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST);
-
-        mFragment.initAnomalyInfo();
-
-        verify(mLoaderManager).initLoader(eq(0), eq(Bundle.EMPTY), any());
-    }
-
-    @Test
-    public void testInitAnomalyInfo_anomalyExisted_updateAnomaly() {
-        doReturn(mAnomalies).when(mBundle)
-            .getParcelableArrayList(AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST);
-
-        mFragment.initAnomalyInfo();
-
-        verify(mAnomalySummaryPreferenceController).updateAnomalySummaryPreference(mAnomalies);
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java
index a6790fd..406ed77 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.doReturn;
 
 import android.content.Context;
@@ -24,17 +25,17 @@
 
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import androidx.preference.SwitchPreference;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class AutoRestrictionPreferenceControllerTest {
     private static final int ON = 1;
     private static final int OFF = 0;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
index 3dee0a6..1a3155d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
@@ -35,6 +35,7 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settings.testutils.shadow.ShadowFragment;
 import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
@@ -45,13 +46,12 @@
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import androidx.preference.Preference;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = {SettingsShadowResources.SettingsShadowTheme.class, ShadowFragment.class})
 public class BackgroundActivityPreferenceControllerTest {
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
index dc7c205..c29a012 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge;
 
 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.when;
@@ -24,31 +25,25 @@
 import android.content.Context;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
-import android.util.FeatureFlagUtils;
-import android.util.SparseArray;
 
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsImpl;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.InstrumentedPreferenceFragment;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 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.List;
-
 import androidx.preference.PreferenceGroup;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class BatteryAppListPreferenceControllerTest {
 
     private static final String[] PACKAGE_NAMES = {"com.app1", "com.app2"};
@@ -168,21 +163,6 @@
     }
 
     @Test
-    public void testRefreshAnomalyIcon_containsAnomaly_showAnomalyIcon() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.BATTERY_DISPLAY_APP_LIST, true);
-        PowerGaugePreference preference = new PowerGaugePreference(mContext);
-        final String key = mPreferenceController.extractKeyFromUid(UID);
-        final SparseArray<List<Anomaly>> anomalySparseArray = new SparseArray<>();
-        anomalySparseArray.append(UID, null);
-        preference.setKey(key);
-        doReturn(preference).when(mAppListGroup).findPreference(key);
-
-        mPreferenceController.refreshAnomalyIcon(anomalySparseArray);
-
-        assertThat(preference.showAnomalyIcon()).isTrue();
-    }
-
-    @Test
     public void testShouldHideSipper_typeOvercounted_returnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
index 30999cb..58bfe0e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.spy;
 
 import android.content.Context;
@@ -26,19 +27,19 @@
 import com.android.settings.fuelgauge.batterytip.AppInfo;
 import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
 import com.android.settings.testutils.DatabaseTestUtils;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
 import java.util.List;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class BatteryDatabaseManagerTest {
     private static String PACKAGE_NAME_NEW = "com.android.app1";
     private static int UID_NEW = 345;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
index b89a3f0..7bb0848 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
@@ -16,6 +16,7 @@
 package com.android.settings.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -30,6 +31,7 @@
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatterySipper.DrainType;
 import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -38,12 +40,11 @@
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.Locale;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class BatteryEntryTest {
 
     private static final int APP_UID = 123;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java
index abf05af..d8ee8f6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
@@ -29,6 +30,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
 
 import org.junit.Before;
@@ -36,13 +38,12 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class BatteryOptimizationPreferenceControllerTest {
 
     private static final String PKG_IN_WHITELIST = "com.pkg.in.whitelist";
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index 801a5e5..df34b78 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -51,8 +51,6 @@
 
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.R;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -429,16 +427,6 @@
     }
 
     @Test
-    public void testGetSummaryResIdFromAnomalyType() {
-        assertThat(mBatteryUtils.getSummaryResIdFromAnomalyType(Anomaly.AnomalyType.WAKE_LOCK))
-                .isEqualTo(R.string.battery_abnormal_wakelock_summary);
-        assertThat(mBatteryUtils.getSummaryResIdFromAnomalyType(Anomaly.AnomalyType.WAKEUP_ALARM))
-                .isEqualTo(R.string.battery_abnormal_wakeup_alarm_summary);
-        assertThat(mBatteryUtils.getSummaryResIdFromAnomalyType(Anomaly.AnomalyType.BLUETOOTH_SCAN))
-                .isEqualTo(R.string.battery_abnormal_location_summary);
-    }
-
-    @Test
     public void testGetForegroundActivityTotalTimeMs_returnMilliseconds() {
         final long rawRealtimeUs = SystemClock.elapsedRealtime() * 1000;
         doReturn(mTimer).when(mUid).getForegroundActivityTimer();
@@ -665,4 +653,35 @@
         assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
                 mAnomalyInfo)).isTrue();
     }
+
+    @Test
+    public void clearForceAppStandby_appRestricted_clearAndReturnTrue() {
+        when(mBatteryUtils.getPackageUid(HIGH_SDK_PACKAGE)).thenReturn(UID);
+        when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+                HIGH_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
+
+        assertThat(mBatteryUtils.clearForceAppStandby(HIGH_SDK_PACKAGE)).isTrue();
+        verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+                HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+    }
+
+    @Test
+    public void clearForceAppStandby_appInvalid_returnFalse() {
+        when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(BatteryUtils.UID_NULL);
+
+        assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
+        verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+                PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
+    }
+
+    @Test
+    public void clearForceAppStandby_appUnrestricted_returnFalse() {
+        when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(UID);
+        when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+                PACKAGE_NAME)).thenReturn(AppOpsManager.MODE_ALLOWED);
+
+        assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
+        verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+                PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetailsTest.java
deleted file mode 100644
index 0fb004c..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetailsTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge;
-
-import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.util.IconDrawableFactory;
-
-import com.android.settings.SettingsActivity;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-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;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
-import androidx.preference.PreferenceGroup;
-import androidx.preference.PreferenceManager;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class PowerUsageAnomalyDetailsTest {
-
-    private static final String NAME_APP_1 = "app1";
-    private static final String NAME_APP_2 = "app2";
-    private static final String NAME_APP_3 = "app3";
-    private static final String PACKAGE_NAME_1 = "com.android.app1";
-    private static final String PACKAGE_NAME_2 = "com.android.app2";
-    private static final String PACKAGE_NAME_3 = "com.android.app3";
-
-    @Mock
-    private SettingsActivity mSettingsActivity;
-    @Mock
-    private PreferenceManager mPreferenceManager;
-    @Mock
-    private Drawable mDrawable1;
-    @Mock
-    private Drawable mDrawable2;
-    @Mock
-    private Drawable mDrawable3;
-    @Mock
-    private PackageManager mPackageManager;
-    @Mock
-    private IconDrawableFactory mIconDrawableFactory;
-
-    private PowerUsageAnomalyDetails mFragment;
-    private PreferenceGroup mAbnormalListGroup;
-    private List<Anomaly> mAnomalyList;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mAbnormalListGroup = spy(new PreferenceCategory(RuntimeEnvironment.application));
-
-        mAnomalyList = new ArrayList<>();
-        Anomaly anomaly1 = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKE_LOCK)
-                .setPackageName(PACKAGE_NAME_1)
-                .setDisplayName(NAME_APP_1)
-                .build();
-        mAnomalyList.add(anomaly1);
-        Anomaly anomaly2 = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setPackageName(PACKAGE_NAME_2)
-                .setDisplayName(NAME_APP_2)
-                .build();
-        mAnomalyList.add(anomaly2);
-        Anomaly anomaly3 = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
-                .setPackageName(PACKAGE_NAME_3)
-                .setDisplayName(NAME_APP_3)
-                .build();
-        mAnomalyList.add(anomaly3);
-
-        mFragment = spy(new PowerUsageAnomalyDetails());
-        mFragment.mAbnormalListGroup = mAbnormalListGroup;
-        mFragment.mAnomalies = mAnomalyList;
-        mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application);
-        mFragment.mPackageManager = mPackageManager;
-        mFragment.mIconDrawableFactory = mIconDrawableFactory;
-        when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
-        when(mPreferenceManager.getContext()).thenReturn(RuntimeEnvironment.application);
-    }
-
-    @Test
-    public void testRefreshUi_displayCorrectTitleAndSummary() {
-        final List<Preference> testPreferences = new ArrayList<>();
-        final ArgumentCaptor<Preference> preferenceCaptor =
-            ArgumentCaptor.forClass(Preference.class);
-        Answer<Void> prefCallable = new Answer<Void>() {
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
-                testPreferences.add(preferenceCaptor.getValue());
-                return null;
-            }
-        };
-        doAnswer(prefCallable).when(mAbnormalListGroup).addPreference(preferenceCaptor.capture());
-
-        mFragment.refreshUi();
-
-        final Preference wakelockPreference = testPreferences.get(0);
-        assertThat(wakelockPreference.getTitle()).isEqualTo(NAME_APP_1);
-        assertThat(wakelockPreference.getSummary()).isEqualTo("Keeping device awake");
-        final Preference wakeupPreference = testPreferences.get(1);
-        assertThat(wakeupPreference.getTitle()).isEqualTo(NAME_APP_2);
-        assertThat(wakeupPreference.getSummary()).isEqualTo("Waking up device in background");
-        final Preference bluetoothPreference = testPreferences.get(2);
-        assertThat(bluetoothPreference.getTitle()).isEqualTo(NAME_APP_3);
-        assertThat(bluetoothPreference.getSummary()).isEqualTo("Requesting location frequently");
-    }
-
-    @Test
-    public void testRefreshUi_iconCorrect() {
-        doReturn(mDrawable1).when(mFragment).getBadgedIcon(eq(PACKAGE_NAME_1), anyInt());
-        doReturn(mDrawable2).when(mFragment).getBadgedIcon(eq(PACKAGE_NAME_2), anyInt());
-        doReturn(mDrawable3).when(mFragment).getBadgedIcon(eq(PACKAGE_NAME_3), anyInt());
-
-        final List<Drawable> testIcons = new ArrayList<>();
-        final ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(
-                Preference.class);
-        Answer<Void> prefCallable = new Answer<Void>() {
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
-                testIcons.add(preferenceCaptor.getValue().getIcon());
-                return null;
-            }
-        };
-        doAnswer(prefCallable).when(mAbnormalListGroup).addPreference(preferenceCaptor.capture());
-
-        mFragment.refreshUi();
-
-        assertThat(testIcons).containsExactly(mDrawable1, mDrawable2, mDrawable3);
-    }
-
-    @Test
-    public void testStartBatteryAbnormalPage_dataCorrect() {
-        final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
-
-        PowerUsageAnomalyDetails.startBatteryAbnormalPage(mSettingsActivity, mFragment,
-                mAnomalyList);
-
-        verify(mSettingsActivity).startActivity(intent.capture());
-        assertThat(intent.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
-                .getParcelableArrayList(PowerUsageAnomalyDetails.EXTRA_ANOMALY_LIST))
-                .isEqualTo(mAnomalyList);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 22b042e..97e272b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -34,7 +34,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
-import android.util.SparseArray;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -46,7 +45,6 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.applications.LayoutPreference;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -240,23 +238,6 @@
     }
 
     @Test
-    public void updateAnomalySparseArray() {
-        mFragment.mAnomalySparseArray = new SparseArray<>();
-        final List<Anomaly> anomalies = new ArrayList<>();
-        final Anomaly anomaly1 = new Anomaly.Builder().setUid(UID).build();
-        final Anomaly anomaly2 = new Anomaly.Builder().setUid(UID).build();
-        final Anomaly anomaly3 = new Anomaly.Builder().setUid(UID_2).build();
-        anomalies.add(anomaly1);
-        anomalies.add(anomaly2);
-        anomalies.add(anomaly3);
-
-        mFragment.updateAnomalySparseArray(anomalies);
-
-        assertThat(mFragment.mAnomalySparseArray.get(UID)).containsExactly(anomaly1, anomaly2);
-        assertThat(mFragment.mAnomalySparseArray.get(UID_2)).containsExactly(anomaly3);
-    }
-
-    @Test
     public void restartBatteryTipLoader() {
         //TODO: add policy logic here when BatteryTipPolicy is implemented
         doReturn(mLoaderManager).when(mFragment).getLoaderManager();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
index 81cf652..267f263 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
@@ -18,7 +18,9 @@
 
 import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT;
 import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID;
+
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
@@ -33,6 +35,7 @@
 import com.android.settings.R;
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.fuelgauge.batterytip.AppInfo;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -40,7 +43,6 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
@@ -48,7 +50,7 @@
 
 import androidx.preference.Preference;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class RestrictAppPreferenceControllerTest {
     private static final int ALLOWED_UID = 111;
     private static final String ALLOWED_PACKAGE_NAME = "com.android.allowed.package";
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
index 1cc027f..b9ed509 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
@@ -21,7 +21,6 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
@@ -38,6 +37,8 @@
 import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
 import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settingslib.testutils.FragmentTestUtils;
 
 import org.junit.Before;
@@ -47,18 +48,18 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.preference.CheckBoxPreference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceManager;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class})
 public class RestrictedAppDetailsTest {
 
     private static final String PACKAGE_NAME = "com.android.app";
@@ -154,8 +155,8 @@
 
         FragmentTestUtils.startFragment(dialogFragment);
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
         assertThat(shadowDialog.getTitle()).isEqualTo("Restrict app?");
     }
 
@@ -166,8 +167,8 @@
 
         FragmentTestUtils.startFragment(dialogFragment);
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
         assertThat(shadowDialog.getTitle()).isEqualTo("Remove restriction?");
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java
index d7db331..971de7a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.doReturn;
 
 import android.content.ContentResolver;
@@ -25,17 +26,17 @@
 
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import androidx.preference.SwitchPreference;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class SmartBatteryPreferenceControllerTest {
 
     private static final int ON = 1;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicyTest.java
deleted file mode 100644
index f209fd7..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicyTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.content.Context;
-import android.provider.Settings;
-import android.text.format.DateUtils;
-import android.util.KeyValueListParser;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class AnomalyDetectionPolicyTest {
-
-    private static final String ANOMALY_DETECTION_CONSTANTS_VALUE =
-            "anomaly_detection_enabled=true"
-            + ",wakelock_enabled=false"
-            + ",wakelock_threshold=3000"
-            + ",wakeup_alarm_enabled=true"
-            + ",wakeup_alarm_threshold=100"
-            + ",wakeup_blacklisted_tags=tag1:tag2:with%2Ccomma:with%3Acolon"
-            + ",bluetooth_scan_enabled=true"
-            + ",bluetooth_scan_threshold=2000";
-    private Context mContext;
-    private KeyValueListParser mKeyValueListParser;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        mKeyValueListParser = spy((new KeyValueListParser(',')));
-    }
-
-    @Test
-    public void testInit_usesConfigValues() {
-        AnomalyDetectionPolicy anomalyDetectionPolicy = createAnomalyPolicyWithConfig();
-
-        assertThat(anomalyDetectionPolicy.anomalyDetectionEnabled).isTrue();
-        assertThat(anomalyDetectionPolicy.wakeLockDetectionEnabled).isFalse();
-        assertThat(anomalyDetectionPolicy.wakeLockThreshold).isEqualTo(3000);
-        assertThat(anomalyDetectionPolicy.wakeupAlarmDetectionEnabled).isTrue();
-        assertThat(anomalyDetectionPolicy.wakeupAlarmThreshold).isEqualTo(100);
-        assertThat(anomalyDetectionPolicy.wakeupBlacklistedTags)
-                .containsExactly("tag1", "tag2", "with,comma", "with:colon");
-        assertThat(anomalyDetectionPolicy.bluetoothScanDetectionEnabled).isTrue();
-        assertThat(anomalyDetectionPolicy.bluetoothScanThreshold).isEqualTo(2000);
-    }
-
-    @Test
-    public void testInit_defaultValues() {
-        Settings.Global.putString(mContext.getContentResolver(),
-                Settings.Global.ANOMALY_DETECTION_CONSTANTS, "");
-        // Mock it to avoid noSuchMethodError
-        doReturn(true).when(mKeyValueListParser).getBoolean(anyString(), eq(true));
-        doReturn(false).when(mKeyValueListParser).getBoolean(anyString(), eq(false));
-
-        AnomalyDetectionPolicy anomalyDetectionPolicy = new AnomalyDetectionPolicy(mContext);
-        ReflectionHelpers.setField(anomalyDetectionPolicy, "mParser", mKeyValueListParser);
-
-        assertThat(anomalyDetectionPolicy.anomalyDetectionEnabled).isFalse();
-        assertThat(anomalyDetectionPolicy.wakeLockDetectionEnabled).isFalse();
-        assertThat(anomalyDetectionPolicy.wakeLockThreshold).isEqualTo(DateUtils.HOUR_IN_MILLIS);
-        assertThat(anomalyDetectionPolicy.wakeupAlarmDetectionEnabled).isFalse();
-        assertThat(anomalyDetectionPolicy.wakeupAlarmThreshold).isEqualTo(10);
-        assertThat(anomalyDetectionPolicy.wakeupBlacklistedTags).isNull();
-        assertThat(anomalyDetectionPolicy.bluetoothScanDetectionEnabled).isFalse();
-        assertThat(anomalyDetectionPolicy.bluetoothScanThreshold)
-            .isEqualTo(30 * DateUtils.MINUTE_IN_MILLIS);
-    }
-
-    @Test
-    public void testIsAnomalyDetectorEnabled_usesConfigValues() {
-        AnomalyDetectionPolicy policy = createAnomalyPolicyWithConfig();
-
-        assertThat(policy.isAnomalyDetectorEnabled(Anomaly.AnomalyType.WAKE_LOCK)).isFalse();
-        assertThat(policy.isAnomalyDetectorEnabled(Anomaly.AnomalyType.WAKEUP_ALARM)).isTrue();
-        assertThat(policy.isAnomalyDetectorEnabled(Anomaly.AnomalyType.BLUETOOTH_SCAN)).isTrue();
-    }
-
-    @Test
-    public void testIsAnomalyDetectorEnabled_usesDefaultValues() {
-        Settings.Global.putString(mContext.getContentResolver(),
-                Settings.Global.ANOMALY_DETECTION_CONSTANTS, "");
-        // Mock it to avoid noSuchMethodError
-        doReturn(true).when(mKeyValueListParser).getBoolean(anyString(), eq(true));
-        doReturn(false).when(mKeyValueListParser).getBoolean(anyString(), eq(false));
-
-        AnomalyDetectionPolicy policy = new AnomalyDetectionPolicy(mContext);
-        ReflectionHelpers.setField(policy, "mParser", mKeyValueListParser);
-
-        assertThat(policy.isAnomalyDetectorEnabled(Anomaly.AnomalyType.WAKE_LOCK)).isFalse();
-        assertThat(policy.isAnomalyDetectorEnabled(Anomaly.AnomalyType.WAKEUP_ALARM)).isFalse();
-        assertThat(policy.isAnomalyDetectorEnabled(Anomaly.AnomalyType.BLUETOOTH_SCAN)).isFalse();
-    }
-
-    private AnomalyDetectionPolicy createAnomalyPolicyWithConfig() {
-        Settings.Global.putString(mContext.getContentResolver(),
-                Settings.Global.ANOMALY_DETECTION_CONSTANTS, ANOMALY_DETECTION_CONSTANTS_VALUE);
-        // Mock it to avoid noSuchMethodError
-        doReturn(true).when(mKeyValueListParser)
-            .getBoolean(AnomalyDetectionPolicy.KEY_ANOMALY_DETECTION_ENABLED, false);
-        doReturn(false).when(mKeyValueListParser)
-            .getBoolean(AnomalyDetectionPolicy.KEY_WAKELOCK_DETECTION_ENABLED, false);
-        doReturn(true).when(mKeyValueListParser)
-            .getBoolean(AnomalyDetectionPolicy.KEY_WAKEUP_ALARM_DETECTION_ENABLED, false);
-        doReturn(true).when(mKeyValueListParser)
-            .getBoolean(AnomalyDetectionPolicy.KEY_BLUETOOTH_SCAN_DETECTION_ENABLED, false);
-
-        final AnomalyDetectionPolicy policy = new AnomalyDetectionPolicy(mContext);
-        ReflectionHelpers.setField(policy, "mParser", mKeyValueListParser);
-        return policy;
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
deleted file mode 100644
index c68b438..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.pm.permission.RuntimePermissionPresenter;
-import android.os.Build;
-
-import com.android.settings.R;
-import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowRuntimePermissionPresenter;
-import com.android.settingslib.testutils.FragmentTestUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowDialog;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = ShadowRuntimePermissionPresenter.class)
-public class AnomalyDialogFragmentTest {
-
-    private static final String PACKAGE_NAME = "com.android.app";
-    private static final String DISPLAY_NAME = "app";
-    private static final int UID = 111;
-
-    @Mock
-    private AnomalyUtils mAnomalyUtils;
-    @Mock
-    private AnomalyAction mAnomalyAction;
-    @Mock
-    private RuntimePermissionPresenter mRuntimePermissionPresenter;
-    private Anomaly mWakeLockAnomaly;
-    private Anomaly mWakeupAlarmAnomaly;
-    private Anomaly mWakeupAlarmAnomaly2;
-    private Anomaly mBluetoothAnomaly;
-    private AnomalyDialogFragment mAnomalyDialogFragment;
-    private Context mContext;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = spy(RuntimeEnvironment.application);
-        mWakeLockAnomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKE_LOCK)
-                .setUid(UID)
-                .setPackageName(PACKAGE_NAME)
-                .setDisplayName(DISPLAY_NAME)
-                .build();
-        mWakeupAlarmAnomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setUid(UID)
-                .setPackageName(PACKAGE_NAME)
-                .setDisplayName(DISPLAY_NAME)
-                .build();
-        mWakeupAlarmAnomaly2 = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setUid(UID)
-                .setPackageName(PACKAGE_NAME)
-                .setDisplayName(DISPLAY_NAME)
-                .setTargetSdkVersion(Build.VERSION_CODES.O)
-                .build();
-        mBluetoothAnomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
-                .setUid(UID)
-                .setPackageName(PACKAGE_NAME)
-                .setDisplayName(DISPLAY_NAME)
-                .build();
-        FakeFeatureFactory.setupForTest();
-        ShadowRuntimePermissionPresenter.setRuntimePermissionPresenter(mRuntimePermissionPresenter);
-    }
-
-    @Test
-    public void testOnCreateDialog_hasCorrectData() {
-        mAnomalyDialogFragment =
-            AnomalyDialogFragment.newInstance(mWakeLockAnomaly, 0 /* metricskey */);
-        FragmentTestUtils.startFragment(mAnomalyDialogFragment);
-
-        assertThat(mAnomalyDialogFragment.mAnomaly).isEqualTo(mWakeLockAnomaly);
-    }
-
-    @Test
-    public void testOnCreateDialog_wakelockAnomaly_fireForceStopDialog() {
-        mAnomalyDialogFragment =
-            AnomalyDialogFragment.newInstance(mWakeLockAnomaly, 0 /* metricskey */);
-
-        FragmentTestUtils.startFragment(mAnomalyDialogFragment);
-
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        assertThat(dialog).isNotNull();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
-
-        assertThat(shadowDialog.getMessage()).isEqualTo(
-                mContext.getString(R.string.dialog_stop_message, mWakeLockAnomaly.displayName));
-        assertThat(shadowDialog.getTitle()).isEqualTo(
-                mContext.getString(R.string.dialog_stop_title));
-        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getText()).isEqualTo(
-                mContext.getString(R.string.dialog_stop_ok));
-        assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getText()).isEqualTo(
-                mContext.getString(R.string.dlg_cancel));
-    }
-
-    @Test
-    public void testOnCreateDialog_wakeupAlarmAnomalyPriorO_fireStopAndBackgroundCheckDialog() {
-        mAnomalyDialogFragment =
-            AnomalyDialogFragment.newInstance(mWakeupAlarmAnomaly, 0 /* metricskey */);
-
-        FragmentTestUtils.startFragment(mAnomalyDialogFragment);
-
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        assertThat(dialog).isNotNull();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
-
-        assertThat(shadowDialog.getMessage()).isEqualTo(
-                mContext.getString(R.string.dialog_background_check_message,
-                        mWakeLockAnomaly.displayName));
-        assertThat(shadowDialog.getTitle()).isEqualTo(
-                mContext.getString(R.string.dialog_background_check_title));
-        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getText()).isEqualTo(
-                mContext.getString(R.string.dialog_background_check_ok));
-        assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getText()).isEqualTo(
-                mContext.getString(R.string.dlg_cancel));
-    }
-
-    @Test
-    public void testOnCreateDialog_wakeupAlarmAnomalyTargetingO_fireForceStopDialog() {
-        mAnomalyDialogFragment =
-            AnomalyDialogFragment.newInstance(mWakeupAlarmAnomaly2, 0 /* metricskey */);
-
-        FragmentTestUtils.startFragment(mAnomalyDialogFragment);
-
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        assertThat(dialog).isNotNull();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
-
-        assertThat(shadowDialog.getMessage()).isEqualTo(
-                mContext.getString(R.string.dialog_stop_message_wakeup_alarm,
-                        mWakeLockAnomaly.displayName));
-        assertThat(shadowDialog.getTitle()).isEqualTo(
-                mContext.getString(R.string.dialog_stop_title));
-        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getText()).isEqualTo(
-                mContext.getString(R.string.dialog_stop_ok));
-        assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getText()).isEqualTo(
-                mContext.getString(R.string.dlg_cancel));
-    }
-
-    @Test
-    public void testOnCreateDialog_bluetoothAnomaly_fireLocationCheckDialog() {
-        mAnomalyDialogFragment = spy(AnomalyDialogFragment.newInstance(mBluetoothAnomaly,
-                0 /* metricskey */));
-        mAnomalyDialogFragment.mAnomalyUtils = mAnomalyUtils;
-        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
-        doNothing().when(mAnomalyDialogFragment).initAnomalyUtils();
-        doReturn(Anomaly.AnomalyActionType.LOCATION_CHECK).when(mAnomalyAction).getActionType();
-
-        FragmentTestUtils.startFragment(mAnomalyDialogFragment);
-
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        assertThat(dialog).isNotNull();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
-
-        assertThat(shadowDialog.getMessage()).isEqualTo(
-                mContext.getString(R.string.dialog_location_message,
-                        mWakeLockAnomaly.displayName));
-        assertThat(shadowDialog.getTitle()).isEqualTo(
-                mContext.getString(R.string.dialog_location_title));
-        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getText()).isEqualTo(
-                mContext.getString(R.string.dialog_location_ok));
-        assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getText()).isEqualTo(
-                mContext.getString(R.string.dlg_cancel));
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java
deleted file mode 100644
index e2febc1..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.UserManager;
-
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector;
-import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
-import com.android.settings.fuelgauge.anomaly.checker.WakeupAlarmAnomalyDetector;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class AnomalyLoaderTest {
-
-    private static final String PACKAGE_NAME = "com.android.settings";
-    private static final CharSequence DISPLAY_NAME = "Settings";
-    private static final int UID = 0;
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-    @Mock
-    private BatteryStatsHelper mBatteryStatsHelper;
-    @Mock
-    private WakeLockAnomalyDetector mWakeLockAnomalyDetector;
-    @Mock
-    private WakeupAlarmAnomalyDetector mWakeupAlarmAnomalyDetector;
-    @Mock
-    private BluetoothScanAnomalyDetector mBluetoothScanAnomalyDetector;
-    @Mock
-    private AnomalyDetectionPolicy mAnomalyDetectionPolicy;
-    @Mock
-    private UserManager mUserManager;
-    private Anomaly mWakeLockAnomaly;
-    private Anomaly mWakeupAlarmAnomaly;
-    private Anomaly mBluetoothScanAnomaly;
-    private List<Anomaly> mWakeLockAnomalies;
-    private List<Anomaly> mWakeupAlarmAnomalies;
-    private List<Anomaly> mBluetoothScanAnomalies;
-    private AnomalyLoader mAnomalyLoader;
-
-    @Before
-    public void setUp() throws PackageManager.NameNotFoundException {
-        MockitoAnnotations.initMocks(this);
-
-        FakeFeatureFactory.setupForTest();
-        doReturn(true).when(mAnomalyDetectionPolicy).isAnomalyDetectorEnabled(anyInt());
-        doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
-        when(mContext.getPackageManager().getPackageUid(anyString(), anyInt())).thenReturn(UID);
-
-        mWakeLockAnomalies = new ArrayList<>();
-        mWakeLockAnomaly = createAnomaly(Anomaly.AnomalyType.WAKE_LOCK);
-        mWakeLockAnomalies.add(mWakeLockAnomaly);
-        doReturn(mWakeLockAnomalies).when(mWakeLockAnomalyDetector).detectAnomalies(any(), any());
-
-        mWakeupAlarmAnomalies = new ArrayList<>();
-        mWakeupAlarmAnomaly = createAnomaly(Anomaly.AnomalyType.WAKEUP_ALARM);
-        mWakeupAlarmAnomalies.add(mWakeupAlarmAnomaly);
-        doReturn(mWakeupAlarmAnomalies)
-            .when(mWakeupAlarmAnomalyDetector).detectAnomalies(any(), any());
-
-        mBluetoothScanAnomalies = new ArrayList<>();
-        mBluetoothScanAnomaly = createAnomaly(Anomaly.AnomalyType.BLUETOOTH_SCAN);
-        mBluetoothScanAnomalies.add(mBluetoothScanAnomaly);
-        doReturn(mBluetoothScanAnomalies)
-            .when(mBluetoothScanAnomalyDetector).detectAnomalies(any(), any());
-
-        mAnomalyLoader = new AnomalyLoader(mContext, mBatteryStatsHelper, null,
-                mAnomalyDetectionPolicy);
-        mAnomalyLoader.mAnomalyUtils = spy(new AnomalyUtils(mContext));
-    }
-
-    @Test
-    public void testLoadInBackground_containsValidAnomalies() {
-        doReturn(mWakeLockAnomalyDetector).when(mAnomalyLoader.mAnomalyUtils).getAnomalyDetector(
-                Anomaly.AnomalyType.WAKE_LOCK);
-        doReturn(mWakeupAlarmAnomalyDetector).when(mAnomalyLoader.mAnomalyUtils).getAnomalyDetector(
-                Anomaly.AnomalyType.WAKEUP_ALARM);
-        doReturn(mBluetoothScanAnomalyDetector).when(
-                mAnomalyLoader.mAnomalyUtils).getAnomalyDetector(
-                Anomaly.AnomalyType.BLUETOOTH_SCAN);
-
-        List<Anomaly> anomalies = mAnomalyLoader.loadInBackground();
-
-        assertThat(anomalies)
-            .containsExactly(mWakeLockAnomaly, mWakeupAlarmAnomaly, mBluetoothScanAnomaly);
-    }
-
-    private Anomaly createAnomaly(@Anomaly.AnomalyType int type) {
-        return new Anomaly.Builder()
-                .setType(type)
-                .setUid(UID)
-                .setPackageName(PACKAGE_NAME)
-                .setDisplayName(DISPLAY_NAME)
-                .build();
-    }
-
-    @Test
-    public void testGenerateFakeData() {
-        List<Anomaly> anomalies = mAnomalyLoader.generateFakeData();
-
-        assertThat(anomalies)
-            .containsExactly(mWakeLockAnomaly, mWakeupAlarmAnomaly, mBluetoothScanAnomaly);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyPreferenceTest.java
deleted file mode 100644
index 9b85981..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyPreferenceTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class AnomalyPreferenceTest {
-
-    @Anomaly.AnomalyType
-    private static final int ANOMALY_TYPE = Anomaly.AnomalyType.WAKE_LOCK;
-    private static final String PACKAGE_NAME = "com.android.app";
-    private static final String DISPLAY_NAME = "app";
-    private static final int UID = 111;
-
-    private Context mContext;
-    private Anomaly mAnomaly;
-    private AnomalyPreference mAnomalyPreference;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = RuntimeEnvironment.application;
-
-        mAnomaly = new Anomaly.Builder()
-                .setType(ANOMALY_TYPE)
-                .setPackageName(PACKAGE_NAME)
-                .setDisplayName(DISPLAY_NAME)
-                .setUid(UID)
-                .build();
-    }
-
-    @Test
-    public void testAnomalyPreference_containsCorrectData() {
-        mAnomalyPreference = new AnomalyPreference(mContext, mAnomaly);
-
-        assertThat(mAnomalyPreference.getTitle()).isEqualTo(DISPLAY_NAME);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java
deleted file mode 100644
index e6dea88..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-
-import com.android.settings.SettingsActivity;
-import com.android.settings.core.InstrumentedPreferenceFragment;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class AnomalySummaryPreferenceControllerTest {
-
-    @Anomaly.AnomalyType
-    private static final int ANOMALY_TYPE = Anomaly.AnomalyType.WAKE_LOCK;
-    private static final String PACKAGE_NAME = "com.android.app";
-    private static final String DISPLAY_NAME = "appName";
-    private static final int UID = 111;
-
-    @Mock
-    private InstrumentedPreferenceFragment mFragment;
-    @Mock
-    private FragmentManager mFragmentManager;
-    @Mock
-    private FragmentTransaction mFragmentTransaction;
-    @Mock
-    private SettingsActivity mSettingsActivity;
-    @Mock
-    private PreferenceScreen mPreferenceScreen;
-
-    private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
-    private Preference mPreference;
-    private Context mContext;
-    private List<Anomaly> mAnomalyList;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = RuntimeEnvironment.application;
-        mPreference = new Preference(mContext);
-        mPreference.setKey(AnomalySummaryPreferenceController.ANOMALY_KEY);
-        when(mFragment.getPreferenceScreen()).thenReturn(mPreferenceScreen);
-        when(mFragment.getFragmentManager()).thenReturn(mFragmentManager);
-        when(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction);
-        when(mFragment.getContext()).thenReturn(mContext);
-        when(mSettingsActivity.getApplicationContext()).thenReturn(mContext);
-        when(mPreferenceScreen.findPreference(any())).thenReturn(mPreference);
-
-        mAnomalyList = new ArrayList<>();
-
-        mAnomalySummaryPreferenceController = new AnomalySummaryPreferenceController(
-                mSettingsActivity, mFragment);
-    }
-
-    @Test
-    public void testUpdateHighUsageSummaryPreference_hasCorrectData() {
-        mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(mAnomalyList);
-
-        assertThat(mAnomalySummaryPreferenceController.mAnomalies).isEqualTo(mAnomalyList);
-    }
-
-    @Test
-    public void testUpdateAnomalySummaryPreference_oneAnomaly_showCorrectSummary() {
-        mAnomalyList.add(createTestAnomaly());
-
-        mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(mAnomalyList);
-
-        assertThat(mPreference.getTitle()).isEqualTo("appName draining battery");
-        assertThat(mPreference.getSummary()).isEqualTo("Keeping device awake");
-    }
-
-    @Test
-    public void testUpdateAnomalySummaryPreference_emptyAnomaly_preferenceInvisible() {
-        mPreference.setVisible(true);
-        mAnomalyList.clear();
-
-        mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(mAnomalyList);
-
-        assertThat(mPreference.isVisible()).isFalse();
-    }
-
-    @Test
-    public void testUpdateAnomalySummaryPreference_multipleAnomalies_showCorrectSummary() {
-        mAnomalyList.add(createTestAnomaly());
-        mAnomalyList.add(createTestAnomaly());
-
-        mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(mAnomalyList);
-
-        assertThat(mPreference.getTitle()).isEqualTo("Apps draining battery");
-        assertThat(mPreference.getSummary()).isEqualTo("2 apps misbehaving");
-    }
-
-    @Test
-    public void testOnPreferenceTreeClick_oneAnomaly_showDialog() {
-
-        mAnomalyList.add(createTestAnomaly());
-        mAnomalySummaryPreferenceController.mAnomalies = mAnomalyList;
-
-        mAnomalySummaryPreferenceController.onPreferenceTreeClick(mPreference);
-
-        verify(mFragmentManager).beginTransaction();
-        verify(mFragmentTransaction).add(any(), anyString());
-        verify(mFragmentTransaction).commit();
-    }
-
-    private Anomaly createTestAnomaly() {
-        return new Anomaly.Builder()
-                .setType(ANOMALY_TYPE)
-                .setUid(UID)
-                .setPackageName(PACKAGE_NAME)
-                .setDisplayName(DISPLAY_NAME)
-                .build();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java
deleted file mode 100644
index be09c24..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class AnomalyTest {
-
-    private static int TYPE = Anomaly.AnomalyType.WAKE_LOCK;
-    private static int UID = 111;
-    private static int SDK_VERSION = Build.VERSION_CODES.L;
-    private static long WAKE_LOCK_TIME_MS = 1500;
-    private static String PACKAGE_NAME = "com.android.settings";
-    private static String DISPLAY_NAME = "settings";
-    private static long BLUETOOTH_TIME_MS = 2555555;
-    private static int WAKEUP_ALARM_COUNT = 100;
-
-    private Anomaly mAnomaly;
-
-    @Before
-    public void setUp() {
-        mAnomaly = new Anomaly.Builder()
-                .setType(TYPE)
-                .setUid(UID)
-                .setWakeLockTimeMs(WAKE_LOCK_TIME_MS)
-                .setPackageName(PACKAGE_NAME)
-                .setDisplayName(DISPLAY_NAME)
-                .setTargetSdkVersion(SDK_VERSION)
-                .setBackgroundRestrictionEnabled(true)
-                .setBluetoothScanningTimeMs(BLUETOOTH_TIME_MS)
-                .setWakeupAlarmCount(WAKEUP_ALARM_COUNT)
-                .build();
-    }
-
-    @Test
-    public void testBuilder_buildCorrectly() {
-        assertThat(mAnomaly.type).isEqualTo(TYPE);
-        assertThat(mAnomaly.uid).isEqualTo(UID);
-        assertThat(mAnomaly.wakelockTimeMs).isEqualTo(WAKE_LOCK_TIME_MS);
-        assertThat(mAnomaly.packageName).isEqualTo(PACKAGE_NAME);
-        assertThat(mAnomaly.displayName).isEqualTo(DISPLAY_NAME);
-        assertThat(mAnomaly.targetSdkVersion).isEqualTo(SDK_VERSION);
-        assertThat(mAnomaly.backgroundRestrictionEnabled).isTrue();
-        assertThat(mAnomaly.wakeupAlarmCount).isEqualTo(WAKEUP_ALARM_COUNT);
-        assertThat(mAnomaly.bluetoothScanningTimeMs).isEqualTo(BLUETOOTH_TIME_MS);
-    }
-
-    @Test
-    public void testToString() {
-        assertThat(mAnomaly.toString()).isEqualTo(
-                "type=wakelock uid=111 package=com.android.settings displayName=settings"
-                        + " wakelockTimeMs=1500 wakeupAlarmCount=100 bluetoothTimeMs=2555555");
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
deleted file mode 100644
index 72abc18..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.verify;
-
-import android.os.Build;
-import android.util.Pair;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
-import com.android.settings.fuelgauge.anomaly.action.StopAndBackgroundCheckAction;
-import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
-import com.android.settings.fuelgauge.anomaly.checker.WakeupAlarmAnomalyDetector;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowKeyValueListParser;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = ShadowKeyValueListParser.class)
-public class AnomalyUtilsTest {
-
-    private static final String PACKAGE_NAME_WAKEUP = "com.android.app1";
-    private static final String PACKAGE_NAME_WAKELOCK = "com.android.app2";
-    private static final int CONTEXT_ID = 55;
-
-    @Mock
-    private MetricsFeatureProvider mMetricsFeatureProvider;
-    private AnomalyUtils mAnomalyUtils;
-    private Anomaly mWakeupAnomaly;
-    private Anomaly mWakeLockAnomaly;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mAnomalyUtils = new AnomalyUtils(RuntimeEnvironment.application);
-
-        mWakeLockAnomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKE_LOCK)
-                .setPackageName(PACKAGE_NAME_WAKELOCK)
-                .build();
-        mWakeupAnomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setPackageName(PACKAGE_NAME_WAKEUP)
-                .build();
-    }
-
-    @Test
-    public void testGetAnomalyAction_typeWakeLock_returnForceStop() {
-        Anomaly anomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKE_LOCK)
-                .build();
-        assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
-                ForceStopAction.class);
-    }
-
-    @Test
-    public void testGetAnomalyDetector_typeWakeLock_returnWakeLockDetector() {
-        assertThat(mAnomalyUtils.getAnomalyDetector(Anomaly.AnomalyType.WAKE_LOCK)).isInstanceOf(
-                WakeLockAnomalyDetector.class);
-    }
-
-    @Test
-    public void testGetAnomalyAction_typeWakeUpAlarmTargetO_returnForceStop() {
-        Anomaly anomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setTargetSdkVersion(Build.VERSION_CODES.O)
-                .build();
-        assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
-                ForceStopAction.class);
-    }
-
-    @Test
-    public void testGetAnomalyAction_typeWakeUpAlarmTargetPriorOAndBgOff_returnStopAndBackground() {
-        Anomaly anomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setTargetSdkVersion(Build.VERSION_CODES.L)
-                .setBackgroundRestrictionEnabled(false)
-                .build();
-        assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
-                StopAndBackgroundCheckAction.class);
-    }
-
-    @Test
-    public void testGetAnomalyAction_typeWakeUpAlarmTargetPriorOAndBgOn_returnForceStop() {
-        Anomaly anomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setTargetSdkVersion(Build.VERSION_CODES.L)
-                .setBackgroundRestrictionEnabled(true)
-                .build();
-        assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
-                ForceStopAction.class);
-    }
-
-    @Test
-    public void testGetAnomalyDetector_typeWakeUpAlarm_returnWakeUpAlarmDetector() {
-        assertThat(mAnomalyUtils.getAnomalyDetector(Anomaly.AnomalyType.WAKEUP_ALARM)).isInstanceOf(
-                WakeupAlarmAnomalyDetector.class);
-    }
-
-    @Test
-    public void testLogAnomaly() {
-        mAnomalyUtils.logAnomaly(mMetricsFeatureProvider, mWakeLockAnomaly, CONTEXT_ID);
-
-        verify(mMetricsFeatureProvider).action(RuntimeEnvironment.application,
-                MetricsProto.MetricsEvent.ANOMALY_TYPE_WAKELOCK,
-                PACKAGE_NAME_WAKELOCK,
-                Pair.create(
-                        MetricsProto.MetricsEvent.FIELD_CONTEXT,
-                        CONTEXT_ID),
-                Pair.create(
-                        MetricsProto.MetricsEvent.FIELD_ANOMALY_ACTION_TYPE,
-                        Anomaly.AnomalyActionType.FORCE_STOP));
-    }
-
-    @Test
-    public void testLogAnomalies() {
-        final List<Anomaly> anomalies = new ArrayList<>();
-        anomalies.add(mWakeLockAnomaly);
-        anomalies.add(mWakeupAnomaly);
-
-        mAnomalyUtils.logAnomalies(mMetricsFeatureProvider, anomalies, CONTEXT_ID);
-
-        verify(mMetricsFeatureProvider).action(RuntimeEnvironment.application,
-                MetricsProto.MetricsEvent.ANOMALY_TYPE_WAKELOCK,
-                PACKAGE_NAME_WAKELOCK,
-                Pair.create(
-                        MetricsProto.MetricsEvent.FIELD_CONTEXT,
-                        CONTEXT_ID),
-                Pair.create(
-                        MetricsProto.MetricsEvent.FIELD_ANOMALY_ACTION_TYPE,
-                        Anomaly.AnomalyActionType.FORCE_STOP));
-        verify(mMetricsFeatureProvider).action(RuntimeEnvironment.application,
-                MetricsProto.MetricsEvent.ANOMALY_TYPE_WAKEUP_ALARM,
-                PACKAGE_NAME_WAKEUP,
-                Pair.create(
-                        MetricsProto.MetricsEvent.FIELD_CONTEXT,
-                        CONTEXT_ID),
-                Pair.create(
-                        MetricsProto.MetricsEvent.FIELD_ANOMALY_ACTION_TYPE,
-                        Anomaly.AnomalyActionType.STOP_AND_BACKGROUND_CHECK));
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/AnomalyActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/AnomalyActionTest.java
deleted file mode 100644
index 226be10..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/AnomalyActionTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.verify;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.util.Pair;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class AnomalyActionTest {
-
-    private static final String PACKAGE_NAME = "com.android.app";
-    private static final int UID = 111;
-    private static final int ACTION_KEY = 2;
-    private static final int METRIC_KEY = 3;
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-    @Mock
-    private AppOpsManager mAppOpsManager;
-    private Anomaly mAnomaly;
-    private TestAnomalyAction mTestAnomalyAction;
-    private FakeFeatureFactory mFeatureFactory;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mFeatureFactory = FakeFeatureFactory.setupForTest();
-        doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
-
-        mAnomaly = new Anomaly.Builder().setUid(UID).setPackageName(PACKAGE_NAME).build();
-        mTestAnomalyAction = new TestAnomalyAction(mContext);
-    }
-
-    @Test
-    public void testHandlePositiveAction_logAction() {
-        mTestAnomalyAction.handlePositiveAction(mAnomaly, METRIC_KEY);
-
-        verify(mFeatureFactory.metricsFeatureProvider).action(mContext, ACTION_KEY, PACKAGE_NAME,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRIC_KEY));
-    }
-
-    private class TestAnomalyAction extends AnomalyAction {
-        private TestAnomalyAction(Context context) {
-            super(context);
-            mActionMetricKey = ACTION_KEY;
-        }
-
-        @Override
-        public boolean isActionActive(Anomaly anomaly) {
-            return false;
-        }
-
-        @Override
-        public int getActionType() {
-            return 0;
-        }
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java
deleted file mode 100644
index 20b5486..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.verify;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.os.Build;
-
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class BackgroundCheckActionTest {
-
-    private static final String PACKAGE_NAME = "com.android.app";
-    private static final int UID = 111;
-    private static final int SDK_VERSION = Build.VERSION_CODES.L;
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-    @Mock
-    private AppOpsManager mAppOpsManager;
-    @Mock
-    private BatteryUtils mBatteryUtils;
-    private Anomaly mAnomaly;
-    private BackgroundCheckAction mBackgroundCheckAction;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        FakeFeatureFactory.setupForTest();
-        doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
-
-        mAnomaly = new Anomaly.Builder()
-                .setUid(UID)
-                .setPackageName(PACKAGE_NAME)
-                .setTargetSdkVersion(SDK_VERSION)
-                .build();
-        mBackgroundCheckAction = new BackgroundCheckAction(mContext);
-        mBackgroundCheckAction.mBatteryUtils = mBatteryUtils;
-    }
-
-    @Test
-    public void testHandlePositiveAction_forceStopPackage() {
-        mBackgroundCheckAction.handlePositiveAction(mAnomaly, 0 /* metricskey */);
-
-        verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME,
-                AppOpsManager.MODE_IGNORED);
-    }
-
-    @Test
-    public void testIsActionActive_modeAllowed_returnTrue() {
-        doReturn(false).when(mBatteryUtils)
-            .isBackgroundRestrictionEnabled(SDK_VERSION, UID, PACKAGE_NAME);
-
-        assertThat(mBackgroundCheckAction.isActionActive(mAnomaly)).isTrue();
-    }
-
-    @Test
-    public void testIsActionActive_modeIgnored_returnFalse() {
-        doReturn(true).when(mBatteryUtils)
-            .isBackgroundRestrictionEnabled(SDK_VERSION, UID, PACKAGE_NAME);
-
-        assertThat(mBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
-    }
-
-    @Test
-    public void testConstructor_batteryUtilsNotNull() {
-        mBackgroundCheckAction = new BackgroundCheckAction(mContext);
-
-        assertThat(mBackgroundCheckAction.mBatteryUtils).isNotNull();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/ForceStopActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/ForceStopActionTest.java
deleted file mode 100644
index 49c679b..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/ForceStopActionTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.verify;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class ForceStopActionTest {
-
-    private static final String PACKAGE_NAME = "com.android.app";
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-    @Mock
-    private ActivityManager mActivityManager;
-    @Mock
-    private ApplicationInfo mApplicationInfo;
-    @Mock
-    private PackageManager mPackageManager;
-    private Anomaly mAnomaly;
-    private ForceStopAction mForceStopAction;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        FakeFeatureFactory.setupForTest();
-        doReturn(mActivityManager).when(mContext).getSystemService(Context.ACTIVITY_SERVICE);
-        doReturn(mPackageManager).when(mContext).getPackageManager();
-        doReturn(mApplicationInfo).when(mPackageManager)
-            .getApplicationInfo(PACKAGE_NAME, PackageManager.GET_META_DATA);
-
-        mAnomaly = new Anomaly.Builder().setPackageName(PACKAGE_NAME).build();
-        mForceStopAction = new ForceStopAction(mContext);
-    }
-
-    @Test
-    public void testHandlePositiveAction_forceStopPackage() {
-        mForceStopAction.handlePositiveAction(mAnomaly, 0 /* metricskey */);
-
-        verify(mActivityManager).forceStopPackage(PACKAGE_NAME);
-    }
-
-    @Test
-    public void testIsActionActive_appStopped_returnFalse() {
-        mApplicationInfo.flags = ApplicationInfo.FLAG_STOPPED;
-
-        assertThat(mForceStopAction.isActionActive(mAnomaly)).isFalse();
-    }
-
-    @Test
-    public void testIsActionActive_appRunning_returnTrue() {
-        mApplicationInfo.flags = 0;
-
-        assertThat(mForceStopAction.isActionActive(mAnomaly)).isTrue();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckActionTest.java
deleted file mode 100644
index 711fa11..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckActionTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.Manifest;
-import android.content.Context;
-import android.content.pm.PackageManager;
-
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowPermissionChecker;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = ShadowPermissionChecker.class)
-public class LocationCheckActionTest {
-
-    private static final String PACKAGE_NAME = "com.android.app";
-    private static final int UID = 12345;
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-    private Anomaly mAnomaly;
-    private LocationCheckAction mLocationCheckAction;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        FakeFeatureFactory.setupForTest();
-        mLocationCheckAction = new LocationCheckAction(mContext, null);
-        mAnomaly = new Anomaly.Builder()
-                .setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
-                .setPackageName(PACKAGE_NAME)
-                .setUid(UID)
-                .build();
-        ShadowPermissionChecker.clear();
-    }
-
-    @Test
-    public void testIsActionActive_coarseLocationGranted_returnTrue() {
-        ShadowPermissionChecker.addPermission(Manifest.permission.ACCESS_COARSE_LOCATION, -1, UID,
-                PACKAGE_NAME, PackageManager.PERMISSION_GRANTED);
-
-        assertThat(mLocationCheckAction.isActionActive(mAnomaly)).isTrue();
-    }
-
-    @Test
-    public void testIsActionActive_fineLocationGranted_returnTrue() {
-        ShadowPermissionChecker.addPermission(Manifest.permission.ACCESS_FINE_LOCATION, -1, UID,
-                PACKAGE_NAME, PackageManager.PERMISSION_GRANTED);
-
-        assertThat(mLocationCheckAction.isActionActive(mAnomaly)).isTrue();
-    }
-
-    @Test
-    public void testIsActionActive_noLocationGranted_returnFalse() {
-        assertThat(mLocationCheckAction.isActionActive(mAnomaly)).isFalse();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java
deleted file mode 100644
index f49395b..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.action;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class StopAndBackgroundActionTest {
-
-    private static final String PACKAGE_NAME = "com.android.app";
-    private static final int UID = 111;
-    private static final int METRICS_KEY = 3;
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-    @Mock
-    private BackgroundCheckAction mBackgroundCheckAction;
-    @Mock
-    private ForceStopAction mForceStopAction;
-    private StopAndBackgroundCheckAction mStopAndBackgroundCheckAction;
-    private Anomaly mAnomaly;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mAnomaly = new Anomaly.Builder().setUid(UID).setPackageName(PACKAGE_NAME).build();
-
-        FakeFeatureFactory.setupForTest();
-        mStopAndBackgroundCheckAction = new StopAndBackgroundCheckAction(mContext, mForceStopAction,
-                mBackgroundCheckAction);
-    }
-
-    @Test
-    public void testHandlePositiveAction_stopAndBackgroundCheck() {
-        mStopAndBackgroundCheckAction.handlePositiveAction(mAnomaly, METRICS_KEY);
-
-        verify(mBackgroundCheckAction).handlePositiveAction(mAnomaly, METRICS_KEY);
-        verify(mForceStopAction).handlePositiveAction(mAnomaly, METRICS_KEY);
-    }
-
-    @Test
-    public void testIsActionActive_restrictionEnabled_returnFalse() {
-        doReturn(true).when(mForceStopAction).isActionActive(mAnomaly);
-
-        assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
-    }
-
-    @Test
-    public void testIsActionActive_appNotRunning_returnFalse() {
-        doReturn(true).when(mBackgroundCheckAction).isActionActive(mAnomaly);
-
-        assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
-    }
-
-    @Test
-    public void testIsActionActive_appStoppedAndRestrictionOn_returnFalse() {
-        assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
deleted file mode 100644
index 61cf694..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.checker;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.BatteryStats;
-import android.text.format.DateUtils;
-
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
-import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class BluetoothScanAnomalyDetectorTest {
-
-    private static final String TARGET_PACKAGE_NAME = "com.android.app";
-    private static final int ANOMALY_UID = 111;
-    private static final int NORMAL_UID = 222;
-    private static final int TARGET_UID = 333;
-    private static final long ANOMALY_BLUETOOTH_SCANNING_TIME = DateUtils.HOUR_IN_MILLIS;
-    private static final long NORMAL_BLUETOOTH_SCANNING_TIME = DateUtils.MINUTE_IN_MILLIS;
-    @Mock
-    private BatteryStatsHelper mBatteryStatsHelper;
-    @Mock
-    private BatterySipper mAnomalySipper;
-    @Mock
-    private BatterySipper mNormalSipper;
-    @Mock
-    private BatterySipper mTargetSipper;
-    @Mock
-    private BatteryStats.Uid mAnomalyUid;
-    @Mock
-    private BatteryStats.Uid mNormalUid;
-    @Mock
-    private BatteryStats.Uid mTargetUid;
-    @Mock
-    private BatteryUtils mBatteryUtils;
-    @Mock
-    private AnomalyDetectionPolicy mPolicy;
-    @Mock
-    private AnomalyAction mAnomalyAction;
-    @Mock
-    private AnomalyUtils mAnomalyUtils;
-
-    private BluetoothScanAnomalyDetector mBluetoothScanAnomalyDetector;
-    private Context mContext;
-    private List<BatterySipper> mUsageList;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = spy(RuntimeEnvironment.application);
-        ReflectionHelpers.setField(mPolicy, "bluetoothScanThreshold",
-                30 * DateUtils.MINUTE_IN_MILLIS);
-        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
-
-        mAnomalySipper.uidObj = mAnomalyUid;
-        doReturn(ANOMALY_UID).when(mAnomalyUid).getUid();
-        mNormalSipper.uidObj = mNormalUid;
-        doReturn(NORMAL_UID).when(mNormalUid).getUid();
-        mTargetSipper.uidObj = mTargetUid;
-        doReturn(TARGET_UID).when(mTargetUid).getUid();
-
-        mUsageList = new ArrayList<>();
-        mUsageList.add(mAnomalySipper);
-        mUsageList.add(mNormalSipper);
-        mUsageList.add(mTargetSipper);
-        when(mBatteryStatsHelper.getUsageList()).thenReturn(mUsageList);
-
-        mBluetoothScanAnomalyDetector = spy(new BluetoothScanAnomalyDetector(mContext, mPolicy,
-                mAnomalyUtils));
-        mBluetoothScanAnomalyDetector.mBatteryUtils = mBatteryUtils;
-        doReturn(false).when(mBatteryUtils).shouldHideSipper(any());
-        doReturn(true).when(mAnomalyAction).isActionActive(any());
-
-        doReturn(ANOMALY_BLUETOOTH_SCANNING_TIME).when(
-                mBluetoothScanAnomalyDetector).getBluetoothUnoptimizedBgTimeMs(eq(mAnomalyUid),
-                anyLong());
-        doReturn(ANOMALY_BLUETOOTH_SCANNING_TIME).when(
-                mBluetoothScanAnomalyDetector).getBluetoothUnoptimizedBgTimeMs(eq(mTargetUid),
-                anyLong());
-        doReturn(NORMAL_BLUETOOTH_SCANNING_TIME).when(
-                mBluetoothScanAnomalyDetector).getBluetoothUnoptimizedBgTimeMs(eq(mNormalUid),
-                anyLong());
-    }
-
-    @Test
-    public void testDetectAnomalies_containsAnomaly_detectIt() {
-        doReturn(-1).when(mBatteryUtils).getPackageUid(nullable(String.class));
-        final Anomaly anomaly = createBluetoothAnomaly(ANOMALY_UID);
-        final Anomaly targetAnomaly = createBluetoothAnomaly(TARGET_UID);
-
-        List<Anomaly> mAnomalies =
-            mBluetoothScanAnomalyDetector.detectAnomalies(mBatteryStatsHelper);
-
-        assertThat(mAnomalies).containsExactly(anomaly, targetAnomaly);
-    }
-
-    @Test
-    public void testDetectAnomalies_detectTargetAnomaly_detectIt() {
-        doReturn(TARGET_UID).when(mBatteryUtils).getPackageUid(TARGET_PACKAGE_NAME);
-        final Anomaly targetAnomaly = createBluetoothAnomaly(TARGET_UID);
-
-        List<Anomaly> mAnomalies =
-            mBluetoothScanAnomalyDetector.detectAnomalies(mBatteryStatsHelper, TARGET_PACKAGE_NAME);
-
-        assertThat(mAnomalies).containsExactly(targetAnomaly);
-    }
-
-    private Anomaly createBluetoothAnomaly(int uid) {
-        return new Anomaly.Builder()
-                .setUid(uid)
-                .setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
-                .setBluetoothScanningTimeMs(ANOMALY_BLUETOOTH_SCANNING_TIME)
-                .build();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
deleted file mode 100644
index b70dcaf..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.checker;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.os.BatteryStats;
-import android.text.format.DateUtils;
-
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
-import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class WakeLockAnomalyDetectorTest {
-
-    private static final String TARGET_PACKAGE_NAME = "com.android.app";
-    private static final long ANOMALY_WAKELOCK_TIME_MS = 2 * DateUtils.HOUR_IN_MILLIS;
-    private static final long NORMAL_WAKELOCK_TIME_MS = DateUtils.SECOND_IN_MILLIS;
-    private static final long WAKELOCK_THRESHOLD_MS = DateUtils.HOUR_IN_MILLIS;
-    private static final int ANOMALY_UID = 111;
-    private static final int NORMAL_UID = 222;
-    private static final int TARGET_UID = 333;
-    private static final int INACTIVE_UID = 444;
-    @Mock
-    private BatteryStatsHelper mBatteryStatsHelper;
-    @Mock
-    private BatterySipper mAnomalySipper;
-    @Mock
-    private BatterySipper mTargetSipper;
-    @Mock
-    private BatterySipper mNormalSipper;
-    @Mock
-    private BatterySipper mInactiveSipper;
-    @Mock
-    private BatteryStats.Uid mAnomalyUid;
-    @Mock
-    private BatteryStats.Uid mNormalUid;
-    @Mock
-    private BatteryStats.Uid mTargetUid;
-    @Mock
-    private BatteryStats.Uid mInactiveUid;
-    @Mock
-    private BatteryUtils mBatteryUtils;
-    @Mock
-    private PackageManager mPackageManager;
-    @Mock
-    private ApplicationInfo mApplicationInfo;
-    @Mock
-    private AnomalyDetectionPolicy mPolicy;
-    @Mock
-    private AnomalyAction mAnomalyAction;
-    @Mock
-    private AnomalyUtils mAnomalyUtils;
-
-    private WakeLockAnomalyDetector mWakelockAnomalyDetector;
-    private Context mContext;
-    private List<BatterySipper> mUsageList;
-    private Anomaly mAnomaly;
-    private Anomaly mTargetAnomaly;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = spy(RuntimeEnvironment.application);
-        ReflectionHelpers.setField(mPolicy, "wakeLockThreshold", WAKELOCK_THRESHOLD_MS);
-
-        doReturn(false).when(mBatteryUtils).shouldHideSipper(nullable(BatterySipper.class));
-        doReturn(mPackageManager).when(mContext).getPackageManager();
-        doReturn(mApplicationInfo).when(mPackageManager)
-            .getApplicationInfo(nullable(String.class), anyInt());
-        doReturn(true).when(mAnomalyAction).isActionActive(any());
-        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
-
-        mWakelockAnomalyDetector =
-            spy(new WakeLockAnomalyDetector(mContext, mPolicy, mAnomalyUtils));
-        mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils;
-
-        mAnomalySipper.uidObj = mAnomalyUid;
-        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
-            .getBackgroundTotalDurationMs(eq(mAnomalyUid), anyLong());
-        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
-            .getCurrentDurationMs(eq(mAnomalyUid), anyLong());
-        doReturn(ANOMALY_UID).when(mAnomalyUid).getUid();
-
-        mNormalSipper.uidObj = mNormalUid;
-        doReturn(NORMAL_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
-            .getBackgroundTotalDurationMs(eq(mNormalUid), anyLong());
-        doReturn(0L).when(mWakelockAnomalyDetector)
-            .getCurrentDurationMs(eq(mNormalUid), anyLong());
-        doReturn(NORMAL_UID).when(mNormalUid).getUid();
-
-        mTargetSipper.uidObj = mTargetUid;
-        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
-            .getBackgroundTotalDurationMs(eq(mTargetUid), anyLong());
-        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
-            .getCurrentDurationMs(eq(mTargetUid), anyLong());
-        doReturn(TARGET_UID).when(mTargetUid).getUid();
-
-        mInactiveSipper.uidObj = mInactiveUid;
-        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
-            .getBackgroundTotalDurationMs(eq(mInactiveUid), anyLong());
-        doReturn(0L).when(mWakelockAnomalyDetector)
-            .getCurrentDurationMs(eq(mInactiveUid), anyLong());
-        doReturn(INACTIVE_UID).when(mInactiveUid).getUid();
-
-        mUsageList = new ArrayList<>();
-        mUsageList.add(mAnomalySipper);
-        mUsageList.add(mNormalSipper);
-        mUsageList.add(mTargetSipper);
-        mUsageList.add(mInactiveSipper);
-        when(mBatteryStatsHelper.getUsageList()).thenReturn(mUsageList);
-
-        mAnomaly = createWakeLockAnomaly(ANOMALY_UID);
-        mTargetAnomaly = createWakeLockAnomaly(TARGET_UID);
-    }
-
-    @Test
-    public void testDetectAnomalies_containsAnomaly_detectIt() {
-        doReturn(BatteryUtils.UID_NULL).when(mBatteryUtils).getPackageUid(nullable(String.class));
-
-        List<Anomaly> mAnomalies = mWakelockAnomalyDetector.detectAnomalies(mBatteryStatsHelper);
-
-        assertThat(mAnomalies).containsExactly(mAnomaly, mTargetAnomaly);
-    }
-
-    @Test
-    public void testDetectAnomalies_containsTargetPackage_detectIt() {
-        doReturn(TARGET_UID).when(mBatteryUtils).getPackageUid(TARGET_PACKAGE_NAME);
-
-        List<Anomaly> mAnomalies =
-            mWakelockAnomalyDetector.detectAnomalies(mBatteryStatsHelper, TARGET_PACKAGE_NAME);
-
-        assertThat(mAnomalies).containsExactly(mTargetAnomaly);
-    }
-
-    @Test
-    public void testContainsThresholdFromPolicy() {
-        assertThat(mWakelockAnomalyDetector.mWakeLockThresholdMs).isEqualTo(WAKELOCK_THRESHOLD_MS);
-    }
-
-    private Anomaly createWakeLockAnomaly(int uid) {
-        return new Anomaly.Builder()
-                .setUid(uid)
-                .setType(Anomaly.AnomalyType.WAKE_LOCK)
-                .setWakeLockTimeMs(ANOMALY_WAKELOCK_TIME_MS)
-                .build();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java
deleted file mode 100644
index 789b80b..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly.checker;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.BatteryStats;
-import android.os.Build;
-import android.text.format.DateUtils;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
-import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class WakeupAlarmAnomalyDetectorTest {
-
-    private static final String TARGET_PACKAGE_NAME = "com.android.target";
-    private static final String ANOMALY_PACKAGE_NAME = "com.android.anomaly";
-    private static final boolean TARGET_BACKGROUND_RESTRICTION_ON = false;
-    private static final boolean ANOMALY_BACKGROUND_RESTRICTION_ON = true;
-    private static final int TARGET_SDK = Build.VERSION_CODES.L;
-    private static final int ANOMALY_SDK = Build.VERSION_CODES.O;
-    private static final int ANOMALY_UID = 111;
-    private static final int NORMAL_UID = 222;
-    private static final int TARGET_UID = 333;
-    private static final long RUNNING_TIME_MS =
-            1 * DateUtils.HOUR_IN_MILLIS + 10 * DateUtils.MINUTE_IN_MILLIS;
-    private static final int ANOMALY_WAKEUP_COUNT = 500;
-    private static final int NORMAL_WAKEUP_COUNT = 61;
-    private static final int BLACKLISTED_WAKEUP_COUNT = 37;
-    private static final int ANOMALY_WAKEUP_FREQUENCY = 428; // count per hour
-    @Mock
-    private BatteryStatsHelper mBatteryStatsHelper;
-    @Mock
-    private BatterySipper mAnomalySipper;
-    @Mock
-    private BatterySipper mNormalSipper;
-    @Mock
-    private BatterySipper mTargetSipper;
-    @Mock
-    private BatteryStats.Uid mAnomalyUid;
-    @Mock
-    private BatteryStats.Uid mNormalUid;
-    @Mock
-    private BatteryStats.Uid mTargetUid;
-    @Mock
-    private BatteryUtils mBatteryUtils;
-    @Mock
-    private BatteryStats.Uid.Pkg mPkg;
-    @Mock
-    private BatteryStats.Counter mCounter;
-    @Mock
-    private BatteryStats.Counter mCounter2;
-    @Mock
-    private AnomalyDetectionPolicy mPolicy;
-    @Mock
-    private AnomalyAction mAnomalyAction;
-    @Mock
-    private AnomalyUtils mAnomalyUtils;
-
-    private WakeupAlarmAnomalyDetector mWakeupAlarmAnomalyDetector;
-    private Context mContext;
-    private List<BatterySipper> mUsageList;
-    private Anomaly mAnomaly;
-    private Anomaly mTargetAnomaly;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = spy(RuntimeEnvironment.application);
-        ReflectionHelpers.setField(mPolicy, "wakeupAlarmThreshold", 60);
-        final Set<String> blacklistedTags = new ArraySet<>();
-        blacklistedTags.add("blacklistedTag");
-        ReflectionHelpers.setField(mPolicy, "wakeupBlacklistedTags", blacklistedTags);
-
-        doReturn(false).when(mBatteryUtils).shouldHideSipper(any());
-        doReturn(RUNNING_TIME_MS).when(mBatteryUtils)
-            .calculateRunningTimeBasedOnStatsType(any(), anyInt());
-        doReturn(true).when(mAnomalyAction).isActionActive(any());
-        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
-
-        mAnomalySipper.uidObj = mAnomalyUid;
-        doReturn(ANOMALY_UID).when(mAnomalyUid).getUid();
-        mNormalSipper.uidObj = mNormalUid;
-        doReturn(NORMAL_UID).when(mNormalUid).getUid();
-        mTargetSipper.uidObj = mTargetUid;
-        doReturn(TARGET_UID).when(mTargetUid).getUid();
-
-        mUsageList = new ArrayList<>();
-        mUsageList.add(mAnomalySipper);
-        mUsageList.add(mNormalSipper);
-        mUsageList.add(mTargetSipper);
-        when(mBatteryStatsHelper.getUsageList()).thenReturn(mUsageList);
-
-        doReturn(TARGET_PACKAGE_NAME).when(mBatteryUtils).getPackageName(TARGET_UID);
-        doReturn(ANOMALY_PACKAGE_NAME).when(mBatteryUtils).getPackageName(ANOMALY_UID);
-        doReturn(TARGET_SDK).when(mBatteryUtils).getTargetSdkVersion(TARGET_PACKAGE_NAME);
-        doReturn(ANOMALY_SDK).when(mBatteryUtils).getTargetSdkVersion(ANOMALY_PACKAGE_NAME);
-        doReturn(TARGET_BACKGROUND_RESTRICTION_ON).when(mBatteryUtils)
-                .isBackgroundRestrictionEnabled(TARGET_SDK, TARGET_UID, TARGET_PACKAGE_NAME);
-        doReturn(ANOMALY_BACKGROUND_RESTRICTION_ON).when(mBatteryUtils)
-                .isBackgroundRestrictionEnabled(ANOMALY_SDK, ANOMALY_UID, ANOMALY_PACKAGE_NAME);
-
-        mAnomaly = new Anomaly.Builder()
-                .setUid(ANOMALY_UID)
-                .setPackageName(ANOMALY_PACKAGE_NAME)
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setTargetSdkVersion(ANOMALY_SDK)
-                .setBackgroundRestrictionEnabled(ANOMALY_BACKGROUND_RESTRICTION_ON)
-                .setWakeupAlarmCount(ANOMALY_WAKEUP_FREQUENCY)
-                .build();
-        mTargetAnomaly = new Anomaly.Builder()
-                .setUid(TARGET_UID)
-                .setPackageName(TARGET_PACKAGE_NAME)
-                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
-                .setTargetSdkVersion(TARGET_SDK)
-                .setBackgroundRestrictionEnabled(TARGET_BACKGROUND_RESTRICTION_ON)
-                .setWakeupAlarmCount(ANOMALY_WAKEUP_FREQUENCY)
-                .build();
-
-        mWakeupAlarmAnomalyDetector =
-            spy(new WakeupAlarmAnomalyDetector(mContext, mPolicy, mAnomalyUtils));
-        mWakeupAlarmAnomalyDetector.mBatteryUtils = mBatteryUtils;
-    }
-
-    @Test
-    public void testDetectAnomalies_containsAnomaly_detectIt() {
-        doReturn(-1).when(mBatteryUtils).getPackageUid(nullable(String.class));
-        doReturn(ANOMALY_WAKEUP_COUNT).when(mWakeupAlarmAnomalyDetector)
-            .getWakeupAlarmCountFromUid(mAnomalyUid);
-        doReturn(ANOMALY_WAKEUP_COUNT).when(mWakeupAlarmAnomalyDetector)
-            .getWakeupAlarmCountFromUid(mTargetUid);
-        doReturn(NORMAL_WAKEUP_COUNT).when(mWakeupAlarmAnomalyDetector)
-            .getWakeupAlarmCountFromUid(mNormalUid);
-
-        List<Anomaly> mAnomalies = mWakeupAlarmAnomalyDetector.detectAnomalies(mBatteryStatsHelper);
-
-        assertThat(mAnomalies).containsExactly(mAnomaly, mTargetAnomaly);
-    }
-
-    @Test
-    public void testDetectAnomalies_detectTargetAnomaly_detectIt() {
-        doReturn(TARGET_UID).when(mBatteryUtils).getPackageUid(TARGET_PACKAGE_NAME);
-        doReturn(ANOMALY_WAKEUP_COUNT).when(mWakeupAlarmAnomalyDetector)
-            .getWakeupAlarmCountFromUid(mAnomalyUid);
-        doReturn(ANOMALY_WAKEUP_COUNT).when(mWakeupAlarmAnomalyDetector)
-            .getWakeupAlarmCountFromUid(mTargetUid);
-        doReturn(NORMAL_WAKEUP_COUNT).when(mWakeupAlarmAnomalyDetector)
-            .getWakeupAlarmCountFromUid(mNormalUid);
-
-        List<Anomaly> mAnomalies = mWakeupAlarmAnomalyDetector
-            .detectAnomalies(mBatteryStatsHelper, TARGET_PACKAGE_NAME);
-
-        assertThat(mAnomalies).containsExactly(mTargetAnomaly);
-    }
-
-    @Test
-    public void testGetWakeupAlarmCountFromUid_countCorrect() {
-        final ArrayMap<String, BatteryStats.Uid.Pkg> packageStats = new ArrayMap<>();
-        final ArrayMap<String, BatteryStats.Counter> alarms = new ArrayMap<>();
-        doReturn(alarms).when(mPkg).getWakeupAlarmStats();
-        doReturn(NORMAL_WAKEUP_COUNT).when(mCounter).getCountLocked(anyInt());
-        doReturn(packageStats).when(mAnomalyUid).getPackageStats();
-        packageStats.put("", mPkg);
-        alarms.put("1", mCounter);
-        alarms.put("2", mCounter);
-
-        assertThat(mWakeupAlarmAnomalyDetector.getWakeupAlarmCountFromUid(mAnomalyUid))
-            .isEqualTo(2 * NORMAL_WAKEUP_COUNT);
-    }
-
-    @Test
-    public void testGetWakeupAlarmCountFromUid_filterOutBlacklistedTags() {
-        final ArrayMap<String, BatteryStats.Uid.Pkg> packageStats = new ArrayMap<>();
-        final ArrayMap<String, BatteryStats.Counter> alarms = new ArrayMap<>();
-        doReturn(alarms).when(mPkg).getWakeupAlarmStats();
-        doReturn(NORMAL_WAKEUP_COUNT).when(mCounter).getCountLocked(anyInt());
-        doReturn(BLACKLISTED_WAKEUP_COUNT).when(mCounter2).getCountLocked(anyInt());
-        doReturn(packageStats).when(mAnomalyUid).getPackageStats();
-        packageStats.put("", mPkg);
-        alarms.put("allowedTag", mCounter);
-        alarms.put("blacklistedTag", mCounter2);
-
-        assertThat(mWakeupAlarmAnomalyDetector.getWakeupAlarmCountFromUid(mAnomalyUid))
-            .isEqualTo(NORMAL_WAKEUP_COUNT);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java
index 74e8fe6..ef12673 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AppInfoTest.java
@@ -21,7 +21,6 @@
 import android.os.Parcel;
 import android.text.format.DateUtils;
 
-import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
@@ -36,8 +35,10 @@
 public class AppInfoTest {
 
     private static final String PACKAGE_NAME = "com.android.app";
-    private static final int TYPE_WAKELOCK = Anomaly.AnomalyType.WAKE_LOCK;
-    private static final int TYPE_WAKEUP = Anomaly.AnomalyType.WAKEUP_ALARM;
+    private static final int TYPE_WAKELOCK =
+            StatsManagerConfig.AnomalyType.EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF;
+    private static final int TYPE_WAKEUP =
+            StatsManagerConfig.AnomalyType.EXCESSIVE_WAKEUPS_IN_BACKGROUND;
     private static final long SCREEN_TIME_MS = DateUtils.HOUR_IN_MILLIS;
     private static final int UID = 3452;
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
index e9c9978..8882101 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
@@ -20,7 +20,6 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.text.format.DateUtils;
 
@@ -33,6 +32,8 @@
 import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowUtils;
 import com.android.settingslib.testutils.FragmentTestUtils;
 
@@ -42,16 +43,16 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowDialog;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.appcompat.app.AlertDialog;
+
 @RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = ShadowUtils.class)
+@Config(shadows = {ShadowUtils.class, ShadowAlertDialogCompat.class,
+        SettingsShadowResourcesImpl.class})
 public class BatteryTipDialogFragmentTest {
 
     private static final String PACKAGE_NAME = "com.android.app";
@@ -108,8 +109,8 @@
 
         Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable();
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getMessage()).isEqualTo(
                 mContext.getString(R.string.battery_tip_dialog_message, 1));
@@ -121,8 +122,8 @@
 
         FragmentTestUtils.startFragment(mDialogFragment);
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getTitle()).isEqualTo("Restrict app?");
         assertThat(shadowDialog.getMessage())
@@ -142,8 +143,8 @@
 
         Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable();
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getTitle()).isEqualTo("Restrict 2 apps?");
         assertThat(shadowDialog.getMessage())
@@ -171,8 +172,8 @@
 
         Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable();
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getTitle()).isEqualTo("Restrict 6 apps?");
         assertThat(shadowDialog.getMessage())
@@ -189,8 +190,8 @@
 
         FragmentTestUtils.startFragment(mDialogFragment);
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getTitle()).isEqualTo("Remove restriction?");
         assertThat(shadowDialog.getMessage())
@@ -204,8 +205,8 @@
 
         FragmentTestUtils.startFragment(mDialogFragment);
 
-        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
-        ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog);
+        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
 
         assertThat(shadowDialog.getMessage()).isEqualTo(
                 "Your apps are using a normal amount of battery. If apps use too much battery, "
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java
index b0d6a7d..3ada030 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java
@@ -28,9 +28,13 @@
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.fuelgauge.BatteryInfo;
 import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
+import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
+import com.android.settings.testutils.BatteryTestUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -77,6 +81,12 @@
         mBatteryTipLoader.mBatteryUtils = mBatteryUtils;
     }
 
+    @After
+    public void tearDown() {
+        BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance");
+        BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance");
+    }
+
     @Test
     public void testLoadBackground_containsAllTipsWithOrder() {
         final List<BatteryTip> batteryTips = mBatteryTipLoader.loadInBackground();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
index 547e0eb..053a716 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
@@ -49,7 +49,8 @@
             + ",test_battery_saver_tip=true"
             + ",test_high_usage_tip=false"
             + ",test_smart_battery_tip=true"
-            + ",test_low_battery_tip=true";
+            + ",test_low_battery_tip=true"
+            + ",app_restriction_active_hour=6";
     private Context mContext;
 
     @Before
@@ -72,6 +73,7 @@
         assertThat(batteryTipPolicy.highUsagePeriodMs).isEqualTo(2000);
         assertThat(batteryTipPolicy.highUsageBatteryDraining).isEqualTo(30);
         assertThat(batteryTipPolicy.appRestrictionEnabled).isTrue();
+        assertThat(batteryTipPolicy.appRestrictionActiveHour).isEqualTo(6);
         assertThat(batteryTipPolicy.reducedBatteryEnabled).isTrue();
         assertThat(batteryTipPolicy.reducedBatteryPercent).isEqualTo(30);
         assertThat(batteryTipPolicy.lowBatteryEnabled).isFalse();
@@ -99,6 +101,7 @@
         assertThat(batteryTipPolicy.highUsagePeriodMs).isEqualTo(2 * DateUtils.HOUR_IN_MILLIS);
         assertThat(batteryTipPolicy.highUsageBatteryDraining).isEqualTo(25);
         assertThat(batteryTipPolicy.appRestrictionEnabled).isTrue();
+        assertThat(batteryTipPolicy.appRestrictionActiveHour).isEqualTo(24);
         assertThat(batteryTipPolicy.reducedBatteryEnabled).isFalse();
         assertThat(batteryTipPolicy.reducedBatteryPercent).isEqualTo(50);
         assertThat(batteryTipPolicy.lowBatteryEnabled).isTrue();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java
index 459c4e2..3882e8c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge.batterytip;
 
 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.when;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
index 6ef4c74..179f2a1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
@@ -34,8 +34,11 @@
 import com.android.settings.fuelgauge.batterytip.AppInfo;
 import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
+import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
+import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
+import com.android.settings.testutils.BatteryTestUtils;
 import com.android.settings.testutils.DatabaseTestUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -86,6 +89,7 @@
         mContext = spy(RuntimeEnvironment.application);
         mPolicy = spy(new BatteryTipPolicy(mContext));
 
+        doReturn(mContext).when(mContext).getApplicationContext();
         doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
         doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(
                 AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, RESTRICTED_UID, RESTRICTED_PACKAGE_NAME);
@@ -93,6 +97,7 @@
                 AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UNRESTRICTED_UID,
                 UNRESTRICTED_PACKAGE_NAME);
 
+        BatteryDatabaseManager.setUpForTest(mBatteryDatabaseManager);
         doReturn(mPackageManager).when(mContext).getPackageManager();
         doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(any(),
                 anyInt());
@@ -102,7 +107,12 @@
 
         mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy);
         mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager;
+    }
 
+    @After
+    public void tearDown() {
+        BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance");
+        BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance");
     }
 
     @After
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
index 5c8b7d9..dd3e281 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
@@ -34,9 +34,11 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.fuelgauge.batterytip.AppInfo;
+import com.android.settings.testutils.BatteryTestUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -74,6 +76,7 @@
         MockitoAnnotations.initMocks(this);
 
         mContext = spy(RuntimeEnvironment.application);
+        doReturn(mContext).when(mContext).getApplicationContext();
         doReturn(mPackageManager).when(mContext).getPackageManager();
         doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME,
                 PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER);
@@ -98,6 +101,12 @@
         mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
     }
 
+    @After
+    public void tearDown() {
+        BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance");
+        BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance");
+    }
+
     @Test
     public void parcelable() {
         Parcel parcel = Parcel.obtain();
diff --git a/tests/robotests/src/com/android/settings/localepicker/LocalePickerWithRegionActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/LocalePickerWithRegionActivityTest.java
new file mode 100644
index 0000000..bad3dbd
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/localepicker/LocalePickerWithRegionActivityTest.java
@@ -0,0 +1,51 @@
+package com.android.settings.localepicker;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+
+import android.app.Activity;
+
+import com.android.internal.app.LocaleStore;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.shadows.ShadowActivity;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class LocalePickerWithRegionActivityTest {
+
+    private LocalePickerWithRegionActivity mActivity;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        final ActivityController<LocalePickerWithRegionActivity> mActivityController =
+                Robolectric.buildActivity(LocalePickerWithRegionActivity.class);
+        mActivity = spy(mActivityController.get());
+    }
+
+    @Test
+    public void onLocaleSelected_resultShouldBeOK() {
+        final ShadowActivity shadowActivity = Shadows.shadowOf(mActivity);
+        mActivity.onLocaleSelected(mock(LocaleStore.LocaleInfo.class));
+
+        assertEquals(Activity.RESULT_OK, shadowActivity.getResultCode());
+    }
+
+    @Test
+    public void onLocaleSelected_localeInfoShouldBeSentBack() {
+        final ShadowActivity shadowActivity = Shadows.shadowOf(mActivity);
+        mActivity.onLocaleSelected(mock(LocaleStore.LocaleInfo.class));
+
+        assertNotNull(shadowActivity.getResultIntent().getSerializableExtra(
+                LocaleListEditor.INTENT_LOCALE_KEY));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/location/InjectedSettingTest.java b/tests/robotests/src/com/android/settings/location/InjectedSettingTest.java
deleted file mode 100644
index 5045837..0000000
--- a/tests/robotests/src/com/android/settings/location/InjectedSettingTest.java
+++ /dev/null
@@ -1,59 +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.location;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public final class InjectedSettingTest {
-
-    private static final String TEST_STRING = "test";
-
-    @Test
-    public void buildWithoutPackageName_ShouldReturnNull() {
-        assertThat(((new InjectedSetting.Builder())
-                .setClassName(TEST_STRING)
-                .setTitle(TEST_STRING)
-                .setSettingsActivity(TEST_STRING).build())).isNull();
-    }
-
-    private InjectedSetting getTestSetting() {
-        return new InjectedSetting.Builder()
-                .setPackageName(TEST_STRING)
-                .setClassName(TEST_STRING)
-                .setTitle(TEST_STRING)
-                .setSettingsActivity(TEST_STRING).build();
-    }
-
-    @Test
-    public void testEquals() {
-        InjectedSetting setting1 = getTestSetting();
-        InjectedSetting setting2 = getTestSetting();
-        assertThat(setting1).isEqualTo(setting2);
-    }
-
-    @Test
-    public void testHashCode() {
-        InjectedSetting setting = getTestSetting();
-        assertThat(setting.hashCode()).isEqualTo(1225314048);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java
index ba5decc..f0904d0 100644
--- a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java
@@ -67,7 +67,7 @@
     @Mock
     private PreferenceScreen mScreen;
     @Mock
-    private SettingsInjector mSettingsInjector;
+    private AppSettingsInjector mSettingsInjector;
     @Mock
     private DevicePolicyManager mDevicePolicyManager;
 
diff --git a/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogPreferenceTest.java b/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogPreferenceTest.java
index 3e1cde1..cb26fb6 100644
--- a/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogPreferenceTest.java
@@ -25,7 +25,6 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import android.app.AlertDialog;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -49,6 +48,8 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
+import androidx.appcompat.app.AlertDialog;
+
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = ShadowOs.class)
 public class PrivateDnsModeDialogPreferenceTest {
@@ -132,9 +133,9 @@
     @Test
     public void testOnCheckedChanged_switchMode_saveButtonHasCorrectState() {
         final String[] INVALID_HOST_NAMES = new String[] {
-            INVALID_HOST_NAME,
-            "2001:db8::53",  // IPv6 string literal
-            "192.168.1.1",   // IPv4 string literal
+                INVALID_HOST_NAME,
+                "2001:db8::53",  // IPv6 string literal
+                "192.168.1.1",   // IPv4 string literal
         };
 
         for (String invalid : INVALID_HOST_NAMES) {
diff --git a/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java
index 3d33ec2..150a89f 100644
--- a/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java
@@ -17,9 +17,12 @@
 package com.android.settings.notification;
 
 import static android.provider.Settings.Secure.NOTIFICATION_BADGING;
+
 import static com.android.settings.notification.BadgingNotificationPreferenceController.OFF;
 import static com.android.settings.notification.BadgingNotificationPreferenceController.ON;
+
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -27,20 +30,21 @@
 import android.content.Context;
 import android.provider.Settings;
 
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 import androidx.preference.TwoStatePreference;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class BadgingNotificationPreferenceControllerTest {
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
diff --git a/tests/robotests/src/com/android/settings/notification/DeletedChannelsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/DeletedChannelsPreferenceControllerTest.java
index 5aecadc..c1428a4 100644
--- a/tests/robotests/src/com/android/settings/notification/DeletedChannelsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/DeletedChannelsPreferenceControllerTest.java
@@ -18,6 +18,7 @@
 
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
+
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.mock;
@@ -31,18 +32,19 @@
 import android.content.Context;
 import android.os.UserManager;
 
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
 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;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.shadows.ShadowApplication;
 
 import androidx.preference.Preference;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class DeletedChannelsPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java
index 71ca554..b4f86a7 100644
--- a/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java
@@ -17,7 +17,9 @@
 package com.android.settings.notification;
 
 import static android.provider.Settings.System.NOTIFICATION_LIGHT_PULSE;
+
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -28,6 +30,7 @@
 import android.provider.Settings;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -35,14 +38,13 @@
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 import androidx.preference.TwoStatePreference;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class PulseNotificationPreferenceControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
index f76a5ca..5068f85 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 Google Inc.
+ * 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.
@@ -16,38 +16,33 @@
 
 package com.android.settings.password;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import android.app.AlertDialog;
 import android.content.Context;
 
 import com.android.settings.R;
 import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settings.testutils.shadow.ShadowUtils;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settingslib.testutils.FragmentTestUtils;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowDialog;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 @RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowUtils.class})
+@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class})
 public class ChooseLockTypeDialogFragmentTest {
 
     private Context mContext;
@@ -61,32 +56,36 @@
     }
 
     @Test
-    @Ignore("b/111247403")
     public void testThatDialog_IsShown() {
         AlertDialog latestDialog = startLockFragment();
-        assertNotNull(latestDialog);
-        ShadowDialog shadowDialog = Shadows.shadowOf(latestDialog);
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(
+                latestDialog);
+
+        assertThat(latestDialog).isNotNull();
+        assertThat(latestDialog.isShowing()).isTrue();
         // verify that we are looking at the expected dialog.
-        assertEquals(shadowDialog.getTitle(),
+        assertThat(shadowAlertDialog.getTitle()).isEqualTo(
                 mContext.getString(R.string.setup_lock_settings_options_dialog_title));
     }
 
     @Test
-    @Ignore("b/111247403")
     public void testThat_OnClickListener_IsCalled() {
         mFragment.mDelegate = mock(OnLockTypeSelectedListener.class);
         AlertDialog lockDialog = startLockFragment();
-        ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(lockDialog);
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(lockDialog);
+
         shadowAlertDialog.clickOnItem(0);
+
         verify(mFragment.mDelegate, times(1)).onLockTypeSelected(any(ScreenLockType.class));
     }
 
     @Test
-    @Ignore("b/111247403")
     public void testThat_OnClickListener_IsNotCalledWhenCancelled() {
         mFragment.mDelegate = mock(OnLockTypeSelectedListener.class);
         AlertDialog lockDialog = startLockFragment();
+
         lockDialog.dismiss();
+
         verify(mFragment.mDelegate, never()).onLockTypeSelected(any(ScreenLockType.class));
     }
 
@@ -94,7 +93,7 @@
         ChooseLockTypeDialogFragment chooseLockTypeDialogFragment =
                 ChooseLockTypeDialogFragment.newInstance(1234);
         chooseLockTypeDialogFragment.show(mFragment.getChildFragmentManager(), null);
-        return ShadowAlertDialog.getLatestAlertDialog();
+        return ShadowAlertDialogCompat.getLatestAlertDialog();
     }
 
     public static class TestFragment extends Fragment implements OnLockTypeSelectedListener {
diff --git a/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java b/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java
index 636248a..1d0b71f 100644
--- a/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java
+++ b/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java
@@ -20,9 +20,8 @@
 
 import com.android.settings.password.ConfirmDeviceCredentialBaseFragment.LastTryDialog;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
 
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
@@ -32,13 +31,12 @@
 import androidx.fragment.app.FragmentManager;
 
 @RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = SettingsShadowResources.SettingsShadowTheme.class)
+@Config(shadows = SettingsShadowResourcesImpl.class)
 public class ConfirmCredentialTest {
     @Test
-    @Ignore("b/111193572")
     public void testLastTryDialogShownExactlyOnce() {
         FragmentManager fm = Robolectric.buildActivity(FragmentActivity.class).
-                get().getSupportFragmentManager();
+                setup().get().getSupportFragmentManager();
 
         // Launch only one instance at a time.
         assertThat(LastTryDialog.show(
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
index 627a4a0..d2ec785 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
@@ -19,7 +19,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.robolectric.RuntimeEnvironment.application;
 
-import android.app.AlertDialog;
 import android.content.ComponentName;
 import android.content.pm.PackageManager;
 import android.os.UserHandle;
@@ -37,28 +36,29 @@
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowUtils;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
 import org.robolectric.shadows.ShadowPackageManager;
 import org.robolectric.util.ReflectionHelpers;
 import org.robolectric.util.ReflectionHelpers.ClassParameter;
 
 import java.util.Arrays;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentActivity;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = {
-    SettingsShadowResourcesImpl.class,
-    SettingsShadowResources.SettingsShadowTheme.class,
-    ShadowUtils.class
+        SettingsShadowResourcesImpl.class,
+        SettingsShadowResources.SettingsShadowTheme.class,
+        ShadowUtils.class,
+        ShadowAlertDialogCompat.class
 })
 public class SetupChooseLockPatternTest {
 
@@ -88,7 +88,7 @@
         ShadowPackageManager spm = Shadows.shadowOf(application.getPackageManager());
         ComponentName cname = new ComponentName(application, SetupRedactionInterstitial.class);
         final int componentEnabled = spm.getComponentEnabledSettingFlags(cname)
-            & PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+                & PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
         assertThat(componentEnabled).isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
     }
 
@@ -111,22 +111,20 @@
         assertThat(button.getVisibility()).isEqualTo(View.VISIBLE);
 
         button.performClick();
-        AlertDialog chooserDialog = ShadowAlertDialog.getLatestAlertDialog();
+        AlertDialog chooserDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
         assertThat(chooserDialog).isNotNull();
-        int count = Shadows.shadowOf(chooserDialog).getAdapter().getCount();
+        int count = chooserDialog.getListView().getCount();
         assertThat(count).named("List items shown").isEqualTo(3);
     }
 
     @Config(qualifiers = "sw400dp")
     @Test
-    @Ignore("b/111194289")
     public void sw400dp_shouldShowScreenLockOptions() {
         verifyScreenLockOptionsShown();
     }
 
     @Config(qualifiers = "sw400dp-land")
     @Test
-    @Ignore("b/111194289")
     public void sw400dpLandscape_shouldShowScreenLockOptions() {
         verifyScreenLockOptionsShown();
     }
@@ -156,7 +154,7 @@
         assertThat(skipButton.getVisibility()).isEqualTo(View.VISIBLE);
 
         skipButton.performClick();
-        AlertDialog chooserDialog = ShadowAlertDialog.getLatestAlertDialog();
+        AlertDialog chooserDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
         assertThat(chooserDialog).isNotNull();
     }
 
diff --git a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
index 57cf7cd..aa36b33 100644
--- a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
@@ -16,30 +16,30 @@
 
 package com.android.settings.password;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import android.app.AlertDialog;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.android.settings.R;
 import com.android.settings.testutils.Robolectric;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowUtils;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentActivity;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = {
-    SettingsShadowResources.SettingsShadowTheme.class,
-    ShadowUtils.class
+        SettingsShadowResources.SettingsShadowTheme.class,
+        ShadowUtils.class,
+        ShadowAlertDialogCompat.class,
+        SettingsShadowResourcesImpl.class
 })
 public class SetupSkipDialogTest {
 
@@ -55,12 +55,12 @@
         SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(false);
         setupSkipDialog.show(mActivity.getSupportFragmentManager());
 
-        AlertDialog alertDialog = ShadowAlertDialog.getLatestAlertDialog();
-        assertNotNull(alertDialog);
-        ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(alertDialog);
-        assertEquals(mActivity.getString(R.string.lock_screen_intro_skip_title),
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(mActivity.getString(R.string.lock_screen_intro_skip_title)).isEqualTo(
                 shadowAlertDialog.getTitle());
-        assertEquals(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text),
+        assertThat(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text)).isEqualTo(
                 shadowAlertDialog.getMessage());
     }
 
@@ -69,12 +69,12 @@
         SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(true);
         setupSkipDialog.show(mActivity.getSupportFragmentManager());
 
-        AlertDialog alertDialog = ShadowAlertDialog.getLatestAlertDialog();
-        assertNotNull(alertDialog);
-        ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(alertDialog);
-        assertEquals(mActivity.getString(R.string.lock_screen_intro_skip_title),
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(mActivity.getString(R.string.lock_screen_intro_skip_title)).isEqualTo(
                 shadowAlertDialog.getTitle());
-        assertEquals(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text_frp),
+        assertThat(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text_frp)).isEqualTo(
                 shadowAlertDialog.getMessage());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java
index 173f56b..7e8c0d5 100644
--- a/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java
@@ -17,17 +17,22 @@
 package com.android.settings.security;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
 
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.display.AmbientDisplayAlwaysOnPreferenceController;
 import com.android.settings.display.AmbientDisplayNotificationsPreferenceController;
 import com.android.settings.gestures.DoubleTapScreenPreferenceController;
 import com.android.settings.gestures.PickupGesturePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.XmlTestUtils;
 import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
@@ -37,6 +42,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
@@ -49,12 +55,18 @@
 })
 public class LockscreenDashboardFragmentTest {
 
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    private FakeFeatureFactory mFeatureFactory;
     private TestFragment mTestFragment;
     private Context mContext;
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(any(Context.class)))
+                .thenReturn(mLockPatternUtils);
         mContext = RuntimeEnvironment.application;
         mTestFragment = spy(new TestFragment());
     }
@@ -112,6 +124,16 @@
         verify(controller).setConfig(any());
     }
 
+    @Test
+    public void isPageSearchable_notLocked_shouldNotBeSearchable() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true);
+
+        assertThat(LockscreenDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
+                .getNonIndexableKeys(mContext))
+                .contains("security_lockscreen_settings_screen");
+    }
+
     public static class TestFragment extends LockscreenDashboardFragment {
         @Override
         protected <T extends AbstractPreferenceController> T use(Class<T> clazz) {
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index ed33a80..b96c128 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -48,8 +48,11 @@
 import org.mockito.ArgumentCaptor;
 import org.robolectric.RuntimeEnvironment;
 
+import androidx.core.graphics.drawable.IconCompat;
 import androidx.slice.Slice;
+import androidx.slice.SliceMetadata;
 import androidx.slice.SliceProvider;
+import androidx.slice.core.SliceAction;
 import androidx.slice.widget.SliceLiveData;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -406,27 +409,92 @@
         assertThat(intentData).isEqualTo(expectedUri);
     }
 
+    @Test
+    public void buildIntentSlice_noIconPassed_returnsSliceWithIcon() {
+        final int expectedIconResource = IconCompat.createWithResource(mContext,
+                R.drawable.ic_settings).toIcon().getResId();
+        final SliceData sliceData = getDummyData(CONTEXT_CONTROLLER, SliceData.SliceType.INTENT,
+                0x0);
+
+        final Slice slice = SliceBuilderUtils.buildSlice(mContext, sliceData);
+
+        final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
+        final SliceAction primaryAction = metadata.getPrimaryAction();
+        final int actualIconResource = primaryAction.getIcon().toIcon().getResId();
+        assertThat(actualIconResource).isEqualTo(expectedIconResource);
+    }
+
+    @Test
+    public void buildToggleSlice_noIconPassed_returnsSliceWithIcon() {
+        final int expectedIconResource = IconCompat.createWithResource(mContext,
+                R.drawable.ic_settings).toIcon().getResId();
+        final SliceData dummyData = getDummyData(TOGGLE_CONTROLLER, SliceData.SliceType.SWITCH,
+                0x0);
+
+        final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData);
+
+        final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
+        final SliceAction primaryAction = metadata.getPrimaryAction();
+        final int actualIconResource = primaryAction.getIcon().toIcon().getResId();
+        assertThat(actualIconResource).isEqualTo(expectedIconResource);
+    }
+
+    @Test
+    public void buildSliderSlice_noIconPassed_returnsSliceWithIcon() {
+        final int expectedIconResource = IconCompat.createWithResource(mContext,
+                R.drawable.ic_settings).toIcon().getResId();
+        final SliceData data = getDummyData(SLIDER_CONTROLLER, SliceData.SliceType.SLIDER, 0x0);
+
+        final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
+
+        final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
+        final SliceAction primaryAction = metadata.getPrimaryAction();
+        final int actualIconResource = primaryAction.getIcon().toIcon().getResId();
+        assertThat(actualIconResource).isEqualTo(expectedIconResource);
+    }
+
+    @Test
+    public void getSafeIcon_replacesEmptyIconWithSettingsIcon() {
+        final int settingsIcon = R.drawable.ic_settings;
+        final int zeroIcon = 0x0;
+        final SliceData data = getDummyData(TOGGLE_CONTROLLER, SliceData.SliceType.SWITCH,
+                zeroIcon);
+
+        final IconCompat actualIcon = SliceBuilderUtils.getSafeIcon(mContext, data);
+
+        final int actualIconResource = actualIcon.toIcon().getResId();
+        assertThat(actualIconResource).isNotEqualTo(zeroIcon);
+        assertThat(actualIconResource).isEqualTo(settingsIcon);
+    }
+
     private SliceData getDummyData() {
-        return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE);
+        return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE,
+                ICON);
+    }
+
+    private SliceData getDummyData(Class prefController, int sliceType, int icon) {
+        return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE,
+                icon);
     }
 
     private SliceData getDummyData(String summary, String screenTitle) {
-        return getDummyData(TOGGLE_CONTROLLER, summary, SliceData.SliceType.SWITCH, screenTitle);
+        return getDummyData(TOGGLE_CONTROLLER, summary, SliceData.SliceType.SWITCH, screenTitle,
+                ICON);
     }
 
     private SliceData getDummyData(Class prefController, int sliceType) {
-        return getDummyData(prefController, SUMMARY, sliceType, SCREEN_TITLE);
+        return getDummyData(prefController, SUMMARY, sliceType, SCREEN_TITLE, ICON);
     }
 
     private SliceData getDummyData(Class prefController, String summary, int sliceType,
-            String screenTitle) {
+            String screenTitle, int icon) {
         return new SliceData.Builder()
                 .setKey(KEY)
                 .setTitle(TITLE)
                 .setSummary(summary)
                 .setScreenTitle(screenTitle)
                 .setKeywords(KEYWORDS)
-                .setIcon(ICON)
+                .setIcon(icon)
                 .setFragmentName(FRAGMENT_NAME)
                 .setUri(URI)
                 .setPreferenceControllerClassName(prefController.getName())
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index 2bdab27..eed2009 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -19,6 +19,8 @@
 import android.content.Intent;
 import android.os.BatteryManager;
 
+import java.lang.reflect.Field;
+
 public class BatteryTestUtils {
 
     public static Intent getChargingIntent() {
@@ -47,4 +49,15 @@
         return intent;
     }
 
+    public static void clearStaticInstance(Class clazz, String fieldName) {
+        Field instance;
+        try {
+            instance = clazz.getDeclaredField(fieldName);
+            instance.setAccessible(true);
+            instance.set(null, null);
+        } catch (Exception e) {
+            throw new RuntimeException();
+        }
+    }
+
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResourcesImpl.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResourcesImpl.java
index 9fb69a3..dd51687 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResourcesImpl.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResourcesImpl.java
@@ -43,7 +43,8 @@
         // that Robolectric isn't yet aware of.
         // TODO: Remove this once Robolectric is updated.
         if (id == R.drawable.switchbar_background
-                || id == R.color.ripple_material_light) {
+                || id == R.color.ripple_material_light
+                || id == R.color.ripple_material_dark) {
             return new ColorDrawable();
         } else if (id == R.drawable.ic_launcher_settings) {
             // ic_launcher_settings uses adaptive-icon, which is not supported by robolectric,
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowTypedArray.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowTypedArray.java
new file mode 100644
index 0000000..fc3ff0c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowTypedArray.java
@@ -0,0 +1,47 @@
+/*
+ * 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.testutils.shadow;
+
+import static org.robolectric.shadow.api.Shadow.directlyOn;
+
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.StyleableRes;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.RealObject;
+import org.robolectric.shadows.ShadowTypedArray;
+
+@Implements(value = TypedArray.class, inheritImplementationMethods = true)
+public class SettingsShadowTypedArray extends ShadowTypedArray {
+
+    @RealObject
+    TypedArray realTypedArray;
+
+    @Implementation
+    @Nullable
+    public ColorStateList getColorStateList(@StyleableRes int index) {
+        if (index == com.android.internal.R.styleable.TextView_textColorLink) {
+            return ColorStateList.valueOf(Color.WHITE);
+        }
+        return directlyOn(realTypedArray, TypedArray.class).getColorStateList(index);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessPoint.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessPoint.java
new file mode 100644
index 0000000..2cb6964
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessPoint.java
@@ -0,0 +1,31 @@
+/*
+ * 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.testutils.shadow;
+
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(AccessPoint.class)
+public class ShadowAccessPoint {
+
+    @Implementation
+    public String getSavedNetworkSummary() {
+        return "saved";
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAlertDialogCompat.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAlertDialogCompat.java
new file mode 100644
index 0000000..a682d85
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAlertDialogCompat.java
@@ -0,0 +1,83 @@
+/*
+ * 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.testutils.shadow;
+
+import android.annotation.SuppressLint;
+import android.view.View;
+
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.RealObject;
+import org.robolectric.annotation.Resetter;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.util.ReflectionHelpers;
+
+import javax.annotation.Nullable;
+
+import androidx.appcompat.app.AlertDialog;
+
+/* Robolectric shadow for the androidx alert dialog. */
+@Implements(AlertDialog.class)
+public class ShadowAlertDialogCompat extends ShadowDialog {
+
+    @SuppressLint("StaticFieldLeak")
+    @Nullable
+    private static ShadowAlertDialogCompat latestSupportAlertDialog;
+    @RealObject
+    private AlertDialog realAlertDialog;
+
+    @Implementation
+    public void show() {
+        super.show();
+        latestSupportAlertDialog = this;
+    }
+
+    public CharSequence getMessage() {
+        final Object alertController = ReflectionHelpers.getField(realAlertDialog, "mAlert");
+        return ReflectionHelpers.getField(alertController, "mMessage");
+    }
+
+    public CharSequence getTitle() {
+        final Object alertController = ReflectionHelpers.getField(realAlertDialog, "mAlert");
+        return ReflectionHelpers.getField(alertController, "mTitle");
+    }
+
+    public View getView() {
+        final Object alertController = ReflectionHelpers.getField(realAlertDialog, "mAlert");
+        return ReflectionHelpers.getField(alertController, "mView");
+    }
+
+    @Nullable
+    public static AlertDialog getLatestAlertDialog() {
+        return latestSupportAlertDialog == null ? null : latestSupportAlertDialog.realAlertDialog;
+    }
+
+    @Resetter
+    public static void reset() {
+        latestSupportAlertDialog = null;
+    }
+
+    public static ShadowAlertDialogCompat shadowOf(AlertDialog alertDialog) {
+        return (ShadowAlertDialogCompat) Shadow.extract(alertDialog);
+    }
+
+    public void clickOnItem(int index) {
+        Shadows.shadowOf(realAlertDialog.getListView()).performItemClick(index);
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiManager.java
index e5304da..65f92a3 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiManager.java
@@ -20,13 +20,17 @@
 
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
+import android.net.wifi.hotspot2.PasspointConfiguration;
 
 import org.robolectric.annotation.HiddenApi;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.shadow.api.Shadow;
 
-@Implements(WifiManager.class)
+import java.util.Collections;
+import java.util.List;
+
+@Implements(value = WifiManager.class, inheritImplementationMethods = true)
 public class ShadowWifiManager extends org.robolectric.shadows.ShadowWifiManager {
 
     public WifiConfiguration savedWifiConfig;
@@ -43,6 +47,11 @@
         savedWifiConfig = config;
     }
 
+    @Implementation
+    public List<PasspointConfiguration> getPasspointConfigurations() {
+        return Collections.emptyList();
+    }
+
     public static ShadowWifiManager get() {
         return Shadow.extract(application.getSystemService(WifiManager.class));
     }
diff --git a/tests/robotests/src/com/android/settings/widget/BottomLabelLayoutTest.java b/tests/robotests/src/com/android/settings/widget/BottomLabelLayoutTest.java
index ea0d89a..7b7bcfa 100644
--- a/tests/robotests/src/com/android/settings/widget/BottomLabelLayoutTest.java
+++ b/tests/robotests/src/com/android/settings/widget/BottomLabelLayoutTest.java
@@ -23,14 +23,14 @@
 import android.widget.Space;
 
 import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class BottomLabelLayoutTest {
 
     private BottomLabelLayout mBottomLabelLayout;
diff --git a/tests/robotests/src/com/android/settings/widget/UsageGraphTest.java b/tests/robotests/src/com/android/settings/widget/UsageGraphTest.java
index 15658d5..4b23e7f 100644
--- a/tests/robotests/src/com/android/settings/widget/UsageGraphTest.java
+++ b/tests/robotests/src/com/android/settings/widget/UsageGraphTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.widget;
 
 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.when;
@@ -25,15 +26,15 @@
 import android.content.res.Resources;
 import android.util.SparseIntArray;
 
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.R;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
 public class UsageGraphTest {
 
     private UsageGraph mGraph;
diff --git a/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java
new file mode 100644
index 0000000..ad56fe6
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.widget;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+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 androidx.preference.PreferenceScreen;
+
+@RunWith(RobolectricTestRunner.class)
+public class VideoPreferenceControllerTest {
+
+    @Mock
+    private VideoPreference mPreference;
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private VideoPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mController = new VideoPreferenceController(RuntimeEnvironment.application, "test_pref");
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+    }
+
+    @Test
+    public void getAvailabilityStatus_isAlwaysAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE);
+    }
+
+    @Test
+    public void onPause_shouldCallOnViewInvisibleOnPrefernece() {
+        mController.displayPreference(mScreen);
+
+        mController.onPause();
+
+        verify(mPreference).onViewInvisible();
+    }
+
+    @Test
+    public void onResume_shouldCallOnViewVisibleOnPrefernece() {
+        mController.displayPreference(mScreen);
+
+        mController.onResume();
+
+        verify(mPreference).onViewVisible(anyBoolean());
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/SavedAccessPointsWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/SavedAccessPointsWifiSettingsTest.java
deleted file mode 100644
index b4fc4cd..0000000
--- a/tests/robotests/src/com/android/settings/wifi/SavedAccessPointsWifiSettingsTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.wifi;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WifiManager.ActionListener;
-import android.os.Handler;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.wifi.AccessPoint;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class SavedAccessPointsWifiSettingsTest {
-
-    @Mock
-    private WifiManager mockWifiManager;
-    @Mock
-    private WifiDialog mockWifiDialog;
-    @Mock
-    private WifiConfigController mockConfigController;
-    @Mock
-    private WifiConfiguration mockWifiConfiguration;
-    @Mock
-    private AccessPoint mockAccessPoint;
-    @Mock
-    private Handler mHandler;
-
-    private SavedAccessPointsWifiSettings mSettings;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mSettings = new SavedAccessPointsWifiSettings();
-        ReflectionHelpers.setField(mSettings, "mHandler", mHandler);
-        ReflectionHelpers.setField(mSettings, "mWifiManager", mockWifiManager);
-
-        when(mockWifiDialog.getController()).thenReturn(mockConfigController);
-        when(mockConfigController.getConfig()).thenReturn(mockWifiConfiguration);
-    }
-
-    @Test
-    public void onForget_isPasspointConfig_shouldSendMessageToHandler() {
-        final AccessPoint accessPoint = mock(AccessPoint.class);
-        when(accessPoint.isPasspointConfig()).thenReturn(true);
-        ReflectionHelpers.setField(mSettings, "mSelectedAccessPoint", accessPoint);
-
-        mSettings.onForget(null);
-
-        verify(mHandler).sendEmptyMessage(SavedAccessPointsWifiSettings.MSG_UPDATE_PREFERENCES);
-    }
-
-    @Test
-    public void onForget_onSuccess_shouldSendMessageToHandler() {
-        mSettings.mForgetListener.onSuccess();
-
-        verify(mHandler).sendEmptyMessage(SavedAccessPointsWifiSettings.MSG_UPDATE_PREFERENCES);
-    }
-
-    @Test
-    public void onForget_onFailure_shouldSendMessageToHandler() {
-        mSettings.mForgetListener.onFailure(0);
-
-        verify(mHandler).sendEmptyMessage(SavedAccessPointsWifiSettings.MSG_UPDATE_PREFERENCES);
-    }
-
-    @Test
-    public void onSubmit_shouldInvokeSaveApi() {
-        mSettings.onSubmit(mockWifiDialog);
-        verify(mockWifiManager).save(eq(mockWifiConfiguration), any(ActionListener.class));
-    }
-
-    @Test
-    public void onForget_shouldInvokeForgetApi() {
-        ReflectionHelpers.setField(mSettings, "mSelectedAccessPoint", mockAccessPoint);
-        when(mockAccessPoint.getConfig()).thenReturn(mockWifiConfiguration);
-        mSettings.onForget(mockWifiDialog);
-        verify(mockWifiManager)
-                .forget(eq(mockWifiConfiguration.networkId), any(ActionListener.class));
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
index 8cdecff..e80edba 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
@@ -24,6 +24,9 @@
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.SettingsShadowTypedArray;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowConnectivityManager;
 import com.android.settings.testutils.shadow.ShadowWifiManager;
 
@@ -34,16 +37,17 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
 import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = {
-    SettingsShadowResources.SettingsShadowTheme.class,
-    ShadowConnectivityManager.class,
-    ShadowWifiManager.class
-}
-)
+        SettingsShadowResources.SettingsShadowTheme.class,
+        ShadowConnectivityManager.class,
+        SettingsShadowTypedArray.class,
+        ShadowWifiManager.class,
+        ShadowAlertDialogCompat.class,
+        SettingsShadowResourcesImpl.class
+})
 public class WifiDialogActivityTest {
 
     private static final String AP1_SSID = "\"ap1\"";
@@ -62,7 +66,7 @@
     @Test
     public void onSubmit_shouldConnectToNetwork() {
         WifiDialogActivity activity = Robolectric.setupActivity(WifiDialogActivity.class);
-        WifiDialog dialog = (WifiDialog) ShadowAlertDialog.getLatestAlertDialog();
+        WifiDialog dialog = (WifiDialog) ShadowAlertDialogCompat.getLatestAlertDialog();
         assertThat(dialog).isNotNull();
 
         ReflectionHelpers.setField(dialog, "mController", mController);
@@ -78,8 +82,9 @@
                 Robolectric.buildActivity(
                         WifiDialogActivity.class,
                         new Intent().putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false))
-                .setup().get();
-        WifiDialog dialog = (WifiDialog) ShadowAlertDialog.getLatestAlertDialog();
+                        .setup().get();
+        WifiDialog dialog = (WifiDialog) ShadowAlertDialogCompat.getLatestAlertDialog();
+
         assertThat(dialog).isNotNull();
 
         ReflectionHelpers.setField(dialog, "mController", mController);
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogTest.java
index 7025100..7a88131 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiDialogTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogTest.java
@@ -25,15 +25,7 @@
 
     private Context mContext = RuntimeEnvironment.application;
 
-    private WifiDialogListener mListener = new WifiDialogListener() {
-        @Override
-        public void onForget(WifiDialog dialog) {
-        }
-
-        @Override
-        public void onSubmit(WifiDialog dialog) {
-        }
-    };
+    private WifiDialogListener mListener = new WifiDialogListener() {};
 
     @Before
     public void setUp() {
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiScanningRequiredFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/WifiScanningRequiredFragmentTest.java
index 995ad17..d37b667 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiScanningRequiredFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiScanningRequiredFragmentTest.java
@@ -27,7 +27,6 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import android.app.AlertDialog;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -45,6 +44,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 
 @RunWith(SettingsRobolectricTestRunner.class)
diff --git a/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java b/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java
index 252e7ed..7e3ce6f 100644
--- a/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java
@@ -20,11 +20,10 @@
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
-import android.content.Context;
 import android.net.wifi.WifiManager;
-import android.view.inputmethod.InputMethodManager;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
 import com.android.settings.testutils.shadow.ShadowNfcAdapter;
 
 import org.junit.After;
@@ -33,17 +32,15 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = ShadowNfcAdapter.class)
+@Config(shadows = {ShadowNfcAdapter.class, SettingsShadowResourcesImpl.class})
 public class WriteWifiConfigToNfcDialogTest {
 
     @Mock
-    private Activity mActivity;
-    @Mock
     private WifiManager mWifiManager;
 
     private WriteWifiConfigToNfcDialog mWriteWifiConfigToNfcDialog;
@@ -51,13 +48,10 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        when(mActivity.getApplicationContext()).thenReturn(mActivity);
-        when(mActivity.getSystemService(Context.INPUT_METHOD_SERVICE))
-                .thenReturn(ReflectionHelpers.newInstance(InputMethodManager.class));
-        mWriteWifiConfigToNfcDialog = new WriteWifiConfigToNfcDialog(RuntimeEnvironment.application,
-                0 /* security */);
+        final Activity activity = Robolectric.setupActivity(Activity.class);
+        mWriteWifiConfigToNfcDialog = new WriteWifiConfigToNfcDialog(activity, 0 /* security */);
         ReflectionHelpers.setField(mWriteWifiConfigToNfcDialog, "mWifiManager", mWifiManager);
-        mWriteWifiConfigToNfcDialog.setOwnerActivity(mActivity);
+        mWriteWifiConfigToNfcDialog.setOwnerActivity(activity);
         mWriteWifiConfigToNfcDialog.onCreate(null /* savedInstanceState */);
     }
 
diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java
new file mode 100644
index 0000000..790739a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java
@@ -0,0 +1,135 @@
+/*
+ * 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.wifi.savedaccesspoints;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+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.Context;
+import android.net.wifi.WifiConfiguration;
+
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowAccessPoint;
+import com.android.settings.testutils.shadow.ShadowThreadUtils;
+import com.android.settings.testutils.shadow.ShadowWifiManager;
+import com.android.settingslib.wifi.AccessPointPreference;
+
+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;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowThreadUtils.class, ShadowWifiManager.class})
+public class SavedAccessPointsPreferenceControllerTest {
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+    @Mock
+    private PreferenceCategory mPreferenceCategory;
+
+    private Context mContext;
+    private ShadowWifiManager mWifiManager;
+    private SavedAccessPointsPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mWifiManager = ShadowWifiManager.get();
+        mController = spy(new SavedAccessPointsPreferenceController(mContext, "test_key"));
+
+        when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
+                .thenReturn(mPreferenceCategory);
+        when(mPreferenceCategory.getContext()).thenReturn(mContext);
+    }
+
+    @Test
+    public void getAvailability_alwaysAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void onStart_shouldRefreshApList() {
+        doNothing().when(mController).refreshSavedAccessPoints();
+
+        mController.onStart();
+
+        verify(mController).refreshSavedAccessPoints();
+    }
+
+
+    @Test
+    public void postRefresh_shouldRefreshApList() {
+        doNothing().when(mController).refreshSavedAccessPoints();
+
+        mController.postRefreshSavedAccessPoints();
+
+        verify(mController).refreshSavedAccessPoints();
+    }
+
+    @Test
+    public void forget_onSuccess_shouldRefreshApList() {
+        doNothing().when(mController).refreshSavedAccessPoints();
+
+        mController.onSuccess();
+
+        verify(mController).refreshSavedAccessPoints();
+    }
+
+    @Test
+    public void forget_onFailure_shouldRefreshApList() {
+        doNothing().when(mController).refreshSavedAccessPoints();
+
+        mController.onFailure(0 /* reason */);
+
+        verify(mController).refreshSavedAccessPoints();
+    }
+
+    @Test
+    @Config(shadows = ShadowAccessPoint.class)
+    public void refreshSavedAccessPoints_shouldListAllAPs() {
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "SSID";
+        config.BSSID = "BSSID";
+        config.networkId = 2;
+        mWifiManager.addNetwork(config);
+
+        final ArgumentCaptor<AccessPointPreference> captor =
+                ArgumentCaptor.forClass(AccessPointPreference.class);
+        mController.displayPreference(mPreferenceScreen);
+        mController.refreshSavedAccessPoints();
+
+        verify(mPreferenceCategory).addPreference(captor.capture());
+
+        final AccessPointPreference pref = captor.getValue();
+        assertThat(pref.getTitle()).isEqualTo(config.SSID);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java
new file mode 100644
index 0000000..97ad7d9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.wifi.savedaccesspoints;
+
+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;
+import static org.mockito.Mockito.when;
+
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.wifi.WifiConfigController;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class SavedAccessPointsWifiSettingsTest {
+
+    @Mock
+    private WifiManager mWifiManager;
+    @Mock
+    private WifiDialog mWifiDialog;
+    @Mock
+    private WifiConfigController mConfigController;
+    @Mock
+    private WifiConfiguration mWifiConfiguration;
+    @Mock
+    private AccessPoint mAccessPoint;
+    @Mock
+    private SavedAccessPointsPreferenceController mSavedApController;
+
+    private TestFragment mSettings;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mSettings = spy(new TestFragment());
+
+        doReturn(mSavedApController).when(mSettings)
+                .use(SavedAccessPointsPreferenceController.class);
+
+        ReflectionHelpers.setField(mSettings, "mWifiManager", mWifiManager);
+
+        when(mWifiDialog.getController()).thenReturn(mConfigController);
+        when(mConfigController.getConfig()).thenReturn(mWifiConfiguration);
+    }
+
+    @Test
+    public void onForget_isPasspointConfig_shouldRefreshAPList() {
+        when(mAccessPoint.isPasspointConfig()).thenReturn(true);
+        ReflectionHelpers.setField(mSettings, "mSelectedAccessPoint", mAccessPoint);
+
+        mSettings.onForget(null);
+
+        verify(mSavedApController).postRefreshSavedAccessPoints();
+    }
+
+    @Test
+    public void onForget_shouldInvokeForgetApi() {
+        ReflectionHelpers.setField(mSettings, "mSelectedAccessPoint", mAccessPoint);
+        when(mAccessPoint.getConfig()).thenReturn(mWifiConfiguration);
+
+        mSettings.onForget(mWifiDialog);
+
+        verify(mWifiManager)
+                .forget(mWifiConfiguration.networkId, mSavedApController);
+    }
+
+    @Test
+    public void verifyConstants() {
+        assertThat(mSettings.getMetricsCategory()).isEqualTo(MetricsEvent.WIFI_SAVED_ACCESS_POINTS);
+        assertThat(mSettings.getPreferenceScreenResId())
+                .isEqualTo(R.xml.wifi_display_saved_access_points);
+    }
+
+    public static class TestFragment extends SavedAccessPointsWifiSettings {
+
+        public <T extends AbstractPreferenceController> T use(Class<T> clazz) {
+            return super.use(clazz);
+        }
+    }
+}
diff --git a/tests/unit/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckActionTest.java b/tests/unit/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckActionTest.java
deleted file mode 100644
index 8be3320..0000000
--- a/tests/unit/src/com/android/settings/fuelgauge/anomaly/action/LocationCheckActionTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.fuelgauge.anomaly.action;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import com.android.settings.fuelgauge.anomaly.Anomaly;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LocationCheckActionTest {
-    private static final String PACKAGE_NAME = "com.android.chrome";
-
-    private Context mContext;
-    private LocationCheckAction mLocationCheckAction;
-    private Anomaly mAnomaly;
-
-    @Before
-    public void setUp() {
-        mContext = InstrumentationRegistry.getTargetContext();
-        mLocationCheckAction = new LocationCheckAction(mContext);
-
-        mAnomaly = new Anomaly.Builder()
-                .setUid(getPackageUid(mContext, PACKAGE_NAME))
-                .setPackageName(PACKAGE_NAME)
-                .build();
-    }
-
-    @Test
-    public void testRevokeAndCheck() {
-        mLocationCheckAction.handlePositiveAction(mAnomaly, 0 /* metric key */);
-
-        assertThat(mLocationCheckAction.isActionActive(mAnomaly)).isFalse();
-    }
-
-    private int getPackageUid(Context context, String packageName) {
-        try {
-            return context.getPackageManager().getPackageUid(packageName,
-                    PackageManager.GET_META_DATA);
-        } catch (PackageManager.NameNotFoundException e) {
-            return -1;
-        }
-    }
-}
-
-
-
-
