diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java index 622b758e0e211..3a097a71e3e96 100644 --- a/services/core/java/com/android/server/policy/AppOpsPolicy.java +++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java @@ -280,14 +280,15 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat private static void updateAllowListedTagsForPackageLocked(int uid, String packageName, Set allowListedTags, ConcurrentHashMap>> datastore) { + final int appId = UserHandle.getAppId(uid); // We make a copy of the per UID state to limit our mutation to one // operation in the underlying concurrent data structure. - ArrayMap> uidTags = datastore.get(uid); - if (uidTags != null) { - uidTags = new ArrayMap<>(uidTags); + ArrayMap> appIdTags = datastore.get(appId); + if (appIdTags != null) { + appIdTags = new ArrayMap<>(appIdTags); } - ArraySet packageTags = (uidTags != null) ? uidTags.get(packageName) : null; + ArraySet packageTags = (appIdTags != null) ? appIdTags.get(packageName) : null; if (packageTags != null) { packageTags = new ArraySet<>(packageTags); } @@ -299,17 +300,17 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat } else { packageTags = new ArraySet<>(allowListedTags); } - if (uidTags == null) { - uidTags = new ArrayMap<>(); + if (appIdTags == null) { + appIdTags = new ArrayMap<>(); } - uidTags.put(packageName, packageTags); - datastore.put(uid, uidTags); - } else if (uidTags != null) { - uidTags.remove(packageName); - if (!uidTags.isEmpty()) { - datastore.put(uid, uidTags); + appIdTags.put(packageName, packageTags); + datastore.put(appId, appIdTags); + } else if (appIdTags != null) { + appIdTags.remove(packageName); + if (!appIdTags.isEmpty()) { + datastore.put(appId, appIdTags); } else { - datastore.remove(uid); + datastore.remove(appId); } } } @@ -318,9 +319,10 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat @NonNull String attributionTag, @NonNull Map>> mappedOps) { // Only a single lookup from the underlying concurrent data structure - final ArrayMap> uidTags = mappedOps.get(uid); - if (uidTags != null) { - final ArraySet packageTags = uidTags.get(packageName); + final int appId = UserHandle.getAppId(uid); + final ArrayMap> appIdTags = mappedOps.get(appId); + if (appIdTags != null) { + final ArraySet packageTags = appIdTags.get(packageName); if (packageTags != null && packageTags.contains(attributionTag)) { return true; }