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) {