Cache PermissionInfos in whitelistAllSystemAppPermissions

PermissionInfo-s are not per package. Hence instead of resolving them
over and over again, cache already resolved PermissionInfo and reuse
them.

Before whitelistAllSystemAppPermissions took between 600 and 1100 ms on
a crosshatch-eng. Now it takes between 200-350 ms.

Test: Booted a few time and measured how long this method took
Bug: 139485700
Fixes: 136682954
Change-Id: I83221f9fb2ed00b67957a633d26906f4d8aeb26e
diff --git a/PermissionController/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java b/PermissionController/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
index cac2ef2..ff72b98 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
@@ -25,6 +25,7 @@
 import android.content.pm.PermissionInfo;
 import android.permission.PermissionManager;
 import android.text.TextUtils;
+import android.util.ArrayMap;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
@@ -88,6 +89,9 @@
                         | PackageManager.MATCH_UNINSTALLED_PACKAGES
                         | PackageManager.MATCH_FACTORY_ONLY);
 
+        // Cache permissionInfos
+        final ArrayMap<String, PermissionInfo> permissionInfos = new ArrayMap<>();
+
         final int appCount = apps.size();
         for (int i = 0; i < appCount; i++) {
             final PackageInfo app = apps.get(i);
@@ -97,12 +101,16 @@
             }
 
             for (String requestedPermission : app.requestedPermissions) {
-                final PermissionInfo permInfo;
-                try {
-                    permInfo = context.getPackageManager().getPermissionInfo(
-                            requestedPermission, 0);
-                } catch (PackageManager.NameNotFoundException e) {
-                    continue;
+                PermissionInfo permInfo = permissionInfos.get(requestedPermission);
+                if (permInfo == null) {
+                    try {
+                        permInfo = context.getPackageManager().getPermissionInfo(
+                                requestedPermission, 0);
+                    } catch (PackageManager.NameNotFoundException e) {
+                        continue;
+                    }
+
+                    permissionInfos.put(requestedPermission, permInfo);
                 }
 
                 if ((permInfo.flags & (PermissionInfo.FLAG_HARD_RESTRICTED