diff options
-rw-r--r-- | services/core/java/com/android/server/StorageManagerService.java | 30 |
1 files 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 d137e68d09d7..a39b6d937d74 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; @@ -1924,24 +1927,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, @@ -1952,6 +1953,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) { @@ -4192,9 +4200,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; } |