Merge "Cleanup Storage Settings" into sc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ef53747..8a5539b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1980,13 +1980,6 @@
         </activity>
 
         <activity
-            android:name="Settings$PrivateVolumeSettingsActivity"
-            android:label="@string/storage_settings_title">
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.deviceinfo.PrivateVolumeSettings" />
-        </activity>
-
-        <activity
             android:name="Settings$PublicVolumeSettingsActivity"
             android:exported="true"
             android:label="@string/storage_settings_title">
diff --git a/res/layout-land/storage_summary_donut.xml b/res/layout-land/storage_summary_donut.xml
deleted file mode 100644
index 2e5ee93..0000000
--- a/res/layout-land/storage_summary_donut.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center_vertical"
-    android:orientation="horizontal" >
-
-    <LinearLayout
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:gravity="center_vertical"
-        android:orientation="vertical"
-        android:paddingStart="@dimen/preference_no_icon_padding_start"
-        android:paddingEnd="@dimen/storage_summary_padding_end"
-        android:paddingTop="32dp"
-        android:paddingBottom="32dp" >
-
-        <TextView
-            android:id="@android:id/title"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:ellipsize="marquee"
-            android:fadingEdge="horizontal"
-            android:fontFamily="@*android:string/config_headlineFontFamily"
-            android:singleLine="true"
-            android:textAlignment="viewStart"
-            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
-            android:textSize="36sp" />
-
-        <TextView
-            android:id="@android:id/summary"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="4dp"
-            android:layout_marginEnd="4dp"
-            android:maxLines="10"
-            android:paddingBottom="20dp"
-            android:textAlignment="viewStart"
-            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
-
-        <Button
-            android:id="@+id/deletion_helper_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/summary"
-            android:text="@string/storage_menu_manage"
-            style="@style/ActionPrimaryButton" />
-    </LinearLayout>
-
-    <com.android.settings.widget.DonutView
-        android:id="@+id/donut"
-        android:layout_width="112dp"
-        android:layout_height="112dp"
-        android:layout_marginEnd="32dp"
-        android:gravity="end|center_vertical"
-        android:minWidth="58dp"
-        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" />
-
-</LinearLayout>
diff --git a/res/layout-sw360dp/storage_summary_donut.xml b/res/layout-sw360dp/storage_summary_donut.xml
deleted file mode 100644
index 2e5ee93..0000000
--- a/res/layout-sw360dp/storage_summary_donut.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center_vertical"
-    android:orientation="horizontal" >
-
-    <LinearLayout
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:gravity="center_vertical"
-        android:orientation="vertical"
-        android:paddingStart="@dimen/preference_no_icon_padding_start"
-        android:paddingEnd="@dimen/storage_summary_padding_end"
-        android:paddingTop="32dp"
-        android:paddingBottom="32dp" >
-
-        <TextView
-            android:id="@android:id/title"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:ellipsize="marquee"
-            android:fadingEdge="horizontal"
-            android:fontFamily="@*android:string/config_headlineFontFamily"
-            android:singleLine="true"
-            android:textAlignment="viewStart"
-            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
-            android:textSize="36sp" />
-
-        <TextView
-            android:id="@android:id/summary"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="4dp"
-            android:layout_marginEnd="4dp"
-            android:maxLines="10"
-            android:paddingBottom="20dp"
-            android:textAlignment="viewStart"
-            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
-
-        <Button
-            android:id="@+id/deletion_helper_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/summary"
-            android:text="@string/storage_menu_manage"
-            style="@style/ActionPrimaryButton" />
-    </LinearLayout>
-
-    <com.android.settings.widget.DonutView
-        android:id="@+id/donut"
-        android:layout_width="112dp"
-        android:layout_height="112dp"
-        android:layout_marginEnd="32dp"
-        android:gravity="end|center_vertical"
-        android:minWidth="58dp"
-        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" />
-
-</LinearLayout>
diff --git a/res/layout/preference_storage_action.xml b/res/layout/preference_storage_action.xml
deleted file mode 100644
index 19d7763..0000000
--- a/res/layout/preference_storage_action.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:orientation="horizontal">
-
-    <ImageView
-        android:id="@+id/unmount"
-        android:layout_width="wrap_content"
-        android:layout_height="fill_parent"
-        android:paddingStart="16dip"
-        android:paddingEnd="16dip"
-        android:contentDescription="@string/storage_menu_unmount"
-        android:layout_gravity="center"
-        android:gravity="center"
-        android:src="@drawable/ic_eject_24dp"
-        android:background="?android:attr/selectableItemBackground" />
-
-</LinearLayout>
diff --git a/res/layout/storage_summary_donut.xml b/res/layout/storage_summary_donut.xml
deleted file mode 100644
index cc4df20..0000000
--- a/res/layout/storage_summary_donut.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center"
-    android:orientation="vertical"
-    android:paddingTop="32dp"
-    android:paddingBottom="32dp" >
-
-    <TextView
-        android:id="@android:id/title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:ellipsize="marquee"
-        android:fadingEdge="horizontal"
-        android:fontFamily="@*android:string/config_headlineFontFamily"
-        android:singleLine="true"
-        android:textAlignment="center"
-        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
-        android:textSize="36sp" />
-
-    <TextView
-        android:id="@android:id/summary"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="4dp"
-        android:maxLines="10"
-        android:textAlignment="center"
-        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
-
-    <com.android.settings.widget.DonutView
-        android:id="@+id/donut"
-        android:layout_width="168dp"
-        android:layout_height="168dp"
-        android:layout_marginTop="4dp"
-        android:layout_marginBottom="4dp"
-        android:minWidth="58dp" />
-
-    <Button
-        android:id="@+id/deletion_helper_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/storage_menu_manage"
-        style="@style/ActionPrimaryButton" />
-
-</LinearLayout>
diff --git a/res/layout/storage_volume.xml b/res/layout/storage_volume.xml
deleted file mode 100644
index ca368b9..0000000
--- a/res/layout/storage_volume.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall"
-    android:gravity="center_vertical"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/activatedBackgroundIndicator"
-    android:clipToPadding="false">
-
-    <LinearLayout
-        android:id="@+id/icon_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="start|center_vertical"
-        android:minWidth="56dp"
-        android:orientation="horizontal"
-        android:paddingTop="4dp"
-        android:paddingBottom="4dp">
-        <com.android.internal.widget.PreferenceImageView
-            android:id="@android:id/icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:maxWidth="48dp"
-            android:maxHeight="48dp" />
-    </LinearLayout>
-
-    <RelativeLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingTop="16dp"
-        android:paddingBottom="16dp">
-
-        <TextView android:id="@android:id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:textAppearance="?android:attr/textAppearanceListItem"
-            android:ellipsize="marquee" />
-
-        <TextView android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/title"
-            android:layout_alignStart="@android:id/title"
-            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-            android:textColor="?android:attr/textColorSecondary"
-            android:maxLines="10" />
-
-        <ProgressBar
-            android:id="@android:id/progress"
-            android:layout_width="match_parent"
-            android:layout_height="8dp"
-            android:layout_marginTop="8dp"
-            android:layout_below="@android:id/summary"
-            android:layout_alignStart="@android:id/summary"
-            android:max="100"
-            style="?android:attr/progressBarStyleHorizontal" />
-
-    </RelativeLayout>
-
-    <!-- Preference should place its actual preference widget here. -->
-    <LinearLayout android:id="@android:id/widget_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:gravity="end|center_vertical"
-        android:paddingStart="16dp"
-        android:orientation="vertical" />
-
-</LinearLayout>
diff --git a/res/menu/storage_volume.xml b/res/menu/storage_volume.xml
index 87f7515..422355d 100644
--- a/res/menu/storage_volume.xml
+++ b/res/menu/storage_volume.xml
@@ -29,12 +29,10 @@
         android:title="@string/storage_menu_format" />
     <item
         android:id="@+id/storage_format_as_portable"
-        android:title="@string/storage_menu_format_public"
-        android:visible="false" />
+        android:title="@string/storage_menu_format_public" />
     <item
         android:id="@+id/storage_format_as_internal"
-        android:title="@string/storage_menu_format_private"
-        android:visible="false" />
+        android:title="@string/storage_menu_format_private" />
     <item
         android:id="@+id/storage_migrate"
         android:title="@string/storage_menu_migrate" />
@@ -43,6 +41,5 @@
         android:title="@string/storage_menu_free" />
     <item
         android:id="@+id/storage_forget"
-        android:title="@string/storage_menu_forget"
-        android:visible="false" />
+        android:title="@string/storage_menu_forget" />
 </menu>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index d426411..37e71e2 100755
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -30,9 +30,4 @@
     <!-- Display, Screen zoom -->
     <dimen name="screen_zoom_preview_height">160dp</dimen>
 
-    <!-- Text size of the big number in the donut. -->
-    <dimen name="storage_donut_view_percent_text_size">30sp</dimen>
-    <!-- Text size of the label text in the donut. -->
-    <dimen name="storage_donut_view_label_text_size">14sp</dimen>
-
 </resources>
diff --git a/res/values-sw360dp/dimens.xml b/res/values-sw360dp/dimens.xml
index b81a98a..23a1176 100755
--- a/res/values-sw360dp/dimens.xml
+++ b/res/values-sw360dp/dimens.xml
@@ -25,8 +25,4 @@
     <!-- Suggestion cards-->
     <dimen name="suggestion_card_padding_bottom_one_card">22dp</dimen>
 
-    <!-- Text size of the big number in the donut. -->
-    <dimen name="storage_donut_view_percent_text_size">30sp</dimen>
-    <!-- Text size of the label text in the donut. -->
-    <dimen name="storage_donut_view_label_text_size">14sp</dimen>
 </resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index bde5288..573d906 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -139,15 +139,6 @@
         <attr name="android:gravity" />
     </declare-styleable>
 
-    <!-- For DonutView -->
-    <declare-styleable name="DonutView">
-        <attr name="meterBackgroundColor" format="color" />
-        <attr name="meterConsumedColor" format="color" />
-        <attr name="applyColorAccent" format="boolean" />
-        <attr name="showPercentString" format="boolean" />
-        <attr name="thickness" format="dimension" />
-    </declare-styleable>
-
     <!-- For biometric enroll checkboxes -->
     <declare-styleable name="BiometricEnrollCheckbox">
         <attr name="icon" format="reference" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 52a30e6..304feb8 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -325,19 +325,6 @@
     <dimen name="select_dialog_item_margin_start">12dp</dimen>
     <dimen name="select_dialog_summary_padding_bottom">8dp</dimen>
 
-    <!-- Padding between the donut and the storage summary. -->
-    <dimen name="storage_summary_padding_end">16dp</dimen>
-    <!-- Text size of the big number in the donut. -->
-    <dimen name="storage_donut_view_percent_text_size">45sp</dimen>
-    <!-- Text size of the percentage sign in the donut. -->
-    <dimen name="storage_donut_view_percent_sign_size">20sp</dimen>
-    <!-- Text size of the label text in the donut. -->
-    <dimen name="storage_donut_view_label_text_size">21sp</dimen>
-    <!-- Text size of the label text in the donut if the label text is long. -->
-    <dimen name="storage_donut_view_shrunken_label_text_size">10sp</dimen>
-    <!-- The width of the storage summary donut -->
-    <dimen name="storage_donut_thickness">4dp</dimen>
-
     <!-- Battery meter view size -->
     <dimen name="battery_meter_width">66dp</dimen>
     <dimen name="battery_meter_height">100dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d20392d..72f57f4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3426,11 +3426,6 @@
     <string name="sd_format_summary" product="default">Erases all data on the SD card, such as music and photos</string>
     <!-- SD card status when it is mounted as read only. Will be appended to size, starts with an unbreakable space -->
 
-    <!-- Title of dialog asking user to confirm before clearing all caches. [CHAR LIMIT=48] -->
-    <string name="memory_clear_cache_title">Clear cached data?</string>
-    <!-- Message of dialog asking user to confirm before clearing all caches. [CHAR LIMIT=48] -->
-    <string name="memory_clear_cache_message">This will clear cached data for all apps.</string>
-
     <!-- SD card & phone storage settings item summary that will result in the phone connected to PC and MTP/PTP enabled.   [CHAR LIMIT=80] -->
     <string name="mtp_ptp_mode_summary">MTP or PTP function is active</string>
 
@@ -3482,8 +3477,6 @@
     <string name="storage_menu_forget">Forget</string>
     <!-- Storage setting.  Menu option for setting up a storage device [CHAR LIMIT=30]-->
     <string name="storage_menu_set_up">Set up</string>
-    <!-- Storage setting.  Menu option for exploring a storage device [CHAR LIMIT=30]-->
-    <string name="storage_menu_explore">Explore</string>
     <!-- Storage setting. Menu option for using the deletion helper. [CHAR LIMIT=30] -->
     <string name="storage_menu_free">Free up space</string>
     <!-- Storage setting. Menu option for accessing the storage manager settings. [CHAR LIMIT=30] -->
@@ -3520,14 +3513,10 @@
     <!-- Section header above list of external storage devices [CHAR LIMIT=30]-->
     <string name="storage_external_title">Portable storage</string>
 
-    <!-- Summary of a single storage volume, constrasting available and total storage space. [CHAR LIMIT=48]-->
-    <string name="storage_volume_summary"><xliff:g id="used" example="1.2GB">%1$s</xliff:g> used of <xliff:g id="total" example="32GB">%2$s</xliff:g></string>
     <!-- Summary of a single storage volume used space. [CHAR LIMIT=24] -->
     <string name="storage_size_large"><xliff:g id="number" example="128">^1</xliff:g><small><small> <xliff:g id="unit" example="KB">^2</xliff:g></small></small></string>
     <!-- Summary of a single storage volume total space. [CHAR LIMIT=48]-->
     <string name="storage_volume_used">Used of <xliff:g id="total" example="32GB">%1$s</xliff:g></string>
-    <!-- Summary of a single storage volume total space. [CHAR LIMIT=48]-->
-    <string name="storage_volume_used_total">Total used of <xliff:g id="total" example="32GB">%1$s</xliff:g></string>
 
     <!-- Toast informing that storage mount operation was successful. [CHAR LIMIT=64]-->
     <string name="storage_mount_success"><xliff:g id="name" example="SD card">%1$s</xliff:g> is mounted</string>
@@ -3555,10 +3544,6 @@
     <string name="storage_dialog_unmountable">This <xliff:g id="name" example="SD card">^1</xliff:g> is corrupted.
 \n\nTo use this <xliff:g id="name" example="SD card">^1</xliff:g>, you have to set it up first.</string>
 
