Merge "Update the settings privacy page to the latest mocks" into sc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 61c0c4e..5abe890 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1079,6 +1079,20 @@
         </activity>
 
         <activity
+            android:name=".Settings$LockScreenSettingsActivity"
+            android:label="@string/lockscreen_settings_title"
+            android:exported="true">
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.LOCK_SCREEN_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.security.LockscreenDashboardFragment" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                       android:value="true" />
+        </activity>
+
+        <activity
             android:name="SettingsLicenseActivity"
             android:label="@string/settings_license_activity_title"
             android:exported="true"
diff --git a/res/layout/fingerprint_enroll_finish_base.xml b/res/layout/fingerprint_enroll_finish_base.xml
index 262374d..48831dc 100644
--- a/res/layout/fingerprint_enroll_finish_base.xml
+++ b/res/layout/fingerprint_enroll_finish_base.xml
@@ -52,6 +52,7 @@
                     android:layout_height="match_parent"
                     android:padding="7dp"
                     android:contentDescription="@android:string/fingerprint_icon_content_description"
+                    android:importantForAccessibility="no"
                     android:src="@drawable/fingerprint_enroll_finish" />
             </com.google.android.setupdesign.view.FillContentLayout>
 
diff --git a/res/values/config.xml b/res/values/config.xml
index 21d9c75..1e2855b 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -511,8 +511,8 @@
     <!-- Media Uri to view videos storage category. -->
     <string name="config_videos_storage_category_uri" translatable="false">content://com.android.providers.media.documents/root/videos_root</string>
 
-    <!-- Media Uri to view audios storage category. -->
-    <string name="config_audios_storage_category_uri" translatable="false">content://com.android.providers.media.documents/root/audio_root</string>
+    <!-- Media Uri to view audio storage category. -->
+    <string name="config_audio_storage_category_uri" translatable="false">content://com.android.providers.media.documents/root/audio_root</string>
 
     <!-- Media Uri to view documents & other storage category. -->
     <string name="config_documents_and_other_storage_category_uri" translatable="false">content://com.android.providers.media.documents/root/documents_root</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6395a61..e530ab9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11883,8 +11883,8 @@
     <!-- Preference label for the Videos storage section. [CHAR LIMIT=50] -->
     <string name="storage_videos">Videos</string>
 
-    <!-- Preference label for the Audios storage section. [CHAR LIMIT=50] -->
-    <string name="storage_audios">Audios</string>
+    <!-- Preference label for the Audio storage section. [CHAR LIMIT=50] -->
+    <string name="storage_audio">Audio</string>
 
     <!-- Preference label for the Apps storage section. [CHAR LIMIT=50] -->
     <string name="storage_apps">Apps</string>
diff --git a/res/xml/storage_category_fragment.xml b/res/xml/storage_category_fragment.xml
new file mode 100644
index 0000000..72623d7
--- /dev/null
+++ b/res/xml/storage_category_fragment.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- Layout for the storage breakdown for a profile of the primary user. -->
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/storage_settings">
+    <Preference
+        android:key="free_up_space"
+        android:order="4"
+        android:title="@string/storage_free_up_space_title"
+        android:summary="@string/storage_free_up_space_summary"
+        android:icon="@drawable/ic_files_go_round"
+        settings:allowDividerAbove="true"/>
+    <!-- Preference order 100~200 are 'ONLY' for storage category preferences below. -->
+    <Preference
+        android:key="pref_public_storage"
+        android:title="@string/storage_files"
+        android:icon="@drawable/ic_folder_vd_theme_24"
+        android:order="100"/>
+    <com.android.settings.deviceinfo.StorageItemPreference
+        android:key="pref_images"
+        android:title="@string/storage_images"
+        android:icon="@drawable/ic_photo_library"
+        android:order="101"/>
+    <com.android.settings.deviceinfo.StorageItemPreference
+        android:key="pref_videos"
+        android:title="@string/storage_videos"
+        android:icon="@drawable/ic_local_movies"
+        android:order="102"/>
+    <com.android.settings.deviceinfo.StorageItemPreference
+        android:key="pref_audio"
+        android:title="@string/storage_audio"
+        android:icon="@drawable/ic_media_stream"
+        android:order="103"/>
+    <com.android.settings.deviceinfo.StorageItemPreference
+        android:key="pref_apps"
+        android:title="@string/storage_apps"
+        android:icon="@drawable/ic_storage_apps"
+        android:order="104"/>
+    <com.android.settings.deviceinfo.StorageItemPreference
+        android:key="pref_games"
+        android:title="@string/storage_games"
+        android:icon="@drawable/ic_videogame_vd_theme_24"
+        android:order="105"/>
+    <com.android.settings.deviceinfo.StorageItemPreference
+        android:key="pref_documents_and_other"
+        android:title="@string/storage_documents_and_other"
+        android:icon="@drawable/ic_folder_vd_theme_24"
+        android:order="106"/>
+    <com.android.settings.deviceinfo.StorageItemPreference
+        android:key="pref_system"
+        android:title="@string/storage_system"
+        android:icon="@drawable/ic_system_update"
+        android:order="107"/>
+    <com.android.settings.deviceinfo.StorageItemPreference
+        android:key="pref_trash"
+        android:title="@string/storage_trash"
+        android:icon="@drawable/ic_trash_can"
+        android:order="108"/>
+    <!-- Preference order 100~200 are 'ONLY' for storage category preferences above. -->
+    <PreferenceCategory
+        android:key="pref_secondary_users"
+        android:title="@string/storage_other_users"
+        android:order="201" />
+</PreferenceScreen>
diff --git a/res/xml/storage_dashboard_fragment.xml b/res/xml/storage_dashboard_fragment.xml
index 71d0712..655e683 100644
--- a/res/xml/storage_dashboard_fragment.xml
+++ b/res/xml/storage_dashboard_fragment.xml
@@ -18,7 +18,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:title="@string/storage_settings"
-    android:orderingFromXml="false"
     settings:keywords="@string/keywords_storage">
     <com.android.settingslib.widget.SettingsSpinnerPreference
         android:key="storage_spinner"
@@ -45,8 +44,8 @@
         android:order="4"
         android:title="@string/storage_free_up_space_title"
         android:summary="@string/storage_free_up_space_summary"
-        settings:allowDividerAbove="true"
-        android:icon="@drawable/ic_files_go_round"/>
+        android:icon="@drawable/ic_files_go_round"
+        settings:allowDividerAbove="true"/>
     <!-- Preference order 100~200 are 'ONLY' for storage category preferences below. -->
     <Preference
         android:key="pref_public_storage"
@@ -64,8 +63,8 @@
         android:icon="@drawable/ic_local_movies"
         android:order="102"/>
     <com.android.settings.deviceinfo.StorageItemPreference
-        android:key="pref_audios"
-        android:title="@string/storage_audios"
+        android:key="pref_audio"
+        android:title="@string/storage_audio"
         android:icon="@drawable/ic_media_stream"
         android:order="103"/>
     <com.android.settings.deviceinfo.StorageItemPreference
diff --git a/res/xml/storage_dashboard_header_fragment.xml b/res/xml/storage_dashboard_header_fragment.xml
new file mode 100644
index 0000000..dec6f89
--- /dev/null
+++ b/res/xml/storage_dashboard_header_fragment.xml
@@ -0,0 +1,42 @@
+<!--
+Copyright (C) 2021 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:key="storage_header"
+    android:title="@string/storage_settings">
+    <com.android.settingslib.widget.SettingsSpinnerPreference
+        android:key="storage_spinner"
+        android:order="1"
+        settings:searchable="false"
+        settings:controller="com.android.settings.deviceinfo.storage.StorageSelectionPreferenceController"/>
+    <com.android.settingslib.widget.UsageProgressBarPreference
+        android:key="storage_summary"
+        android:order="2"
+        android:selectable="false"
+        settings:searchable="false"
+        settings:controller="com.android.settings.deviceinfo.storage.StorageUsageProgressBarPreferenceController"
+        settings:allowDividerBelow="true"/>
+    <com.android.settings.widget.PrimarySwitchPreference
+        android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings"
+        android:key="toggle_asm"
+        android:title="@string/automatic_storage_manager_preference_title"
+        android:icon="@drawable/ic_storage"
+        android:order="3"
+        settings:allowDividerAbove="true"
+        settings:controller="com.android.settings.deviceinfo.storage.AutomaticStorageManagementSwitchPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/storage_profile_fragment.xml b/res/xml/storage_profile_fragment.xml
deleted file mode 100644
index a12bdd5..0000000
--- a/res/xml/storage_profile_fragment.xml
+++ /dev/null
@@ -1,52 +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.
--->
-
-<!-- Layout for the storage breakdown for a profile of the primary user. -->
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:title="@string/storage_settings">
-    <com.android.settings.deviceinfo.StorageItemPreference
-        android:key="pref_photos_videos"
-        android:title="@string/storage_photos_videos"
-        android:icon="@drawable/ic_photo_library"
-        android:order="2" />
-    <com.android.settings.deviceinfo.StorageItemPreference
-        android:key="pref_music_audio"
-        android:title="@string/storage_music_audio"
-        android:icon="@drawable/ic_media_stream"
-        android:order="3" />
-    <com.android.settings.deviceinfo.StorageItemPreference
-        android:key="pref_games"
-        android:title="@string/storage_games"
-        android:icon="@drawable/ic_videogame_vd_theme_24"
-        android:order="4" />
-    <com.android.settings.deviceinfo.StorageItemPreference
-        android:key="pref_movies"
-        android:title="@string/storage_movies_tv"
-        android:icon="@drawable/ic_local_movies"
-        android:order="5"
-    />
-    <com.android.settings.deviceinfo.StorageItemPreference
-        android:key="pref_other_apps"
-        android:title="@string/storage_other_apps"
-        android:icon="@drawable/ic_storage_apps"
-        android:order="6" />
-    <com.android.settings.deviceinfo.StorageItemPreference
-        android:key="pref_files"
-        android:title="@string/storage_files"
-        android:icon="@drawable/ic_folder_vd_theme_24"
-        android:order="7" />
-</PreferenceScreen>
diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml
index 725390e..6d73ad6 100644
--- a/res/xml/top_level_settings.xml
+++ b/res/xml/top_level_settings.xml
@@ -21,140 +21,157 @@
     android:key="top_level_settings">
 
     <Preference
+        android:fragment="com.android.settings.network.NetworkDashboardFragment"
+        android:icon="@drawable/ic_settings_wireless"
         android:key="top_level_network"
+        android:order="-150"
         android:title="@string/network_dashboard_title"
         android:summary="@string/summary_placeholder"
-        android:icon="@drawable/ic_homepage_network"
-        android:order="-120"
-        android:fragment="com.android.settings.network.NetworkDashboardFragment"
         settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
 
     <Preference
+        android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
+        android:icon="@drawable/ic_devices_other"
         android:key="top_level_connected_devices"
+        android:order="-140"
         android:title="@string/connected_devices_dashboard_title"
         android:summary="@string/summary_placeholder"
-        android:icon="@drawable/ic_homepage_connected_device"
-        android:order="-110"
-        android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
         settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/>
 
     <Preference
-        android:key="top_level_apps_and_notifs"
-        android:title="@string/app_and_notification_dashboard_title"
-        android:summary="@string/app_and_notification_dashboard_summary"
-        android:icon="@drawable/ic_homepage_apps"
-        android:order="-100"
-        android:fragment="com.android.settings.applications.AppAndNotificationDashboardFragment"/>
+        android:fragment="com.android.settings.applications.AppDashboardFragment"
+        android:icon="@drawable/ic_apps"
+        android:key="top_level_apps"
+        android:order="-130"
+        android:title="@string/apps_dashboard_title"
+        android:summary="@string/app_and_notification_dashboard_summary"/>
 
     <Preference
