From 40396d532f0d7f588e623f968fe098f697bed5ec Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Fri, 19 Mar 2021 15:35:06 +0800 Subject: [PATCH] Only show storage category stats preferences for private volumes Hide it because there is no framework API to get storage category stats of public volumes. Bug: 174964885 Test: manual Observe storage settings UI of a USB flash drive. Change-Id: I7272cd18c186793f86548a87b5cb88bb957ff8d5 --- .../deviceinfo/StorageDashboardFragment.java | 6 ++-- .../StorageItemPreferenceController.java | 35 ++++++++++++------- .../deviceinfo/storage/VolumeSizesLoader.java | 18 ++-------- .../storage/VolumeSizesLoaderTest.java | 19 +--------- 4 files changed, 30 insertions(+), 48 deletions(-) diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java index 7af4f0cfd02..b8c4e286777 100644 --- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java +++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java @@ -248,13 +248,15 @@ public class StorageDashboardFragment extends DashboardFragment 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 dba72ba5ac6..e007090f3eb 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java @@ -192,7 +192,27 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle */ 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 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle mSystemPreference = screen.findPreference(SYSTEM_KEY); mFilePreference = screen.findPreference(FILES_KEY); - setFilesPreferenceVisibility(); + updateCategoryPreferencesVisibility(); } public void onLoadFinished(SparseArray result, @@ -296,17 +316,6 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle 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 64510c6f602..d95befaa3ae 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.PrivateStorageInfo; 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 { @@ -50,11 +49,6 @@ public class VolumeSizesLoader extends AsyncLoaderCompat { @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 @@ public class VolumeSizesLoader extends AsyncLoaderCompat { 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 77fd9636150..79c5db8d831 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 @@ import org.junit.runner.RunWith; @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 @@ public class VolumeSizesLoaderTest { 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); - } }