-    <!-- Dialog body informing user about an unsupported storage device. [CHAR LIMIT=NONE]-->
-    <string name="storage_dialog_unsupported">This device doesn\u2019t support this <xliff:g id="name" example="SD card">^1</xliff:g>.
-\n\nTo use this <xliff:g id="name" example="SD card">^1</xliff:g> with this device, you have to set it up first.</string>
-
     <!-- Body of dialog informing user about consequences of formatting an internal storage device [CHAR LIMIT=NONE]-->
     <string name="storage_internal_format_details">After formatting, you can use this <xliff:g id="name" example="SD card">^1</xliff:g> in other devices.
 \n\nAll data on this <xliff:g id="name" example="SD card">^1</xliff:g> will be erased. Consider backing up first.
@@ -3582,34 +3567,11 @@
     <!-- Body of dialog confirming that user wants to forget an internal storage device [CHAR LIMIT=NONE]-->
     <string name="storage_internal_forget_confirm">All the apps, photos, and data stored on this <xliff:g id="name" example="SD card">^1</xliff:g> will be lost forever.</string>
 
-    <!-- Item title describing storage used by apps [CHAR LIMIT=48]-->
-    <string name="storage_detail_apps">Apps</string>
     <!-- Item title describing storage used by images [CHAR LIMIT=48]-->
     <string name="storage_detail_images">Images</string>
-    <!-- Item title describing storage used by videos [CHAR LIMIT=48]-->
-    <string name="storage_detail_videos">Videos</string>
-    <!-- Item title describing storage used by audio [CHAR LIMIT=48]-->
-    <string name="storage_detail_audio">Audio</string>
-    <!-- Item title describing storage used by cached data [CHAR LIMIT=48]-->
-    <string name="storage_detail_cached">Cached data</string>
-    <!-- Item title describing storage used by other data [CHAR LIMIT=48]-->
-    <string name="storage_detail_other">Other</string>
-    <!-- Item title describing internal storage used by the Android System [CHAR LIMIT=48]-->
-    <string name="storage_detail_system">System</string>
-    <!-- Item title that will launch a file explorer [CHAR LIMIT=48]-->
-    <string name="storage_detail_explore">Explore <xliff:g id="name" example="SD card">^1</xliff:g></string>
-
-    <!-- Body of dialog informing user about other files on a storage device [CHAR LIMIT=NONE]-->
-    <string name="storage_detail_dialog_other">Other includes shared files saved by apps, files downloaded from the internet or Bluetooth, Android files, and so on.
-\n\nTo see the visible contents of this <xliff:g id="name" example="SD card">^1</xliff:g>, tap Explore.</string>
-
     <!-- Body of dialog informing user about the storage used by the Android System [CHAR LIMIT=NONE]-->
     <string name="storage_detail_dialog_system">System includes files used to run Android version <xliff:g id="version" example="8.0">%s</xliff:g></string>
 
-    <!-- Body of dialog informing user about other users on a storage device [CHAR LIMIT=NONE]-->
-    <string name="storage_detail_dialog_user"><xliff:g id="user" example="Guest user">^1</xliff:g> may have saved photos, music, apps, or other data, using <xliff:g id="size" example="1.2 GB">^2</xliff:g> of storage.
-\n\nTo view details, switch to <xliff:g id="user" example="Guest user">^1</xliff:g>.</string>
-
     <!-- Title of wizard step prompting user to setup a storage device [CHAR LIMIT=32] -->
     <string name="storage_wizard_init_title">Set up your <xliff:g id="name" example="SD card">^1</xliff:g></string>
     <!-- Title of wizard choice to use storage device as external storage [CHAR LIMIT=64] -->
diff --git a/res/xml/device_info_storage.xml b/res/xml/device_info_storage.xml
deleted file mode 100644
index d5cce39..0000000
--- a/res/xml/device_info_storage.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:title="@string/storage_settings"
-    settings:keywords="@string/keywords_storage">
-
-    <PreferenceCategory
-        android:key="storage_internal"
-        android:title="@string/storage_internal_title" />
-
-    <PreferenceCategory
-        android:key="storage_external"
-        android:title="@string/storage_external_title" />
-
-</PreferenceScreen>
diff --git a/res/xml/device_info_storage_volume.xml b/res/xml/device_info_storage_volume.xml
index cb02d9a..47abe0d 100644
--- a/res/xml/device_info_storage_volume.xml
+++ b/res/xml/device_info_storage_volume.xml
@@ -17,7 +17,6 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:title="@string/storage_settings"
-    settings:keywords="@string/keywords_storage">
+    android:title="@string/storage_settings">
 
 </PreferenceScreen>
diff --git a/res/xml/storage_dashboard_fragment.xml b/res/xml/storage_dashboard_fragment.xml
index adc29d3..71d0712 100644
--- a/res/xml/storage_dashboard_fragment.xml
+++ b/res/xml/storage_dashboard_fragment.xml
@@ -18,7 +18,8 @@
     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">
+    android:orderingFromXml="false"
+    settings:keywords="@string/keywords_storage">
     <com.android.settingslib.widget.SettingsSpinnerPreference
         android:key="storage_spinner"
         android:order="1"
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 95e68de..48793e9 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -79,7 +79,6 @@
     public static class DataSaverSummaryActivity extends SettingsActivity{ /* empty */ }
     public static class DateTimeSettingsActivity extends SettingsActivity { /* empty */ }
     public static class PrivateVolumeForgetActivity extends SettingsActivity { /* empty */ }
-    public static class PrivateVolumeSettingsActivity extends SettingsActivity { /* empty */ }
     public static class PublicVolumeSettingsActivity extends SettingsActivity { /* empty */ }
     public static class WifiSettingsActivity extends SettingsActivity { /* empty */ }
     public static class WifiSettings2Activity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index c08c149..1ea7e17 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -78,10 +78,8 @@
 import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
 import com.android.settings.development.DevelopmentSettingsDashboardFragment;
 import com.android.settings.deviceinfo.PrivateVolumeForget;
-import com.android.settings.deviceinfo.PrivateVolumeSettings;
 import com.android.settings.deviceinfo.PublicVolumeSettings;
 import com.android.settings.deviceinfo.StorageDashboardFragment;
-import com.android.settings.deviceinfo.StorageSettings;
 import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
 import com.android.settings.deviceinfo.firmwareversion.FirmwareVersionSettings;
 import com.android.settings.deviceinfo.legal.ModuleLicensesDashboard;
@@ -215,9 +213,7 @@
             ToggleDaltonizerPreferenceFragment.class.getName(),
             ToggleReduceBrightColorsPreferenceFragment.class.getName(),
             TextToSpeechSettings.class.getName(),
-            StorageSettings.class.getName(),
             PrivateVolumeForget.class.getName(),
-            PrivateVolumeSettings.class.getName(),
             PublicVolumeSettings.class.getName(),
             DevelopmentSettingsDashboardFragment.class.getName(),
             AndroidBeam.class.getName(),
diff --git a/src/com/android/settings/deviceinfo/MigrateEstimateTask.java b/src/com/android/settings/deviceinfo/MigrateEstimateTask.java
index 9198ade..03e2b04 100644
--- a/src/com/android/settings/deviceinfo/MigrateEstimateTask.java
+++ b/src/com/android/settings/deviceinfo/MigrateEstimateTask.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.deviceinfo;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 import android.app.usage.ExternalStorageStats;
 import android.app.usage.StorageStatsManager;
 import android.content.Context;