+        android:fragment="com.android.settings.notification.ConfigureNotificationSettings"
+        android:icon="@drawable/ic_notifications"
+        android:key="top_level_notification"
+        android:order="-120"
+        android:title="@string/configure_notification_settings"
+        android:summary="@string/notification_dashboard_summary"/>
+
+    <Preference
+        android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
+        android:icon="@drawable/ic_settings_battery_white"
         android:key="top_level_battery"
+        android:order="-110"
         android:title="@string/power_usage_summary_title"
         android:summary="@string/summary_placeholder"
-        android:icon="@drawable/ic_homepage_battery"
-        android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
-        android:order="-90"
         settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>
 
     <Preference
-        android:key="top_level_display"
-        android:title="@string/display_settings"
-        android:summary="@string/summary_placeholder"
-        android:icon="@drawable/ic_homepage_display"
-        android:order="-80"
-        android:fragment="com.android.settings.DisplaySettings"
-        settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
-
-    <Preference
-        android:key="top_level_sound"
-        android:title="@string/sound_settings"
-        android:summary="@string/sound_dashboard_summary"
-        android:icon="@drawable/ic_homepage_sound"
-        android:order="-70"
-        android:fragment="com.android.settings.notification.SoundSettings"/>
-
-    <Preference
+        android:fragment="com.android.settings.deviceinfo.StorageDashboardFragment"
+        android:icon="@drawable/ic_storage_white"
         android:key="top_level_storage"
+        android:order="-100"
         android:title="@string/storage_settings"
         android:summary="@string/summary_placeholder"
-        android:icon="@drawable/ic_homepage_storage"
-        android:order="-60"
-        android:fragment="com.android.settings.deviceinfo.StorageDashboardFragment"
         settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/>
 
     <Preference
-        android:key="top_level_privacy"
-        android:title="@string/privacy_dashboard_title"
-        android:summary="@string/privacy_dashboard_summary"
-        android:icon="@drawable/ic_homepage_privacy"
-        android:order="-55"
-        android:fragment="com.android.settings.privacy.PrivacyDashboardFragment"/>
+        android:fragment="com.android.settings.notification.SoundSettings"
+        android:icon="@drawable/ic_volume_up_24dp"
+        android:key="top_level_sound"
+        android:order="-90"
+        android:title="@string/sound_settings"
+        android:summary="@string/sound_dashboard_summary"/>
 
     <Preference
-        android:key="top_level_location"
-        android:title="@string/location_settings_title"
-        android:summary="@string/location_settings_loading_app_permission_stats"
-        android:icon="@drawable/ic_homepage_location"
-        android:order="-50"
-        android:fragment="com.android.settings.location.LocationSettings"
-        settings:controller="com.android.settings.location.TopLevelLocationPreferenceController"/>
+        android:fragment="com.android.settings.DisplaySettings"
+        android:icon="@drawable/ic_settings_display_white"
+        android:key="top_level_display"
+        android:order="-80"
+        android:title="@string/display_settings"
+        android:summary="@string/display_dashboard_summary"
+        settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
+
+    <com.android.settingslib.RestrictedTopLevelPreference
+        android:icon="@drawable/ic_settings_wallpaper_white"
+        android:key="top_level_wallpaper"
+        android:order="-70"
+        android:title="@string/wallpaper_settings_title"
+        android:summary="@string/wallpaper_dashboard_summary"
+        settings:controller="com.android.settings.display.TopLevelWallpaperPreferenceController"/>
 
     <Preference
-        android:key="top_level_security"
-        android:title="@string/security_settings_title"
-        android:summary="@string/summary_placeholder"
-        android:icon="@drawable/ic_homepage_security"
-        android:order="-40"
+        android:fragment="com.android.settings.accessibility.AccessibilitySettings"
+        android:icon="@drawable/ic_settings_accessibility"
+        android:key="top_level_accessibility"
+        android:order="-60"
+        android:title="@string/accessibility_settings"
+        android:summary="@string/accessibility_settings_summary"
+        settings:controller="com.android.settings.accessibility.TopLevelAccessibilityPreferenceController"/>
+
+    <Preference
         android:fragment="com.android.settings.security.SecuritySettings"
+        android:icon="@drawable/ic_settings_security_white"
+        android:key="top_level_security"
+        android:order="-50"
+        android:title="@string/security_settings_title"
+        android:summary="@string/security_dashboard_summary"
         settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/>
 
     <Preference
-        android:key="top_level_accounts"
-        android:title="@string/account_dashboard_title"
-        android:summary="@string/summary_placeholder"
-        android:icon="@drawable/ic_homepage_accounts"
-        android:order="-30"
-        android:fragment="com.android.settings.accounts.AccountDashboardFragment"
-        settings:controller="com.android.settings.accounts.TopLevelAccountEntryPreferenceController"/>
+        android:fragment="com.android.settings.privacy.PrivacyDashboardFragment"
+        android:icon="@drawable/ic_settings_privacy"
+        android:key="top_level_privacy"
+        android:order="-40"
+        android:title="@string/privacy_dashboard_title"
+        android:summary="@string/privacy_dashboard_summary"/>
 
     <Preference
-        android:key="top_level_accessibility"
-        android:title="@string/accessibility_settings"
-        android:summary="@string/accessibility_settings_summary"
-        android:icon="@drawable/ic_homepage_accessibility"
-        android:order="-20"
-        android:fragment="com.android.settings.accessibility.AccessibilitySettings"
-        settings:controller="com.android.settings.accessibility.TopLevelAccessibilityPreferenceController"/>
+        android:fragment="com.android.settings.location.LocationSettings"
+        android:icon="@drawable/ic_settings_location"
+        android:key="top_level_location"
+        android:order="-30"
+        android:title="@string/location_settings_title"
+        android:summary="@string/location_settings_loading_app_permission_stats"
+        settings:controller="com.android.settings.location.TopLevelLocationPreferenceController"/>
 
     <Preference
         android:key="top_level_emergency"
         android:title="@string/emergency_settings_preference_title"
-        android:icon="@drawable/ic_homepage_emergency"
-        android:order="-10"
+        android:summary="@string/emergency_dashboard_summary"
+        android:icon="@drawable/ic_settings_emergency"
+        android:order="-20"
         android:fragment="com.android.settings.emergency.EmergencyDashboardFragment"/>
 
     <Preference
-        android:key="top_level_system"
-        android:title="@string/header_category_system"
-        android:summary="@string/system_dashboard_summary"
-        android:icon="@drawable/ic_homepage_system_dashboard"
-        android:order="10"
-        android:fragment="com.android.settings.system.SystemDashboardFragment"/>
+        android:fragment="com.android.settings.accounts.AccountDashboardFragment"
+        android:icon="@drawable/ic_settings_accounts"
+        android:key="top_level_accounts"
+        android:order="-10"
+        android:title="@string/account_dashboard_title"
+        android:summary="@string/summary_placeholder"
+        settings:controller="com.android.settings.accounts.TopLevelAccountEntryPreferenceController"/>
 
     <Preference
+        android:fragment="com.android.settings.system.SystemDashboardFragment"
+        android:icon="@drawable/ic_settings_system_dashboard_white"
+        android:key="top_level_system"
+        android:order="10"
+        android:title="@string/header_category_system"
+        android:summary="@string/system_dashboard_summary"/>
+
+    <Preference
+        android:fragment="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment"
+        android:icon="@drawable/ic_phone_info"
         android:key="top_level_about_device"
+        android:order="20"
         android:title="@string/about_settings"
         android:summary="@string/summary_placeholder"
-        android:icon="@drawable/ic_homepage_about"
-        android:order="20"
-        android:fragment="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment"
         settings:controller="com.android.settings.deviceinfo.aboutphone.TopLevelAboutDevicePreferenceController"/>
 
     <Preference
+        android:icon="@drawable/ic_help"
         android:key="top_level_support"
-        android:summary="@string/support_summary"
-        android:title="@string/page_tab_title_support"
-        android:icon="@drawable/ic_homepage_support"
         android:order="100"
+        android:title="@string/page_tab_title_support"
+        android:summary="@string/support_summary"
         settings:controller="com.android.settings.support.SupportPreferenceController"/>
 
 </PreferenceScreen>
diff --git a/res/xml/top_level_settings_grouped.xml b/res/xml/top_level_settings_grouped.xml
deleted file mode 100644
index 7b4f8a1..0000000
--- a/res/xml/top_level_settings_grouped.xml
+++ /dev/null
@@ -1,177 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2020 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:key="top_level_settings_grouped">
-
-    <Preference
-        android:fragment="com.android.settings.network.NetworkDashboardFragment"
-        android:icon="@drawable/ic_settings_wireless"
-        android:key="top_level_network"
-        android:order="-150"
-        android:title="@string/network_dashboard_title"
-        android:summary="@string/summary_placeholder"
-        settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
-
-    <Preference
-        android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
-        android:icon="@drawable/ic_devices_other"
-        android:key="top_level_connected_devices"
-        android:order="-140"
-        android:title="@string/connected_devices_dashboard_title"
-        android:summary="@string/summary_placeholder"
-        settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/>
-
-    <Preference
-        android:fragment="com.android.settings.applications.AppDashboardFragment"
-        android:icon="@drawable/ic_apps"
-        android:key="top_level_apps"
-        android:order="-130"
-        android:title="@string/apps_dashboard_title"
-        android:summary="@string/app_and_notification_dashboard_summary"/>
-
-    <Preference
-        android:fragment="com.android.settings.notification.ConfigureNotificationSettings"
-        android:icon="@drawable/ic_notifications"
-        android:key="top_level_notification"
-        android:order="-120"
-        android:title="@string/configure_notification_settings"
-        android:summary="@string/notification_dashboard_summary"/>
-
-    <Preference
-        android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
-        android:icon="@drawable/ic_settings_battery_white"
-        android:key="top_level_battery"
-        android:order="-110"
-        android:title="@string/power_usage_summary_title"
-        android:summary="@string/summary_placeholder"
-        settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>
-
-    <Preference
-        android:fragment="com.android.settings.deviceinfo.StorageDashboardFragment"
-        android:icon="@drawable/ic_storage_white"
-        android:key="top_level_storage"
-        android:order="-100"
-        android:title="@string/storage_settings"
-        android:summary="@string/summary_placeholder"
-        settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/>
-
-    <Preference
-        android:fragment="com.android.settings.notification.SoundSettings"
-        android:icon="@drawable/ic_volume_up_24dp"
-        android:key="top_level_sound"
-        android:order="-90"
-        android:title="@string/sound_settings"
-        android:summary="@string/sound_dashboard_summary"/>
-
-    <Preference
-        android:fragment="com.android.settings.DisplaySettings"
-        android:icon="@drawable/ic_settings_display_white"
-        android:key="top_level_display"
-        android:order="-80"
-        android:title="@string/display_settings"
-        android:summary="@string/display_dashboard_summary"
-        settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
-
-    <com.android.settingslib.RestrictedTopLevelPreference
-        android:icon="@drawable/ic_settings_wallpaper_white"
-        android:key="top_level_wallpaper"
-        android:order="-70"
-        android:title="@string/wallpaper_settings_title"
-        android:summary="@string/wallpaper_dashboard_summary"
-        settings:controller="com.android.settings.display.TopLevelWallpaperPreferenceController"/>
-
-    <Preference
-        android:fragment="com.android.settings.accessibility.AccessibilitySettings"
-        android:icon="@drawable/ic_settings_accessibility"
-        android:key="top_level_accessibility"
-        android:order="-60"
-        android:title="@string/accessibility_settings"
-        android:summary="@string/accessibility_settings_summary"
-        settings:controller="com.android.settings.accessibility.TopLevelAccessibilityPreferenceController"/>
-
-    <Preference
-        android:fragment="com.android.settings.security.SecuritySettings"
-        android:icon="@drawable/ic_settings_security_white"
-        android:key="top_level_security"
-        android:order="-50"
-        android:title="@string/security_settings_title"
-        android:summary="@string/security_dashboard_summary"
-        settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/>
-
-    <Preference
-        android:fragment="com.android.settings.privacy.PrivacyDashboardFragment"
-        android:icon="@drawable/ic_settings_privacy"
-        android:key="top_level_privacy"
-        android:order="-40"
-        android:title="@string/privacy_dashboard_title"
-        android:summary="@string/privacy_dashboard_summary"/>
-
-    <Preference
-        android:fragment="com.android.settings.location.LocationSettings"
-        android:icon="@drawable/ic_settings_location"
-        android:key="top_level_location"
-        android:order="-30"
-        android:title="@string/location_settings_title"
-        android:summary="@string/location_settings_loading_app_permission_stats"
-        settings:controller="com.android.settings.location.TopLevelLocationPreferenceController"/>
-
-    <Preference
-        android:key="top_level_emergency"
-        android:title="@string/emergency_settings_preference_title"
-        android:summary="@string/emergency_dashboard_summary"
-        android:icon="@drawable/ic_settings_emergency"
-        android:order="-20"
-        android:fragment="com.android.settings.emergency.EmergencyDashboardFragment"/>
-
-    <Preference
-        android:fragment="com.android.settings.accounts.AccountDashboardFragment"
-        android:icon="@drawable/ic_settings_accounts"
-        android:key="top_level_accounts"
-        android:order="-10"
-        android:title="@string/account_dashboard_title"
-        android:summary="@string/summary_placeholder"
-        settings:controller="com.android.settings.accounts.TopLevelAccountEntryPreferenceController"/>
-
-    <Preference
-        android:fragment="com.android.settings.system.SystemDashboardFragment"
-        android:icon="@drawable/ic_settings_system_dashboard_white"
-        android:key="top_level_system"
-        android:order="10"
-        android:title="@string/header_category_system"
-        android:summary="@string/system_dashboard_summary"/>
-
-    <Preference
-        android:fragment="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment"
-        android:icon="@drawable/ic_phone_info"
-        android:key="top_level_about_device"
-        android:order="20"
-        android:title="@string/about_settings"
-        android:summary="@string/summary_placeholder"
-        settings:controller="com.android.settings.deviceinfo.aboutphone.TopLevelAboutDevicePreferenceController"/>
-
-    <Preference
-        android:icon="@drawable/ic_help"
-        android:key="top_level_support"
-        android:order="100"
-        android:title="@string/page_tab_title_support"
-        android:summary="@string/support_summary"
-        settings:controller="com.android.settings.support.SupportPreferenceController"/>
-
-</PreferenceScreen>
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 8ae93ea..8f06c1f 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -120,6 +120,10 @@
     public static class AccessibilityContrastSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilityDaltonizerSettingsActivity extends SettingsActivity { /* empty */ }
     /**
+     * Activity for lockscreen settings.
+     */
+    public static class LockScreenSettingsActivity extends SettingsActivity { /* empty */ }
+    /**
      * Activity for Reduce Bright Colors.
      */
     public static class ReduceBrightColorsSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java
