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
This commit is contained in:
Svet Ganov
2021-04-28 22:14:25 +00:00
parent 76cdac9f94
commit 4f0b921e9d

View File

@@ -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);
}
@@ -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<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;
}