@@ -37,6 +35,8 @@
 import java.util.UUID;
 
 public abstract class MigrateEstimateTask extends AsyncTask<Void, Void, Long> {
+    private static final String TAG = "MigrateEstimateTask";
+
     private static final String EXTRA_SIZE_BYTES = "size_bytes";
 
     /**
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
deleted file mode 100644
index 08d6ca4..0000000
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ /dev/null
@@ -1,898 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo;
-
-import android.app.Dialog;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.IPackageDataObserver;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.os.storage.StorageEventListener;
-import android.os.storage.StorageManager;
-import android.os.storage.VolumeInfo;
-import android.os.storage.VolumeRecord;
-import android.provider.DocumentsContract;
-import android.text.TextUtils;
-import android.text.format.Formatter;
-import android.text.format.Formatter.BytesResult;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.EditText;
-
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.Fragment;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
-import androidx.preference.PreferenceGroup;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.Settings.StorageUseActivity;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
-import com.android.settings.applications.manageapplications.ManageApplications;
-import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.deviceinfo.StorageSettings.MountTask;
-import com.android.settingslib.deviceinfo.StorageMeasurement;
-import com.android.settingslib.deviceinfo.StorageMeasurement.MeasurementDetails;
-import com.android.settingslib.deviceinfo.StorageMeasurement.MeasurementReceiver;
-
-import com.google.android.collect.Lists;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Panel showing summary and actions for a {@link VolumeInfo#TYPE_PRIVATE}
- * storage volume.
- */
-public class PrivateVolumeSettings extends SettingsPreferenceFragment {
-    // TODO: disable unmount when providing over MTP/PTP
-    // TODO: warn when mounted read-only
-
-    private static final String TAG = "PrivateVolumeSettings";
-    private static final boolean LOGV = false;
-
-    private static final String TAG_RENAME = "rename";
-    private static final String TAG_OTHER_INFO = "otherInfo";
-    private static final String TAG_SYSTEM_INFO = "systemInfo";
-    private static final String TAG_USER_INFO = "userInfo";
-    private static final String TAG_CONFIRM_CLEAR_CACHE = "confirmClearCache";
-
-    private static final String EXTRA_VOLUME_SIZE = "volume_size";
-
-    private static final String AUTHORITY_MEDIA = "com.android.providers.media.documents";
-
-    private static final int[] ITEMS_NO_SHOW_SHARED = new int[] {
-            R.string.storage_detail_apps,
-            R.string.storage_detail_system,
-    };
-
-    private static final int[] ITEMS_SHOW_SHARED = new int[] {
-            R.string.storage_detail_apps,
-            R.string.storage_detail_images,
-            R.string.storage_detail_videos,
-            R.string.storage_detail_audio,
-            R.string.storage_detail_system,
-            R.string.storage_detail_other,
-    };
-
-    private StorageManager mStorageManager;
-    private UserManager mUserManager;
-
-    private String mVolumeId;
-    private VolumeInfo mVolume;
-    private VolumeInfo mSharedVolume;
-    private long mTotalSize;
-    private long mSystemSize;
-
-    private StorageMeasurement mMeasure;
-
-    private UserInfo mCurrentUser;
-
-    private StorageSummaryPreference mSummary;
-    private List<StorageItemPreference> mItemPreferencePool = Lists.newArrayList();
-    private List<PreferenceCategory> mHeaderPreferencePool = Lists.newArrayList();
-    private int mHeaderPoolIndex;
-    private int mItemPoolIndex;
-
-    private Preference mExplore;
-
-    private boolean mNeedsUpdate;
-
-    private boolean isVolumeValid() {
-        return (mVolume != null) && (mVolume.getType() == VolumeInfo.TYPE_PRIVATE)
-                && mVolume.isMountedReadable();
-    }
-
-    public PrivateVolumeSettings() {
-        setRetainInstance(true);
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.DEVICEINFO_STORAGE;
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        final Context context = getActivity();
-
-        mUserManager = context.getSystemService(UserManager.class);
-        mStorageManager = context.getSystemService(StorageManager.class);
-
-        mVolumeId = getArguments().getString(VolumeInfo.EXTRA_VOLUME_ID);
-        mVolume = mStorageManager.findVolumeById(mVolumeId);
-
-        final long sharedDataSize = mVolume.getPath().getTotalSpace();
-        mTotalSize = getArguments().getLong(EXTRA_VOLUME_SIZE, 0);
-        mSystemSize = mTotalSize - sharedDataSize;
-        if (LOGV) Log.v(TAG,
-                "onCreate() mTotalSize: " + mTotalSize + " sharedDataSize: " + sharedDataSize);
-
-        if (mTotalSize <= 0) {
-            mTotalSize = sharedDataSize;
-            mSystemSize = 0;
-        }
-
-        // Find the emulated shared storage layered above this private volume
-        mSharedVolume = mStorageManager.findEmulatedForPrivate(mVolume);
-
-        mMeasure = new StorageMeasurement(context, mVolume, mSharedVolume);
-        mMeasure.setReceiver(mReceiver);
-
-        if (!isVolumeValid()) {
-            getActivity().finish();
-            return;
-        }
-
-        addPreferencesFromResource(R.xml.device_info_storage_volume);
-        getPreferenceScreen().setOrderingAsAdded(true);
-
-        mSummary = new StorageSummaryPreference(getPrefContext());
-        mCurrentUser = mUserManager.getUserInfo(UserHandle.myUserId());
-
-        mExplore = buildAction(R.string.storage_menu_explore);
-
-        mNeedsUpdate = true;
-
-        setHasOptionsMenu(true);
-    }
-
-    private void setTitle() {
-        getActivity().setTitle(mStorageManager.getBestVolumeDescription(mVolume));
-    }
-
-    private void update() {
-        if (!isVolumeValid()) {
-            getActivity().finish();
-            return;
-        }
-
-        setTitle();
-
-        // Valid options may have changed
-        getActivity().invalidateOptionsMenu();
-
-        final Context context = getActivity();
-        final PreferenceScreen screen = getPreferenceScreen();
-
-        screen.removeAll();
-
-        addPreference(screen, mSummary);
-
-        List<UserInfo> allUsers = mUserManager.getUsers();
-        final int userCount = allUsers.size();
-        final boolean showHeaders = userCount > 1;
-        final boolean showShared = (mSharedVolume != null) && mSharedVolume.isMountedReadable();
-
-        mItemPoolIndex = 0;
-        mHeaderPoolIndex = 0;
-
-        int addedUserCount = 0;
-        // Add current user and its profiles first
-        for (int userIndex = 0; userIndex < userCount; ++userIndex) {
-            final UserInfo userInfo = allUsers.get(userIndex);
-            if (Utils.isProfileOf(mCurrentUser, userInfo)) {
-                final PreferenceGroup details = showHeaders ?
-                        addCategory(screen, userInfo.name) : screen;
-                addDetailItems(details, showShared, userInfo.id);
-                ++addedUserCount;
-            }
-        }
-
-        // Add rest of users
-        if (userCount - addedUserCount > 0) {
-            PreferenceGroup otherUsers = addCategory(screen,
-                    getText(R.string.storage_other_users));
-            for (int userIndex = 0; userIndex < userCount; ++userIndex) {
-                final UserInfo userInfo = allUsers.get(userIndex);
-                if (!Utils.isProfileOf(mCurrentUser, userInfo)) {
-                    addItem(otherUsers, /* titleRes */ 0, userInfo.name, userInfo.id);
-                }
-            }
-        }
-
-        addItem(screen, R.string.storage_detail_cached, null, UserHandle.USER_NULL);
-
-        if (showShared) {
-            addPreference(screen, mExplore);
-        }
-
-        final long freeBytes = mVolume.getPath().getFreeSpace();
-        final long usedBytes = mTotalSize - freeBytes;
-
-        if (LOGV) Log.v(TAG, "update() freeBytes: " + freeBytes + " usedBytes: " + usedBytes);
-
-        final BytesResult result = Formatter.formatBytes(getResources(), usedBytes, 0);
-        mSummary.setTitle(TextUtils.expandTemplate(getText(R.string.storage_size_large),
-                result.value, result.units));
-        mSummary.setSummary(getString(R.string.storage_volume_used,
-                Formatter.formatFileSize(context, mTotalSize)));
-        mSummary.setPercent(usedBytes, mTotalSize);
-
-        mMeasure.forceMeasure();
-        mNeedsUpdate = false;
-    }
-
-    private void addPreference(PreferenceGroup group, Preference pref) {
-        pref.setOrder(Preference.DEFAULT_ORDER);
-        group.addPreference(pref);
-    }
-
-    private PreferenceCategory addCategory(PreferenceGroup group, CharSequence title) {
-        PreferenceCategory category;
-        if (mHeaderPoolIndex < mHeaderPreferencePool.size()) {
-            category = mHeaderPreferencePool.get(mHeaderPoolIndex);
-        } else {
-            category = new PreferenceCategory(getPrefContext());
-            mHeaderPreferencePool.add(category);
-        }
-        category.setTitle(title);
-        category.removeAll();
-        addPreference(group, category);
-        ++mHeaderPoolIndex;
-        return category;
-    }
-
-    private void addDetailItems(PreferenceGroup category, boolean showShared, int userId) {
-        final int[] itemsToAdd = (showShared ? ITEMS_SHOW_SHARED : ITEMS_NO_SHOW_SHARED);
-        for (int i = 0; i < itemsToAdd.length; ++i) {
-            addItem(category, itemsToAdd[i], null, userId);
-        }
-    }
-
-    private void addItem(PreferenceGroup group, int titleRes, CharSequence title, int userId) {
-        if (titleRes == R.string.storage_detail_system) {
-            if (mSystemSize <= 0) {
-                Log.w(TAG, "Skipping System storage because its size is " + mSystemSize);
-                return;
-            }
-            if (userId != UserHandle.myUserId()) {
-                // Only display system on current user.
-                return;
-            }
-        }
-        StorageItemPreference item;
-        if (mItemPoolIndex < mItemPreferencePool.size()) {
-            item = mItemPreferencePool.get(mItemPoolIndex);
-        } else {
-            item = buildItem();
-            mItemPreferencePool.add(item);
-        }
-        if (title != null) {
-            item.setTitle(title);
-            item.setKey(title.toString());
-        } else {
-            item.setTitle(titleRes);
-            item.setKey(Integer.toString(titleRes));
-        }
-        item.setSummary(R.string.memory_calculating_size);
-        item.userHandle = userId;
-        addPreference(group, item);
-        ++mItemPoolIndex;
-    }
-
-    private StorageItemPreference buildItem() {
-        final StorageItemPreference item = new StorageItemPreference(getPrefContext());
-        item.setIcon(R.drawable.empty_icon);
-        return item;
-    }
-
-    private Preference buildAction(int titleRes) {
-        final Preference pref = new Preference(getPrefContext());
-        pref.setTitle(titleRes);
-        pref.setKey(Integer.toString(titleRes));
-        return pref;
-    }
-
-    static void setVolumeSize(Bundle args, long size) {
-        args.putLong(EXTRA_VOLUME_SIZE, size);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        // Refresh to verify that we haven't been formatted away
-        mVolume = mStorageManager.findVolumeById(mVolumeId);
-        if (!isVolumeValid()) {
-            getActivity().finish();
-            return;
-        }
-
-        mStorageManager.registerListener(mStorageListener);
-
-        if (mNeedsUpdate) {
-            update();
-        } else {
-            setTitle();
-        }
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mStorageManager.unregisterListener(mStorageListener);
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        if (mMeasure != null) {
-            mMeasure.onDestroy();
-        }
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        super.onCreateOptionsMenu(menu, inflater);
-        inflater.inflate(R.menu.storage_volume, menu);
-    }
-
-    @Override
-    public void onPrepareOptionsMenu(Menu menu) {
-        if (!isVolumeValid()) return;
-
-        final MenuItem rename = menu.findItem(R.id.storage_rename);
-        final MenuItem mount = menu.findItem(R.id.storage_mount);
-        final MenuItem unmount = menu.findItem(R.id.storage_unmount);
-        final MenuItem format = menu.findItem(R.id.storage_format);
-        final MenuItem migrate = menu.findItem(R.id.storage_migrate);
-        final MenuItem manage = menu.findItem(R.id.storage_free);
-
-        // Actions live in menu for non-internal private volumes; they're shown
-        // as preference items for public volumes.
-        if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(mVolume.getId())) {
-            rename.setVisible(false);
-            mount.setVisible(false);
-            unmount.setVisible(false);
-            format.setVisible(false);
-            manage.setVisible(getResources().getBoolean(
-                    R.bool.config_storage_manager_settings_enabled));
-        } else {
-            rename.setVisible(mVolume.getType() == VolumeInfo.TYPE_PRIVATE);
-            mount.setVisible(mVolume.getState() == VolumeInfo.STATE_UNMOUNTED);
-            unmount.setVisible(mVolume.isMountedReadable());
-            format.setVisible(true);
-            manage.setVisible(false);
-        }
-
-        format.setTitle(R.string.storage_menu_format_public);
-
-        // Only offer to migrate when not current storage
-        final VolumeInfo privateVol = getActivity().getPackageManager()
-                .getPrimaryStorageCurrentVolume();
-        migrate.setVisible((privateVol != null)
-                && (privateVol.getType() == VolumeInfo.TYPE_PRIVATE)
-                && !Objects.equals(mVolume, privateVol)
-                && privateVol.isMountedWritable());
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        final Context context = getActivity();
-        final Bundle args = new Bundle();
-        int i = item.getItemId();
-        if (i == R.id.storage_rename) {
-            RenameFragment.show(this, mVolume);
-            return true;
-        } else if (i == R.id.storage_mount) {
-            new MountTask(context, mVolume).execute();
-            return true;
-        } else if (i == R.id.storage_unmount) {
-            args.putString(VolumeInfo.EXTRA_VOLUME_ID, mVolume.getId());
-            new SubSettingLauncher(context)
-                    .setDestination(PrivateVolumeUnmount.class.getCanonicalName())
-                    .setTitleRes(R.string.storage_menu_unmount)
-                    .setSourceMetricsCategory(getMetricsCategory())
-                    .setArguments(args)
-                    .launch();
-            return true;
-        } else if (i == R.id.storage_format) {
-            args.putString(VolumeInfo.EXTRA_VOLUME_ID, mVolume.getId());
-            new SubSettingLauncher(context)
-                    .setDestination(PrivateVolumeFormat.class.getCanonicalName())
-                    .setTitleRes(R.string.storage_menu_format)
-                    .setSourceMetricsCategory(getMetricsCategory())
-                    .setArguments(args)
-                    .launch();
-            return true;
-        } else if (i == R.id.storage_migrate) {
-            final Intent intent = new Intent(context, StorageWizardMigrateConfirm.class);
-            intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, mVolume.getId());
-            startActivity(intent);
-            return true;
-        } else if (i == R.id.storage_free) {
-            final Intent deletion_helper_intent =
-                    new Intent(StorageManager.ACTION_MANAGE_STORAGE);
-            startActivity(deletion_helper_intent);
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference pref) {
-        // TODO: launch better intents for specific volume
-
-        final int userId = (pref instanceof StorageItemPreference ?
-                ((StorageItemPreference) pref).userHandle : -1);
-        int itemTitleId;
-        try {
-            itemTitleId = Integer.parseInt(pref.getKey());
-        } catch (NumberFormatException e) {
-            itemTitleId = 0;
-        }
-        Intent intent = null;
-        if (itemTitleId == R.string.storage_detail_apps) {
-            Bundle args = new Bundle();
-            args.putString(ManageApplications.EXTRA_CLASSNAME,
-                    StorageUseActivity.class.getName());
-            args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid());
-            args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription());
-            args.putInt(
-                    ManageApplications.EXTRA_STORAGE_TYPE,
-                    ManageApplications.STORAGE_TYPE_LEGACY);
-            intent = new SubSettingLauncher(getActivity())
-                    .setDestination(ManageApplications.class.getName())
-                    .setArguments(args)
-                    .setTitleRes(R.string.apps_storage)
-                    .setSourceMetricsCategory(getMetricsCategory())
-                    .toIntent();
-        } else if (itemTitleId == R.string.storage_detail_images) {
-            intent = getIntentForStorage(AUTHORITY_MEDIA, "images_root");
-        } else if (itemTitleId == R.string.storage_detail_videos) {
-            intent = getIntentForStorage(AUTHORITY_MEDIA, "videos_root");
-        } else if (itemTitleId == R.string.storage_detail_audio) {
-            intent = getIntentForStorage(AUTHORITY_MEDIA, "audio_root");
-        } else if (itemTitleId == R.string.storage_detail_system) {
-            SystemInfoFragment.show(this);
-            return true;
-        } else if (itemTitleId == R.string.storage_detail_other) {
-            OtherInfoFragment.show(this, mStorageManager.getBestVolumeDescription(mVolume),
-                    mSharedVolume, userId);
-            return true;
-        } else if (itemTitleId == R.string.storage_detail_cached) {
-            ConfirmClearCacheFragment.show(this);
-            return true;
-        } else if (itemTitleId == R.string.storage_menu_explore) {
-            intent = mSharedVolume.buildBrowseIntent();
-        } else if (itemTitleId == 0) {
-            UserInfoFragment.show(this, pref.getTitle(), pref.getSummary());
-            return true;
-        }
-
-        if (intent != null) {
-            intent.putExtra(Intent.EXTRA_USER_ID, userId);
-
-            Utils.launchIntent(this, intent);
-            return true;
-        }
-        return super.onPreferenceTreeClick(pref);
-    }
-
-    private Intent getIntentForStorage(String authority, String root) {
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setDataAndType(
-                DocumentsContract.buildRootUri(authority, root),
-                DocumentsContract.Root.MIME_TYPE_ITEM);
-        intent.addCategory(Intent.CATEGORY_DEFAULT);
-
-        return intent;
-    }
-
-    private final MeasurementReceiver mReceiver = new MeasurementReceiver() {
-        @Override
-        public void onDetailsChanged(MeasurementDetails details) {
-            updateDetails(details);
-        }
-    };
-
-    private void updateDetails(MeasurementDetails details) {
-        StorageItemPreference otherItem = null;
-        long accountedSize = 0;
-        long totalMiscSize = 0;
-        long totalDownloadsSize = 0;
-
-        for (int i = 0; i < mItemPoolIndex; ++i) {
-            StorageItemPreference item = mItemPreferencePool.get(i);
-            final int userId = item.userHandle;
-            int itemTitleId;
-            try {
-                itemTitleId = Integer.parseInt(item.getKey());
-            } catch (NumberFormatException e) {
-                itemTitleId = 0;
-            }
-            // Cannot display 'Other' until all known items are accounted for.
-            if (itemTitleId == R.string.storage_detail_system) {
-                updatePreference(item, mSystemSize);
-                accountedSize += mSystemSize;
-                if (LOGV) Log.v(TAG, "mSystemSize: " + mSystemSize
-                        + " accountedSize: " + accountedSize);
-            } else if (itemTitleId == R.string.storage_detail_apps) {
-                updatePreference(item, details.appsSize.get(userId));
-                accountedSize += details.appsSize.get(userId);
-                if (LOGV) Log.v(TAG, "appsSize: " + details.appsSize.get(userId)
-                        + " accountedSize: " + accountedSize);
-            } else if (itemTitleId == R.string.storage_detail_images) {
-                final long imagesSize = totalValues(details, userId,
-                        Environment.DIRECTORY_DCIM, Environment.DIRECTORY_PICTURES);
-                updatePreference(item, imagesSize);
-                accountedSize += imagesSize;
-                if (LOGV) Log.v(TAG, "imagesSize: " + imagesSize
-                        + " accountedSize: " + accountedSize);
-            } else if (itemTitleId == R.string.storage_detail_videos) {
-                final long videosSize = totalValues(details, userId,
-                        Environment.DIRECTORY_MOVIES);
-                updatePreference(item, videosSize);
-                accountedSize += videosSize;
-                if (LOGV) Log.v(TAG, "videosSize: " + videosSize
-                        + " accountedSize: " + accountedSize);
-            } else if (itemTitleId == R.string.storage_detail_audio) {
-                final long audioSize = totalValues(details, userId,
-                        Environment.DIRECTORY_MUSIC,
-                        Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS,
-                        Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_PODCASTS);
-                updatePreference(item, audioSize);
-                accountedSize += audioSize;
-                if (LOGV) Log.v(TAG, "audioSize: " + audioSize
-                        + " accountedSize: " + accountedSize);
-            } else if (itemTitleId == R.string.storage_detail_other) {
-                final long downloadsSize = totalValues(details, userId,
-                        Environment.DIRECTORY_DOWNLOADS);
-                final long miscSize = details.miscSize.get(userId);
-                totalDownloadsSize += downloadsSize;
-                totalMiscSize += miscSize;
-                accountedSize += miscSize + downloadsSize;
-                if (LOGV)
-                    Log.v(TAG, "miscSize for " + userId + ": " + miscSize + "(total: "
-                            + totalMiscSize + ") \ndownloadsSize: " + downloadsSize + "(total: "
-                            + totalDownloadsSize + ") accountedSize: " + accountedSize);
-                otherItem = item;
-            } else if (itemTitleId == R.string.storage_detail_cached) {
-                updatePreference(item, details.cacheSize);
-                accountedSize += details.cacheSize;
-                if (LOGV)
-                    Log.v(TAG, "cacheSize: " + details.cacheSize + " accountedSize: "
-                            + accountedSize);
-            } else if (itemTitleId == 0) {
-                final long userSize = details.usersSize.get(userId);
-                updatePreference(item, userSize);
-                accountedSize += userSize;
-                if (LOGV) Log.v(TAG, "userSize: " + userSize
-                        + " accountedSize: " + accountedSize);
-            }
-        }
-        if (otherItem != null) {
-            final long usedSize = mTotalSize - details.availSize;
-            final long unaccountedSize = usedSize - accountedSize;
-            final long otherSize = totalMiscSize + totalDownloadsSize + unaccountedSize;
-            Log.v(TAG, "Other items: \n\tmTotalSize: " + mTotalSize + " availSize: "
-                    + details.availSize + " usedSize: " + usedSize + "\n\taccountedSize: "
-                    + accountedSize + " unaccountedSize size: " + unaccountedSize
-                    + "\n\ttotalMiscSize: " + totalMiscSize + " totalDownloadsSize: "
-                    + totalDownloadsSize + "\n\tdetails: " + details);
-            updatePreference(otherItem, otherSize);
-        }
-    }
-
-    private void updatePreference(StorageItemPreference pref, long size) {
-        pref.setStorageSize(size, mTotalSize);
-    }
-
-    private static long totalValues(MeasurementDetails details, int userId, String... keys) {
-        long total = 0;
-        HashMap<String, Long> map = details.mediaSize.get(userId);
-        if (map != null) {
-            for (String key : keys) {
-                if (map.containsKey(key)) {
-                    total += map.get(key);
-                }
-            }
-        } else {
-            Log.w(TAG, "MeasurementDetails mediaSize array does not have key for user " + userId);
-        }
-        return total;
-    }
-
-    private final StorageEventListener mStorageListener = new StorageEventListener() {
-        @Override
-        public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
-            if (Objects.equals(mVolume.getId(), vol.getId())) {
-                mVolume = vol;
-                update();
-            }
-        }
-
-        @Override
-        public void onVolumeRecordChanged(VolumeRecord rec) {
-            if (Objects.equals(mVolume.getFsUuid(), rec.getFsUuid())) {
-                mVolume = mStorageManager.findVolumeById(mVolumeId);
-                update();
-            }
-        }
-    };
-
-    /**
-     * Dialog that allows editing of volume nickname.
-     */
-    public static class RenameFragment extends InstrumentedDialogFragment {
-        public static void show(PrivateVolumeSettings parent, VolumeInfo vol) {
-            if (!parent.isAdded()) return;
-
-            final RenameFragment dialog = new RenameFragment();
-            dialog.setTargetFragment(parent, 0);
-            final Bundle args = new Bundle();
-            args.putString(VolumeRecord.EXTRA_FS_UUID, vol.getFsUuid());
-            dialog.setArguments(args);
-            dialog.show(parent.getFragmentManager(), TAG_RENAME);
-        }
-
-        @Override
-        public int getMetricsCategory() {
-            return SettingsEnums.DIALOG_VOLUME_RENAME;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            final Context context = getActivity();
-            final StorageManager storageManager = context.getSystemService(StorageManager.class);
-
-            final String fsUuid = getArguments().getString(VolumeRecord.EXTRA_FS_UUID);
-            final VolumeInfo vol = storageManager.findVolumeByUuid(fsUuid);
-            final VolumeRecord rec = storageManager.findRecordByUuid(fsUuid);
-
-            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
-            final LayoutInflater dialogInflater = LayoutInflater.from(builder.getContext());
-
-            final View view = dialogInflater.inflate(R.layout.dialog_edittext, null, false);
-            final EditText nickname = (EditText) view.findViewById(R.id.edittext);
-            nickname.setText(rec.getNickname());
-
-            builder.setTitle(R.string.storage_rename_title);
-            builder.setView(view);
-
-            builder.setPositiveButton(R.string.save,
-                    new DialogInterface.OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialog, int which) {
-                            // TODO: move to background thread
-                            storageManager.setVolumeNickname(fsUuid,
-                                    nickname.getText().toString());
-                        }
-                    });
-            builder.setNegativeButton(R.string.cancel, null);
-
-            return builder.create();
-        }
-    }
-
-    public static class SystemInfoFragment extends InstrumentedDialogFragment {
-        public static void show(Fragment parent) {
-            if (!parent.isAdded()) return;
-
-            final SystemInfoFragment dialog = new SystemInfoFragment();
-            dialog.setTargetFragment(parent, 0);
-            dialog.show(parent.getFragmentManager(), TAG_SYSTEM_INFO);
-        }
-
-        @Override
-        public int getMetricsCategory() {
-            return SettingsEnums.DIALOG_STORAGE_SYSTEM_INFO;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            return new AlertDialog.Builder(getActivity())
-                    .setMessage(getContext().getString(R.string.storage_detail_dialog_system,
-                            Build.VERSION.RELEASE_OR_CODENAME))
-                    .setPositiveButton(android.R.string.ok, null)
-                    .create();
-        }
-    }
-
-    public static class OtherInfoFragment extends InstrumentedDialogFragment {
-        public static void show(Fragment parent, String title, VolumeInfo sharedVol, int userId) {
-            if (!parent.isAdded()) return;
-
-            final OtherInfoFragment dialog = new OtherInfoFragment();
-            dialog.setTargetFragment(parent, 0);
-            final Bundle args = new Bundle();
-            args.putString(Intent.EXTRA_TITLE, title);
-
-            final Intent intent = sharedVol.buildBrowseIntent();
-            intent.putExtra(Intent.EXTRA_USER_ID, userId);
-            args.putParcelable(Intent.EXTRA_INTENT, intent);
-            dialog.setArguments(args);
-            dialog.show(parent.getFragmentManager(), TAG_OTHER_INFO);
-        }
-
-        @Override
-        public int getMetricsCategory() {
-            return SettingsEnums.DIALOG_STORAGE_OTHER_INFO;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            final Context context = getActivity();
-
-            final String title = getArguments().getString(Intent.EXTRA_TITLE);
-            final Intent intent = getArguments().getParcelable(Intent.EXTRA_INTENT);
-
-            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
-            builder.setMessage(
-                    TextUtils.expandTemplate(getText(R.string.storage_detail_dialog_other), title));
-
-            builder.setPositiveButton(R.string.storage_menu_explore,
-                    new DialogInterface.OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialog, int which) {
-                            Utils.launchIntent(OtherInfoFragment.this, intent);
-                        }
-                    });
-            builder.setNegativeButton(android.R.string.cancel, null);
-
-            return builder.create();
-        }
-    }
-
-    public static class UserInfoFragment extends InstrumentedDialogFragment {
-        public static void show(Fragment parent, CharSequence userLabel, CharSequence userSize) {
-            if (!parent.isAdded()) return;
-
-            final UserInfoFragment dialog = new UserInfoFragment();
-            dialog.setTargetFragment(parent, 0);
-            final Bundle args = new Bundle();
-            args.putCharSequence(Intent.EXTRA_TITLE, userLabel);
-            args.putCharSequence(Intent.EXTRA_SUBJECT, userSize);
-            dialog.setArguments(args);
-            dialog.show(parent.getFragmentManager(), TAG_USER_INFO);
-        }
-
-        @Override
-        public int getMetricsCategory() {
-            return SettingsEnums.DIALOG_STORAGE_USER_INFO;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            final Context context = getActivity();
-
-            final CharSequence userLabel = getArguments().getCharSequence(Intent.EXTRA_TITLE);
-            final CharSequence userSize = getArguments().getCharSequence(Intent.EXTRA_SUBJECT);
-
-            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
-            builder.setMessage(TextUtils.expandTemplate(
-                    getText(R.string.storage_detail_dialog_user), userLabel, userSize));
-
-            builder.setPositiveButton(android.R.string.ok, null);
-
-            return builder.create();
-        }
-    }
-
-    /**
-     * Dialog to request user confirmation before clearing all cache data.
-     */
-    public static class ConfirmClearCacheFragment extends InstrumentedDialogFragment {
-        public static void show(Fragment parent) {
-            if (!parent.isAdded()) return;
-
-            final ConfirmClearCacheFragment dialog = new ConfirmClearCacheFragment();
-            dialog.setTargetFragment(parent, 0);
-            dialog.show(parent.getFragmentManager(), TAG_CONFIRM_CLEAR_CACHE);
-        }
-
-        @Override
-        public int getMetricsCategory() {
-            return SettingsEnums.DIALOG_STORAGE_CLEAR_CACHE;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            final Context context = getActivity();
-
-            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
-            builder.setTitle(R.string.memory_clear_cache_title);
-            builder.setMessage(getString(R.string.memory_clear_cache_message));
-
-            builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialog, int which) {
-                    final PrivateVolumeSettings target = (PrivateVolumeSettings) getTargetFragment();
-                    final PackageManager pm = context.getPackageManager();
-                    final UserManager um = context.getSystemService(UserManager.class);
-
-                    for (int userId : um.getProfileIdsWithDisabled(context.getUserId())) {
-                        final List<PackageInfo> infos = pm.getInstalledPackagesAsUser(0, userId);
-                        final ClearCacheObserver observer = new ClearCacheObserver(
-                                target, infos.size());
-                        for (PackageInfo info : infos) {
-                            pm.deleteApplicationCacheFilesAsUser(info.packageName, userId,
-                                    observer);
-                        }
-                    }
-                }
-            });
-            builder.setNegativeButton(android.R.string.cancel, null);
-
-            return builder.create();
-        }
-    }
-
-    private static class ClearCacheObserver extends IPackageDataObserver.Stub {
-        private final PrivateVolumeSettings mTarget;
-        private int mRemaining;
-
-        public ClearCacheObserver(PrivateVolumeSettings target, int remaining) {
-            mTarget = target;
-            mRemaining = remaining;
-        }
-
-        @Override
-        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
-            synchronized (this) {
-                if (--mRemaining == 0) {
-                    mTarget.getActivity().runOnUiThread(new Runnable() {
-                        @Override
-                        public void run() {
-                            mTarget.update();
-                        }
-                    });
-                }
-            }
-        }
-    }
-}
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeUnmount.java b/src/com/android/settings/deviceinfo/PrivateVolumeUnmount.java
index 3289df9..738c3ca 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeUnmount.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeUnmount.java
@@ -31,7 +31,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.InstrumentedFragment;
-import com.android.settings.deviceinfo.StorageSettings.UnmountTask;
+import com.android.settings.deviceinfo.storage.StorageUtils.UnmountTask;
 import com.android.settings.search.actionbar.SearchMenuController;
 
 public class PrivateVolumeUnmount extends InstrumentedFragment {
diff --git a/src/com/android/settings/deviceinfo/PublicVolumeSettings.java b/src/com/android/settings/deviceinfo/PublicVolumeSettings.java
index b4724ae..5315347 100644
--- a/src/com/android/settings/deviceinfo/PublicVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PublicVolumeSettings.java
@@ -40,8 +40,8 @@
 import com.android.internal.util.Preconditions;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.deviceinfo.StorageSettings.MountTask;
-import com.android.settings.deviceinfo.StorageSettings.UnmountTask;
+import com.android.settings.deviceinfo.storage.StorageUtils.MountTask;
+import com.android.settings.deviceinfo.storage.StorageUtils.UnmountTask;
 
 import java.io.File;
 import java.util.Objects;
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
deleted file mode 100644
index 871844c..0000000
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ /dev/null
@@ -1,692 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo;
-
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
-import android.app.Dialog;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.os.UserManager;
-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 android.text.format.Formatter;
-import android.text.format.Formatter.BytesResult;
-import android.util.Log;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.Fragment;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
-
-import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.RestrictedLockUtils;
-import com.android.settingslib.RestrictedLockUtilsInternal;
-import com.android.settingslib.deviceinfo.PrivateStorageInfo;
-import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
-import com.android.settingslib.search.Indexable;
-import com.android.settingslib.search.SearchIndexable;
-import com.android.settingslib.search.SearchIndexableRaw;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Panel showing both internal storage (both built-in storage and private
- * volumes) and removable storage (public volumes).
- */
-@SearchIndexable
-public class StorageSettings extends SettingsPreferenceFragment implements Indexable {
-    static final String TAG = "StorageSettings";
-
-    private static final String KEY_STORAGE_SETTINGS = "storage_settings";
-    private static final String KEY_INTERNAL_STORAGE = "storage_settings_internal_storage";
-    private static final String KEY_STORAGE_SETTINGS_VOLUME = "storage_settings_volume_";
-    private static final String KEY_STORAGE_SETTINGS_MEMORY_SIZE = "storage_settings_memory_size";
-    private static final String KEY_STORAGE_SETTINGS_MEMORY = "storage_settings_memory_available";
-    private static final String KEY_STORAGE_SETTINGS_DCIM = "storage_settings_dcim_space";
-    private static final String KEY_STORAGE_SETTINGS_MUSIC = "storage_settings_music_space";
-    private static final String KEY_STORAGE_SETTINGS_MISC = "storage_settings_misc_space";
-    private static final String KEY_STORAGE_SETTINGS_FREE_SPACE = "storage_settings_free_space";
-
-    private static final String TAG_VOLUME_UNMOUNTED = "volume_unmounted";
-    private static final String TAG_DISK_INIT = "disk_init";
-    private static final int METRICS_CATEGORY = SettingsEnums.DEVICEINFO_STORAGE;
-
-    private StorageManager mStorageManager;
-
-    private PreferenceCategory mInternalCategory;
-    private PreferenceCategory mExternalCategory;
-
-    private StorageSummaryPreference mInternalSummary;
-    private static long sTotalInternalStorage;
-
-    private boolean mHasLaunchedPrivateVolumeSettings = false;
-
-    @Override
-    public int getMetricsCategory() {
-        return METRICS_CATEGORY;
-    }
-
-    @Override
-    public int getHelpResource() {
-        return R.string.help_uri_storage;
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        final Context context = getActivity();
-
-        mStorageManager = context.getSystemService(StorageManager.class);
-
-        if (sTotalInternalStorage <= 0) {
-            sTotalInternalStorage = mStorageManager.getPrimaryStorageSize();
-        }
-
-        addPreferencesFromResource(R.xml.device_info_storage);
-
-        mInternalCategory = (PreferenceCategory) findPreference("storage_internal");
-        mExternalCategory = (PreferenceCategory) findPreference("storage_external");
-
-        mInternalSummary = new StorageSummaryPreference(getPrefContext());
-
-        setHasOptionsMenu(true);
-    }
-
-    private final StorageEventListener mStorageListener = new StorageEventListener() {
-        @Override
-        public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
-            if (isInteresting(vol)) {
-                refresh();
-            }
-        }
-
-        @Override
-        public void onDiskDestroyed(DiskInfo disk) {
-            refresh();
-        }
-    };
-
-    private static boolean isInteresting(VolumeInfo vol) {
-        switch (vol.getType()) {
-            case VolumeInfo.TYPE_PRIVATE:
-            case VolumeInfo.TYPE_PUBLIC:
-            case VolumeInfo.TYPE_STUB:
-                return true;
-            default:
-                return false;
-        }
-    }
-
-    private synchronized void refresh() {
-        final Context context = getPrefContext();
-
-        getPreferenceScreen().removeAll();
-        mInternalCategory.removeAll();
-        mExternalCategory.removeAll();
-
-        mInternalCategory.addPreference(mInternalSummary);
-
-        final StorageManagerVolumeProvider smvp = new StorageManagerVolumeProvider(mStorageManager);
-        final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo(smvp);
-        final long privateTotalBytes = info.totalBytes;
-        final long privateUsedBytes = info.totalBytes - info.freeBytes;
-
-        final List<VolumeInfo> volumes = mStorageManager.getVolumes();
-        Collections.sort(volumes, VolumeInfo.getDescriptionComparator());
-
-        for (VolumeInfo vol : volumes) {
-            if (vol.getType() == VolumeInfo.TYPE_PRIVATE) {
-
-                if (vol.getState() == VolumeInfo.STATE_UNMOUNTABLE) {
-                    mInternalCategory.addPreference(
-                            new StorageVolumePreference(context, vol, 0));
-                } else {
-                    final long volumeTotalBytes = PrivateStorageInfo.getTotalSize(vol,
-                            sTotalInternalStorage);
-                    mInternalCategory.addPreference(
-                            new StorageVolumePreference(context, vol, volumeTotalBytes));
-                }
-            } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC
-                    || vol.getType() == VolumeInfo.TYPE_STUB) {
-                mExternalCategory.addPreference(
-                        new StorageVolumePreference(context, vol, 0));
-            }
-        }
-
-        // Show missing private volumes
-        final List<VolumeRecord> recs = mStorageManager.getVolumeRecords();
-        for (VolumeRecord rec : recs) {
-            if (rec.getType() == VolumeInfo.TYPE_PRIVATE
-                    && mStorageManager.findVolumeByUuid(rec.getFsUuid()) == null) {
-                // TODO: add actual storage type to record
-                final Preference pref = new Preference(context);
-                pref.setKey(rec.getFsUuid());
-                pref.setTitle(rec.getNickname());
-                pref.setSummary(com.android.internal.R.string.ext_media_status_missing);
-                pref.setIcon(R.drawable.ic_sim_sd);
-                mInternalCategory.addPreference(pref);
-            }
-        }
-
-        // Show unsupported disks to give a chance to init
-        final List<DiskInfo> disks = mStorageManager.getDisks();
-        for (DiskInfo disk : disks) {
-            if (disk.volumeCount == 0 && disk.size > 0) {
-                final Preference pref = new Preference(context);
-                pref.setKey(disk.getId());
-                pref.setTitle(disk.getDescription());
-                pref.setSummary(com.android.internal.R.string.ext_media_status_unsupported);
-                pref.setIcon(R.drawable.ic_sim_sd);
-                mExternalCategory.addPreference(pref);
-            }
-        }
-
-        final BytesResult result = Formatter.formatBytes(getResources(), privateUsedBytes, 0);
-        mInternalSummary.setTitle(TextUtils.expandTemplate(getText(R.string.storage_size_large),
-                result.value, result.units));
-        mInternalSummary.setSummary(getString(R.string.storage_volume_used_total,
-                Formatter.formatFileSize(context, privateTotalBytes)));
-        if (mInternalCategory.getPreferenceCount() > 0) {
-            getPreferenceScreen().addPreference(mInternalCategory);
-        }
-        if (mExternalCategory.getPreferenceCount() > 0) {
-            getPreferenceScreen().addPreference(mExternalCategory);
-        }
-
-        if (mInternalCategory.getPreferenceCount() == 2
-                && mExternalCategory.getPreferenceCount() == 0) {
-            // Only showing primary internal storage, so just shortcut
-            if (!mHasLaunchedPrivateVolumeSettings) {
-                mHasLaunchedPrivateVolumeSettings = true;
-                final Bundle args = new Bundle();
-                args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL);
-                new SubSettingLauncher(getActivity())
-                        .setDestination(StorageDashboardFragment.class.getName())
-                        .setArguments(args)
-                        .setTitleRes(R.string.storage_settings)
-                        .setSourceMetricsCategory(getMetricsCategory())
-                        .launch();
-                finish();
-            }
-        }
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        mStorageManager.registerListener(mStorageListener);
-        refresh();
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mStorageManager.unregisterListener(mStorageListener);
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference pref) {
-        final String key = pref.getKey();
-        if (pref instanceof StorageVolumePreference) {
-            // Picked a normal volume
-            final VolumeInfo vol = mStorageManager.findVolumeById(key);
-
-            if (vol == null) {
-                return false;
-            }
-
-            if (vol.getState() == VolumeInfo.STATE_UNMOUNTED) {
-                VolumeUnmountedFragment.show(this, vol.getId());
-                return true;
-            } else if (vol.getState() == VolumeInfo.STATE_UNMOUNTABLE) {
-                DiskInitFragment.show(this, R.string.storage_dialog_unmountable, vol.getDiskId());
-                return true;
-            }
-
-            if (vol.getType() == VolumeInfo.TYPE_PRIVATE) {
-                final Bundle args = new Bundle();
-                args.putString(VolumeInfo.EXTRA_VOLUME_ID, vol.getId());
-
-                if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.getId())) {
-                    new SubSettingLauncher(getContext())
-                            .setDestination(StorageDashboardFragment.class.getCanonicalName())
-                            .setTitleRes(R.string.storage_settings)
-                            .setSourceMetricsCategory(getMetricsCategory())
-                            .setArguments(args)
-                            .launch();
-                } else {
-                    // TODO: Go to the StorageDashboardFragment once it fully handles all of the
-                    //       SD card cases and other private internal storage cases.
-                    PrivateVolumeSettings.setVolumeSize(args, PrivateStorageInfo.getTotalSize(vol,
-                            sTotalInternalStorage));
-                    new SubSettingLauncher(getContext())
-                            .setDestination(PrivateVolumeSettings.class.getCanonicalName())
-                            .setTitleRes(-1)
-                            .setSourceMetricsCategory(getMetricsCategory())
-                            .setArguments(args)
-                            .launch();
-                }
-
-                return true;
-
-            } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC) {
-                return handlePublicVolumeClick(getContext(), vol);
-            } else if (vol.getType() == VolumeInfo.TYPE_STUB) {
-                return handleStubVolumeClick(getContext(), vol);
-            }
-
-        } else if (key.startsWith("disk:")) {
-            // Picked an unsupported disk
-            DiskInitFragment.show(this, R.string.storage_dialog_unsupported, key);
-            return true;
-
-        } else {
-            // Picked a missing private volume
-            final Bundle args = new Bundle();
-            args.putString(VolumeRecord.EXTRA_FS_UUID, key);
-            new SubSettingLauncher(getContext())
-                    .setDestination(PrivateVolumeForget.class.getCanonicalName())
-                    .setTitleRes(R.string.storage_menu_forget)
-                    .setSourceMetricsCategory(getMetricsCategory())
-                    .setArguments(args)
-                    .launch();
-            return true;
-        }
-
-        return false;
-    }
-
-    @VisibleForTesting
-    static boolean handleStubVolumeClick(Context context, VolumeInfo vol) {
-        final Intent intent = vol.buildBrowseIntent();
-        if (vol.isMountedReadable() && intent != null) {
-            context.startActivity(intent);
-            return true;
-        }
-        return false;
-    }
-
-    @VisibleForTesting
-    static boolean handlePublicVolumeClick(Context context, VolumeInfo vol) {
-        final Intent intent = vol.buildBrowseIntent();
-        if (vol.isMountedReadable() && intent != null) {
-            context.startActivity(intent);
-            return true;
-        } else {
-            final Bundle args = new Bundle();
-            args.putString(VolumeInfo.EXTRA_VOLUME_ID, vol.getId());
-            new SubSettingLauncher(context)
-                    .setDestination(PublicVolumeSettings.class.getCanonicalName())
-                    .setTitleRes(-1)
-                    .setSourceMetricsCategory(METRICS_CATEGORY)
-                    .setArguments(args)
-                    .launch();
-            return true;
-        }
-    }
-
-    public static class MountTask extends AsyncTask<Void, Void, Exception> {
-        private final Context mContext;
-        private final StorageManager mStorageManager;
-        private final String mVolumeId;
-        private final String mDescription;
-
-        public MountTask(Context context, VolumeInfo volume) {
-            mContext = context.getApplicationContext();
-            mStorageManager = mContext.getSystemService(StorageManager.class);
-            mVolumeId = volume.getId();
-            mDescription = mStorageManager.getBestVolumeDescription(volume);
-        }
-
-        @Override
-        protected Exception doInBackground(Void... params) {
-            try {
-                mStorageManager.mount(mVolumeId);
-                return null;
-            } catch (Exception e) {
-                return e;
-            }
-        }
-
-        @Override
-        protected void onPostExecute(Exception e) {
-            if (e == null) {
-                Toast.makeText(mContext, mContext.getString(R.string.storage_mount_success,
-                        mDescription), Toast.LENGTH_SHORT).show();
-            } else {
-                Log.e(TAG, "Failed to mount " + mVolumeId, e);
-                Toast.makeText(mContext, mContext.getString(R.string.storage_mount_failure,
-                        mDescription), Toast.LENGTH_SHORT).show();
-            }
-        }
-    }
-
-    public static class UnmountTask extends AsyncTask<Void, Void, Exception> {
-        private final Context mContext;
-        private final StorageManager mStorageManager;
-        private final String mVolumeId;
-        private final String mDescription;
-
-        public UnmountTask(Context context, VolumeInfo volume) {
-            mContext = context.getApplicationContext();
-            mStorageManager = mContext.getSystemService(StorageManager.class);
-            mVolumeId = volume.getId();
-            mDescription = mStorageManager.getBestVolumeDescription(volume);
-        }
-
-        @Override
-        protected Exception doInBackground(Void... params) {
-            try {
-                mStorageManager.unmount(mVolumeId);
-                return null;
-            } catch (Exception e) {
-                return e;
-            }
-        }
-
-        @Override
-        protected void onPostExecute(Exception e) {
-            if (e == null) {
-                Toast.makeText(mContext, mContext.getString(R.string.storage_unmount_success,
-                        mDescription), Toast.LENGTH_SHORT).show();
-            } else {
-                Log.e(TAG, "Failed to unmount " + mVolumeId, e);
-                Toast.makeText(mContext, mContext.getString(R.string.storage_unmount_failure,
-                        mDescription), Toast.LENGTH_SHORT).show();
-            }
-        }
-    }
-
-    public static class VolumeUnmountedFragment extends InstrumentedDialogFragment {
-        public static void show(Fragment parent, String volumeId) {
-            final Bundle args = new Bundle();
-            args.putString(VolumeInfo.EXTRA_VOLUME_ID, volumeId);
-
-            final VolumeUnmountedFragment dialog = new VolumeUnmountedFragment();
-            dialog.setArguments(args);
-            dialog.setTargetFragment(parent, 0);
-            dialog.show(parent.getFragmentManager(), TAG_VOLUME_UNMOUNTED);
-        }
-
-        @Override
-        public int getMetricsCategory() {
-            return SettingsEnums.DIALOG_VOLUME_UNMOUNT;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            final Context context = getActivity();
-            final StorageManager sm = context.getSystemService(StorageManager.class);
-
-            final String volumeId = getArguments().getString(VolumeInfo.EXTRA_VOLUME_ID);
-            final VolumeInfo vol = sm.findVolumeById(volumeId);
-
-            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
-            builder.setMessage(TextUtils.expandTemplate(
-                    getText(R.string.storage_dialog_unmounted), vol.getDisk().getDescription()));
-
-            builder.setPositiveButton(R.string.storage_menu_mount,
-                    new DialogInterface.OnClickListener() {
-                        /**
-                         * Check if an {@link
-                         * RestrictedLockUtils#sendShowAdminSupportDetailsIntent admin
-                         * details intent} should be shown for the restriction and show it.
-                         *
-                         * @param restriction The restriction to check
-                         * @return {@code true} iff a intent was shown.
-                         */
-                        private boolean wasAdminSupportIntentShown(@NonNull String restriction) {
-                            EnforcedAdmin admin = RestrictedLockUtilsInternal
-                                    .checkIfRestrictionEnforced(getActivity(), restriction,
-                                            UserHandle.myUserId());
-                            boolean hasBaseUserRestriction =
-                                    RestrictedLockUtilsInternal.hasBaseUserRestriction(
-                                            getActivity(), restriction, UserHandle.myUserId());
-                            if (admin != null && !hasBaseUserRestriction) {
-                                RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(),
-                                        admin);
-                                return true;
-                            }
-
-                            return false;
-                        }
-
-                        @Override
-                        public void onClick(DialogInterface dialog, int which) {
-                            if (wasAdminSupportIntentShown(
-                                    UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA)) {
-                                return;
-                            }
-
-                            if (vol.disk != null && vol.disk.isUsb() &&
-                                    wasAdminSupportIntentShown(
-                                            UserManager.DISALLOW_USB_FILE_TRANSFER)) {
-                                return;
-                            }
-
-                            new MountTask(context, vol).execute();
-                        }
-                    });
-            builder.setNegativeButton(R.string.cancel, null);
-
-            return builder.create();
-        }
-    }
-
-    public static class DiskInitFragment extends InstrumentedDialogFragment {
-        @Override
-        public int getMetricsCategory() {
-            return SettingsEnums.DIALOG_VOLUME_INIT;
-        }
-
-        public static void show(Fragment parent, int resId, String diskId) {
-            final Bundle args = new Bundle();
-            args.putInt(Intent.EXTRA_TEXT, resId);
-            args.putString(DiskInfo.EXTRA_DISK_ID, diskId);
-
-            final DiskInitFragment dialog = new DiskInitFragment();
-            dialog.setArguments(args);
-            dialog.setTargetFragment(parent, 0);
-            dialog.show(parent.getFragmentManager(), TAG_DISK_INIT);
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            final Context context = getActivity();
-            final StorageManager sm = context.getSystemService(StorageManager.class);
-
-            final int resId = getArguments().getInt(Intent.EXTRA_TEXT);
-            final String diskId = getArguments().getString(DiskInfo.EXTRA_DISK_ID);
-            final DiskInfo disk = sm.findDiskById(diskId);
-
-            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
-            builder.setMessage(TextUtils.expandTemplate(getText(resId), disk.getDescription()));
-
-            builder.setPositiveButton(R.string.storage_menu_set_up,
-                    new DialogInterface.OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialog, int which) {
-                            final Intent intent = new Intent(context, StorageWizardInit.class);
-                            intent.putExtra(DiskInfo.EXTRA_DISK_ID, diskId);
-                            startActivity(intent);
-                        }
-                    });
-            builder.setNegativeButton(R.string.cancel, null);
-
-            return builder.create();
-        }
-    }
-
-    /** Enable indexing of searchable data */
-    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider() {
-                @Override
-                public List<SearchIndexableRaw> getRawDataToIndex(
-                        Context context, boolean enabled) {
-                    final List<SearchIndexableRaw> result = new ArrayList<>();
-
-                    SearchIndexableRaw data = new SearchIndexableRaw(context);
-                    data.title = context.getString(R.string.storage_settings);
-                    data.key = KEY_STORAGE_SETTINGS;
-                    data.screenTitle = context.getString(R.string.storage_settings);
-                    data.keywords = context.getString(R.string.keywords_storage_settings);
-                    result.add(data);
-
-                    data = new SearchIndexableRaw(context);
-                    data.title = context.getString(R.string.internal_storage);
-                    data.key = KEY_INTERNAL_STORAGE;
-                    data.screenTitle = context.getString(R.string.storage_settings);
-                    result.add(data);
-
-                    data = new SearchIndexableRaw(context);
-                    final StorageManager storage = context.getSystemService(StorageManager.class);
-                    final List<VolumeInfo> vols = storage.getVolumes();
-                    for (VolumeInfo vol : vols) {
-                        if (isInteresting(vol)) {
-                            data.title = storage.getBestVolumeDescription(vol);
-                            data.key = KEY_STORAGE_SETTINGS_VOLUME + vol.id;
-                            data.screenTitle = context.getString(R.string.storage_settings);
-                            result.add(data);
-                        }
-                    }
-
-                    data = new SearchIndexableRaw(context);
-                    data.title = context.getString(R.string.memory_size);
-                    data.key = KEY_STORAGE_SETTINGS_MEMORY_SIZE;
-                    data.screenTitle = context.getString(R.string.storage_settings);
-                    result.add(data);
-
-                    data = new SearchIndexableRaw(context);
-                    data.title = context.getString(R.string.memory_available);
-                    data.key = KEY_STORAGE_SETTINGS_MEMORY;
-                    data.screenTitle = context.getString(R.string.storage_settings);
-                    result.add(data);
-
-                    data = new SearchIndexableRaw(context);
-                    data.title = context.getString(R.string.memory_dcim_usage);
-                    data.key = KEY_STORAGE_SETTINGS_DCIM;
-                    data.screenTitle = context.getString(R.string.storage_settings);
-                    result.add(data);
-
-                    data = new SearchIndexableRaw(context);
-                    data.title = context.getString(R.string.memory_music_usage);
-                    data.key = KEY_STORAGE_SETTINGS_MUSIC;
-                    data.screenTitle = context.getString(R.string.storage_settings);
-                    result.add(data);
-
-                    data = new SearchIndexableRaw(context);
-                    data.title = context.getString(R.string.memory_media_misc_usage);
-                    data.key = KEY_STORAGE_SETTINGS_MISC;
-                    data.screenTitle = context.getString(R.string.storage_settings);
-                    result.add(data);
-
-                    data = new SearchIndexableRaw(context);
-                    data.title = context.getString(R.string.storage_menu_free);
-                    data.key = KEY_STORAGE_SETTINGS_FREE_SPACE;
-                    data.screenTitle = context.getString(R.string.storage_menu_free);
-                    data.intentAction = StorageManager.ACTION_MANAGE_STORAGE;
-                    data.keywords = context.getString(R.string.keywords_storage_menu_free);
-                    result.add(data);
-
-                    return result;
-                }
-
-                @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    final List<String> niks = super.getNonIndexableKeys(context);
-                    if (isExternalExist(context)) {
-                        niks.add(KEY_STORAGE_SETTINGS);
-                        niks.add(KEY_INTERNAL_STORAGE);
-                        niks.add(KEY_STORAGE_SETTINGS_MEMORY_SIZE);
-                        niks.add(KEY_STORAGE_SETTINGS_MEMORY);
-                        niks.add(KEY_STORAGE_SETTINGS_DCIM);
-                        niks.add(KEY_STORAGE_SETTINGS_MUSIC);
-                        niks.add(KEY_STORAGE_SETTINGS_MISC);
-                        niks.add(KEY_STORAGE_SETTINGS_FREE_SPACE);
-
-                        final StorageManager storage = context.getSystemService(
-                                StorageManager.class);
-                        final List<VolumeInfo> vols = storage.getVolumes();
-                        for (VolumeInfo vol : vols) {
-                            if (isInteresting(vol)) {
-                                niks.add(KEY_STORAGE_SETTINGS_VOLUME + vol.id);
-                            }
-                        }
-                    }
-                    return niks;
-                }
-
-                @Override
-                protected boolean isPageSearchEnabled(Context context) {
-                    return !isExternalExist(context);
-                }
-
-                private boolean isExternalExist(Context context) {
-                    int internalCount = 0;
-                    StorageManager storageManager = context.getSystemService(StorageManager.class);
-                    final List<VolumeInfo> volumes = storageManager.getVolumes();
-                    for (VolumeInfo vol : volumes) {
-                        //External storage
-                        if (vol.getType() == VolumeInfo.TYPE_PUBLIC
-                                || vol.getType() == VolumeInfo.TYPE_STUB) {
-                            return true;
-                        } else if (vol.getType() == VolumeInfo.TYPE_PRIVATE) {
-                            internalCount++;
-                        }
-                    }
-
-                    // Unsupported disks
-                    final List<DiskInfo> disks = storageManager.getDisks();
-                    for (DiskInfo disk : disks) {
-                        if (disk.volumeCount == 0 && disk.size > 0) {
-                            return true;
-                        }
-                    }
-
-                    // Missing private volumes
-                    final List<VolumeRecord> recs = storageManager.getVolumeRecords();
-                    for (VolumeRecord rec : recs) {
-                        if (rec.getType() == VolumeInfo.TYPE_PRIVATE
-                                && storageManager.findVolumeByUuid(rec.getFsUuid()) == null) {
-                            internalCount++;
-                        }
-                    }
-
-                    return (internalCount != 1);
-                }
-            };
-}
diff --git a/src/com/android/settings/deviceinfo/StorageUnmountReceiver.java b/src/com/android/settings/deviceinfo/StorageUnmountReceiver.java
index 81ac97b..41f59b4 100644
--- a/src/com/android/settings/deviceinfo/StorageUnmountReceiver.java
+++ b/src/com/android/settings/deviceinfo/StorageUnmountReceiver.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.deviceinfo;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -25,9 +23,11 @@
 import android.os.storage.VolumeInfo;
 import android.util.Log;
 
