From 1470f1f691c2f49207ab42951f6601e2ea6e3a1a Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Mon, 4 May 2020 09:06:40 +0100 Subject: AppOpsService: Notify storage manager when all ops are reset. Ops that it is interested in may be reset. Test: manual Bug: 153226372 Change-Id: Id0fdea4646b5eb3d9eee6bde0c6212b91768517f --- .../com/android/server/appop/AppOpsService.java | 55 +++++++++++++++------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index d76ee685ca4d..6fe73a6cc666 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -2536,6 +2536,28 @@ public class AppOpsService extends IAppOpsService.Stub { } } + private static ArrayList addChange(ArrayList reports, + int op, int uid, String packageName) { + boolean duplicate = false; + if (reports == null) { + reports = new ArrayList<>(); + } else { + final int reportCount = reports.size(); + for (int j = 0; j < reportCount; j++) { + ChangeRec report = reports.get(j); + if (report.op == op && report.pkg.equals(packageName)) { + duplicate = true; + break; + } + } + } + if (!duplicate) { + reports.add(new ChangeRec(op, uid, packageName)); + } + + return reports; + } + private static HashMap> addCallbacks( HashMap> callbacks, int op, int uid, String packageName, ArraySet cbs) { @@ -2549,22 +2571,9 @@ public class AppOpsService extends IAppOpsService.Stub { for (int i=0; i reports = callbacks.get(cb); - boolean duplicate = false; - if (reports == null) { - reports = new ArrayList<>(); - callbacks.put(cb, reports); - } else { - final int reportCount = reports.size(); - for (int j = 0; j < reportCount; j++) { - ChangeRec report = reports.get(j); - if (report.op == op && report.pkg.equals(packageName)) { - duplicate = true; - break; - } - } - } - if (!duplicate) { - reports.add(new ChangeRec(op, uid, packageName)); + ArrayList changed = addChange(reports, op, uid, packageName); + if (changed != reports) { + callbacks.put(cb, changed); } } return callbacks; @@ -2602,6 +2611,7 @@ public class AppOpsService extends IAppOpsService.Stub { enforceManageAppOpsModes(callingPid, callingUid, reqUid); HashMap> callbacks = null; + ArrayList allChanges = new ArrayList<>(); synchronized (this) { boolean changed = false; for (int i = mUidStates.size() - 1; i >= 0; i--) { @@ -2622,6 +2632,9 @@ public class AppOpsService extends IAppOpsService.Stub { mOpModeWatchers.get(code)); callbacks = addCallbacks(callbacks, code, uidState.uid, packageName, mPackageModeWatchers.get(packageName)); + + allChanges = addChange(allChanges, code, uidState.uid, + packageName); } } } @@ -2661,6 +2674,7 @@ public class AppOpsService extends IAppOpsService.Stub { callbacks = addCallbacks(callbacks, curOp.op, uid, packageName, mPackageModeWatchers.get(packageName)); + allChanges = addChange(allChanges, curOp.op, uid, packageName); curOp.removeAttributionsWithNoTime(); if (curOp.mAttributions.isEmpty()) { pkgOps.removeAt(j); @@ -2695,6 +2709,15 @@ public class AppOpsService extends IAppOpsService.Stub { } } } + + if (allChanges != null) { + int numChanges = allChanges.size(); + for (int i = 0; i < numChanges; i++) { + ChangeRec change = allChanges.get(i); + notifyOpChangedSync(change.op, change.uid, change.pkg, + AppOpsManager.opToDefaultMode(change.op)); + } + } } private void evalAllForegroundOpsLocked() { -- cgit v1.2.3-59-g8ed1b