index 86ead5c..016ac05 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java
@@ -45,6 +45,12 @@
     }
 
     @Override
+    public int getHelpResource() {
+        // Hides help center in action bar and footer bar in SuW
+        return 0;
+    }
+
+    @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 5a686c2..0de86f5 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -47,7 +47,6 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.ArrayMap;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.util.Pair;
 import android.widget.Toast;
@@ -60,7 +59,6 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.PrimarySwitchPreference;
@@ -399,8 +397,7 @@
     private void setPreferenceIcon(Preference preference, Tile tile, boolean forceRoundedIcon,
             String iconPackage, Icon icon) {
         Drawable iconDrawable = icon.loadDrawable(preference.getContext());
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)
-                && TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
+        if (TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
             iconDrawable.setTint(Utils.getHomepageIconColor(preference.getContext()));
         } else if (forceRoundedIcon && !TextUtils.equals(mContext.getPackageName(), iconPackage)) {
             iconDrawable = new AdaptiveIcon(mContext, iconDrawable,
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectStorageFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectStorageFragment.java
index 9e505e3..c4ff91b 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectStorageFragment.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectStorageFragment.java
@@ -16,32 +16,301 @@
 
 package com.android.settings.dashboard.profileselector;
 
+import android.app.Activity;
+import android.app.settings.SettingsEnums;
+import android.content.Context;
 import android.os.Bundle;
+import android.os.storage.DiskInfo;
+import android.os.storage.StorageEventListener;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.os.storage.VolumeRecord;
+import android.text.TextUtils;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
 
-import com.android.settings.deviceinfo.StorageDashboardFragment;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.deviceinfo.StorageCategoryFragment;
+import com.android.settings.deviceinfo.VolumeOptionMenuController;
+import com.android.settings.deviceinfo.storage.AutomaticStorageManagementSwitchPreferenceController;
+import com.android.settings.deviceinfo.storage.DiskInitFragment;
+import com.android.settings.deviceinfo.storage.StorageEntry;
+import com.android.settings.deviceinfo.storage.StorageSelectionPreferenceController;
+import com.android.settings.deviceinfo.storage.StorageUsageProgressBarPreferenceController;
+import com.android.settings.deviceinfo.storage.StorageUtils;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
- * Storage Settings page for personal/managed profile.
+ * Storage Settings main UI is composed by 3 fragments:
+ *
+ * StorageDashboardFragment only shows when there is only personal profile for current user.
+ *
+ * ProfileSelectStorageFragment (controls preferences above profile tab) and
+ * StorageCategoryFragment (controls preferences below profile tab) only show when current
+ * user has installed work profile.
+ *
+ * ProfileSelectStorageFragment and StorageCategoryFragment have many similar or the same
+ * code as StorageDashboardFragment. Remember to sync code between these fragments when you have to
+ * change Storage Settings.
  */
 public class ProfileSelectStorageFragment extends ProfileSelectFragment {
 
+    private static final String TAG = "ProfileSelStorageFrag";
+    private static final String SELECTED_STORAGE_ENTRY_KEY = "selected_storage_entry_key";
+
+    private StorageManager mStorageManager;
+
+    private final List<StorageEntry> mStorageEntries = new ArrayList<>();
+    private StorageEntry mSelectedStorageEntry;
+    private Fragment[] mFragments;
+
+    private StorageSelectionPreferenceController mStorageSelectionController;
+    private StorageUsageProgressBarPreferenceController mStorageUsageProgressBarController;
+    private VolumeOptionMenuController mOptionMenuController;
+
+    private final StorageEventListener mStorageEventListener = new StorageEventListener() {
+        @Override
+        public void onVolumeStateChanged(VolumeInfo volumeInfo, int oldState, int newState) {
+            if (!StorageUtils.isStorageSettingsInterestedVolume(volumeInfo)) {
+                return;
+            }
+
+            final StorageEntry changedStorageEntry = new StorageEntry(getContext(), volumeInfo);
+            switch (volumeInfo.getState()) {
+                case VolumeInfo.STATE_MOUNTED:
+                case VolumeInfo.STATE_MOUNTED_READ_ONLY:
+                case VolumeInfo.STATE_UNMOUNTABLE:
+                    // Add mounted or unmountable storage in the list and show it on spinner.
+                    // Unmountable storages are the storages which has a problem format and android
+                    // is not able to mount it automatically.
+                    // Users can format an unmountable storage by the UI and then use the storage.
+                    mStorageEntries.removeIf(storageEntry -> {
+                        return storageEntry.equals(changedStorageEntry);
+                    });
+                    mStorageEntries.add(changedStorageEntry);
+                    if (changedStorageEntry.equals(mSelectedStorageEntry)) {
+                        mSelectedStorageEntry = changedStorageEntry;
+                    }
+                    refreshUi();
+                    break;
+                case VolumeInfo.STATE_REMOVED:
+                case VolumeInfo.STATE_UNMOUNTED:
+                case VolumeInfo.STATE_BAD_REMOVAL:
+                case VolumeInfo.STATE_EJECTING:
+                    // Remove removed storage from list and don't show it on spinner.
+                    if (mStorageEntries.remove(changedStorageEntry)) {
+                        if (changedStorageEntry.equals(mSelectedStorageEntry)) {
+                            mSelectedStorageEntry =
+                                    StorageEntry.getDefaultInternalStorageEntry(getContext());
+                        }
+                        refreshUi();
+                    }
+                    break;
+                default:
+                    // Do nothing.
+            }
+        }
+
+        @Override
+        public void onVolumeRecordChanged(VolumeRecord volumeRecord) {
+            if (StorageUtils.isVolumeRecordMissed(mStorageManager, volumeRecord)) {
+                // VolumeRecord is a metadata of VolumeInfo, if a VolumeInfo is missing
+                // (e.g., internal SD card is removed.) show the missing storage to users,
+                // users can insert the SD card or manually forget the storage from the device.
+                final StorageEntry storageEntry = new StorageEntry(volumeRecord);
+                if (!mStorageEntries.contains(storageEntry)) {
+                    mStorageEntries.add(storageEntry);
+                    refreshUi();
+                }
+            } else {
+                // Find mapped VolumeInfo and replace with existing one for something changed.
+                // (e.g., Renamed.)
+                final VolumeInfo mappedVolumeInfo =
+                        mStorageManager.findVolumeByUuid(volumeRecord.getFsUuid());
+                if (mappedVolumeInfo == null) {
+                    return;
+                }
+
+                final boolean removeMappedStorageEntry = mStorageEntries.removeIf(storageEntry ->
+                        storageEntry.isVolumeInfo()
+                            && TextUtils.equals(storageEntry.getFsUuid(), volumeRecord.getFsUuid())
+                );
+                if (removeMappedStorageEntry) {
+                    mStorageEntries.add(new StorageEntry(getContext(), mappedVolumeInfo));
+                    refreshUi();
+                }
+            }
+        }
+
+        @Override
+        public void onVolumeForgotten(String fsUuid) {
+            final StorageEntry storageEntry = new StorageEntry(
+                    new VolumeRecord(VolumeInfo.TYPE_PUBLIC, fsUuid));
+            if (mStorageEntries.remove(storageEntry)) {
+                if (mSelectedStorageEntry.equals(storageEntry)) {
+                    mSelectedStorageEntry =
+                            StorageEntry.getDefaultInternalStorageEntry(getContext());
+                }
+                refreshUi();
+            }
+        }
+
+        @Override
+        public void onDiskScanned(DiskInfo disk, int volumeCount) {
+            if (!StorageUtils.isDiskUnsupported(disk)) {
+                return;
+            }
+            final StorageEntry storageEntry = new StorageEntry(disk);
+            if (!mStorageEntries.contains(storageEntry)) {
+                mStorageEntries.add(storageEntry);
+                refreshUi();
+            }
+        }
+
+        @Override
+        public void onDiskDestroyed(DiskInfo disk) {
+            final StorageEntry storageEntry = new StorageEntry(disk);
+            if (mStorageEntries.remove(storageEntry)) {
+                if (mSelectedStorageEntry.equals(storageEntry)) {
+                    mSelectedStorageEntry =
+                            StorageEntry.getDefaultInternalStorageEntry(getContext());
+                }
+                refreshUi();
+            }
+        }
+    };
+
     @Override
     public Fragment[] getFragments() {
+        if (mFragments != null) {
+            return mFragments;
+        }
+
         final Bundle workBundle = new Bundle();
         workBundle.putInt(EXTRA_PROFILE, ProfileType.WORK);
-        final Fragment workFragment = new StorageDashboardFragment();
+        final Fragment workFragment = new StorageCategoryFragment();
         workFragment.setArguments(workBundle);
 
         final Bundle personalBundle = new Bundle();
         personalBundle.putInt(EXTRA_PROFILE, ProfileType.PERSONAL);
-        final Fragment personalFragment = new StorageDashboardFragment();
+        final Fragment personalFragment = new StorageCategoryFragment();
         personalFragment.setArguments(personalBundle);
 
-        return new Fragment[] {
+        mFragments = new Fragment[] {
             personalFragment,
             workFragment
         };
+        return mFragments;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.storage_dashboard_header_fragment;
+    }
+
+    private void refreshUi() {
+        mStorageSelectionController.setStorageEntries(mStorageEntries);
+        mStorageSelectionController.setSelectedStorageEntry(mSelectedStorageEntry);
+        mStorageUsageProgressBarController.setSelectedStorageEntry(mSelectedStorageEntry);
+
+        for (Fragment fragment : getFragments()) {
+            if (!(fragment instanceof StorageCategoryFragment)) {
+                throw new IllegalStateException("Wrong fragment type to refreshUi");
+            }
+            ((StorageCategoryFragment) fragment).refreshUi(mSelectedStorageEntry);
+        }
+
+        mOptionMenuController.setSelectedStorageEntry(mSelectedStorageEntry);
+        getActivity().invalidateOptionsMenu();
+    }
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        final Activity activity = getActivity();
+        mStorageManager = activity.getSystemService(StorageManager.class);
+
+        if (icicle == null) {
+            final VolumeInfo specifiedVolumeInfo =
+                    Utils.maybeInitializeVolume(mStorageManager, getArguments());
+            mSelectedStorageEntry = specifiedVolumeInfo == null
+                    ? StorageEntry.getDefaultInternalStorageEntry(getContext())
+                    : new StorageEntry(getContext(), specifiedVolumeInfo);
+        } else {
+            mSelectedStorageEntry = icicle.getParcelable(SELECTED_STORAGE_ENTRY_KEY);
+        }
+
+        initializeOptionsMenu(activity);
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(AutomaticStorageManagementSwitchPreferenceController.class).setFragmentManager(
+                getFragmentManager());
+        mStorageSelectionController = use(StorageSelectionPreferenceController.class);
+        mStorageSelectionController.setOnItemSelectedListener(storageEntry -> {
+            mSelectedStorageEntry = storageEntry;
+            refreshUi();
+
+            if (storageEntry.isDiskInfoUnsupported() || storageEntry.isUnmountable()) {
+                DiskInitFragment.show(this, R.string.storage_dialog_unmountable,
+                        storageEntry.getDiskId());
+            } else if (storageEntry.isVolumeRecordMissed()) {
+                StorageUtils.launchForgetMissingVolumeRecordFragment(getContext(), storageEntry);
+            }
+        });
+        mStorageUsageProgressBarController = use(StorageUsageProgressBarPreferenceController.class);
+    }
+
+    @VisibleForTesting
+    void initializeOptionsMenu(Activity activity) {
+        mOptionMenuController = new VolumeOptionMenuController(activity, this,
+                mSelectedStorageEntry);
+        getSettingsLifecycle().addObserver(mOptionMenuController);
+        setHasOptionsMenu(true);
+        activity.invalidateOptionsMenu();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        mStorageEntries.clear();
+        mStorageEntries.addAll(StorageUtils.getAllStorageEntries(getContext(), mStorageManager));
+        refreshUi();
+        mStorageManager.registerListener(mStorageEventListener);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        mStorageManager.unregisterListener(mStorageEventListener);
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        outState.putParcelable(SELECTED_STORAGE_ENTRY_KEY, mSelectedStorageEntry);
+        super.onSaveInstanceState(outState);
+    }
+
+    @Override
+    public int getHelpResource() {
+        return R.string.help_url_storage_dashboard;
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.SETTINGS_STORAGE_CATEGORY;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
     }
 }
diff --git a/src/com/android/settings/deviceinfo/StorageCategoryFragment.java b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
new file mode 100644
index 0000000..ba59498
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.deviceinfo;
+
+import android.app.settings.SettingsEnums;
+import android.app.usage.StorageStatsManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.os.storage.StorageManager;
+import android.util.SparseArray;
+import android.view.View;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
+import com.android.settings.deviceinfo.storage.CachedStorageValuesHelper;
+import com.android.settings.deviceinfo.storage.SecondaryUserController;
+import com.android.settings.deviceinfo.storage.StorageAsyncLoader;
+import com.android.settings.deviceinfo.storage.StorageEntry;
+import com.android.settings.deviceinfo.storage.StorageItemPreferenceController;
+import com.android.settings.deviceinfo.storage.UserIconLoader;
+import com.android.settings.deviceinfo.storage.VolumeSizesLoader;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.deviceinfo.PrivateStorageInfo;
+import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Storage Settings main UI is composed by 3 fragments:
+ *
+ * StorageDashboardFragment only shows when there is only personal profile for current user.
+ *
+ * ProfileSelectStorageFragment (controls preferences above profile tab) and
+ * StorageCategoryFragment (controls preferences below profile tab) only show when current
+ * user has installed work profile.
+ *
+ * ProfileSelectStorageFragment and StorageCategoryFragment have many similar or the same
+ * code as StorageDashboardFragment. Remember to sync code between these fragments when you have to
+ * change Storage Settings.
+ */
+public class StorageCategoryFragment extends DashboardFragment
+        implements
+        LoaderManager.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>>,
+        Preference.OnPreferenceClickListener {
+    private static final String TAG = "StorageCategoryFrag";
+    private static final String SUMMARY_PREF_KEY = "storage_summary";
+    private static final String FREE_UP_SPACE_PREF_KEY = "free_up_space";
+    private static final int STORAGE_JOB_ID = 0;
+    private static final int ICON_JOB_ID = 1;
+    private static final int VOLUME_SIZE_JOB_ID = 2;
+
+    private StorageManager mStorageManager;
+    private UserManager mUserManager;
+    private StorageEntry mSelectedStorageEntry;
+    private PrivateStorageInfo mStorageInfo;
+    private SparseArray<StorageAsyncLoader.AppsStorageResult> mAppsResult;
+    private CachedStorageValuesHelper mCachedStorageValuesHelper;
+
+    private StorageItemPreferenceController mPreferenceController;
+    private List<AbstractPreferenceController> mSecondaryUsers;
+    private boolean mIsWorkProfile;
+    private int mUserId;
+    private Preference mFreeUpSpacePreference;
+
+    /**
+     * Refresh UI for specified storageEntry.
+     */
+    public void refreshUi(StorageEntry storageEntry) {
+        mSelectedStorageEntry = storageEntry;
+        if (mPreferenceController == null) {
+            // Check null here because when onResume, StorageCategoryFragment may not
+            // onAttach to createPreferenceControllers and mPreferenceController will be null.
+            return;
+        }
+
+        mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
+
+        if (!mSelectedStorageEntry.isMounted()) {
+            // Set null volume to hide category stats.
+            mPreferenceController.setVolume(null);
+            return;
+        }
+        if (mSelectedStorageEntry.isPrivate()) {
+            // Stats data is only available on private volumes.
+            getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
+            getLoaderManager()
+                 .restartLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
+            getLoaderManager().restartLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks());
+        } else {
+            mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
+        }
+    }
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        mStorageManager = getActivity().getSystemService(StorageManager.class);
+
+        initializePreference();
+    }
+
+    private void initializePreference() {
+        mFreeUpSpacePreference = getPreferenceScreen().findPreference(FREE_UP_SPACE_PREF_KEY);
+        mFreeUpSpacePreference.setOnPreferenceClickListener(this);
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        // These member variables are initialized befoer super.onAttach for
+        // createPreferenceControllers to work correctly.
+        mUserManager = context.getSystemService(UserManager.class);
+        mIsWorkProfile = getArguments().getInt(ProfileSelectFragment.EXTRA_PROFILE)
+                == ProfileSelectFragment.ProfileType.WORK;
+        mUserId = Utils.getCurrentUserId(mUserManager, mIsWorkProfile);
+
+        super.onAttach(context);
+    }
+
+    @Override
+    public void onViewCreated(View v, Bundle savedInstanceState) {
+        super.onViewCreated(v, savedInstanceState);
+        initializeCacheProvider();
+        maybeSetLoading(isQuotaSupported());
+
+        EntityHeaderController.newInstance(getActivity(), this /*fragment*/,
+                null /* header view */)
+                .setRecyclerView(getListView(), getSettingsLifecycle());
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        if (mSelectedStorageEntry != null) {
+            refreshUi(mSelectedStorageEntry);
+        }
+    }
+
+    private void onReceivedSizes() {
+        boolean stopLoading = false;
+        if (mStorageInfo != null) {
+            final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
+            mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
+            mPreferenceController.setUsedSize(privateUsedBytes);
+            mPreferenceController.setTotalSize(mStorageInfo.totalBytes);
+            for (int i = 0, size = mSecondaryUsers.size(); i < size; i++) {
+                final AbstractPreferenceController controller = mSecondaryUsers.get(i);
+                if (controller instanceof SecondaryUserController) {
+                    SecondaryUserController userController = (SecondaryUserController) controller;
+                    userController.setTotalSize(mStorageInfo.totalBytes);
+                }
+            }
+            stopLoading = true;
+        }
+
+        if (mAppsResult != null) {
+            mPreferenceController.onLoadFinished(mAppsResult, mUserId);
+            updateSecondaryUserControllers(mSecondaryUsers, mAppsResult);
+            stopLoading = true;
+        }
+
+        // setLoading always causes a flicker, so let's avoid doing it.
+        if (stopLoading) {
+            if (getView().findViewById(R.id.loading_container).getVisibility() == View.VISIBLE) {
+                setLoading(false, true);
+            }
+        }
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.SETTINGS_STORAGE_CATEGORY;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.storage_category_fragment;
+    }
+
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        final StorageManager sm = context.getSystemService(StorageManager.class);
+        mPreferenceController = new StorageItemPreferenceController(context, this,
+                null /* volume */, new StorageManagerVolumeProvider(sm), mIsWorkProfile);
+        controllers.add(mPreferenceController);
+
+        mSecondaryUsers = SecondaryUserController.getSecondaryUserControllers(context,
+                mUserManager, mIsWorkProfile /* isWorkProfileOnly */);
+        controllers.addAll(mSecondaryUsers);
+
+        return controllers;
+    }
+
+    /**
+     * Updates the secondary user controller sizes.
+     */
+    private void updateSecondaryUserControllers(List<AbstractPreferenceController> controllers,
+            SparseArray<StorageAsyncLoader.AppsStorageResult> stats) {
+        for (int i = 0, size = controllers.size(); i < size; i++) {
+            final AbstractPreferenceController controller = controllers.get(i);
+            if (controller instanceof StorageAsyncLoader.ResultHandler) {
+                StorageAsyncLoader.ResultHandler userController =
+                        (StorageAsyncLoader.ResultHandler) controller;
+                userController.handleResult(stats);
+            }
+        }
+    }
+
+    @Override
+    public Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> onCreateLoader(int id,
+            Bundle args) {
+        final Context context = getContext();
+        return new StorageAsyncLoader(context, mUserManager,
+                mSelectedStorageEntry.getFsUuid(),
+                new StorageStatsSource(context),
+                context.getPackageManager());
+    }
+
+    @Override
+    public void onLoadFinished(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader,
+            SparseArray<StorageAsyncLoader.AppsStorageResult> data) {
+        mAppsResult = data;
+        maybeCacheFreshValues();
+        onReceivedSizes();
+    }
+
+    @Override
+    public void onLoaderReset(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader) {
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        if (preference == mFreeUpSpacePreference) {
+            final Context context = getContext();
+            final MetricsFeatureProvider metricsFeatureProvider =
+                    FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+            metricsFeatureProvider.logClickedPreference(preference, getMetricsCategory());
+            metricsFeatureProvider.action(context, SettingsEnums.STORAGE_FREE_UP_SPACE_NOW);
+            final Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
+            context.startActivityAsUser(intent, new UserHandle(mUserId));
+            return true;
+        }
+        return false;
+    }
+
+    @VisibleForTesting
+    public void setCachedStorageValuesHelper(CachedStorageValuesHelper helper) {
+        mCachedStorageValuesHelper = helper;
+    }
+
+    @VisibleForTesting
+    public PrivateStorageInfo getPrivateStorageInfo() {
+        return mStorageInfo;
+    }
+
+    @VisibleForTesting
+    public void setPrivateStorageInfo(PrivateStorageInfo info) {
+        mStorageInfo = info;
+    }
+
+    @VisibleForTesting
+    public SparseArray<StorageAsyncLoader.AppsStorageResult> getAppsStorageResult() {
+        return mAppsResult;
+    }
+
+    @VisibleForTesting
+    public void setAppsStorageResult(SparseArray<StorageAsyncLoader.AppsStorageResult> info) {
+        mAppsResult = info;
+    }
+
+    @VisibleForTesting
+    void initializeCachedValues() {
+        final PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo();
+        final SparseArray<StorageAsyncLoader.AppsStorageResult> loaderResult =
+                mCachedStorageValuesHelper.getCachedAppsStorageResult();
+        if (info == null || loaderResult == null) {
+            return;
+        }
+
+        mStorageInfo = info;
+        mAppsResult = loaderResult;
+    }
+
+    /**
+     * Activate loading UI and animation if it's necessary.
+     */
+    @VisibleForTesting
+    public void maybeSetLoading(boolean isQuotaSupported) {
+        // If we have fast stats, we load until both have loaded.
+        // If we have slow stats, we load when we get the total volume sizes.
+        if ((isQuotaSupported && (mStorageInfo == null || mAppsResult == null))
+                || (!isQuotaSupported && mStorageInfo == null)) {
+            setLoading(true /* loading */, false /* animate */);
+        }
+    }
+
+    private void initializeCacheProvider() {
+        mCachedStorageValuesHelper = new CachedStorageValuesHelper(getContext(), mUserId);
+        initializeCachedValues();
+        onReceivedSizes();
+    }
+
+    private void maybeCacheFreshValues() {
+        if (mStorageInfo != null && mAppsResult != null) {
+            mCachedStorageValuesHelper.cacheResult(mStorageInfo, mAppsResult.get(mUserId));
+        }
+    }
+
+    private boolean isQuotaSupported() {
+        return mSelectedStorageEntry.isMounted()
+                && getActivity().getSystemService(StorageStatsManager.class)
+                        .isQuotaSupported(mSelectedStorageEntry.getFsUuid());
+    }
+
+    /**
+     * IconLoaderCallbacks exists because StorageCategoryFragment already implements
+     * LoaderCallbacks for a different type.
+     */
+    public final class IconLoaderCallbacks
+            implements LoaderManager.LoaderCallbacks<SparseArray<Drawable>> {
+        @Override
+        public Loader<SparseArray<Drawable>> onCreateLoader(int id, Bundle args) {
+            return new UserIconLoader(
+                    getContext(),
+                    () -> UserIconLoader.loadUserIconsWithContext(getContext()));
+        }
+
+        @Override
+        public void onLoadFinished(
+                Loader<SparseArray<Drawable>> loader, SparseArray<Drawable> data) {
+            mSecondaryUsers
+                    .stream()
+                    .filter(controller -> controller instanceof UserIconLoader.UserIconHandler)
+                    .forEach(
+                            controller ->
+                                    ((UserIconLoader.UserIconHandler) controller)
+                                            .handleUserIcons(data));
+        }
+
+        @Override
+        public void onLoaderReset(Loader<SparseArray<Drawable>> loader) {
+        }
+    }
+
+    /**
+     * VolumeSizeCallbacks exists because StorageCategoryFragment already implements
+     * LoaderCallbacks for a different type.
+     */
+    public final class VolumeSizeCallbacks
+            implements LoaderManager.LoaderCallbacks<PrivateStorageInfo> {
+        @Override
+        public Loader<PrivateStorageInfo> onCreateLoader(int id, Bundle args) {
+            final Context context = getContext();
+            final StorageManagerVolumeProvider smvp =
+                    new StorageManagerVolumeProvider(mStorageManager);
+            final StorageStatsManager stats = context.getSystemService(StorageStatsManager.class);
+            return new VolumeSizesLoader(context, smvp, stats,
+                    mSelectedStorageEntry.getVolumeInfo());
+        }
+
+        @Override
+        public void onLoaderReset(Loader<PrivateStorageInfo> loader) {
+        }
+
+        @Override
+        public void onLoadFinished(
+                Loader<PrivateStorageInfo> loader, PrivateStorageInfo privateStorageInfo) {
+            if (privateStorageInfo == null) {
+                getActivity().finish();
+                return;
+            }
+
+            mStorageInfo = privateStorageInfo;
+            maybeCacheFreshValues();
+            onReceivedSizes();
+        }
+    }
+}
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index 6a3bb51..cc7eff6 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -43,7 +43,6 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
 import com.android.settings.deviceinfo.storage.AutomaticStorageManagementSwitchPreferenceController;
 import com.android.settings.deviceinfo.storage.CachedStorageValuesHelper;
 import com.android.settings.deviceinfo.storage.DiskInitFragment;
