From 9b26e937d5d8845127ef8746135bec53c56b59e1 Mon Sep 17 00:00:00 2001 From: Zim Date: Wed, 10 Mar 2021 10:42:12 +0000 Subject: [PATCH] Fix FileSystemProvider open for external USB files Ie08b94cf79c86e9f87639e4fbdd82b2732771187 introduced a regression where we try to coerce *all* files to a media store URI to open with the correct media_capabilities for the caller. Unfortunately, external USB files cannot be coerced to a media store URI and transcoding is not supported there anyways. Now, we avoid coercing USB files, additionally, if the coercion fails for any reason, we fallback to opening via the filesystem directly. Test: Manual Bug: 180802673 Change-Id: Iba8505669897d4ebfef5232707b8e2fec9bed76f --- .../internal/content/FileSystemProvider.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java index e602cd2c8890e..a60b31078a864 100644 --- a/core/java/com/android/internal/content/FileSystemProvider.java +++ b/core/java/com/android/internal/content/FileSystemProvider.java @@ -504,8 +504,10 @@ public abstract class FileSystemProvider extends DocumentsProvider { final File visibleFile = getFileForDocId(documentId, true); final int pfdMode = ParcelFileDescriptor.parseMode(mode); - if (pfdMode == ParcelFileDescriptor.MODE_READ_ONLY || visibleFile == null) { - return openFileForRead(file); + if (visibleFile == null) { + return ParcelFileDescriptor.open(file, pfdMode); + } else if (pfdMode == ParcelFileDescriptor.MODE_READ_ONLY) { + return openFileForRead(visibleFile); } else { try { // When finished writing, kick off media scanner @@ -522,6 +524,10 @@ public abstract class FileSystemProvider extends DocumentsProvider { private ParcelFileDescriptor openFileForRead(final File target) throws FileNotFoundException { final Uri uri = MediaStore.scanFile(getContext().getContentResolver(), target); + if (uri == null) { + Log.w(TAG, "Failed to retrieve media store URI for: " + target); + return ParcelFileDescriptor.open(target, ParcelFileDescriptor.MODE_READ_ONLY); + } // Passing the calling uid via EXTRA_MEDIA_CAPABILITIES_UID, so that the decision to // transcode or not transcode can be made based upon the calling app's uid, and not based @@ -532,7 +538,8 @@ public abstract class FileSystemProvider extends DocumentsProvider { final AssetFileDescriptor afd = getContext().getContentResolver().openTypedAssetFileDescriptor(uri, "*/*", opts); if (afd == null) { - return null; + Log.w(TAG, "Failed to open with media_capabilities uid for URI: " + uri); + return ParcelFileDescriptor.open(target, ParcelFileDescriptor.MODE_READ_ONLY); } return afd.getParcelFileDescriptor();