diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index 532c720706a..ee68311a868 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -58,6 +58,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; @@ -165,17 +166,14 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index for (VolumeInfo vol : volumes) { if (vol.getType() == VolumeInfo.TYPE_PRIVATE) { + final long volumeTotalBytes = getTotalSize(vol); final int color = COLOR_PRIVATE[privateCount++ % COLOR_PRIVATE.length]; mInternalCategory.addPreference( - new StorageVolumePreference(context, vol, color, sTotalInternalStorage)); + new StorageVolumePreference(context, vol, color, volumeTotalBytes)); if (vol.isMountedReadable()) { final File path = vol.getPath(); - privateUsedBytes += path.getTotalSpace() - path.getFreeSpace(); - if (sTotalInternalStorage > 0) { - privateTotalBytes = sTotalInternalStorage; - } else { - privateTotalBytes += path.getTotalSpace(); - } + privateUsedBytes += (volumeTotalBytes - path.getFreeSpace()); + privateTotalBytes += volumeTotalBytes; } } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC) { mExternalCategory.addPreference( @@ -277,7 +275,7 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index if (vol.getType() == VolumeInfo.TYPE_PRIVATE) { final Bundle args = new Bundle(); args.putString(VolumeInfo.EXTRA_VOLUME_ID, vol.getId()); - PrivateVolumeSettings.setVolumeSize(args, sTotalInternalStorage); + PrivateVolumeSettings.setVolumeSize(args, getTotalSize(vol)); startFragment(this, PrivateVolumeSettings.class.getCanonicalName(), -1, 0, args); return true; @@ -495,19 +493,11 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index long privateFreeBytes = 0; long privateTotalBytes = 0; for (VolumeInfo info : volumes) { - if (info.getType() != VolumeInfo.TYPE_PUBLIC - && info.getType() != VolumeInfo.TYPE_PRIVATE) { - continue; - } final File path = info.getPath(); - if (path == null) { + if (info.getType() != VolumeInfo.TYPE_PRIVATE || path == null) { continue; } - if (info.getType() == VolumeInfo.TYPE_PRIVATE && sTotalInternalStorage > 0) { - privateTotalBytes = sTotalInternalStorage; - } else { - privateTotalBytes += path.getTotalSpace(); - } + privateTotalBytes += getTotalSize(info); privateFreeBytes += path.getFreeSpace(); } long privateUsedBytes = privateTotalBytes - privateFreeBytes; @@ -517,6 +507,27 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index } } + private static long getTotalSize(VolumeInfo info) { + // Device could have more than one primary storage, which could be located in the + // internal flash (UUID_PRIVATE_INTERNAL) or in an external disk. + // If it's internal, try to get its total size from StorageManager first + // (sTotalInternalStorage), since that size is more precise because it accounts for + // the system partition. + if (info.getType() == VolumeInfo.TYPE_PRIVATE + && Objects.equals(info.getFsUuid(), StorageManager.UUID_PRIVATE_INTERNAL) + && sTotalInternalStorage > 0) { + return sTotalInternalStorage; + } else { + final File path = info.getPath(); + if (path == null) { + // Should not happen, caller should have checked. + Log.e(TAG, "info's path is null on getTotalSize(): " + info); + return 0; + } + return path.getTotalSpace(); + } + } + public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY = new SummaryLoader.SummaryProviderFactory() { @Override