@@ -69,8 +68,20 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.stream.Collectors;
 
+/**
+ * Storage Settings main UI is composed by 3 fragments:
+ *
+ * StorageDashboardFragment only shows when there is only personal profile for current user.
+ *
+ * ProfileSelectStorageFragment (controls preferences above profile tab) and
+ * StorageCategoryFragment (controls preferences below profile tab) only show when current
+ * user has installed work profile.
+ *
+ * ProfileSelectStorageFragment and StorageCategoryFragment have many similar or the same
+ * code as StorageDashboardFragment. Remember to sync code between these fragments when you have to
+ * change Storage Settings.
+ */
 @SearchIndexable
 public class StorageDashboardFragment extends DashboardFragment
         implements
@@ -104,7 +115,7 @@
     private final StorageEventListener mStorageEventListener = new StorageEventListener() {
         @Override
         public void onVolumeStateChanged(VolumeInfo volumeInfo, int oldState, int newState) {
-            if (!isInteresting(volumeInfo)) {
+            if (!StorageUtils.isStorageSettingsInterestedVolume(volumeInfo)) {
                 return;
             }
 
@@ -146,7 +157,7 @@
 
         @Override
         public void onVolumeRecordChanged(VolumeRecord volumeRecord) {
-            if (isVolumeRecordMissed(volumeRecord)) {
+            if (StorageUtils.isVolumeRecordMissed(mStorageManager, volumeRecord)) {
                 // VolumeRecord is a metadata of VolumeInfo, if a VolumeInfo is missing
                 // (e.g., internal SD card is removed.) show the missing storage to users,
                 // users can insert the SD card or manually forget the storage from the device.
@@ -159,7 +170,7 @@
                 // Find mapped VolumeInfo and replace with existing one for something changed.
                 // (e.g., Renamed.)
                 final VolumeInfo mappedVolumeInfo =
-                            mStorageManager.findVolumeByUuid(volumeRecord.getFsUuid());
+                        mStorageManager.findVolumeByUuid(volumeRecord.getFsUuid());
                 if (mappedVolumeInfo == null) {
                     return;
                 }
@@ -190,7 +201,7 @@
 
         @Override
         public void onDiskScanned(DiskInfo disk, int volumeCount) {
-            if (!isDiskUnsupported(disk)) {
+            if (!StorageUtils.isDiskUnsupported(disk)) {
                 return;
             }
             final StorageEntry storageEntry = new StorageEntry(disk);
@@ -213,33 +224,6 @@
         }
     };
 
-    private static boolean isInteresting(VolumeInfo volumeInfo) {
-        switch (volumeInfo.getType()) {
-            case VolumeInfo.TYPE_PRIVATE:
-            case VolumeInfo.TYPE_PUBLIC:
-            case VolumeInfo.TYPE_STUB:
-                return true;
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * VolumeRecord is a metadata of VolumeInfo, this is the case where a VolumeInfo is missing.
-     * (e.g., internal SD card is removed.)
-     */
-    private boolean isVolumeRecordMissed(VolumeRecord volumeRecord) {
-        return volumeRecord.getType() == VolumeInfo.TYPE_PRIVATE
-                && mStorageManager.findVolumeByUuid(volumeRecord.getFsUuid()) == null;
-    }
-
-    /**
-     * A unsupported disk is the disk of problem format, android is not able to mount automatically.
-     */
-    private static boolean isDiskUnsupported(DiskInfo disk) {
-        return disk.volumeCount == 0 && disk.size > 0;
-    }
-
     private void refreshUi() {
         mStorageSelectionController.setStorageEntries(mStorageEntries);
         mStorageSelectionController.setSelectedStorageEntry(mSelectedStorageEntry);
@@ -297,9 +281,8 @@
         // These member variables are initialized befoer super.onAttach for
         // createPreferenceControllers to work correctly.
         mUserManager = context.getSystemService(UserManager.class);
-        mIsWorkProfile = getArguments().getInt(ProfileSelectFragment.EXTRA_PROFILE)
-                == ProfileSelectFragment.ProfileType.WORK;
-        mUserId = Utils.getCurrentUserId(mUserManager, mIsWorkProfile);
+        mIsWorkProfile = false;
+        mUserId = UserHandle.myUserId();
 
         super.onAttach(context);
         use(AutomaticStorageManagementSwitchPreferenceController.class).setFragmentManager(
@@ -334,8 +317,7 @@
         initializeCacheProvider();
         maybeSetLoading(isQuotaSupported());
 
-        final Activity activity = getActivity();
-        EntityHeaderController.newInstance(activity, this /*fragment*/,
+        EntityHeaderController.newInstance(getActivity(), this /*fragment*/,
                 null /* header view */)
                 .setRecyclerView(getListView(), getSettingsLifecycle());
     }
@@ -345,18 +327,7 @@
         super.onResume();
 
         mStorageEntries.clear();
-        mStorageEntries.addAll(mStorageManager.getVolumes().stream()
-                .filter(volumeInfo -> isInteresting(volumeInfo))
-                .map(volumeInfo -> new StorageEntry(getContext(), volumeInfo))
-                .collect(Collectors.toList()));
-        mStorageEntries.addAll(mStorageManager.getDisks().stream()
-                .filter(disk -> isDiskUnsupported(disk))
-                .map(disk -> new StorageEntry(disk))
-                .collect(Collectors.toList()));
-        mStorageEntries.addAll(mStorageManager.getVolumeRecords().stream()
-                .filter(volumeRecord -> isVolumeRecordMissed(volumeRecord))
-                .map(volumeRecord -> new StorageEntry(volumeRecord))
-                .collect(Collectors.toList()));
+        mStorageEntries.addAll(StorageUtils.getAllStorageEntries(getContext(), mStorageManager));
         refreshUi();
         mStorageManager.registerListener(mStorageEventListener);
     }
@@ -381,19 +352,18 @@
     private void onReceivedSizes() {
         boolean stopLoading = false;
         if (mStorageInfo != null) {
-            long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
+            final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
             mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
             mPreferenceController.setUsedSize(privateUsedBytes);
             mPreferenceController.setTotalSize(mStorageInfo.totalBytes);
             for (int i = 0, size = mSecondaryUsers.size(); i < size; i++) {
-                AbstractPreferenceController controller = mSecondaryUsers.get(i);
+                final AbstractPreferenceController controller = mSecondaryUsers.get(i);
                 if (controller instanceof SecondaryUserController) {
                     SecondaryUserController userController = (SecondaryUserController) controller;
                     userController.setTotalSize(mStorageInfo.totalBytes);
                 }
             }
             stopLoading = true;
-
         }
 
         if (mAppsResult != null) {
@@ -428,7 +398,7 @@
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        StorageManager sm = context.getSystemService(StorageManager.class);
+        final StorageManager sm = context.getSystemService(StorageManager.class);
         mPreferenceController = new StorageItemPreferenceController(context, this,
                 null /* volume */, new StorageManagerVolumeProvider(sm), mIsWorkProfile);
         controllers.add(mPreferenceController);
@@ -440,18 +410,13 @@
         return controllers;
     }
 
-    @VisibleForTesting
-    protected void setVolume(VolumeInfo info) {
-        mSelectedStorageEntry = new StorageEntry(getContext(), info);
-    }
-
     /**
      * Updates the secondary user controller sizes.
      */
     private void updateSecondaryUserControllers(List<AbstractPreferenceController> controllers,
             SparseArray<StorageAsyncLoader.AppsStorageResult> stats) {
         for (int i = 0, size = controllers.size(); i < size; i++) {
-            AbstractPreferenceController controller = controllers.get(i);
+            final AbstractPreferenceController controller = controllers.get(i);
             if (controller instanceof StorageAsyncLoader.ResultHandler) {
                 StorageAsyncLoader.ResultHandler userController =
                         (StorageAsyncLoader.ResultHandler) controller;
@@ -552,9 +517,9 @@
     }
 
     @VisibleForTesting
-    public void initializeCachedValues() {
-        PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo();
-        SparseArray<StorageAsyncLoader.AppsStorageResult> loaderResult =
+    void initializeCachedValues() {
+        final PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo();
+        final SparseArray<StorageAsyncLoader.AppsStorageResult> loaderResult =
                 mCachedStorageValuesHelper.getCachedAppsStorageResult();
         if (info == null || loaderResult == null) {
             return;
@@ -564,12 +529,15 @@
         mAppsResult = loaderResult;
     }
 
+    /**
+     * Activate loading UI and animation if it's necessary.
+     */
     @VisibleForTesting
     public void maybeSetLoading(boolean isQuotaSupported) {
         // If we have fast stats, we load until both have loaded.
         // If we have slow stats, we load when we get the total volume sizes.
-        if ((isQuotaSupported && (mStorageInfo == null || mAppsResult == null)) ||
-                (!isQuotaSupported && mStorageInfo == null)) {
+        if ((isQuotaSupported && (mStorageInfo == null || mAppsResult == null))
+                || (!isQuotaSupported && mStorageInfo == null)) {
             setLoading(true /* loading */, false /* animate */);
         }
     }
@@ -622,6 +590,10 @@
         }
     }
 
+    /**
+     * VolumeSizeCallbacks exists because StorageCategoryFragment already implements
+     * LoaderCallbacks for a different type.
+     */
     public final class VolumeSizeCallbacks
             implements LoaderManager.LoaderCallbacks<PrivateStorageInfo> {
         @Override
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 656f337..241c852 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -76,7 +76,7 @@
     @VisibleForTesting
     static final String VIDEOS_KEY = "pref_videos";
     @VisibleForTesting
-    static final String AUDIOS_KEY = "pref_audios";
+    static final String AUDIO_KEY = "pref_audio";
     @VisibleForTesting
     static final String APPS_KEY = "pref_apps";
     @VisibleForTesting
@@ -93,7 +93,7 @@
     @VisibleForTesting
     final Uri mVideosUri;
     @VisibleForTesting
-    final Uri mAudiosUri;
+    final Uri mAudioUri;
     @VisibleForTesting
     final Uri mDocumentsAndOtherUri;
 
@@ -119,7 +119,7 @@
     @VisibleForTesting
     StorageItemPreference mVideosPreference;
     @VisibleForTesting
-    StorageItemPreference mAudiosPreference;
+    StorageItemPreference mAudioPreference;
     @VisibleForTesting
     StorageItemPreference mAppsPreference;
     @VisibleForTesting
@@ -151,8 +151,8 @@
                 .getString(R.string.config_images_storage_category_uri));
         mVideosUri = Uri.parse(context.getResources()
                 .getString(R.string.config_videos_storage_category_uri));
-        mAudiosUri = Uri.parse(context.getResources()
-                .getString(R.string.config_audios_storage_category_uri));
+        mAudioUri = Uri.parse(context.getResources()
+                .getString(R.string.config_audio_storage_category_uri));
         mDocumentsAndOtherUri = Uri.parse(context.getResources()
                 .getString(R.string.config_documents_and_other_storage_category_uri));
     }
@@ -182,8 +182,8 @@
             case VIDEOS_KEY:
                 launchActivityWithUri(mVideosUri);
                 return true;
-            case AUDIOS_KEY:
-                launchActivityWithUri(mAudiosUri);
+            case AUDIO_KEY:
+                launchActivityWithUri(mAudioUri);
                 return true;
             case APPS_KEY:
                 launchAppsIntent();
@@ -251,7 +251,7 @@
         final boolean privateStoragePreferencesVisible = isValidPrivateVolume();
         mImagesPreference.setVisible(privateStoragePreferencesVisible);
         mVideosPreference.setVisible(privateStoragePreferencesVisible);
-        mAudiosPreference.setVisible(privateStoragePreferencesVisible);
+        mAudioPreference.setVisible(privateStoragePreferencesVisible);
         mAppsPreference.setVisible(privateStoragePreferencesVisible);
         mGamesPreference.setVisible(privateStoragePreferencesVisible);
         mDocumentsAndOtherPreference.setVisible(privateStoragePreferencesVisible);
@@ -279,7 +279,7 @@
 
             mPrivateStorageItemPreferences.add(mImagesPreference);
             mPrivateStorageItemPreferences.add(mVideosPreference);
-            mPrivateStorageItemPreferences.add(mAudiosPreference);
+            mPrivateStorageItemPreferences.add(mAudioPreference);
             mPrivateStorageItemPreferences.add(mAppsPreference);
             mPrivateStorageItemPreferences.add(mGamesPreference);
             mPrivateStorageItemPreferences.add(mDocumentsAndOtherPreference);
@@ -288,7 +288,7 @@
         }
         mScreen.removePreference(mImagesPreference);
         mScreen.removePreference(mVideosPreference);
-        mScreen.removePreference(mAudiosPreference);
+        mScreen.removePreference(mAudioPreference);
         mScreen.removePreference(mAppsPreference);
         mScreen.removePreference(mGamesPreference);
         mScreen.removePreference(mDocumentsAndOtherPreference);
@@ -317,7 +317,7 @@
         tintPreference(mPublicStoragePreference);
         tintPreference(mImagesPreference);
         tintPreference(mVideosPreference);
-        tintPreference(mAudiosPreference);
+        tintPreference(mAudioPreference);
         tintPreference(mAppsPreference);
         tintPreference(mGamesPreference);
         tintPreference(mDocumentsAndOtherPreference);
@@ -346,7 +346,7 @@
         mPublicStoragePreference = screen.findPreference(PUBLIC_STORAGE_KEY);
         mImagesPreference = screen.findPreference(IMAGES_KEY);
         mVideosPreference = screen.findPreference(VIDEOS_KEY);
-        mAudiosPreference = screen.findPreference(AUDIOS_KEY);
+        mAudioPreference = screen.findPreference(AUDIO_KEY);
         mAppsPreference = screen.findPreference(APPS_KEY);
         mGamesPreference = screen.findPreference(GAMES_KEY);
         mDocumentsAndOtherPreference = screen.findPreference(DOCUMENTS_AND_OTHER_KEY);
@@ -363,7 +363,7 @@
 
         mImagesPreference.setStorageSize(getImagesSize(data), mTotalSize);
         mVideosPreference.setStorageSize(getVideosSize(data), mTotalSize);
-        mAudiosPreference.setStorageSize(getAudiosSize(data), mTotalSize);
+        mAudioPreference.setStorageSize(getAudioSize(data), mTotalSize);
         mAppsPreference.setStorageSize(getAppsSize(data), mTotalSize);
         mGamesPreference.setStorageSize(getGamesSize(data), mTotalSize);
         mDocumentsAndOtherPreference.setStorageSize(getDocumentsAndOtherSize(data),
@@ -426,7 +426,7 @@
         return data.videoAppsSize;
     }
 
-    private long getAudiosSize(StorageAsyncLoader.AppsStorageResult data) {
+    private long getAudioSize(StorageAsyncLoader.AppsStorageResult data) {
         return data.musicAppsSize + data.externalStats.audioBytes;
     }
 
diff --git a/src/com/android/settings/deviceinfo/storage/StorageUtils.java b/src/com/android/settings/deviceinfo/storage/StorageUtils.java
index 919908d..549eef6 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageUtils.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageUtils.java
@@ -22,6 +22,7 @@
 import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.storage.DiskInfo;
 import android.os.storage.StorageManager;
 import android.os.storage.VolumeInfo;
 import android.os.storage.VolumeRecord;
@@ -36,11 +37,67 @@
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.deviceinfo.PrivateVolumeForget;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /** Storage utilities */
 public class StorageUtils {
 
     private static final String TAG = "StorageUtils";
 
+    /**
+     * Collects and returns all kinds of StorageEntry which will show in Storage Settings.
+     */
+    public static List<StorageEntry> getAllStorageEntries(Context context,
+            StorageManager storageManager) {
+        final List<StorageEntry> storageEntries = new ArrayList<>();
+        storageEntries.addAll(storageManager.getVolumes().stream()
+                .filter(volumeInfo -> isStorageSettingsInterestedVolume(volumeInfo))
+                .map(volumeInfo -> new StorageEntry(context, volumeInfo))
+                .collect(Collectors.toList()));
+        storageEntries.addAll(storageManager.getDisks().stream()
+                .filter(disk -> isDiskUnsupported(disk))
+                .map(disk -> new StorageEntry(disk))
+                .collect(Collectors.toList()));
+        storageEntries.addAll(storageManager.getVolumeRecords().stream()
+                .filter(volumeRecord -> isVolumeRecordMissed(storageManager, volumeRecord))
+                .map(volumeRecord -> new StorageEntry(volumeRecord))
+                .collect(Collectors.toList()));
+        return storageEntries;
+    }
+
+    /**
+     * Returns true if the volumeInfo may be displayed in Storage Settings.
+     */
+    public static boolean isStorageSettingsInterestedVolume(VolumeInfo volumeInfo) {
+        switch (volumeInfo.getType()) {
+            case VolumeInfo.TYPE_PRIVATE:
+            case VolumeInfo.TYPE_PUBLIC:
+            case VolumeInfo.TYPE_STUB:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * VolumeRecord is a metadata of VolumeInfo, this is the case where a VolumeInfo is missing.
+     * (e.g., internal SD card is removed.)
+     */
+    public static boolean isVolumeRecordMissed(StorageManager storageManager,
+            VolumeRecord volumeRecord) {
+        return volumeRecord.getType() == VolumeInfo.TYPE_PRIVATE
+                && storageManager.findVolumeByUuid(volumeRecord.getFsUuid()) == null;
+    }
+
+    /**
+     * A unsupported disk is the disk of problem format, android is not able to mount automatically.
+     */
+    public static boolean isDiskUnsupported(DiskInfo disk) {
+        return disk.volumeCount == 0 && disk.size > 0;
+    }
+
     /** Launches the fragment to forget a specified missing volume record. */
     public static void launchForgetMissingVolumeRecordFragment(Context context,
             StorageEntry storageEntry) {
diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
index a803225..7486f22 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.fuelgauge;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.graphics.drawable.Drawable;
@@ -37,6 +38,7 @@
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnCreate;
@@ -89,9 +91,10 @@
     private final String mPreferenceKey;
     private final SettingsActivity mActivity;
     private final InstrumentedPreferenceFragment mFragment;
-    private final Handler mHandler = new Handler(Looper.getMainLooper());
-    private final CharSequence[] mNotAllowShowSummaryPackages;
     private final CharSequence[] mNotAllowShowEntryPackages;
+    private final CharSequence[] mNotAllowShowSummaryPackages;
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
 
     // Preference cache to avoid create new instance each time.
     @VisibleForTesting
@@ -111,6 +114,8 @@
             .getTextArray(R.array.allowlist_hide_summary_in_battery_usage);
         mNotAllowShowEntryPackages = context.getResources()
             .getTextArray(R.array.allowlist_hide_entry_in_battery_usage);
+        mMetricsFeatureProvider =
+            FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
         if (lifecycle != null) {
             lifecycle.addObserver(this);
         }
@@ -127,6 +132,7 @@
             savedInstanceState.getBoolean(KEY_EXPAND_SYSTEM_INFO, mIsExpanded);
         Log.d(TAG, String.format("onCreate() slotIndex=%d isExpanded=%b",
             mTrapezoidIndex, mIsExpanded));
+        mMetricsFeatureProvider.action(mPrefContext, SettingsEnums.OPEN_BATTERY_USAGE);
     }
 
     @Override
@@ -191,15 +197,22 @@
         final BatteryDiffEntry diffEntry = powerPref.getBatteryDiffEntry();
         final BatteryHistEntry histEntry = diffEntry.mBatteryHistEntry;
         final String packageName = histEntry.mPackageName;
+        final boolean isAppEntry = histEntry.isAppEntry();
         // Checks whether the package is installed or not.
         boolean isValidPackage = true;
-        if (histEntry.isAppEntry()) {
+        if (isAppEntry) {
             if (mBatteryUtils == null) {
                 mBatteryUtils = BatteryUtils.getInstance(mPrefContext);
             }
             isValidPackage = mBatteryUtils.getPackageUid(packageName)
                 != BatteryUtils.UID_NULL;
         }
+        mMetricsFeatureProvider.action(
+            mPrefContext,
+            isAppEntry
+                ? SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM
+                : SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
+            packageName);
         Log.d(TAG, String.format("handleClick() label=%s key=%s isValid:%b\n%s",
             diffEntry.getAppLabel(), histEntry.getKey(), isValidPackage, histEntry));
         if (isValidPackage) {
@@ -215,11 +228,20 @@
     public void onSelect(int trapezoidIndex) {
         Log.d(TAG, "onChartSelect:" + trapezoidIndex);
         refreshUi(trapezoidIndex, /*isForce=*/ false);
+        mMetricsFeatureProvider.action(
+            mPrefContext,
+            trapezoidIndex == BatteryChartView.SELECTED_INDEX_ALL
+                ? SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL
+                : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT);
     }
 
     @Override
     public void onExpand(boolean isExpanded) {
         mIsExpanded = isExpanded;
+        mMetricsFeatureProvider.action(
+            mPrefContext,
+            SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
+            isExpanded);
         refreshExpandUi();
     }
 
diff --git a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
index 7b73638..81ad5be 100644
--- a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
@@ -73,6 +73,11 @@
         mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
         mBatteryHistEntry = batteryHistEntry;
         mUserManager = context.getSystemService(UserManager.class);
+        if (foregroundUsageTimeInMs == 0
+                && backgroundUsageTimeInMs == 0
+                && consumePower != 0) {
+            Log.w(TAG, "abnornal BatteryDiffEntry:\n" + this);
+        }
     }
 
     /** Sets the total consumed power in a specific time slot. */
diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java
index 37f9e12..e05247c 100644
--- a/src/com/android/settings/fuelgauge/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/ConvertUtils.java
@@ -230,7 +230,7 @@
                 if (selectedBatteryEntry == null) {
                     continue;
                 }
-                // Force refine the cumulative value since it may introduce deviation
+                // Forces refine the cumulative value since it may introduce deviation
                 // error since we will apply the interpolation arithmetic.
                 final float totalUsageTimeInMs =
                     foregroundUsageTimeInMs + backgroundUsageTimeInMs;
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index c59b805..5950e4b 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -96,12 +96,7 @@
                 getLifecycle().addObserver(new AvatarViewMixin(this, avatarView));
             }
 
-            if (FeatureFlagUtils.isEnabled(this, FeatureFlags.SILKY_HOME)) {
-                showSuggestionFragment();
-            } else {
-                findViewById(R.id.homepage_title).setVisibility(View.GONE);
-                avatarView.setVisibility(View.GONE);
-            }
+            showSuggestionFragment();
 
             if (FeatureFlagUtils.isEnabled(this, FeatureFlags.CONTEXTUAL_HOME)) {
                 showFragment(new ContextualCardsFragment(), R.id.contextual_cards_content);
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index f4f7f61..681ea51 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -23,8 +23,6 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.provider.SearchIndexableResource;
-import android.util.FeatureFlagUtils;
 
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
@@ -33,7 +31,6 @@
 
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -41,9 +38,6 @@
 import com.android.settingslib.core.instrumentation.Instrumentable;
 import com.android.settingslib.search.SearchIndexable;
 
-import java.util.Arrays;
-import java.util.List;
-
 @SearchIndexable(forTarget = MOBILE)
 public class TopLevelSettings extends DashboardFragment implements
         PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@@ -59,9 +53,6 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) {
-            return R.xml.top_level_settings_grouped;
-        }
         return R.xml.top_level_settings;
     }
 
@@ -108,9 +99,6 @@
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         super.onCreatePreferences(savedInstanceState, rootKey);
-        if (!FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) {
-            return;
-        }
         final PreferenceScreen screen = getPreferenceScreen();
         if (screen == null) {
             return;
@@ -137,16 +125,7 @@
     }
 
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider() {
-
-                @Override
-                public List<SearchIndexableResource> getXmlResourcesToIndex(
-                        Context context, boolean enabled) {
-                    final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = FeatureFlagUtils.isEnabled(context, FeatureFlags.SILKY_HOME)
-                            ? R.xml.top_level_settings_grouped : R.xml.top_level_settings;
-                    return Arrays.asList(sir);
-                }
+            new BaseSearchIndexProvider(R.xml.top_level_settings) {
 
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java
index 01cdba7..8a03a04 100644
--- a/src/com/android/settings/security/SecuritySettings.java
+++ b/src/com/android/settings/security/SecuritySettings.java
@@ -31,6 +31,7 @@
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.enterprise.EnterprisePrivacyPreferenceController;
 import com.android.settings.enterprise.FinancedPrivacyPreferenceController;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.security.trustagent.ManageTrustAgentsPreferenceController;
 import com.android.settings.security.trustagent.TrustAgentListPreferenceController;
@@ -152,5 +153,11 @@
                     return buildPreferenceControllers(context, null /* lifecycle */,
                             null /* host*/);
                 }
+
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    return !FeatureFactory.getFactory(context).getSecuritySettingsFeatureProvider()
+                            .hasAlternativeSecuritySettingsFragment();
+                }
             };
 }
diff --git a/src/com/android/settings/widget/SettingsMainSwitchPreference.java b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
index f627e31..04317a8 100644
--- a/src/com/android/settings/widget/SettingsMainSwitchPreference.java
+++ b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
@@ -74,7 +74,7 @@
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
-        holder.setDividerAllowedAbove(true);
+        holder.setDividerAllowedAbove(false);
         holder.setDividerAllowedBelow(false);
 
         mMainSwitchBar = (SettingsMainSwitchBar) holder.findViewById(R.id.main_switch_bar);
diff --git a/tests/robotests/assets/exempt_not_implementing_index_provider b/tests/robotests/assets/exempt_not_implementing_index_provider
index 7815a48..d4a1c2e 100644
--- a/tests/robotests/assets/exempt_not_implementing_index_provider
+++ b/tests/robotests/assets/exempt_not_implementing_index_provider
@@ -37,6 +37,7 @@
 com.android.settings.datetime.timezone.TimeZoneSettings
 com.android.settings.development.compat.PlatformCompatDashboard
 com.android.settings.deviceinfo.PublicVolumeSettings
+com.android.settings.deviceinfo.StorageDashboardNoHeaderFragment
 com.android.settings.deviceinfo.legal.ModuleLicensesDashboard
 com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionCamera
 com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionLocation
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index 3fd1218..0a87d08 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -112,8 +112,8 @@
         images.setIcon(R.drawable.ic_photo_library);
         final StorageItemPreference videos = spy(new StorageItemPreference(mContext));
         videos.setIcon(R.drawable.ic_local_movies);
-        final StorageItemPreference audios = spy(new StorageItemPreference(mContext));
-        audios.setIcon(R.drawable.ic_media_stream);
+        final StorageItemPreference audio = spy(new StorageItemPreference(mContext));
+        audio.setIcon(R.drawable.ic_media_stream);
         final StorageItemPreference apps = spy(new StorageItemPreference(mContext));
         apps.setIcon(R.drawable.ic_storage_apps);
         final StorageItemPreference games = spy(new StorageItemPreference(mContext));
@@ -132,8 +132,8 @@
                 .thenReturn(images);
         when(screen.findPreference(eq(StorageItemPreferenceController.VIDEOS_KEY)))
                 .thenReturn(videos);
-        when(screen.findPreference(eq(StorageItemPreferenceController.AUDIOS_KEY)))
-                .thenReturn(audios);
+        when(screen.findPreference(eq(StorageItemPreferenceController.AUDIO_KEY)))
+                .thenReturn(audio);
         when(screen.findPreference(eq(StorageItemPreferenceController.APPS_KEY)))
                 .thenReturn(apps);
         when(screen.findPreference(eq(StorageItemPreferenceController.GAMES_KEY)))
@@ -190,8 +190,8 @@
     }
 
     @Test
-    public void launchAudiosIntent_resolveActionViewNull_settingsIntent() {
-        mPreference.setKey(StorageItemPreferenceController.AUDIOS_KEY);
+    public void launchAudioIntent_resolveActionViewNull_settingsIntent() {
+        mPreference.setKey(StorageItemPreferenceController.AUDIO_KEY);
         final Context mockContext = getMockContext();
         mController = new StorageItemPreferenceController(mockContext, mFragment, mVolume,
                 mSvp, false /* isWorkProfile */);
@@ -203,7 +203,7 @@
         final Intent intent = argumentCaptor.getValue();
 
         assertThat(intent.getAction()).isEqualTo(Intent.ACTION_VIEW);
-        assertThat(intent.getData()).isEqualTo(mController.mAudiosUri);
+        assertThat(intent.getData()).isEqualTo(mController.mAudioUri);
     }
 
     @Test
@@ -215,7 +215,7 @@
         assertThat(mController.mPublicStoragePreference.isVisible()).isFalse();
         assertThat(mController.mImagesPreference.isVisible()).isFalse();
         assertThat(mController.mVideosPreference.isVisible()).isFalse();
-        assertThat(mController.mAudiosPreference.isVisible()).isFalse();
+        assertThat(mController.mAudioPreference.isVisible()).isFalse();
         assertThat(mController.mAppsPreference.isVisible()).isFalse();
         assertThat(mController.mGamesPreference.isVisible()).isFalse();
         assertThat(mController.mDocumentsAndOtherPreference.isVisible()).isFalse();
@@ -355,7 +355,7 @@
 
         assertThat(mController.mImagesPreference.getSummary().toString()).isEqualTo("0.35 GB");
         assertThat(mController.mVideosPreference.getSummary().toString()).isEqualTo("0.16 GB");
-        assertThat(mController.mAudiosPreference.getSummary().toString()).isEqualTo("0.14 GB");
+        assertThat(mController.mAudioPreference.getSummary().toString()).isEqualTo("0.14 GB");
         assertThat(mController.mAppsPreference.getSummary().toString()).isEqualTo("0.09 GB");
         assertThat(mController.mGamesPreference.getSummary().toString()).isEqualTo("0.08 GB");
         assertThat(mController.mDocumentsAndOtherPreference.getSummary().toString())
@@ -371,7 +371,7 @@
         verify(mController.mPublicStoragePreference, times(2)).setIcon(nullable(Drawable.class));
         verify(mController.mImagesPreference, times(2)).setIcon(nullable(Drawable.class));
         verify(mController.mVideosPreference, times(2)).setIcon(nullable(Drawable.class));
-        verify(mController.mAudiosPreference, times(2)).setIcon(nullable(Drawable.class));
+        verify(mController.mAudioPreference, times(2)).setIcon(nullable(Drawable.class));
         verify(mController.mAppsPreference, times(2)).setIcon(nullable(Drawable.class));
         verify(mController.mGamesPreference, times(2)).setIcon(nullable(Drawable.class));
         verify(mController.mDocumentsAndOtherPreference, times(2))
@@ -455,7 +455,7 @@
         assertThat(mController.mPublicStoragePreference.isVisible()).isTrue();
         assertThat(mController.mImagesPreference.isVisible()).isFalse();
         assertThat(mController.mVideosPreference.isVisible()).isFalse();
-        assertThat(mController.mAudiosPreference.isVisible()).isFalse();
+        assertThat(mController.mAudioPreference.isVisible()).isFalse();
         assertThat(mController.mAppsPreference.isVisible()).isFalse();
         assertThat(mController.mGamesPreference.isVisible()).isFalse();
         assertThat(mController.mDocumentsAndOtherPreference.isVisible()).isFalse();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java
index 3c371a0..4371472 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java
@@ -26,6 +26,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.ContentValues;
 import android.content.pm.PackageManager;
@@ -43,6 +44,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -82,12 +84,16 @@
     @Mock private Resources mResources;
 
     private Context mContext;
+    private FakeFeatureFactory mFeatureFactory;
     private BatteryDiffEntry mBatteryDiffEntry;
+    private MetricsFeatureProvider mMetricsFeatureProvider;
     private BatteryChartPreferenceController mBatteryChartPreferenceController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
         mContext = spy(RuntimeEnvironment.application);
         mBatteryChartPreferenceController = createController();
         mBatteryChartPreferenceController.mPrefContext = mContext;
@@ -331,9 +337,14 @@
     }
 
     @Test
-    public void testHandlePreferenceTreeClick_notPowerGaugePreference_returnFalse() {
+    public void testHandlePreferenceTreeiClick_notPowerGaugePreference_returnFalse() {
         assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(mAppListGroup))
             .isFalse();
+
+        verify(mMetricsFeatureProvider, never())
+            .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM);
+        verify(mMetricsFeatureProvider, never())
+            .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM);
     }
 
     @Test
@@ -343,6 +354,11 @@
 
         assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(
             mPowerGaugePreference)).isTrue();
+        verify(mMetricsFeatureProvider)
+            .action(
+                mContext,
+                SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
+                mBatteryHistEntry.mPackageName);
     }
 
     @Test
@@ -355,6 +371,11 @@
 
         assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(
             mPowerGaugePreference)).isFalse();
+        verify(mMetricsFeatureProvider)
+            .action(
+                mContext,
+                SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM,
+                mBatteryHistEntry.mPackageName);
     }
 
     @Test
@@ -474,6 +495,11 @@
         verify(mAppListGroup).addPreference(captor.capture());
         // Verifies the added preference.
         assertThat(captor.getValue().getKey()).isEqualTo(PREF_KEY);
+        verify(mMetricsFeatureProvider)
+            .action(
+                mContext,
+                SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
+                true /*isExpanded*/);
     }
 
     @Test
@@ -489,6 +515,28 @@
         verify(mAppListGroup).findPreference(PREF_KEY);
         verify(mAppListGroup).removePreference(mPowerGaugePreference);
         assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1);
+        verify(mMetricsFeatureProvider)
+            .action(
+                mContext,
+                SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
+                false /*isExpanded*/);
+    }
+
+    @Test
+    public void testOnSelect_selectSpecificTimeSlot_logMetric() {
+        mBatteryChartPreferenceController.onSelect(1 /*slot index*/);
+
+        verify(mMetricsFeatureProvider)
+            .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT);
+    }
+
+    @Test
+    public void testOnSelect_selectAll_logMetric() {
+        mBatteryChartPreferenceController.onSelect(
+            BatteryChartView.SELECTED_INDEX_ALL /*slot index*/);
+
+        verify(mMetricsFeatureProvider)
+            .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL);
     }
 
     @Test
