diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/os/storage/StorageVolume.java | 3 | ||||
-rw-r--r-- | core/java/android/os/storage/VolumeInfo.java | 42 |
2 files changed, 36 insertions, 9 deletions
diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java index d66e228..1408202 100644 --- a/core/java/android/os/storage/StorageVolume.java +++ b/core/java/android/os/storage/StorageVolume.java @@ -58,6 +58,9 @@ public class StorageVolume implements Parcelable { // ACTION_MEDIA_BAD_REMOVAL, ACTION_MEDIA_UNMOUNTABLE and ACTION_MEDIA_EJECT broadcasts. public static final String EXTRA_STORAGE_VOLUME = "storage_volume"; + public static final int STORAGE_ID_INVALID = 0x00000000; + public static final int STORAGE_ID_PRIMARY = 0x00010001; + public StorageVolume(String id, int storageId, File path, String description, boolean primary, boolean removable, boolean emulated, long mtpReserveSize, boolean allowMassStorage, long maxFileSize, UserHandle owner, String fsUuid, String state) { diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index 91cb944..a4ee8b7 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -147,15 +147,11 @@ public class VolumeInfo implements Parcelable { public String path; public String internalPath; - /** Framework state */ - public final int mtpIndex; - - public VolumeInfo(String id, int type, DiskInfo disk, String partGuid, int mtpIndex) { + public VolumeInfo(String id, int type, DiskInfo disk, String partGuid) { this.id = Preconditions.checkNotNull(id); this.type = type; this.disk = disk; this.partGuid = partGuid; - this.mtpIndex = mtpIndex; } public VolumeInfo(Parcel parcel) { @@ -175,7 +171,6 @@ public class VolumeInfo implements Parcelable { fsLabel = parcel.readString(); path = parcel.readString(); internalPath = parcel.readString(); - mtpIndex = parcel.readInt(); } public static @NonNull String getEnvironmentForState(int state) { @@ -308,7 +303,6 @@ public class VolumeInfo implements Parcelable { final boolean removable; final boolean emulated; final boolean allowMassStorage = false; - final int mtpStorageId = MtpStorage.getStorageIdForIndex(mtpIndex); final String envState = getEnvironmentForState(state); File userPath = getPathForUser(userId); @@ -326,9 +320,15 @@ public class VolumeInfo implements Parcelable { long mtpReserveSize = 0; long maxFileSize = 0; + int mtpStorageId = StorageVolume.STORAGE_ID_INVALID; if (type == TYPE_EMULATED) { emulated = true; + + if (isPrimary()) { + mtpStorageId = StorageVolume.STORAGE_ID_PRIMARY; + } + mtpReserveSize = StorageManager.from(context).getStorageLowBytes(userPath); if (ID_EMULATED_INTERNAL.equals(id)) { @@ -341,6 +341,14 @@ public class VolumeInfo implements Parcelable { emulated = false; removable = true; + if (isPrimary()) { + mtpStorageId = StorageVolume.STORAGE_ID_PRIMARY; + } else { + // Since MediaProvider currently persists this value, we need a + // value that is stable over time. + mtpStorageId = buildStableMtpStorageId(fsUuid); + } + if ("vfat".equals(fsType)) { maxFileSize = 4294967295L; } @@ -354,6 +362,24 @@ public class VolumeInfo implements Parcelable { fsUuid, envState); } + public static int buildStableMtpStorageId(String fsUuid) { + if (TextUtils.isEmpty(fsUuid)) { + return StorageVolume.STORAGE_ID_INVALID; + } else { + int hash = 0; + for (int i = 0; i < fsUuid.length(); ++i) { + hash = 31 * hash + fsUuid.charAt(i); + } + hash = (hash ^ (hash << 16)) & 0xffff0000; + // Work around values that the spec doesn't allow, or that we've + // reserved for primary + if (hash == 0x00000000) hash = 0x00020000; + if (hash == 0x00010000) hash = 0x00020000; + if (hash == 0xffff0000) hash = 0xfffe0000; + return hash | 0x0001; + } + } + // TODO: avoid this layering violation private static final String DOCUMENT_AUTHORITY = "com.android.externalstorage.documents"; private static final String DOCUMENT_ROOT_PRIMARY_EMULATED = "primary"; @@ -402,7 +428,6 @@ public class VolumeInfo implements Parcelable { pw.println(); pw.printPair("path", path); pw.printPair("internalPath", internalPath); - pw.printPair("mtpIndex", mtpIndex); pw.decreaseIndent(); pw.println(); } @@ -469,6 +494,5 @@ public class VolumeInfo implements Parcelable { parcel.writeString(fsLabel); parcel.writeString(path); parcel.writeString(internalPath); - parcel.writeInt(mtpIndex); } } |