From de4e90a6bdc7b038d327bd0ebda6bb92f496220b Mon Sep 17 00:00:00 2001 From: Abhijeet Kaur Date: Thu, 14 May 2020 11:44:15 +0100 Subject: [PATCH] Allow ExternalStorageProvider to access all Android/ dirs In Scoped Storage world, access to "Android/data" style directories are hidden for privacy reasons. Files Activity by DocsUI calls ExternalStorageProvider in managed mode. Allow ExternalStorageProvider to show these hidden files when in manage mode. Bug: 150366834 Test: Android/data and Android/obb dirs are not visible in DocsUI Picker view (triggered from StorageTestApp or Gmail) Test: Android/data and Android/obb dirs are accessible from DocsUI Files view (triggered from Settings). Android/data shows package dirs. Manually adb push video to /obb is accessible. Change-Id: I2423d8fa695c68a56d630353317b98ff3bb7ad34 --- .../android/server/StorageManagerService.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 43ed8538fb0cf..e2a0c29dbf016 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -121,6 +121,7 @@ import android.os.storage.StorageVolume; import android.os.storage.VolumeInfo; import android.os.storage.VolumeRecord; import android.provider.DeviceConfig; +import android.provider.DocumentsContract; import android.provider.Downloads; import android.provider.MediaStore; import android.provider.Settings; @@ -432,6 +433,8 @@ class StorageManagerService extends IStorageManager.Stub private volatile int mDownloadsAuthorityAppId = -1; + private volatile int mExternalStorageAuthorityAppId = -1; + private volatile int mCurrentUserId = UserHandle.USER_SYSTEM; private final Installer mInstaller; @@ -1923,24 +1926,22 @@ class StorageManagerService extends IStorageManager.Stub mIAppOpsService = IAppOpsService.Stub.asInterface( ServiceManager.getService(Context.APP_OPS_SERVICE)); - ProviderInfo provider = mPmInternal.resolveContentProvider( - MediaStore.AUTHORITY, PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, - UserHandle.getUserId(UserHandle.USER_SYSTEM)); + ProviderInfo provider = getProviderInfo(MediaStore.AUTHORITY); if (provider != null) { mMediaStoreAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid); sMediaStoreAuthorityProcessName = provider.applicationInfo.processName; } - provider = mPmInternal.resolveContentProvider( - Downloads.Impl.AUTHORITY, PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, - UserHandle.getUserId(UserHandle.USER_SYSTEM)); - + provider = getProviderInfo(Downloads.Impl.AUTHORITY); if (provider != null) { mDownloadsAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid); } + provider = getProviderInfo(DocumentsContract.EXTERNAL_STORAGE_PROVIDER_AUTHORITY); + if (provider != null) { + mExternalStorageAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid); + } + if (!mIsFuseEnabled) { try { mIAppOpsService.startWatchingMode(OP_REQUEST_INSTALL_PACKAGES, null, @@ -1951,6 +1952,13 @@ class StorageManagerService extends IStorageManager.Stub } } + private ProviderInfo getProviderInfo(String authority) { + return mPmInternal.resolveContentProvider( + authority, PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, + UserHandle.getUserId(UserHandle.USER_SYSTEM)); + } + private void updateLegacyStorageApps(String packageName, int uid, boolean hasLegacy) { synchronized (mLock) { if (hasLegacy) { @@ -4191,9 +4199,11 @@ class StorageManagerService extends IStorageManager.Stub return Zygote.MOUNT_EXTERNAL_PASS_THROUGH; } - if (mIsFuseEnabled && mDownloadsAuthorityAppId == UserHandle.getAppId(uid)) { + if (mIsFuseEnabled && (mDownloadsAuthorityAppId == UserHandle.getAppId(uid) + || mExternalStorageAuthorityAppId == UserHandle.getAppId(uid))) { // DownloadManager can write in app-private directories on behalf of apps; // give it write access to Android/ + // ExternalStorageProvider can access Android/{data,obb} dirs in managed mode return Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE; }