@@ -610,6 +658,8 @@
         assertThat(mBatteryChartPreferenceController.mTrapezoidIndex)
             .isEqualTo(expectedIndex);
         assertThat(mBatteryChartPreferenceController.mIsExpanded).isTrue();
+        verify(mMetricsFeatureProvider)
+            .action(mContext, SettingsEnums.OPEN_BATTERY_USAGE);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
index 5bcaf0a..0dfabb9 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
@@ -78,6 +78,6 @@
         BatteryInfo info = loader.loadInBackground();
 
         assertThat(info.remainingLabel).isNotNull();
-        assertThat(info.remainingTimeUs).isEqualTo(TEST_TIME_REMAINING);
+        assertThat(info.remainingTimeUs).isEqualTo(TEST_TIME_REMAINING * 1000);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/homepage/TopLevelSettingsTest.java b/tests/robotests/src/com/android/settings/homepage/TopLevelSettingsTest.java
index 663d7f7..da2f8b5 100644
--- a/tests/robotests/src/com/android/settings/homepage/TopLevelSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/TopLevelSettingsTest.java
@@ -28,13 +28,11 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.util.FeatureFlagUtils;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
@@ -66,19 +64,6 @@
     }
 
     @Test
-    public void getPreferenceScreenResId_silkyHomeDisabled_defaultSettings() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        assertThat(mSettings.getPreferenceScreenResId()).isEqualTo(R.xml.top_level_settings);
-    }
-
-    @Test
-    public void getPreferenceScreenResId_silkyHomeEnabled_groupedSettings() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, true);
-        assertThat(mSettings.getPreferenceScreenResId()).isEqualTo(
-                R.xml.top_level_settings_grouped);
-    }
-
-    @Test
     public void onCreatePreferences_shouldTintPreferenceIcon() {
         final Preference preference = new Preference(mContext);
         preference.setTitle(R.string.network_dashboard_title);
diff --git a/tests/unit/src/com/android/settings/dashboard/profileselector/ProfileSelectStorageFragmentTest.java b/tests/unit/src/com/android/settings/dashboard/profileselector/ProfileSelectStorageFragmentTest.java
new file mode 100644
index 0000000..6eb9aa5
--- /dev/null
+++ b/tests/unit/src/com/android/settings/dashboard/profileselector/ProfileSelectStorageFragmentTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.dashboard.profileselector;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
+import android.os.Looper;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class ProfileSelectStorageFragmentTest {
+
+    private ProfileSelectStorageFragment mFragment;
+
+    @Before
+    @UiThreadTest
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+
+        mFragment = new ProfileSelectStorageFragment();
+    }
+
+    @Test
+    @UiThreadTest
+    public void test_initializeOptionsMenuInvalidatesExistingMenu() {
+        final Activity activity = mock(Activity.class);
+
+        mFragment.initializeOptionsMenu(activity);
+
+        verify(activity).invalidateOptionsMenu();
+    }
+}
diff --git a/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java b/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java
new file mode 100644
index 0000000..c50d993
--- /dev/null
+++ b/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.security;
+
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY;
+import static com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag.FLAG_INCLUDE_PREF_SCREEN;
+import static com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_KEY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.annotation.XmlRes;
+import android.content.Context;
+import android.os.Bundle;
+import android.provider.SearchIndexableResource;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.core.PreferenceXmlParserUtils;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.security.trustagent.TrustAgentManager;
+import com.android.settings.testutils.FakeFeatureFactory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+@RunWith(AndroidJUnit4.class)
+public class SecuritySettingsTest {
+
+    private Context mContext;
+    private SecuritySettingsFeatureProvider mSecuritySettingsFeatureProvider;
+
+    @Mock
+    private TrustAgentManager mTrustAgentManager;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mContext = ApplicationProvider.getApplicationContext();
+        FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider();
+        SecurityFeatureProvider mSecurityFeatureProvider =
+                mFeatureFactory.getSecurityFeatureProvider();
+
+        when(mSecurityFeatureProvider.getTrustAgentManager()).thenReturn(mTrustAgentManager);
+    }
+
+    @Test
+    public void noAlternativeFragmentAvailable_pageIndexIncluded() throws Exception {
+        when(mSecuritySettingsFeatureProvider.hasAlternativeSecuritySettingsFragment())
+                .thenReturn(false);
+        BaseSearchIndexProvider indexProvider = SecuritySettings.SEARCH_INDEX_DATA_PROVIDER;
+
+        List<String> allXmlKeys = getAllXmlKeys(indexProvider);
+        List<String> nonIndexableKeys = indexProvider.getNonIndexableKeys(mContext);
+        allXmlKeys.removeAll(nonIndexableKeys);
+
+        assertThat(allXmlKeys).isNotEmpty();
+    }
+
+    @Test
+    public void alternativeFragmentAvailable_pageIndexExcluded() throws Exception {
+        when(mSecuritySettingsFeatureProvider.hasAlternativeSecuritySettingsFragment())
+                .thenReturn(true);
+        BaseSearchIndexProvider indexProvider = SecuritySettings.SEARCH_INDEX_DATA_PROVIDER;
+
+        List<String> allXmlKeys = getAllXmlKeys(indexProvider);
+        List<String> nonIndexableKeys = indexProvider.getNonIndexableKeys(mContext);
+        allXmlKeys.removeAll(nonIndexableKeys);
+
+        assertThat(allXmlKeys).isEmpty();
+    }
+
+    private List<String> getAllXmlKeys(BaseSearchIndexProvider indexProvider) throws Exception {
+        final List<SearchIndexableResource> resources = indexProvider.getXmlResourcesToIndex(
+                mContext, true /* not used*/);
+        if (resources == null || resources.isEmpty()) {
+            return new ArrayList<>();
+        }
+        final List<String> keys = new ArrayList<>();
+        for (SearchIndexableResource res : resources) {
+            keys.addAll(getKeysFromXml(res.xmlResId));
+        }
+        return keys;
+    }
+
+    private List<String> getKeysFromXml(@XmlRes int xmlResId) throws Exception {
+        final List<String> keys = new ArrayList<>();
+        final List<Bundle> metadata = PreferenceXmlParserUtils
+                .extractMetadata(mContext, xmlResId, FLAG_NEED_KEY | FLAG_INCLUDE_PREF_SCREEN);
+        for (Bundle bundle : metadata) {
+            keys.add(bundle.getString(METADATA_KEY));
+        }
+        return keys;
+    }
+}