diff options
| -rw-r--r-- | core/java/android/os/FileUtils.java | 11 | ||||
| -rw-r--r-- | core/java/android/os/storage/StorageVolume.java | 6 | ||||
| -rw-r--r-- | core/java/android/os/storage/VolumeInfo.java | 5 | ||||
| -rw-r--r-- | core/java/android/provider/MediaStore.java | 49 |
4 files changed, 62 insertions, 9 deletions
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index ca3905148ede..51c3c4c25ce0 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -72,6 +72,7 @@ import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; +import java.util.Collection; import java.util.Comparator; import java.util.Objects; import java.util.concurrent.Executor; @@ -831,6 +832,16 @@ public class FileUtils { return false; } + /** {@hide} */ + public static boolean contains(Collection<File> dirs, File file) { + for (File dir : dirs) { + if (contains(dir, file)) { + return true; + } + } + return false; + } + /** * Test if a file lives under the given directory, either as a direct child * or a distant grandchild. diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java index df1a7131a7ae..714a06126ef7 100644 --- a/core/java/android/os/storage/StorageVolume.java +++ b/core/java/android/os/storage/StorageVolume.java @@ -35,6 +35,7 @@ import com.android.internal.util.Preconditions; import java.io.CharArrayWriter; import java.io.File; +import java.util.Locale; /** * Information about a shared/external storage volume for a specific user. @@ -263,6 +264,11 @@ public final class StorageVolume implements Parcelable { return mFsUuid; } + /** {@hide} */ + public @Nullable String getNormalizedUuid() { + return mFsUuid != null ? mFsUuid.toLowerCase(Locale.US) : null; + } + /** * Parse and return volume UUID as FAT volume ID, or return -1 if unable to * parse or UUID is unknown. diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index 8c3aa1750acf..5d310e1c2db9 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -42,6 +42,7 @@ import com.android.internal.util.Preconditions; import java.io.CharArrayWriter; import java.io.File; import java.util.Comparator; +import java.util.Locale; import java.util.Objects; /** @@ -254,6 +255,10 @@ public class VolumeInfo implements Parcelable { return fsUuid; } + public @Nullable String getNormalizedFsUuid() { + return fsUuid != null ? fsUuid.toLowerCase(Locale.US) : null; + } + @UnsupportedAppUsage public int getMountUserId() { return mountUserId; diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 3a4998630544..487198ba4d45 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -70,6 +70,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Set; @@ -1224,7 +1226,7 @@ public final class MediaStore { if (sv.isPrimary()) { return VOLUME_EXTERNAL; } else { - return checkArgumentVolumeName(sv.getUuid()); + return checkArgumentVolumeName(sv.getNormalizedUuid()); } } throw new IllegalStateException("Unknown volume at " + path); @@ -2919,7 +2921,7 @@ public final class MediaStore { if (vi.isPrimary()) { volumeNames.add(VOLUME_EXTERNAL); } else { - volumeNames.add(vi.getFsUuid()); + volumeNames.add(vi.getNormalizedFsUuid()); } } } @@ -2953,8 +2955,7 @@ public final class MediaStore { // When not one of the well-known values above, it must be a hex UUID for (int i = 0; i < volumeName.length(); i++) { final char c = volumeName.charAt(i); - if (('a' <= c && c <= 'f') || ('A' <= c && c <= 'F') - || ('0' <= c && c <= '9') || (c == '-')) { + if (('a' <= c && c <= 'f') || ('0' <= c && c <= '9') || (c == '-')) { continue; } else { throw new IllegalArgumentException("Invalid volume name: " + volumeName); @@ -2963,23 +2964,26 @@ public final class MediaStore { return volumeName; } - /** {@hide} */ + /** + * Return path where the given volume is mounted. Not valid for + * {@link #VOLUME_INTERNAL}. + * + * @hide + */ public static @NonNull File getVolumePath(@NonNull String volumeName) throws FileNotFoundException { if (TextUtils.isEmpty(volumeName)) { throw new IllegalArgumentException(); } - if (VOLUME_INTERNAL.equals(volumeName)) { - return Environment.getDataDirectory(); - } else if (VOLUME_EXTERNAL.equals(volumeName)) { + if (VOLUME_EXTERNAL.equals(volumeName)) { return Environment.getExternalStorageDirectory(); } final StorageManager sm = AppGlobals.getInitialApplication() .getSystemService(StorageManager.class); for (VolumeInfo vi : sm.getVolumes()) { - if (Objects.equals(vi.getFsUuid(), volumeName)) { + if (Objects.equals(vi.getNormalizedFsUuid(), volumeName)) { final File path = vi.getPathForUser(UserHandle.myUserId()); if (path != null) { return path; @@ -2992,6 +2996,33 @@ public final class MediaStore { } /** + * Return paths that should be scanned for the given volume. + * + * @hide + */ + public static @NonNull Collection<File> getVolumeScanPaths(@NonNull String volumeName) + throws FileNotFoundException { + if (TextUtils.isEmpty(volumeName)) { + throw new IllegalArgumentException(); + } + + final ArrayList<File> res = new ArrayList<>(); + if (VOLUME_INTERNAL.equals(volumeName)) { + res.add(new File(Environment.getRootDirectory(), "media")); + res.add(new File(Environment.getOemDirectory(), "media")); + res.add(new File(Environment.getProductDirectory(), "media")); + } else { + res.add(getVolumePath(volumeName)); + final UserManager um = AppGlobals.getInitialApplication() + .getSystemService(UserManager.class); + if (VOLUME_EXTERNAL.equals(volumeName) && um.isDemoUser()) { + res.add(Environment.getDataPreloadsMediaDirectory()); + } + } + return res; + } + + /** * Uri for querying the state of the media scanner. */ public static Uri getMediaScannerUri() { |