Loading services/core/java/com/android/server/policy/AppOpsPolicy.java +18 −16 Original line number Diff line number Diff line Loading @@ -280,14 +280,15 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat private static void updateAllowListedTagsForPackageLocked(int uid, String packageName, Set<String> allowListedTags, ConcurrentHashMap<Integer, ArrayMap<String, ArraySet<String>>> 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<String, ArraySet<String>> uidTags = datastore.get(uid); if (uidTags != null) { uidTags = new ArrayMap<>(uidTags); ArrayMap<String, ArraySet<String>> appIdTags = datastore.get(appId); if (appIdTags != null) { appIdTags = new ArrayMap<>(appIdTags); } ArraySet<String> packageTags = (uidTags != null) ? uidTags.get(packageName) : null; ArraySet<String> packageTags = (appIdTags != null) ? appIdTags.get(packageName) : null; if (packageTags != null) { packageTags = new ArraySet<>(packageTags); } Loading @@ -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); } } } Loading @@ -318,9 +319,10 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat @NonNull String attributionTag, @NonNull Map<Integer, ArrayMap<String, ArraySet<String>>> mappedOps) { // Only a single lookup from the underlying concurrent data structure final ArrayMap<String, ArraySet<String>> uidTags = mappedOps.get(uid); if (uidTags != null) { final ArraySet<String> packageTags = uidTags.get(packageName); final int appId = UserHandle.getAppId(uid); final ArrayMap<String, ArraySet<String>> appIdTags = mappedOps.get(appId); if (appIdTags != null) { final ArraySet<String> packageTags = appIdTags.get(packageName); if (packageTags != null && packageTags.contains(attributionTag)) { return true; } Loading Loading
services/core/java/com/android/server/policy/AppOpsPolicy.java +18 −16 Original line number Diff line number Diff line Loading @@ -280,14 +280,15 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat private static void updateAllowListedTagsForPackageLocked(int uid, String packageName, Set<String> allowListedTags, ConcurrentHashMap<Integer, ArrayMap<String, ArraySet<String>>> 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<String, ArraySet<String>> uidTags = datastore.get(uid); if (uidTags != null) { uidTags = new ArrayMap<>(uidTags); ArrayMap<String, ArraySet<String>> appIdTags = datastore.get(appId); if (appIdTags != null) { appIdTags = new ArrayMap<>(appIdTags); } ArraySet<String> packageTags = (uidTags != null) ? uidTags.get(packageName) : null; ArraySet<String> packageTags = (appIdTags != null) ? appIdTags.get(packageName) : null; if (packageTags != null) { packageTags = new ArraySet<>(packageTags); } Loading @@ -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); } } } Loading @@ -318,9 +319,10 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat @NonNull String attributionTag, @NonNull Map<Integer, ArrayMap<String, ArraySet<String>>> mappedOps) { // Only a single lookup from the underlying concurrent data structure final ArrayMap<String, ArraySet<String>> uidTags = mappedOps.get(uid); if (uidTags != null) { final ArraySet<String> packageTags = uidTags.get(packageName); final int appId = UserHandle.getAppId(uid); final ArrayMap<String, ArraySet<String>> appIdTags = mappedOps.get(appId); if (appIdTags != null) { final ArraySet<String> packageTags = appIdTags.get(packageName); if (packageTags != null && packageTags.contains(attributionTag)) { return true; } Loading