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)
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 68b1a48..f9f4cdf 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -63,6 +63,7 @@
 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 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 @@
                 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 52f453d..d1d4cbe 100644
--- a/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
@@ -211,7 +211,9 @@
 
         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 f31f2be..4138057 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -387,7 +387,9 @@
 
         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 e682783..43dc9dd 100644
--- a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
@@ -74,10 +74,14 @@
         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 be2a64a..23559d4 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.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 @@
                 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();