From 4f0b921e9d6580001fb2f6d6542c285f51113a85 Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Wed, 28 Apr 2021 22:14:25 +0000 Subject: Remap per app id for AR/location sources Since the AR and location source concepts define what the app can do, i.e. it can provide activity recognition or location to other apps, we treat that app as the AR/location source and allow op remapping for app users (as this app runs for all users as a separate instance). bug: 185504196 Test: manual Change-Id: Iab15e2d4a2c3f6f15fe8a22c61ea7272460ea4d2 --- .../com/android/server/policy/AppOpsPolicy.java | 34 ++++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java index 622b758e0e21..3a097a71e3e9 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; } -- cgit v1.2.3-59-g8ed1b