Merge "Only show storage category stats preferences for private volumes" into sc-dev
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);
-    }
 }