Merge "Support creating Playlist and Subtitle file" into rvc-dev am: daa4f0f423 am: 5d383e136d
Change-Id: Ia2c197b7ee579f5c21108f70035cbf03a9298591
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 04826c9..c843ce9 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -5833,55 +5833,44 @@
*/
@NonNull
private Uri getContentUriForFile(@NonNull String filePath, @NonNull String mimeType) {
- return getPossibleContentUrisForPath(filePath, mimeType)[0];
- }
-
- /**
- * Returns possible content URIs for given path.
- *
- * Return mime type specific URI for file paths where mime type is specified.
- * If the path is a directory and mime type is unknown, return all possible
- * URIs specific to top level directory of the given path.
- *
- * @throws IllegalStateException if path is invalid or doesn't match a volume.
- */
- @NonNull
- private Uri[] getPossibleContentUrisForPath(@NonNull String path,
- @NonNull String mimeType) {
- final String volName = FileUtils.getVolumeName(getContext(), new File(path));
- Uri[] uris = {Files.getContentUri(volName)};
- final String topLevelDir = extractTopLevelDir(path);
+ final String volName = FileUtils.getVolumeName(getContext(), new File(filePath));
+ Uri uri = Files.getContentUri(volName);
+ final String topLevelDir = extractTopLevelDir(filePath);
if (topLevelDir == null) {
// If the file path doesn't match the external storage directory, we use the files URI
// as default and let #insert enforce the restrictions
- return uris;
+ return uri;
}
switch (topLevelDir) {
- case DIRECTORY_MUSIC:
case DIRECTORY_PODCASTS:
case DIRECTORY_RINGTONES:
case DIRECTORY_ALARMS:
case DIRECTORY_NOTIFICATIONS:
case DIRECTORY_AUDIOBOOKS:
- uris[0] = Audio.Media.getContentUri(volName);
+ uri = Audio.Media.getContentUri(volName);
+ break;
+ case DIRECTORY_MUSIC:
+ if (MimeUtils.isPlaylistMimeType(mimeType)) {
+ uri = Audio.Playlists.getContentUri(volName);
+ } else if (!MimeUtils.isSubtitleMimeType(mimeType)) {
+ // Send Files uri for media type subtitle
+ uri = Audio.Media.getContentUri(volName);
+ }
break;
case DIRECTORY_MOVIES:
- uris[0] = Video.Media.getContentUri(volName);
+ if (MimeUtils.isPlaylistMimeType(mimeType)) {
+ uri = Audio.Playlists.getContentUri(volName);
+ } else if (!MimeUtils.isSubtitleMimeType(mimeType)) {
+ // Send Files uri for media type subtitle
+ uri = Video.Media.getContentUri(volName);
+ }
break;
case DIRECTORY_DCIM:
case DIRECTORY_PICTURES:
- if (mimeType.toLowerCase(Locale.ROOT).startsWith("image")) {
- uris[0] = Images.Media.getContentUri(volName);
- } else if (mimeType.toLowerCase(Locale.ROOT).startsWith("video")) {
- uris[0] = Video.Media.getContentUri(volName);
- } else if (new File(path).isDirectory()) {
- // DCIM and subdirectories of DCIM support both pictures and videos. Return both
- // URIs if the path is directory.
- uris = new Uri[]{Images.Media.getContentUri(volName),
- Video.Media.getContentUri(volName)};
+ if (MimeUtils.isImageMimeType(mimeType)) {
+ uri = Images.Media.getContentUri(volName);
} else {
- // Send images uri for unsupported file types.
- uris[0] = Images.Media.getContentUri(volName);
+ uri = Video.Media.getContentUri(volName);
}
break;
case DIRECTORY_DOWNLOADS:
@@ -5890,7 +5879,7 @@
default:
Log.w(TAG, "Forgot to handle a top level directory in getContentUriForFile?");
}
- return uris;
+ return uri;
}
private boolean fileExists(@NonNull String absolutePath, @NonNull Uri contentUri) {
diff --git a/tests/jni/FuseDaemonTest/src/com/android/tests/fused/FilePathAccessTest.java b/tests/jni/FuseDaemonTest/src/com/android/tests/fused/FilePathAccessTest.java
index 3ab4c39..124aa3b 100644
--- a/tests/jni/FuseDaemonTest/src/com/android/tests/fused/FilePathAccessTest.java
+++ b/tests/jni/FuseDaemonTest/src/com/android/tests/fused/FilePathAccessTest.java
@@ -133,6 +133,8 @@
static final File EXTERNAL_MEDIA_DIR = getContext().getExternalMediaDirs()[0];
static final String AUDIO_FILE_NAME = "FilePathAccessTest_file.mp3";
+ static final String PLAYLIST_FILE_NAME = "FilePathAccessTest_file.m3u";
+ static final String SUBTITLE_FILE_NAME = "FilePathAccessTest_file.srt";
static final String VIDEO_FILE_NAME = "FilePathAccessTest_file.mp4";
static final String IMAGE_FILE_NAME = "FilePathAccessTest_file.jpg";
static final String NONMEDIA_FILE_NAME = "FilePathAccessTest_file.pdf";
@@ -208,6 +210,12 @@
assertThrows(IOException.class, "Operation not permitted", () -> {
new File(PICTURES_DIR, AUDIO_FILE_NAME).createNewFile();
});
+ assertThrows(IOException.class, "Operation not permitted", () -> {
+ new File(PICTURES_DIR, PLAYLIST_FILE_NAME).createNewFile();
+ });
+ assertThrows(IOException.class, "Operation not permitted", () -> {
+ new File(DCIM_DIR, SUBTITLE_FILE_NAME).createNewFile();
+ });
assertCanCreateFile(new File(ALARMS_DIR, AUDIO_FILE_NAME));
assertCanCreateFile(new File(AUDIOBOOKS_DIR, AUDIO_FILE_NAME));
@@ -222,7 +230,9 @@
assertCanCreateFile(new File(DOWNLOAD_DIR, NONMEDIA_FILE_NAME));
assertCanCreateFile(new File(DOWNLOAD_DIR, VIDEO_FILE_NAME));
assertCanCreateFile(new File(MOVIES_DIR, VIDEO_FILE_NAME));
+ assertCanCreateFile(new File(MOVIES_DIR, SUBTITLE_FILE_NAME));
assertCanCreateFile(new File(MUSIC_DIR, AUDIO_FILE_NAME));
+ assertCanCreateFile(new File(MUSIC_DIR, PLAYLIST_FILE_NAME));
assertCanCreateFile(new File(NOTIFICATIONS_DIR, AUDIO_FILE_NAME));
assertCanCreateFile(new File(PICTURES_DIR, IMAGE_FILE_NAME));
assertCanCreateFile(new File(PICTURES_DIR, VIDEO_FILE_NAME));