Merge "Properly iterate over packages in UID."
diff --git a/services/permission/java/com/android/server/permission/access/permission/UidPermissionPolicy.kt b/services/permission/java/com/android/server/permission/access/permission/UidPermissionPolicy.kt
index 0962b0d..a9884dd 100644
--- a/services/permission/java/com/android/server/permission/access/permission/UidPermissionPolicy.kt
+++ b/services/permission/java/com/android/server/permission/access/permission/UidPermissionPolicy.kt
@@ -39,7 +39,6 @@
 import com.android.server.permission.access.util.hasAnyBit
 import com.android.server.permission.access.util.hasBits
 import com.android.server.permission.access.util.isInternal
-import com.android.server.permission.access.util.isRuntime
 import com.android.server.pm.KnownPackages
 import com.android.server.pm.parsing.PackageInfoUtils
 import com.android.server.pm.permission.CompatibilityPermissionInfo
@@ -224,9 +223,8 @@
             if (permission.isRemoved) {
                 return@forEachIndexed
             }
-            val isRequestedByOtherPackages = anyPackageInAppId(appId) { packageState ->
-                packageState.packageName != packageName &&
-                    permissionName in packageState.androidPackage!!.requestedPermissions
+            val isRequestedByOtherPackages = anyRequestingPackageInAppId(appId, permissionName) {
+                it.packageName != packageName
             }
             if (isRequestedByOtherPackages) {
                 return@forEachIndexed
@@ -618,12 +616,12 @@
                     newTargetSdkVersion < Build.VERSION_CODES.Q
                 val isTargetSdkVersionUpgraded = oldTargetSdkVersion < Build.VERSION_CODES.Q &&
                     newTargetSdkVersion >= Build.VERSION_CODES.Q
-                val oldIsRequestLegacyExternalStorage = anyPackageInAppId(appId, oldState) {
-                    it.androidPackage!!.isRequestLegacyExternalStorage
-                }
-                val newIsRequestLegacyExternalStorage = anyPackageInAppId(appId, newState) {
-                    it.androidPackage!!.isRequestLegacyExternalStorage
-                }
+                val oldIsRequestLegacyExternalStorage = anyRequestingPackageInAppId(
+                    appId, permissionName, oldState
+                ) { it.androidPackage!!.isRequestLegacyExternalStorage }
+                val newIsRequestLegacyExternalStorage = anyRequestingPackageInAppId(
+                    appId, permissionName, newState
+                ) { it.androidPackage!!.isRequestLegacyExternalStorage }
                 val isNewlyRequestingLegacyExternalStorage = !isTargetSdkVersionUpgraded &&
                     !oldIsRequestLegacyExternalStorage && newIsRequestLegacyExternalStorage
                 if ((isNewlyRequestingLegacyExternalStorage || isTargetSdkVersionDowngraded) &&
@@ -644,9 +642,8 @@
         val systemState = newState.systemState
         systemState.userIds.forEachIndexed { _, userId ->
             systemState.appIds.forEachKeyIndexed { _, appId ->
-                val isPermissionRequested = anyPackageInAppId(appId) { packageState ->
-                    permissionName in packageState.androidPackage!!.requestedPermissions
-                }
+                val isPermissionRequested =
+                    anyRequestingPackageInAppId(appId, permissionName) { true }
                 if (isPermissionRequested) {
                     evaluatePermissionState(appId, userId, permissionName, installedPackageState)
                 }
@@ -708,10 +705,9 @@
                 val wasRevoked = oldFlags.hasBits(PermissionFlags.INSTALL_REVOKED)
                 val isRequestedByInstalledPackage = installedPackageState != null &&
                     permissionName in installedPackageState.androidPackage!!.requestedPermissions
-                val isRequestedBySystemPackage = anyPackageInAppId(appId) {
-                    it.isSystem && permissionName in it.androidPackage!!.requestedPermissions
-                }
-                val isCompatibilityPermission = anyPackageInAppId(appId) {
+                val isRequestedBySystemPackage =
+                    anyRequestingPackageInAppId(appId, permissionName) { it.isSystem }
+                val isCompatibilityPermission = anyRequestingPackageInAppId(appId, permissionName) {
                     isCompatibilityPermissionForPackage(it.androidPackage!!, permissionName)
                 }
                 // If this is an existing, non-system package,
@@ -732,18 +728,19 @@
                 PermissionFlags.PROTECTION_GRANTED
             } else {
                 val mayGrantByPrivileged = !permission.isPrivileged || (
-                    anyPackageInAppId(appId) {
+                    anyRequestingPackageInAppId(appId, permissionName) {
                         checkPrivilegedPermissionAllowlist(it, permission)
                     }
                 )
                 val shouldGrantBySignature = permission.isSignature && (
-                    anyPackageInAppId(appId) {
+                    anyRequestingPackageInAppId(appId, permissionName) {
                         shouldGrantPermissionBySignature(it, permission)
                     }
                 )
-                val shouldGrantByProtectionFlags = anyPackageInAppId(appId) {
-                    shouldGrantPermissionByProtectionFlags(it, permission)
-                }
+                val shouldGrantByProtectionFlags =
+                    anyRequestingPackageInAppId(appId, permissionName) {
+                        shouldGrantPermissionByProtectionFlags(it, permission)
+                    }
                 if (mayGrantByPrivileged &&
                     (shouldGrantBySignature || shouldGrantByProtectionFlags)) {
                     PermissionFlags.PROTECTION_GRANTED
@@ -789,7 +786,7 @@
                 val wasGrantedByImplicit = newFlags.hasBits(PermissionFlags.IMPLICIT_GRANTED)
                 val isLeanbackNotificationsPermission = newState.systemState.isLeanback &&
                     permissionName in NOTIFICATIONS_PERMISSIONS
-                val isImplicitPermission = anyPackageInAppId(appId) {
+                val isImplicitPermission = anyRequestingPackageInAppId(appId, permissionName) {
                     permissionName in it.androidPackage!!.implicitPermissions
                 }
                 val sourcePermissions = newState.systemState
@@ -1043,24 +1040,24 @@
         state: AccessState = newState
     ): Int {
         var targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT
-        forEachPackageInAppId(appId, state) { packageState ->
-            val androidPackage = packageState.androidPackage!!
-            if (permissionName in androidPackage.requestedPermissions) {
-                targetSdkVersion = targetSdkVersion.coerceAtMost(androidPackage.targetSdkVersion)
-            }
+        forEachRequestingPackageInAppId(appId, permissionName, state) {
+            targetSdkVersion = targetSdkVersion.coerceAtMost(it.androidPackage!!.targetSdkVersion)
         }
         return targetSdkVersion
     }
 
-    private inline fun MutateStateScope.anyPackageInAppId(
+    private inline fun MutateStateScope.anyRequestingPackageInAppId(
         appId: Int,
+        permissionName: String,
         state: AccessState = newState,
         predicate: (PackageState) -> Boolean
     ): Boolean {
         val packageNames = state.systemState.appIds[appId]
         return packageNames.anyIndexed { _, packageName ->
             val packageState = state.systemState.packageStates[packageName]!!
-            packageState.androidPackage != null && predicate(packageState)
+            val androidPackage = packageState.androidPackage
+            androidPackage != null && permissionName in androidPackage.requestedPermissions &&
+                predicate(packageState)
         }
     }
 
@@ -1078,6 +1075,22 @@
         }
     }
 
+    private inline fun MutateStateScope.forEachRequestingPackageInAppId(
+        appId: Int,
+        permissionName: String,
+        state: AccessState = newState,
+        action: (PackageState) -> Unit
+    ) {
+        val packageNames = state.systemState.appIds[appId]
+        packageNames.forEachIndexed { _, packageName ->
+            val packageState = state.systemState.packageStates[packageName]!!
+            val androidPackage = packageState.androidPackage
+            if (androidPackage != null && permissionName in androidPackage.requestedPermissions) {
+                action(packageState)
+            }
+        }
+    }
+
     private fun MutateStateScope.shouldGrantPermissionByProtectionFlags(
         packageState: PackageState,
         permission: Permission