Use System APIs for ExternalStorageProvider and Downloads authority
Bug: 173505864
Test: atest CtsScopedStorageHostTest
Change-Id: I73bdd8983f340f11262c144e47ca16905233b94c
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 9ae6789..a1b5cfc 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -153,6 +153,7 @@
import android.provider.BaseColumns;
import android.provider.Column;
import android.provider.DeviceConfig;
+import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio;
import android.provider.MediaStore.Audio.AudioColumns;
@@ -379,7 +380,9 @@
private static final int sUserId = UserHandle.myUserId();
- // WARNING/TODO (b/173505864): This will be replaced by signature APIs in S
+ /**
+ * Please use {@link getDownloadsProviderAuthority()} instead of using this directly.
+ */
private static final String DOWNLOADS_PROVIDER_AUTHORITY = "downloads";
@GuardedBy("mPendingOpenInfo")
@@ -1054,15 +1057,14 @@
}
ProviderInfo provider = mPackageManager.resolveContentProvider(
- DOWNLOADS_PROVIDER_AUTHORITY, PackageManager.MATCH_DIRECT_BOOT_AWARE
+ getDownloadsProviderAuthority(), PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
if (provider != null) {
mDownloadsAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid);
}
- provider = mPackageManager.resolveContentProvider(
- MediaStore.EXTERNAL_STORAGE_PROVIDER_AUTHORITY, PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
+ provider = mPackageManager.resolveContentProvider(getExternalStorageProviderAuthority(),
+ PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
if (provider != null) {
mExternalStorageAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid);
}
@@ -5393,7 +5395,7 @@
try (ContentProviderClient client = getContext().getContentResolver()
.acquireUnstableContentProviderClient(
- MediaStore.EXTERNAL_STORAGE_PROVIDER_AUTHORITY)) {
+ getExternalStorageProviderAuthority())) {
extras.putParcelable(MediaStore.EXTRA_URI, fileUri);
return client.call(method, null, extras);
} catch (RemoteException e) {
@@ -5408,7 +5410,7 @@
final Uri fileUri;
try (ContentProviderClient client = getContext().getContentResolver()
.acquireUnstableContentProviderClient(
- MediaStore.EXTERNAL_STORAGE_PROVIDER_AUTHORITY)) {
+ getExternalStorageProviderAuthority())) {
final Bundle res = client.call(method, null, extras);
fileUri = res.getParcelable(MediaStore.EXTRA_URI);
} catch (RemoteException e) {
@@ -8371,6 +8373,30 @@
return mCallingIdentity.get().hasPermission(APPOP_REQUEST_INSTALL_PACKAGES_FOR_SHARED_UID);
}
+ private String getExternalStorageProviderAuthority() {
+ if (SdkLevel.isAtLeastS()) {
+ return getExternalStorageProviderAuthorityFromDocumentsContract();
+ }
+ return MediaStore.EXTERNAL_STORAGE_PROVIDER_AUTHORITY;
+ }
+
+ @RequiresApi(Build.VERSION_CODES.S)
+ private String getExternalStorageProviderAuthorityFromDocumentsContract() {
+ return DocumentsContract.EXTERNAL_STORAGE_PROVIDER_AUTHORITY;
+ }
+
+ private String getDownloadsProviderAuthority() {
+ if (SdkLevel.isAtLeastS()) {
+ return getDownloadsProviderAuthorityFromDocumentsContract();
+ }
+ return DOWNLOADS_PROVIDER_AUTHORITY;
+ }
+
+ @RequiresApi(Build.VERSION_CODES.S)
+ private String getDownloadsProviderAuthorityFromDocumentsContract() {
+ return DocumentsContract.EXTERNAL_STORAGE_PROVIDER_AUTHORITY;
+ }
+
private boolean isCallingIdentityDownloadProvider(int uid) {
return uid == mDownloadsAuthorityAppId;
}