Fix Environment.isExternalStorageLegacy() impl.
Earlier, this API only used to consider op_legacy_storage
appop to decide whether an app will get legacy storage view
or not but there are few other factors it needs to consider
like whether the app has WRITE_MEDIA_STORAGE permission or
whether app was allowed to be an installer in which case it
will get legacy access.
Bug: 132760141
Test: atest cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ExternalStorageHostTest.java
Change-Id: I227a171bf40e43e135e1a6dbc819cfad21d91520
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 3716b3e..0ee9a11 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -16,6 +16,7 @@
package android.os;
+import android.Manifest;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.TestApi;
@@ -25,6 +26,7 @@
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.provider.MediaStore;
@@ -1159,11 +1161,36 @@
*/
public static boolean isExternalStorageLegacy(@NonNull File path) {
final Context context = AppGlobals.getInitialApplication();
+ final int uid = context.getApplicationInfo().uid;
+ if (Process.isIsolated(uid)) {
+ return false;
+ }
+
+ final PackageManager packageManager = context.getPackageManager();
+ if (packageManager.isInstantApp()) {
+ return false;
+ }
+
+ if (packageManager.checkPermission(Manifest.permission.WRITE_MEDIA_STORAGE,
+ context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
+ return true;
+ }
+
+ if (packageManager.checkPermission(Manifest.permission.INSTALL_PACKAGES,
+ context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
+ return true;
+ }
final AppOpsManager appOps = context.getSystemService(AppOpsManager.class);
+ final String[] packagesForUid = packageManager.getPackagesForUid(uid);
+ for (String packageName : packagesForUid) {
+ if (appOps.checkOpNoThrow(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES,
+ uid, packageName) == AppOpsManager.MODE_ALLOWED) {
+ return true;
+ }
+ }
return appOps.checkOpNoThrow(AppOpsManager.OP_LEGACY_STORAGE,
- context.getApplicationInfo().uid,
- context.getOpPackageName()) == AppOpsManager.MODE_ALLOWED;
+ uid, context.getOpPackageName()) == AppOpsManager.MODE_ALLOWED;
}
static File getDirectory(String variableName, String defaultPath) {