Support creating Playlist and Subtitle file

Support creating playlist and subtitle file in Music and Movies
directory.

Added testcases to verify playlist and subtitle file creation.

Removed unused getPossibleContentUrisForPath method.

Test: atest FuseDaemonHostTest#testTypePathConformity
Bug: 152941286
Change-Id: Ia40ee66f7c9aefe814dcac9060496876fda600c8
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index d48d8b9..60c4b39 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -5815,55 +5815,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:
@@ -5872,7 +5861,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));