Merge "Support creating Playlist and Subtitle file" into rvc-dev
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));