-import com.android.settings.deviceinfo.StorageSettings.UnmountTask;
+import com.android.settings.deviceinfo.storage.StorageUtils.UnmountTask;
 
 public class StorageUnmountReceiver extends BroadcastReceiver {
+    private static final String TAG = "StorageUnmountReceiver";
+
     @Override
     public void onReceive(Context context, Intent intent) {
         final StorageManager storage = context.getSystemService(StorageManager.class);
diff --git a/src/com/android/settings/deviceinfo/StorageVolumePreference.java b/src/com/android/settings/deviceinfo/StorageVolumePreference.java
deleted file mode 100644
index bd7ca82..0000000
--- a/src/com/android/settings/deviceinfo/StorageVolumePreference.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo;
-
-import android.app.usage.StorageStatsManager;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.drawable.Drawable;
-import android.os.storage.StorageManager;
-import android.os.storage.VolumeInfo;
-import android.text.format.Formatter;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.ImageView;
-import android.widget.ProgressBar;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-import com.android.settings.deviceinfo.StorageSettings.UnmountTask;
-import com.android.settingslib.Utils;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Preference line representing a single {@link VolumeInfo}, possibly including
- * quick actions like unmounting.
- */
-public class StorageVolumePreference extends Preference {
-    private static final String TAG = StorageVolumePreference.class.getSimpleName();
-
-    private final StorageManager mStorageManager;
-    private final VolumeInfo mVolume;
-
-    private int mUsedPercent = -1;
-    private ColorStateList mColorTintList;
-
-    // TODO: ideally, VolumeInfo should have a total physical size.
-    public StorageVolumePreference(Context context, VolumeInfo volume, long totalBytes) {
-        super(context);
-
-        mStorageManager = context.getSystemService(StorageManager.class);
-        mVolume = volume;
-        mColorTintList = Utils.getColorAttr(context, android.R.attr.colorControlNormal);
-
-        setLayoutResource(R.layout.storage_volume);
-
-        setKey(volume.getId());
-        setTitle(mStorageManager.getBestVolumeDescription(volume));
-
-        Drawable icon;
-        if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(volume.getId())) {
-            icon = context.getDrawable(R.drawable.ic_storage);
-        } else {
-            icon = context.getDrawable(R.drawable.ic_sim_sd);
-        }
-
-        if (volume.isMountedReadable()) {
-            // TODO: move statfs() to background thread
-            final File path = volume.getPath();
-
-            long freeBytes = 0;
-            long usedBytes = 0;
-            if (volume.getType() == VolumeInfo.TYPE_PRIVATE) {
-                final StorageStatsManager stats =
-                        context.getSystemService(StorageStatsManager.class);
-                try {
-                    totalBytes = stats.getTotalBytes(volume.getFsUuid());
-                    freeBytes = stats.getFreeBytes(volume.getFsUuid());
-                    usedBytes = totalBytes - freeBytes;
-                } catch (IOException e) {
-                    Log.w(TAG, e);
-                }
-            } else {
-                // StorageStatsManager can only query private volumes.
-                // Default to previous storage calculation for public volumes.
-                if (totalBytes <= 0) {
-                    totalBytes = path.getTotalSpace();
-                }
-                freeBytes = path.getFreeSpace();
-                usedBytes = totalBytes - freeBytes;
-            }
-
-            final String used = Formatter.formatFileSize(context, usedBytes);
-            final String total = Formatter.formatFileSize(context, totalBytes);
-            setSummary(context.getString(R.string.storage_volume_summary, used, total));
-            if (totalBytes > 0) {
-                mUsedPercent = (int) ((usedBytes * 100) / totalBytes);
-            }
-
-            if (freeBytes < mStorageManager.getStorageLowBytes(path)) {
-                mColorTintList = Utils.getColorAttr(context, android.R.attr.colorError);
-                icon = context.getDrawable(R.drawable.ic_warning_24dp);
-                icon.mutate();
-                icon.setTintList(mColorTintList);
-            }
-
-        } else {
-            setSummary(volume.getStateDescription());
-            mUsedPercent = -1;
-        }
-
-        setIcon(icon);
-
-        if (volume.getType() == VolumeInfo.TYPE_PUBLIC
-                && volume.isMountedReadable()) {
-            setWidgetLayoutResource(R.layout.preference_storage_action);
-        }
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder view) {
-        final ImageView unmount = (ImageView) view.findViewById(R.id.unmount);
-        if (unmount != null) {
-            unmount.setOnClickListener(mUnmountListener);
-        }
-
-        final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress);
-        if (mVolume.getType() == VolumeInfo.TYPE_PRIVATE && mUsedPercent != -1) {
-            progress.setVisibility(View.VISIBLE);
-            progress.setProgress(mUsedPercent);
-            progress.setProgressTintList(mColorTintList);
-        } else {
-            progress.setVisibility(View.GONE);
-        }
-
-        super.onBindViewHolder(view);
-    }
-
-    private final View.OnClickListener mUnmountListener = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            new UnmountTask(getContext(), mVolume).execute();
-        }
-    };
-}
diff --git a/src/com/android/settings/deviceinfo/StorageWizardBase.java b/src/com/android/settings/deviceinfo/StorageWizardBase.java
index 92afa56..b1b956e 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardBase.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardBase.java
@@ -19,8 +19,6 @@
 import static android.os.storage.DiskInfo.EXTRA_DISK_ID;
 import static android.os.storage.VolumeInfo.EXTRA_VOLUME_ID;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 import android.annotation.LayoutRes;
 import android.annotation.NonNull;
 import android.content.Intent;
