diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index 7af4f0c..b8c4e28 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -248,13 +248,15 @@
 
         mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
 
-        if (mSelectedStorageEntry.isMounted()) {
+        if (mSelectedStorageEntry.isPrivate() && mSelectedStorageEntry.isMounted()) {
+            // Stats data is only available on private volumes.
             getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
             getLoaderManager()
                  .restartLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
             getLoaderManager().restartLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks());
         } else {
-            mPreferenceController.clearStorageSizeDisplay();
+            // Set null volume to hide category stats.
+            mPreferenceController.setVolume(null);
         }
     }
 
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index dba72ba..e007090 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -192,7 +192,27 @@
      */
     public void setVolume(VolumeInfo volume) {
         mVolume = volume;
-        setFilesPreferenceVisibility();
+        updateCategoryPreferencesVisibility();
+    }
+
+    private void updateCategoryPreferencesVisibility() {
+        // Stats data is only available on private volumes.
+        final boolean isValidVolume = mVolume != null
+                && mVolume.getType() == VolumeInfo.TYPE_PRIVATE
+                && (mVolume.getState() == VolumeInfo.STATE_MOUNTED
+                || mVolume.getState() == VolumeInfo.STATE_MOUNTED_READ_ONLY);
+
+        mPhotoPreference.setVisible(isValidVolume);
+        mAudioPreference.setVisible(isValidVolume);
+        mGamePreference.setVisible(isValidVolume);
+        mMoviesPreference.setVisible(isValidVolume);
+        mAppPreference.setVisible(isValidVolume);
+        mFilePreference.setVisible(isValidVolume);
+        mSystemPreference.setVisible(isValidVolume);
+
+        if (isValidVolume) {
+            setFilesPreferenceVisibility();
+        }
     }
 
     private void setFilesPreferenceVisibility() {
@@ -251,7 +271,7 @@
         mSystemPreference = screen.findPreference(SYSTEM_KEY);
         mFilePreference = screen.findPreference(FILES_KEY);
 
-        setFilesPreferenceVisibility();
+        updateCategoryPreferencesVisibility();
     }
 
     public void onLoadFinished(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
@@ -296,17 +316,6 @@
         mTotalSize = totalSizeBytes;
     }
 
-    /** Set storage size to 0 for each preference. */
-    public void clearStorageSizeDisplay() {
-        mPhotoPreference.setStorageSize(0L, 0L);
-        mAudioPreference.setStorageSize(0L, 0L);
-        mGamePreference.setStorageSize(0L, 0L);
-        mMoviesPreference.setStorageSize(0L, 0L);
-        mAppPreference.setStorageSize(0L, 0L);
-        mFilePreference.setStorageSize(0L, 0L);
-        mSystemPreference.setStorageSize(0L, 0L);
-    }
-
     /**
      * Returns a list of keys used by this preference controller.
      */
diff --git a/src/com/android/settings/deviceinfo/storage/VolumeSizesLoader.java b/src/com/android/settings/deviceinfo/storage/VolumeSizesLoader.java
index 64510c6..d95befa 100644
--- a/src/com/android/settings/deviceinfo/storage/VolumeSizesLoader.java
+++ b/src/com/android/settings/deviceinfo/storage/VolumeSizesLoader.java
@@ -26,7 +26,6 @@
 import com.android.settingslib.deviceinfo.StorageVolumeProvider;
 import com.android.settingslib.utils.AsyncLoaderCompat;
 
-import java.io.File;
 import java.io.IOException;
 
 public class VolumeSizesLoader extends AsyncLoaderCompat<PrivateStorageInfo> {
@@ -50,11 +49,6 @@
 
     @Override
     public PrivateStorageInfo loadInBackground() {
-        if (mVolume == null || (mVolume.getState() != VolumeInfo.STATE_MOUNTED
-                && mVolume.getState() != VolumeInfo.STATE_MOUNTED_READ_ONLY)) {
-            return new PrivateStorageInfo(0L /* freeBytes */, 0L /* totalBytes */);
-        }
-
         PrivateStorageInfo volumeSizes;
         try {
             volumeSizes = getVolumeSize(mVolumeProvider, mStats, mVolume);
@@ -68,14 +62,8 @@
     static PrivateStorageInfo getVolumeSize(
             StorageVolumeProvider storageVolumeProvider, StorageStatsManager stats, VolumeInfo info)
             throws IOException {
-        if (info.getType() == VolumeInfo.TYPE_PRIVATE) {
-            return new PrivateStorageInfo(storageVolumeProvider.getFreeBytes(stats, info),
-                    storageVolumeProvider.getTotalBytes(stats, info));
-        }
-        // TODO(b/174964885): It's confusing to use PrivateStorageInfo for a public storage,
-        //                    replace it with a new naming or a different object.
-        final File rootFile = info.getPath();
-        return rootFile == null ? new PrivateStorageInfo(0L /* freeBytes */, 0L /* totalBytes */)
-                : new PrivateStorageInfo(rootFile.getFreeSpace(), rootFile.getTotalSpace());
+        long privateTotalBytes = storageVolumeProvider.getTotalBytes(stats, info);
+        long privateFreeBytes = storageVolumeProvider.getFreeBytes(stats, info);
+        return new PrivateStorageInfo(privateFreeBytes, privateTotalBytes);
     }
 }
diff --git a/tests/unit/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java b/tests/unit/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java
index 77fd963..79c5db8 100644
--- a/tests/unit/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/storage/VolumeSizesLoaderTest.java
@@ -34,10 +34,8 @@
 @RunWith(AndroidJUnit4.class)
 public class VolumeSizesLoaderTest {
     @Test
-    public void getVolumeSize_privateMountedVolume_getsValidSizes() throws Exception {
+    public void getVolumeSize_getsValidSizes() throws Exception {
         VolumeInfo info = mock(VolumeInfo.class);
-        when(info.getType()).thenReturn(VolumeInfo.TYPE_PRIVATE);
-        when(info.getState()).thenReturn(VolumeInfo.STATE_MOUNTED);
         StorageVolumeProvider storageVolumeProvider = mock(StorageVolumeProvider.class);
         when(storageVolumeProvider.getTotalBytes(any(), any())).thenReturn(10000L);
         when(storageVolumeProvider.getFreeBytes(any(), any())).thenReturn(1000L);
@@ -48,19 +46,4 @@
         assertThat(storageInfo.freeBytes).isEqualTo(1000L);
         assertThat(storageInfo.totalBytes).isEqualTo(10000L);
     }
-
-    @Test
-    public void getVolumeSize_unmountedVolume_getsValidSizes() throws Exception {
-        VolumeInfo info = mock(VolumeInfo.class);
-        when(info.getState()).thenReturn(VolumeInfo.STATE_UNMOUNTED);
-        StorageVolumeProvider storageVolumeProvider = mock(StorageVolumeProvider.class);
-        when(storageVolumeProvider.getTotalBytes(any(), any())).thenReturn(10000L);
-        when(storageVolumeProvider.getFreeBytes(any(), any())).thenReturn(1000L);
-
-        PrivateStorageInfo storageInfo =
-                VolumeSizesLoader.getVolumeSize(storageVolumeProvider, null, info);
-
-        assertThat(storageInfo.freeBytes).isEqualTo(0L);
-        assertThat(storageInfo.totalBytes).isEqualTo(0L);
-    }
 }
