From 3335c72da9c4315ca2fb265d9436aaadfbc1d034 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Wed, 31 May 2023 18:42:11 +0800 Subject: [PATCH] Correct used size of Storage Settings. Since StorageManager rounded the totalBytes of device storage but they don't do that rounding for freeBytes. So in some cases the freeBytes can be greater than totalBytes. We propose to get totalBytes of device storage directly to calculate correct privateUsedBytes. Test: robotest Bug: 281955532 Change-Id: I4f137c20e7c2f54f4e037d50e81b3176edc1a83a (cherry picked from commit e52320e755823fc94e3be11fefa7d5d718daba24) --- src/com/android/settings/Utils.java | 13 ++++++++++++- .../deviceinfo/StorageCategoryFragment.java | 4 +++- .../deviceinfo/StorageDashboardFragment.java | 4 +++- .../TopLevelStoragePreferenceController.java | 8 ++++++-- ...StorageUsageProgressBarPreferenceController.java | 5 ++++- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 68b1a48a380..f9f4cdfbb75 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -63,6 +63,7 @@ import android.os.BatteryManager; import android.os.Binder; import android.os.Build; import android.os.Bundle; +import android.os.Environment; import android.os.IBinder; import android.os.INetworkManagementService; import android.os.RemoteException; @@ -97,7 +98,6 @@ import android.widget.TabWidget; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.StringRes; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.drawable.IconCompat; import androidx.core.graphics.drawable.RoundedBitmapDrawable; @@ -1295,4 +1295,15 @@ public final class Utils extends com.android.settingslib.Utils { com.android.internal.R.bool.config_dreamsOnlyEnabledForDockUser); return dreamsSupported && (!dreamsOnlyEnabledForDockUser || canCurrentUserDream(context)); } + + /** + * Get private total size directly. + * Referred from StorageManager + */ + public static long getPrimaryStorageSize() { + // TODO(b/288103116): remove this method once support by StorageManager. + return Environment.getDataDirectory().getTotalSpace() + + Environment.getRootDirectory().getTotalSpace(); + } + } diff --git a/src/com/android/settings/deviceinfo/StorageCategoryFragment.java b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java index 52f453d46a9..d1d4cbe7f50 100644 --- a/src/com/android/settings/deviceinfo/StorageCategoryFragment.java +++ b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java @@ -211,7 +211,9 @@ public class StorageCategoryFragment extends DashboardFragment setLoading(false /* loading */, false /* animate */); - final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes; + // TODO(b/288103116): replace with new API to get TotalBytes before rounding + // once support by StorageManager. + final long privateUsedBytes = Utils.getPrimaryStorageSize() - mStorageInfo.freeBytes; mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo()); mPreferenceController.setUsedSize(privateUsedBytes); mPreferenceController.setTotalSize(mStorageInfo.totalBytes); diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java index f31f2be0049..4138057a90c 100644 --- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java +++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java @@ -387,7 +387,9 @@ public class StorageDashboardFragment extends DashboardFragment setLoading(false /* loading */, false /* animate */); - final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes; + // TODO(b/288103116): replace with new API to get TotalBytes before rounding + // once support by StorageManager. + final long privateUsedBytes = Utils.getPrimaryStorageSize() - mStorageInfo.freeBytes; mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo()); mPreferenceController.setUsedSize(privateUsedBytes); mPreferenceController.setTotalSize(mStorageInfo.totalBytes); diff --git a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java index e6827832a8e..43dc9dd0d15 100644 --- a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java +++ b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java @@ -74,10 +74,14 @@ public class TopLevelStoragePreferenceController extends BasePreferenceControlle return ThreadUtils.postOnBackgroundThread(() -> { final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo( getStorageManagerVolumeProvider()); - storageCacheHelper.cacheUsedSize(info.totalBytes - info.freeBytes); + + // TODO(b/288103116): replace with new API to get TotalBytes before rounding + // once support by StorageManager. + long usedBytes = Utils.getPrimaryStorageSize() - info.freeBytes; + storageCacheHelper.cacheUsedSize(usedBytes); ThreadUtils.postOnMainThread(() -> { preference.setSummary( - getSummary(info.totalBytes - info.freeBytes, info.totalBytes)); + getSummary(usedBytes, info.totalBytes)); }); }); } diff --git a/src/com/android/settings/deviceinfo/storage/StorageUsageProgressBarPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageUsageProgressBarPreferenceController.java index be2a64abf58..23559d4db00 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageUsageProgressBarPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageUsageProgressBarPreferenceController.java @@ -26,6 +26,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.widget.UsageProgressBarPreference; @@ -92,7 +93,9 @@ public class StorageUsageProgressBarPreferenceController extends BasePreferenceC if (mStorageEntry.isPrivate()) { // StorageStatsManager can only query private storages. mTotalBytes = mStorageStatsManager.getTotalBytes(mStorageEntry.getFsUuid()); - mUsedBytes = mTotalBytes + // TODO(b/288103116): replace with new API to get TotalBytes before rounding + // once support by StorageManager. + mUsedBytes = Utils.getPrimaryStorageSize() - mStorageStatsManager.getFreeBytes(mStorageEntry.getFsUuid()); } else { final File rootFile = mStorageEntry.getPath();