Loading core/java/android/os/storage/VolumeInfo.java +6 −1 Original line number Diff line number Diff line Loading @@ -137,6 +137,7 @@ public class VolumeInfo implements Parcelable { public final String id; public final int type; public final DiskInfo disk; public final String partGuid; public int mountFlags = 0; public int mountUserId = -1; public int state = STATE_UNMOUNTED; Loading @@ -149,10 +150,11 @@ public class VolumeInfo implements Parcelable { /** Framework state */ public final int mtpIndex; public VolumeInfo(String id, int type, DiskInfo disk, int mtpIndex) { public VolumeInfo(String id, int type, DiskInfo disk, String partGuid, int mtpIndex) { this.id = Preconditions.checkNotNull(id); this.type = type; this.disk = disk; this.partGuid = partGuid; this.mtpIndex = mtpIndex; } Loading @@ -164,6 +166,7 @@ public class VolumeInfo implements Parcelable { } else { disk = null; } partGuid = parcel.readString(); mountFlags = parcel.readInt(); mountUserId = parcel.readInt(); state = parcel.readInt(); Loading Loading @@ -385,6 +388,7 @@ public class VolumeInfo implements Parcelable { pw.increaseIndent(); pw.printPair("type", DebugUtils.valueToString(getClass(), "TYPE_", type)); pw.printPair("diskId", getDiskId()); pw.printPair("partGuid", partGuid); pw.printPair("mountFlags", DebugUtils.flagsToString(getClass(), "MOUNT_FLAG_", mountFlags)); pw.printPair("mountUserId", mountUserId); pw.printPair("state", DebugUtils.valueToString(getClass(), "STATE_", state)); Loading Loading @@ -453,6 +457,7 @@ public class VolumeInfo implements Parcelable { } else { parcel.writeInt(0); } parcel.writeString(partGuid); parcel.writeInt(mountFlags); parcel.writeInt(mountUserId); parcel.writeInt(state); Loading core/java/android/os/storage/VolumeRecord.java +5 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ public class VolumeRecord implements Parcelable { public final int type; public final String fsUuid; public String partGuid; public String nickname; public int userFlags; Loading @@ -50,6 +51,7 @@ public class VolumeRecord implements Parcelable { public VolumeRecord(Parcel parcel) { type = parcel.readInt(); fsUuid = parcel.readString(); partGuid = parcel.readString(); nickname = parcel.readString(); userFlags = parcel.readInt(); } Loading Loading @@ -79,6 +81,8 @@ public class VolumeRecord implements Parcelable { pw.increaseIndent(); pw.printPair("type", DebugUtils.valueToString(VolumeInfo.class, "TYPE_", type)); pw.printPair("fsUuid", fsUuid); pw.printPair("partGuid", partGuid); pw.println(); pw.printPair("nickname", nickname); pw.printPair("userFlags", DebugUtils.flagsToString(VolumeRecord.class, "USER_FLAG_", userFlags)); Loading Loading @@ -133,6 +137,7 @@ public class VolumeRecord implements Parcelable { public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(type); parcel.writeString(fsUuid); parcel.writeString(partGuid); parcel.writeString(nickname); parcel.writeInt(userFlags); } Loading core/java/android/text/TextUtils.java +5 −0 Original line number Diff line number Diff line Loading @@ -465,6 +465,11 @@ public class TextUtils { return false; } /** {@hide} */ public static String nullIfEmpty(@Nullable String str) { return isEmpty(str) ? null : str; } /** * Returns the length that the specified CharSequence would have if * spaces and control characters were trimmed from the start and end, Loading services/core/java/com/android/server/MountService.java +35 −9 Original line number Diff line number Diff line Loading @@ -259,6 +259,7 @@ class MountService extends IMountService.Stub private static final String TAG_VOLUME = "volume"; private static final String ATTR_TYPE = "type"; private static final String ATTR_FS_UUID = "fsUuid"; private static final String ATTR_PART_GUID = "partGuid"; private static final String ATTR_NICKNAME = "nickname"; private static final String ATTR_USER_FLAGS = "userFlags"; Loading Loading @@ -689,7 +690,7 @@ class MountService extends IMountService.Stub // Create a stub volume that represents internal storage final VolumeInfo internal = new VolumeInfo(VolumeInfo.ID_PRIVATE_INTERNAL, VolumeInfo.TYPE_PRIVATE, null, 0); VolumeInfo.TYPE_PRIVATE, null, null, 0); internal.state = VolumeInfo.STATE_MOUNTED; internal.path = Environment.getDataDirectory().getAbsolutePath(); mVolumes.put(internal.id, internal); Loading Loading @@ -900,10 +901,12 @@ class MountService extends IMountService.Stub case VoldResponseCode.VOLUME_CREATED: { final String id = cooked[1]; final int type = Integer.parseInt(cooked[2]); final String diskId = (cooked.length == 4) ? cooked[3] : null; final String diskId = TextUtils.nullIfEmpty(cooked[3]); final String partGuid = TextUtils.nullIfEmpty(cooked[4]); final DiskInfo disk = mDisks.get(diskId); final int mtpIndex = allocateMtpIndex(id); final VolumeInfo vol = new VolumeInfo(id, type, disk, mtpIndex); final VolumeInfo vol = new VolumeInfo(id, type, disk, partGuid, mtpIndex); mVolumes.put(id, vol); onVolumeCreatedLocked(vol); break; Loading Loading @@ -1091,13 +1094,21 @@ class MountService extends IMountService.Stub // Remember that we saw this volume so we're ready to accept user // metadata, or so we can annoy them when a private volume is ejected if (vol.isMountedReadable() && !TextUtils.isEmpty(vol.fsUuid)) { if (!mRecords.containsKey(vol.fsUuid)) { final VolumeRecord rec = new VolumeRecord(vol.type, vol.fsUuid); VolumeRecord rec = mRecords.get(vol.fsUuid); if (rec == null) { rec = new VolumeRecord(vol.type, vol.fsUuid); rec.partGuid = vol.partGuid; if (vol.type == VolumeInfo.TYPE_PRIVATE) { rec.nickname = vol.disk.getDescription(); } mRecords.put(rec.fsUuid, rec); writeSettingsLocked(); } else { // Handle upgrade case where we didn't store partition GUID if (TextUtils.isEmpty(rec.partGuid)) { rec.partGuid = vol.partGuid; writeSettingsLocked(); } } } Loading Loading @@ -1347,6 +1358,7 @@ class MountService extends IMountService.Stub final int type = readIntAttribute(in, ATTR_TYPE); final String fsUuid = readStringAttribute(in, ATTR_FS_UUID); final VolumeRecord meta = new VolumeRecord(type, fsUuid); meta.partGuid = readStringAttribute(in, ATTR_PART_GUID); meta.nickname = readStringAttribute(in, ATTR_NICKNAME); meta.userFlags = readIntAttribute(in, ATTR_USER_FLAGS); return meta; Loading @@ -1356,6 +1368,7 @@ class MountService extends IMountService.Stub out.startTag(null, TAG_VOLUME); writeIntAttribute(out, ATTR_TYPE, rec.type); writeStringAttribute(out, ATTR_FS_UUID, rec.fsUuid); writeStringAttribute(out, ATTR_PART_GUID, rec.partGuid); writeStringAttribute(out, ATTR_NICKNAME, rec.nickname); writeIntAttribute(out, ATTR_USER_FLAGS, rec.userFlags); out.endTag(null, TAG_VOLUME); Loading Loading @@ -1573,9 +1586,11 @@ class MountService extends IMountService.Stub Preconditions.checkNotNull(fsUuid); synchronized (mLock) { mRecords.remove(fsUuid); // TODO: tell vold to forget keys final VolumeRecord rec = mRecords.remove(fsUuid); if (rec != null && !TextUtils.isEmpty(rec.partGuid)) { forgetPartition(rec.partGuid); } mCallbacks.notifyVolumeForgotten(fsUuid); // If this had been primary storage, revert back to internal and // reset vold so we bind into new volume into place. Loading @@ -1584,7 +1599,6 @@ class MountService extends IMountService.Stub resetIfReadyAndConnected(); } mCallbacks.notifyVolumeForgotten(fsUuid); writeSettingsLocked(); } } Loading @@ -1597,6 +1611,10 @@ class MountService extends IMountService.Stub synchronized (mLock) { for (int i = 0; i < mRecords.size(); i++) { final String fsUuid = mRecords.keyAt(i); final VolumeRecord rec = mRecords.valueAt(i); if (!TextUtils.isEmpty(rec.partGuid)) { forgetPartition(rec.partGuid); } mCallbacks.notifyVolumeForgotten(fsUuid); } mRecords.clear(); Loading @@ -1610,6 +1628,14 @@ class MountService extends IMountService.Stub } } private void forgetPartition(String partGuid) { try { mConnector.execute("volume", "forget_partition", partGuid); } catch (NativeDaemonConnectorException e) { Slog.w(TAG, "Failed to forget key for " + partGuid + ": " + e); } } @Override public void setDebugFlags(int flags, int mask) { enforcePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS); Loading Loading
core/java/android/os/storage/VolumeInfo.java +6 −1 Original line number Diff line number Diff line Loading @@ -137,6 +137,7 @@ public class VolumeInfo implements Parcelable { public final String id; public final int type; public final DiskInfo disk; public final String partGuid; public int mountFlags = 0; public int mountUserId = -1; public int state = STATE_UNMOUNTED; Loading @@ -149,10 +150,11 @@ public class VolumeInfo implements Parcelable { /** Framework state */ public final int mtpIndex; public VolumeInfo(String id, int type, DiskInfo disk, int mtpIndex) { public VolumeInfo(String id, int type, DiskInfo disk, String partGuid, int mtpIndex) { this.id = Preconditions.checkNotNull(id); this.type = type; this.disk = disk; this.partGuid = partGuid; this.mtpIndex = mtpIndex; } Loading @@ -164,6 +166,7 @@ public class VolumeInfo implements Parcelable { } else { disk = null; } partGuid = parcel.readString(); mountFlags = parcel.readInt(); mountUserId = parcel.readInt(); state = parcel.readInt(); Loading Loading @@ -385,6 +388,7 @@ public class VolumeInfo implements Parcelable { pw.increaseIndent(); pw.printPair("type", DebugUtils.valueToString(getClass(), "TYPE_", type)); pw.printPair("diskId", getDiskId()); pw.printPair("partGuid", partGuid); pw.printPair("mountFlags", DebugUtils.flagsToString(getClass(), "MOUNT_FLAG_", mountFlags)); pw.printPair("mountUserId", mountUserId); pw.printPair("state", DebugUtils.valueToString(getClass(), "STATE_", state)); Loading Loading @@ -453,6 +457,7 @@ public class VolumeInfo implements Parcelable { } else { parcel.writeInt(0); } parcel.writeString(partGuid); parcel.writeInt(mountFlags); parcel.writeInt(mountUserId); parcel.writeInt(state); Loading
core/java/android/os/storage/VolumeRecord.java +5 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ public class VolumeRecord implements Parcelable { public final int type; public final String fsUuid; public String partGuid; public String nickname; public int userFlags; Loading @@ -50,6 +51,7 @@ public class VolumeRecord implements Parcelable { public VolumeRecord(Parcel parcel) { type = parcel.readInt(); fsUuid = parcel.readString(); partGuid = parcel.readString(); nickname = parcel.readString(); userFlags = parcel.readInt(); } Loading Loading @@ -79,6 +81,8 @@ public class VolumeRecord implements Parcelable { pw.increaseIndent(); pw.printPair("type", DebugUtils.valueToString(VolumeInfo.class, "TYPE_", type)); pw.printPair("fsUuid", fsUuid); pw.printPair("partGuid", partGuid); pw.println(); pw.printPair("nickname", nickname); pw.printPair("userFlags", DebugUtils.flagsToString(VolumeRecord.class, "USER_FLAG_", userFlags)); Loading Loading @@ -133,6 +137,7 @@ public class VolumeRecord implements Parcelable { public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(type); parcel.writeString(fsUuid); parcel.writeString(partGuid); parcel.writeString(nickname); parcel.writeInt(userFlags); } Loading
core/java/android/text/TextUtils.java +5 −0 Original line number Diff line number Diff line Loading @@ -465,6 +465,11 @@ public class TextUtils { return false; } /** {@hide} */ public static String nullIfEmpty(@Nullable String str) { return isEmpty(str) ? null : str; } /** * Returns the length that the specified CharSequence would have if * spaces and control characters were trimmed from the start and end, Loading
services/core/java/com/android/server/MountService.java +35 −9 Original line number Diff line number Diff line Loading @@ -259,6 +259,7 @@ class MountService extends IMountService.Stub private static final String TAG_VOLUME = "volume"; private static final String ATTR_TYPE = "type"; private static final String ATTR_FS_UUID = "fsUuid"; private static final String ATTR_PART_GUID = "partGuid"; private static final String ATTR_NICKNAME = "nickname"; private static final String ATTR_USER_FLAGS = "userFlags"; Loading Loading @@ -689,7 +690,7 @@ class MountService extends IMountService.Stub // Create a stub volume that represents internal storage final VolumeInfo internal = new VolumeInfo(VolumeInfo.ID_PRIVATE_INTERNAL, VolumeInfo.TYPE_PRIVATE, null, 0); VolumeInfo.TYPE_PRIVATE, null, null, 0); internal.state = VolumeInfo.STATE_MOUNTED; internal.path = Environment.getDataDirectory().getAbsolutePath(); mVolumes.put(internal.id, internal); Loading Loading @@ -900,10 +901,12 @@ class MountService extends IMountService.Stub case VoldResponseCode.VOLUME_CREATED: { final String id = cooked[1]; final int type = Integer.parseInt(cooked[2]); final String diskId = (cooked.length == 4) ? cooked[3] : null; final String diskId = TextUtils.nullIfEmpty(cooked[3]); final String partGuid = TextUtils.nullIfEmpty(cooked[4]); final DiskInfo disk = mDisks.get(diskId); final int mtpIndex = allocateMtpIndex(id); final VolumeInfo vol = new VolumeInfo(id, type, disk, mtpIndex); final VolumeInfo vol = new VolumeInfo(id, type, disk, partGuid, mtpIndex); mVolumes.put(id, vol); onVolumeCreatedLocked(vol); break; Loading Loading @@ -1091,13 +1094,21 @@ class MountService extends IMountService.Stub // Remember that we saw this volume so we're ready to accept user // metadata, or so we can annoy them when a private volume is ejected if (vol.isMountedReadable() && !TextUtils.isEmpty(vol.fsUuid)) { if (!mRecords.containsKey(vol.fsUuid)) { final VolumeRecord rec = new VolumeRecord(vol.type, vol.fsUuid); VolumeRecord rec = mRecords.get(vol.fsUuid); if (rec == null) { rec = new VolumeRecord(vol.type, vol.fsUuid); rec.partGuid = vol.partGuid; if (vol.type == VolumeInfo.TYPE_PRIVATE) { rec.nickname = vol.disk.getDescription(); } mRecords.put(rec.fsUuid, rec); writeSettingsLocked(); } else { // Handle upgrade case where we didn't store partition GUID if (TextUtils.isEmpty(rec.partGuid)) { rec.partGuid = vol.partGuid; writeSettingsLocked(); } } } Loading Loading @@ -1347,6 +1358,7 @@ class MountService extends IMountService.Stub final int type = readIntAttribute(in, ATTR_TYPE); final String fsUuid = readStringAttribute(in, ATTR_FS_UUID); final VolumeRecord meta = new VolumeRecord(type, fsUuid); meta.partGuid = readStringAttribute(in, ATTR_PART_GUID); meta.nickname = readStringAttribute(in, ATTR_NICKNAME); meta.userFlags = readIntAttribute(in, ATTR_USER_FLAGS); return meta; Loading @@ -1356,6 +1368,7 @@ class MountService extends IMountService.Stub out.startTag(null, TAG_VOLUME); writeIntAttribute(out, ATTR_TYPE, rec.type); writeStringAttribute(out, ATTR_FS_UUID, rec.fsUuid); writeStringAttribute(out, ATTR_PART_GUID, rec.partGuid); writeStringAttribute(out, ATTR_NICKNAME, rec.nickname); writeIntAttribute(out, ATTR_USER_FLAGS, rec.userFlags); out.endTag(null, TAG_VOLUME); Loading Loading @@ -1573,9 +1586,11 @@ class MountService extends IMountService.Stub Preconditions.checkNotNull(fsUuid); synchronized (mLock) { mRecords.remove(fsUuid); // TODO: tell vold to forget keys final VolumeRecord rec = mRecords.remove(fsUuid); if (rec != null && !TextUtils.isEmpty(rec.partGuid)) { forgetPartition(rec.partGuid); } mCallbacks.notifyVolumeForgotten(fsUuid); // If this had been primary storage, revert back to internal and // reset vold so we bind into new volume into place. Loading @@ -1584,7 +1599,6 @@ class MountService extends IMountService.Stub resetIfReadyAndConnected(); } mCallbacks.notifyVolumeForgotten(fsUuid); writeSettingsLocked(); } } Loading @@ -1597,6 +1611,10 @@ class MountService extends IMountService.Stub synchronized (mLock) { for (int i = 0; i < mRecords.size(); i++) { final String fsUuid = mRecords.keyAt(i); final VolumeRecord rec = mRecords.valueAt(i); if (!TextUtils.isEmpty(rec.partGuid)) { forgetPartition(rec.partGuid); } mCallbacks.notifyVolumeForgotten(fsUuid); } mRecords.clear(); Loading @@ -1610,6 +1628,14 @@ class MountService extends IMountService.Stub } } private void forgetPartition(String partGuid) { try { mConnector.execute("volume", "forget_partition", partGuid); } catch (NativeDaemonConnectorException e) { Slog.w(TAG, "Failed to forget key for " + partGuid + ": " + e); } } @Override public void setDebugFlags(int flags, int mask) { enforcePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS); Loading