@@ -54,6 +52,8 @@
 import java.util.Objects;
 
 public abstract class StorageWizardBase extends FragmentActivity {
+    private static final String TAG = "StorageWizardBase";
+
     protected static final String EXTRA_FORMAT_FORGET_UUID = "format_forget_uuid";
     protected static final String EXTRA_FORMAT_PRIVATE = "format_private";
     protected static final String EXTRA_FORMAT_SLOW = "format_slow";
diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
index 88968b3..ea4a2fd 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
@@ -18,8 +18,6 @@
 
 import static android.os.storage.VolumeInfo.TYPE_PRIVATE;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 import android.content.Intent;
 import android.content.pm.IPackageMoveObserver;
 import android.os.AsyncTask;
@@ -40,6 +38,8 @@
 import java.util.concurrent.TimeUnit;
 
 public class StorageWizardFormatProgress extends StorageWizardBase {
+    private static final String TAG = "StorageWizardFormatProgress";
+
     private static final String PROP_DEBUG_STORAGE_SLOW = "sys.debug.storage_slow";
 
     private boolean mFormatPrivate;
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
index 7d20aa7..0d513e5 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.deviceinfo;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 import android.app.settings.SettingsEnums;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -39,6 +37,8 @@
 import java.util.Objects;
 
 public class StorageWizardMigrateConfirm extends StorageWizardBase {
+    private static final String TAG = "StorageWizardMigrateConfirm";
+
     private static final int REQUEST_CREDENTIAL = 100;
 
     private MigrateEstimateTask mEstimate;
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
index b6f2a8d..7e042c1 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateProgress.java
@@ -18,8 +18,6 @@
 
 import static android.content.pm.PackageManager.EXTRA_MOVE_ID;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -34,6 +32,8 @@
 import com.android.settings.R;
 
 public class StorageWizardMigrateProgress extends StorageWizardBase {
+    private static final String TAG = "StorageWizardMigrateProgress";
+
     private static final String ACTION_FINISH_WIZARD = "com.android.systemui.action.FINISH_WIZARD";
 
     private int mMoveId;
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
index 034eb079..b0f8cbd 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
@@ -21,8 +21,6 @@
 import static android.content.pm.PackageManager.EXTRA_MOVE_ID;
 import static android.os.storage.VolumeInfo.EXTRA_VOLUME_ID;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -39,6 +37,8 @@
 import com.android.settings.password.ChooseLockSettingsHelper;
 
 public class StorageWizardMoveConfirm extends StorageWizardBase {
+    private static final String TAG = "StorageWizardMoveConfirm";
+
     private static final int REQUEST_CREDENTIAL = 100;
 
     private String mPackageName;
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java b/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
index 1966c95..8dc1e2f 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
@@ -19,8 +19,6 @@
 import static android.content.Intent.EXTRA_TITLE;
 import static android.content.pm.PackageManager.EXTRA_MOVE_ID;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.MoveCallback;
 import android.os.Bundle;
@@ -32,6 +30,8 @@
 import com.android.settings.R;
 
 public class StorageWizardMoveProgress extends StorageWizardBase {
+    private static final String TAG = "StorageWizardMoveProgress";
+
     private int mMoveId;
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/VolumeOptionMenuController.java b/src/com/android/settings/deviceinfo/VolumeOptionMenuController.java
index 0932447..d4f93fa 100644
--- a/src/com/android/settings/deviceinfo/VolumeOptionMenuController.java
+++ b/src/com/android/settings/deviceinfo/VolumeOptionMenuController.java
@@ -35,11 +35,11 @@
 
 import com.android.settings.R;
 import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.deviceinfo.StorageSettings.MountTask;
-import com.android.settings.deviceinfo.StorageSettings.UnmountTask;
 import com.android.settings.deviceinfo.storage.StorageEntry;
 import com.android.settings.deviceinfo.storage.StorageRenameFragment;
 import com.android.settings.deviceinfo.storage.StorageUtils;
+import com.android.settings.deviceinfo.storage.StorageUtils.MountTask;
+import com.android.settings.deviceinfo.storage.StorageUtils.UnmountTask;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
 import com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 052fc98..4817485 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -45,8 +45,8 @@
 import com.android.settings.applications.manageapplications.ManageApplications;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.deviceinfo.PrivateVolumeSettings.SystemInfoFragment;
 import com.android.settings.deviceinfo.StorageItemPreference;
+import com.android.settings.deviceinfo.storage.StorageUtils.SystemInfoFragment;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
diff --git a/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreference.java b/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreference.java
deleted file mode 100644
index caf5b4e..0000000
--- a/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreference.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo.storage;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.Intent;
-import android.os.storage.StorageManager;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.DonutView;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-/**
- * StorageSummaryDonutPreference is a preference which summarizes the used and remaining storage left
- * on a given storage volume. It is visualized with a donut graphing the % used.
- */
-public class StorageSummaryDonutPreference extends Preference implements View.OnClickListener {
-    private double mPercent = -1;
-
-    public StorageSummaryDonutPreference(Context context) {
-        this(context, null);
-    }
-
-    public StorageSummaryDonutPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        setLayoutResource(R.layout.storage_summary_donut);
-        setEnabled(false);
-    }
-
-    public void setPercent(long usedBytes, long totalBytes) {
-        if (totalBytes == 0) {
-            return;
-        }
-
-        mPercent = usedBytes / (double) totalBytes;
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder view) {
-        super.onBindViewHolder(view);
-        view.itemView.setClickable(false);
-
-        final DonutView donut = (DonutView) view.findViewById(R.id.donut);
-        if (donut != null) {
-            donut.setPercentage(mPercent);
-        }
-
-        final Button deletionHelperButton = (Button) view.findViewById(R.id.deletion_helper_button);
-        if (deletionHelperButton != null) {
-            deletionHelperButton.setOnClickListener(this);
-        }
-    }
-
-    @Override
-    public void onClick(View v) {
-        if (v != null && R.id.deletion_helper_button == v.getId()) {
-            final Context context = getContext();
-            final MetricsFeatureProvider metricsFeatureProvider =
-                    FeatureFactory.getFactory(context).getMetricsFeatureProvider();
-            metricsFeatureProvider.logClickedPreference(this,
-                    getExtras().getInt(DashboardFragment.CATEGORY));
-            metricsFeatureProvider.action(context, SettingsEnums.STORAGE_FREE_UP_SPACE_NOW);
-            final Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
-            context.startActivity(intent);
-        }
-    }
-}
diff --git a/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceController.java
deleted file mode 100644
index d8ee711..0000000
--- a/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceController.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo.storage;
-
-import android.content.Context;
-import android.os.storage.StorageManager;
-import android.os.storage.VolumeInfo;
-import android.text.TextUtils;
-import android.text.format.Formatter;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-import com.android.settingslib.deviceinfo.PrivateStorageInfo;
-import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
-import com.android.settingslib.deviceinfo.StorageVolumeProvider;
-import com.android.settingslib.utils.ThreadUtils;
-
-import java.text.NumberFormat;
-
-/**
- * SummaryPreferenceController updates the donut storage summary preference to have the
- * correct sizes showing.
- */
-public class StorageSummaryDonutPreferenceController extends BasePreferenceController {
-    private long mUsedBytes;
-    private long mTotalBytes;
-    private StorageSummaryDonutPreference mSummary;
-    private final StorageManager mStorageManager;
-    private final StorageManagerVolumeProvider mStorageManagerVolumeProvider;
-
-    public StorageSummaryDonutPreferenceController(Context context, String key) {
-        super(context, key);
-        mStorageManager = mContext.getSystemService(StorageManager.class);
-        mStorageManagerVolumeProvider = new StorageManagerVolumeProvider(mStorageManager);
-    }
-
-    /**
-     * Converts a used storage amount to a formatted text.
-     *
-     * @param usedBytes used bytes of storage
-     * @return a formatted text.
-     */
-    public static CharSequence convertUsedBytesToFormattedText(Context context, long usedBytes) {
-        final Formatter.BytesResult result = Formatter.formatBytes(context.getResources(),
-                usedBytes, 0);
-        return TextUtils.expandTemplate(context.getText(R.string.storage_size_large_alternate),
-                result.value, result.units);
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        mSummary = screen.findPreference(getPreferenceKey());
-        mSummary.setEnabled(true);
-
-        ThreadUtils.postOnBackgroundThread(() -> {
-            final NumberFormat percentageFormat = NumberFormat.getPercentInstance();
-            final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo(
-                    mStorageManagerVolumeProvider);
-            final double privateUsedBytes = info.totalBytes - info.freeBytes;
-            mTotalBytes = info.totalBytes;
-            mUsedBytes = info.totalBytes - info.freeBytes;
-
-            ThreadUtils.postOnMainThread(() -> {
-                updateState(mSummary);
-            });
-        });
-    }
-
-    @Override
-    public void updateState(Preference preference) {
-        super.updateState(preference);
-        mSummary.setTitle(convertUsedBytesToFormattedText(mContext, mUsedBytes));
-        mSummary.setSummary(mContext.getString(R.string.storage_volume_total,
-                Formatter.formatShortFileSize(mContext, mTotalBytes)));
-        mSummary.setPercent(mUsedBytes, mTotalBytes);
-        mSummary.setEnabled(true);
-    }
-
-    /** Invalidates the data on the view and re-renders. */
-    public void invalidateData() {
-        if (mSummary != null) {
-            updateState(mSummary);
-        }
-    }
-
-    @Override
-    public int getAvailabilityStatus() {
-        return AVAILABLE;
-    }
-
-    /**
-     * Updates the state of the donut preference for the next update.
-     *
-     * @param used  Total number of used bytes on the summarized volume.
-     * @param total Total number of bytes on the summarized volume.
-     */
-    public void updateBytes(long used, long total) {
-        mUsedBytes = used;
-        mTotalBytes = total;
-        invalidateData();
-    }
-
-    /**
-     * Updates the state of the donut preference for the next update using volume to summarize.
-     *
-     * @param volume VolumeInfo to use to populate the informayion.
-     */
-    public void updateSizes(StorageVolumeProvider svp, VolumeInfo volume) {
-        final long sharedDataSize = volume.getPath().getTotalSpace();
-        long totalSize = svp.getPrimaryStorageSize();
-
-        if (totalSize <= 0) {
-            totalSize = sharedDataSize;
-        }
-
-        final long usedBytes = totalSize - volume.getPath().getFreeSpace();
-        updateBytes(usedBytes, totalSize);
-    }
-}
diff --git a/src/com/android/settings/deviceinfo/storage/StorageUtils.java b/src/com/android/settings/deviceinfo/storage/StorageUtils.java
index 26bdec0..919908d 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageUtils.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageUtils.java
@@ -16,18 +16,31 @@
 
 package com.android.settings.deviceinfo.storage;
 
+import android.app.Dialog;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.os.AsyncTask;
+import android.os.Build;
 import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
 import android.os.storage.VolumeRecord;
+import android.util.Log;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.Fragment;
 
 import com.android.settings.R;
 import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.deviceinfo.PrivateVolumeForget;
 
 /** Storage utilities */
 public class StorageUtils {
 
+    private static final String TAG = "StorageUtils";
+
     /** Launches the fragment to forget a specified missing volume record. */
     public static void launchForgetMissingVolumeRecordFragment(Context context,
             StorageEntry storageEntry) {
@@ -44,4 +57,104 @@
                 .setArguments(args)
                 .launch();
     }
+
+    /** An AsyncTask to unmount a specified volume. */
+    public static class UnmountTask extends AsyncTask<Void, Void, Exception> {
+        private final Context mContext;
+        private final StorageManager mStorageManager;
+        private final String mVolumeId;
+        private final String mDescription;
+
+        public UnmountTask(Context context, VolumeInfo volume) {
+            mContext = context.getApplicationContext();
+            mStorageManager = mContext.getSystemService(StorageManager.class);
+            mVolumeId = volume.getId();
+            mDescription = mStorageManager.getBestVolumeDescription(volume);
+        }
+
+        @Override
+        protected Exception doInBackground(Void... params) {
+            try {
+                mStorageManager.unmount(mVolumeId);
+                return null;
+            } catch (Exception e) {
+                return e;
+            }
+        }
+
+        @Override
+        protected void onPostExecute(Exception e) {
+            if (e == null) {
+                Toast.makeText(mContext, mContext.getString(R.string.storage_unmount_success,
+                        mDescription), Toast.LENGTH_SHORT).show();
+            } else {
+                Log.e(TAG, "Failed to unmount " + mVolumeId, e);
+                Toast.makeText(mContext, mContext.getString(R.string.storage_unmount_failure,
+                        mDescription), Toast.LENGTH_SHORT).show();
+            }
+        }
+    }
+
+    /** An AsyncTask to mount a specified volume. */
+    public static class MountTask extends AsyncTask<Void, Void, Exception> {
+        private final Context mContext;
+        private final StorageManager mStorageManager;
+        private final String mVolumeId;
+        private final String mDescription;
+
+        public MountTask(Context context, VolumeInfo volume) {
+            mContext = context.getApplicationContext();
+            mStorageManager = mContext.getSystemService(StorageManager.class);
+            mVolumeId = volume.getId();
+            mDescription = mStorageManager.getBestVolumeDescription(volume);
+        }
+
+        @Override
+        protected Exception doInBackground(Void... params) {
+            try {
+                mStorageManager.mount(mVolumeId);
+                return null;
+            } catch (Exception e) {
+                return e;
+            }
+        }
+
+        @Override
+        protected void onPostExecute(Exception e) {
+            if (e == null) {
+                Toast.makeText(mContext, mContext.getString(R.string.storage_mount_success,
+                        mDescription), Toast.LENGTH_SHORT).show();
+            } else {
+                Log.e(TAG, "Failed to mount " + mVolumeId, e);
+                Toast.makeText(mContext, mContext.getString(R.string.storage_mount_failure,
+                        mDescription), Toast.LENGTH_SHORT).show();
+            }
+        }
+    }
+
+    /* Shows information about system storage. */
+    public static class SystemInfoFragment extends InstrumentedDialogFragment {
+        /** Shows the fragment. */
+        public static void show(Fragment parent) {
+            if (!parent.isAdded()) return;
+
+            final SystemInfoFragment dialog = new SystemInfoFragment();
+            dialog.setTargetFragment(parent, 0);
+            dialog.show(parent.getFragmentManager(), "systemInfo");
+        }
+
+        @Override
+        public int getMetricsCategory() {
+            return SettingsEnums.DIALOG_STORAGE_SYSTEM_INFO;
+        }
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            return new AlertDialog.Builder(getActivity())
+                    .setMessage(getContext().getString(R.string.storage_detail_dialog_system,
+                            Build.VERSION.RELEASE_OR_CODENAME))
+                    .setPositiveButton(android.R.string.ok, null)
+                    .create();
+        }
+    }
 }
diff --git a/src/com/android/settings/widget/DonutView.java b/src/com/android/settings/widget/DonutView.java
deleted file mode 100644
index 1371663..0000000
--- a/src/com/android/settings/widget/DonutView.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-package com.android.settings.widget;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.Typeface;
-import android.icu.text.DecimalFormatSymbols;
-import android.text.Layout;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.Spanned;
-import android.text.StaticLayout;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.text.style.RelativeSizeSpan;
-import android.util.AttributeSet;
-import android.view.View;
-
-import androidx.annotation.ColorRes;
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.Utils;
-
-import java.util.Locale;
-
-/**
- * DonutView represents a donut graph. It visualizes a certain percentage of fullness with a
- * corresponding label with the fullness on the inside (i.e. "50%" inside of the donut).
- */
-public class DonutView extends View {
-    private static final int TOP = -90;
-    // From manual testing, this is the longest we can go without visual errors.
-    private static final int LINE_CHARACTER_LIMIT = 10;
-    private float mStrokeWidth;
-    private double mPercent;
-    private Paint mBackgroundCircle;
-    private Paint mFilledArc;
-    private TextPaint mTextPaint;
-    private TextPaint mBigNumberPaint;
-    private String mPercentString;
-    private String mFullString;
-    private boolean mShowPercentString = true;
-    private int mMeterBackgroundColor;
-    private int mMeterConsumedColor;
-
-    public DonutView(Context context) {
-        super(context);
-    }
-
-    public DonutView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mMeterBackgroundColor = context.getColor(R.color.meter_background_color);
-        mMeterConsumedColor = Utils.getColorStateListDefaultColor(mContext,
-                R.color.meter_consumed_color);
-        boolean applyColorAccent = true;
-        Resources resources = context.getResources();
-        mStrokeWidth = resources.getDimension(R.dimen.storage_donut_thickness);
-
-        if (attrs != null) {
-            TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.DonutView);
-            mMeterBackgroundColor = styledAttrs.getColor(R.styleable.DonutView_meterBackgroundColor,
-                    mMeterBackgroundColor);
-            mMeterConsumedColor = styledAttrs.getColor(R.styleable.DonutView_meterConsumedColor,
-                    mMeterConsumedColor);
-            applyColorAccent = styledAttrs.getBoolean(R.styleable.DonutView_applyColorAccent,
-                    true);
-            mShowPercentString = styledAttrs.getBoolean(R.styleable.DonutView_showPercentString,
-                    true);
-            mStrokeWidth = styledAttrs.getDimensionPixelSize(R.styleable.DonutView_thickness,
-                    (int) mStrokeWidth);
-            styledAttrs.recycle();
-        }
-
-        mBackgroundCircle = new Paint();
-        mBackgroundCircle.setAntiAlias(true);
-        mBackgroundCircle.setStrokeCap(Paint.Cap.BUTT);
-        mBackgroundCircle.setStyle(Paint.Style.STROKE);
-        mBackgroundCircle.setStrokeWidth(mStrokeWidth);
-        mBackgroundCircle.setColor(mMeterBackgroundColor);
-
-        mFilledArc = new Paint();
-        mFilledArc.setAntiAlias(true);
-        mFilledArc.setStrokeCap(Paint.Cap.BUTT);
-        mFilledArc.setStyle(Paint.Style.STROKE);
-        mFilledArc.setStrokeWidth(mStrokeWidth);
-        mFilledArc.setColor(mMeterConsumedColor);
-
-        if (applyColorAccent) {
-            final ColorFilter mAccentColorFilter =
-                    new PorterDuffColorFilter(
-                            Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent),
-                            PorterDuff.Mode.SRC_IN);
-            mBackgroundCircle.setColorFilter(mAccentColorFilter);
-            mFilledArc.setColorFilter(mAccentColorFilter);
-        }
-
-        final Locale locale = resources.getConfiguration().locale;
-        final int layoutDirection = TextUtils.getLayoutDirectionFromLocale(locale);
-        final int bidiFlags = (layoutDirection == LAYOUT_DIRECTION_LTR)
-                ? Paint.BIDI_LTR
-                : Paint.BIDI_RTL;
-
-        mTextPaint = new TextPaint();
-        mTextPaint.setColor(Utils.getColorAccentDefaultColor(getContext()));
-        mTextPaint.setAntiAlias(true);
-        mTextPaint.setTextSize(
-                resources.getDimension(R.dimen.storage_donut_view_label_text_size));
-        mTextPaint.setTextAlign(Paint.Align.CENTER);
-        mTextPaint.setBidiFlags(bidiFlags);
-
-        mBigNumberPaint = new TextPaint();
-        mBigNumberPaint.setColor(Utils.getColorAccentDefaultColor(getContext()));
-        mBigNumberPaint.setAntiAlias(true);
-        mBigNumberPaint.setTextSize(
-                resources.getDimension(R.dimen.storage_donut_view_percent_text_size));
-        mBigNumberPaint.setTypeface(Typeface.create(
-                context.getString(com.android.internal.R.string.config_headlineFontFamily),
-                Typeface.NORMAL));
-        mBigNumberPaint.setBidiFlags(bidiFlags);
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-        drawDonut(canvas);
-        if (mShowPercentString) {
-            drawInnerText(canvas);
-        }
-    }
-
-    private void drawDonut(Canvas canvas) {
-        canvas.drawArc(
-                0 + mStrokeWidth,
-                0 + mStrokeWidth,
-                getWidth() - mStrokeWidth,
-                getHeight() - mStrokeWidth,
-                TOP,
-                360,
-                false,
-                mBackgroundCircle);
-
-        canvas.drawArc(
-                0 + mStrokeWidth,
-                0 + mStrokeWidth,
-                getWidth() - mStrokeWidth,
-                getHeight() - mStrokeWidth,
-                TOP,
-                (360 *  (float) mPercent),
-                false,
-                mFilledArc);
-    }
-
-    private void drawInnerText(Canvas canvas) {
-        final float centerX = getWidth() / 2;
-        final float centerY = getHeight() / 2;
-        final float totalHeight = getTextHeight(mTextPaint) + getTextHeight(mBigNumberPaint);
-        final float startY = centerY + totalHeight / 2;
-        // Support from Android P
-        final String localizedPercentSign = new DecimalFormatSymbols().getPercentString();
-
-        // The first line y-coordinates start at (total height - all TextPaint height) / 2
-        canvas.save();
-        final Spannable percentStringSpan =
-                getPercentageStringSpannable(getResources(), mPercentString, localizedPercentSign);
-        final StaticLayout percentStringLayout = new StaticLayout(percentStringSpan,
-                mBigNumberPaint, getWidth(), Layout.Alignment.ALIGN_CENTER, 1, 0, false);
-        canvas.translate(0, (getHeight() - totalHeight) / 2);
-        percentStringLayout.draw(canvas);
-        canvas.restore();
-
-        // The second line starts at the bottom + room for the descender.
-        canvas.drawText(mFullString, centerX, startY - mTextPaint.descent(), mTextPaint);
-    }
-
-    /**
-     * Set a percentage full to have the donut graph.
-     */
-    public void setPercentage(double percent) {
-        mPercent = percent;
-        mPercentString = Utils.formatPercentage(mPercent);
-        mFullString = getContext().getString(R.string.storage_percent_full);
-        if (mFullString.length() > LINE_CHARACTER_LIMIT) {
-            mTextPaint.setTextSize(
-                    getContext()
-                            .getResources()
-                            .getDimension(
-                                    R.dimen.storage_donut_view_shrunken_label_text_size));
-        }
-        setContentDescription(getContext().getString(
-                R.string.join_two_unrelated_items, mPercentString, mFullString));
-        invalidate();
-    }
-
-    @ColorRes
-    public int getMeterBackgroundColor() {
-        return mMeterBackgroundColor;
-    }
-
-    public void setMeterBackgroundColor(@ColorRes int meterBackgroundColor) {
-        mMeterBackgroundColor = meterBackgroundColor;
-        mBackgroundCircle.setColor(meterBackgroundColor);
-        invalidate();
-    }
-
-    @ColorRes
-    public int getMeterConsumedColor() {
-        return mMeterConsumedColor;
-    }
-
-    public void setMeterConsumedColor(@ColorRes int meterConsumedColor) {
-        mMeterConsumedColor = meterConsumedColor;
-        mFilledArc.setColor(meterConsumedColor);
-        invalidate();
-    }
-
-    @VisibleForTesting
-    static Spannable getPercentageStringSpannable(
-            Resources resources, String percentString, String percentageSignString) {
-        final float fontProportion =
-                resources.getDimension(R.dimen.storage_donut_view_percent_sign_size)
-                        / resources.getDimension(R.dimen.storage_donut_view_percent_text_size);
-        final Spannable percentStringSpan = new SpannableString(percentString);
-        int startIndex = percentString.indexOf(percentageSignString);
-        int endIndex = startIndex + percentageSignString.length();
-
-        // Fallback to no small string if we can't find the percentage sign.
-        if (startIndex < 0) {
-            startIndex = 0;
-            endIndex = percentString.length();
-        }
-
-        percentStringSpan.setSpan(
-                new RelativeSizeSpan(fontProportion),
-                startIndex,
-                endIndex,
-                Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
-        return percentStringSpan;
-    }
-
-    private float getTextHeight(TextPaint paint) {
-        // Technically, this should be the cap height, but I can live with the descent - ascent.
-        return paint.descent() - paint.ascent();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java
deleted file mode 100644
index d96473b..0000000
--- a/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.storage.VolumeInfo;
-
-import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-public class StorageSettingsTest {
-
-    @Mock
-    private StorageManagerVolumeProvider mStorageManagerVolumeProvider;
-    @Mock
-    private Activity mActivity;
-
-    private List<VolumeInfo> mVolumes;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mVolumes = new ArrayList<>();
-        mVolumes.add(mock(VolumeInfo.class, RETURNS_DEEP_STUBS));
-        when(mStorageManagerVolumeProvider.getVolumes()).thenReturn(mVolumes);
-    }
-
-    @Test
-    public void handlePublicVolumeClick_startsANonNullActivityWhenVolumeHasNoBrowse() {
-        VolumeInfo volumeInfo = mock(VolumeInfo.class, RETURNS_DEEP_STUBS);
-        when(volumeInfo.isMountedReadable()).thenReturn(true);
-        StorageSettings.handlePublicVolumeClick(mActivity, volumeInfo);
-
-        verify(mActivity, never()).startActivity(null);
-        verify(mActivity).startActivity(any(Intent.class));
-    }
-
-    @Test
-    public void handleStubVolumeClick_startsANonNullActivityWhenVolumeHasNoBrowse() {
-        VolumeInfo volumeInfo = mock(VolumeInfo.class, RETURNS_DEEP_STUBS);
-        when(volumeInfo.isMountedReadable()).thenReturn(true);
-
-        StorageSettings.handleStubVolumeClick(mActivity, volumeInfo);
-
-        verify(mActivity, never()).startActivity(null);
-        verify(mActivity).startActivity(any(Intent.class));
-    }
-}
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 b7bf7f5..4a1ea40 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -48,7 +48,6 @@
 import com.android.settings.SubSettings;
 import com.android.settings.applications.manageapplications.ManageApplications;
 import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
-import com.android.settings.deviceinfo.PrivateVolumeSettings;
 import com.android.settings.deviceinfo.StorageItemPreference;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settingslib.applications.StorageStatsSource;
@@ -329,7 +328,7 @@
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
 
         verify(mFragment.getFragmentManager().beginTransaction())
-            .add(nullable(PrivateVolumeSettings.SystemInfoFragment.class), nullable(String.class));
+            .add(nullable(StorageUtils.SystemInfoFragment.class), nullable(String.class));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
deleted file mode 100644
index cd6f082..0000000
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo.storage;
-
-import static com.android.settings.TestUtils.GIGABYTE;
-import static com.android.settings.TestUtils.KILOBYTE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.storage.VolumeInfo;
-import android.text.format.Formatter;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.Button;
-import android.widget.LinearLayout;
-
-import androidx.preference.PreferenceScreen;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.shadow.ShadowPrivateStorageInfo;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.deviceinfo.PrivateStorageInfo;
-import com.android.settingslib.deviceinfo.StorageVolumeProvider;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-
-import java.io.File;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowPrivateStorageInfo.class)
-public class StorageSummaryDonutPreferenceControllerTest {
-
-    private Context mContext;
-    private StorageSummaryDonutPreferenceController mController;
-    private StorageSummaryDonutPreference mPreference;
-    private PreferenceViewHolder mHolder;
-    private FakeFeatureFactory mFakeFeatureFactory;
-    private MetricsFeatureProvider mMetricsFeatureProvider;
-    private PreferenceScreen mScreen;
-
-    @Before
-    public void setUp() throws Exception {
-        ShadowPrivateStorageInfo.setPrivateStorageInfo(new PrivateStorageInfo(10L, 100L));
-        mContext = spy(Robolectric.setupActivity(Activity.class));
-        mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
-        mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
-        mController = new StorageSummaryDonutPreferenceController(mContext, "key");
-        mPreference = new StorageSummaryDonutPreference(mContext);
-        mScreen = spy(new PreferenceScreen(mContext, null));
-        when(mScreen.findPreference("key")).thenReturn(mPreference);
-
-        LayoutInflater inflater = LayoutInflater.from(mContext);
-        final View view =
-                inflater.inflate(mPreference.getLayoutResource(), new LinearLayout(mContext),
-                        false);
-        mHolder = PreferenceViewHolder.createInstanceForTests(view);
-    }
-
-    @After
-    public void tearDown() {
-        ShadowPrivateStorageInfo.reset();
-    }
-
-    @Test
-    public void testEmpty() {
-        final long totalSpace = 32 * GIGABYTE;
-        final long usedSpace = 0;
-        mController.displayPreference(mScreen);
-        mController.updateBytes(0, 32 * GIGABYTE);
-        mController.updateState(mPreference);
-
-        final Formatter.BytesResult usedSpaceResults =
-                Formatter.formatBytes(mContext.getResources(), usedSpace, 0 /* flags */);
-        assertThat(mPreference.getTitle().toString())
-                .isEqualTo(usedSpaceResults.value + " " + usedSpaceResults.units);
-        assertThat(mPreference.getSummary().toString())
-                .isEqualTo("Used of " + Formatter.formatShortFileSize(mContext, totalSpace));
-    }
-
-    @Test
-    public void testTotalStorage() {
-        final long totalSpace = KILOBYTE * 10;
-        final long usedSpace = KILOBYTE;
-        mController.displayPreference(mScreen);
-        mController.updateBytes(KILOBYTE, totalSpace);
-        mController.updateState(mPreference);
-
-        final Formatter.BytesResult usedSpaceResults =
-                Formatter.formatBytes(mContext.getResources(), usedSpace, 0 /* flags */);
-        assertThat(mPreference.getTitle().toString())
-                .isEqualTo(usedSpaceResults.value + " " + usedSpaceResults.units);
-        assertThat(mPreference.getSummary().toString())
-                .isEqualTo("Used of " + Formatter.formatShortFileSize(mContext, totalSpace));
-    }
-
-    @Test
-    public void testPopulateWithVolume() {
-        final long totalSpace = KILOBYTE * 10;
-        final long freeSpace = KILOBYTE;
-        final long usedSpace = totalSpace - freeSpace;
-        final VolumeInfo volume = Mockito.mock(VolumeInfo.class);
-        final File file = Mockito.mock(File.class);
-        final StorageVolumeProvider svp = Mockito.mock(StorageVolumeProvider.class);
-        when(volume.getPath()).thenReturn(file);
-        when(file.getTotalSpace()).thenReturn(totalSpace);
-        when(file.getFreeSpace()).thenReturn(freeSpace);
-        when(svp.getPrimaryStorageSize()).thenReturn(totalSpace);
-        mController.displayPreference(mScreen);
-
-        mController.updateSizes(svp, volume);
-        mController.updateState(mPreference);
-
-        final Formatter.BytesResult usedSpaceResults =
-                Formatter.formatBytes(mContext.getResources(), usedSpace, 0 /* flags */);
-        assertThat(mPreference.getTitle().toString())
-                .isEqualTo(usedSpaceResults.value + " " + usedSpaceResults.units);
-        assertThat(mPreference.getSummary().toString())
-                .isEqualTo("Used of " + Formatter.formatShortFileSize(mContext, totalSpace));
-    }
-
-    @Test
-    public void testFreeUpSpaceMetricIsTriggered() {
-        mPreference.onBindViewHolder(mHolder);
-        final Button button = (Button) mHolder.findViewById(R.id.deletion_helper_button);
-
-        mPreference.onClick(button);
-
-        verify(mMetricsFeatureProvider, times(1))
-                .action(any(Context.class), eq(MetricsEvent.STORAGE_FREE_UP_SPACE_NOW));
-    }
-}
diff --git a/tests/unit/src/com/android/settings/widget/DonutViewTest.java b/tests/unit/src/com/android/settings/widget/DonutViewTest.java
deleted file mode 100644
index ad02d0e..0000000
--- a/tests/unit/src/com/android/settings/widget/DonutViewTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.
- */
-package com.android.settings.widget;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class DonutViewTest {
-    @Test
-    public void getPercentageStringSpannable_doesntCrashForMissingPercentage() {
-        Context context = ApplicationProvider.getApplicationContext();
-
-        DonutView.getPercentageStringSpannable(context.getResources(), "50%", "h");
-    }
-}