diff options
| author | 2020-05-12 13:52:51 +0000 | |
|---|---|---|
| committer | 2020-05-12 13:52:51 +0000 | |
| commit | 772be3e0ca043be330c623f476d89276cb4a0d02 (patch) | |
| tree | 83fb1114088bb7737bba783782105beaed274106 | |
| parent | 28c447af31c69d0f279ca41afe4b5110b6f64414 (diff) | |
| parent | 1470f1f691c2f49207ab42951f6601e2ea6e3a1a (diff) | |
Merge "AppOpsService: Notify storage manager when all ops are reset." into rvc-dev
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 55 |
1 files 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 63e01e034d7e..5ebfb0069931 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -2582,6 +2582,28 @@ public class AppOpsService extends IAppOpsService.Stub { } } + private static ArrayList<ChangeRec> addChange(ArrayList<ChangeRec> 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<ModeCallback, ArrayList<ChangeRec>> addCallbacks( HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks, int op, int uid, String packageName, ArraySet<ModeCallback> cbs) { @@ -2595,22 +2617,9 @@ public class AppOpsService extends IAppOpsService.Stub { for (int i=0; i<N; i++) { ModeCallback cb = cbs.valueAt(i); ArrayList<ChangeRec> 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<ChangeRec> changed = addChange(reports, op, uid, packageName); + if (changed != reports) { + callbacks.put(cb, changed); } } return callbacks; @@ -2648,6 +2657,7 @@ public class AppOpsService extends IAppOpsService.Stub { enforceManageAppOpsModes(callingPid, callingUid, reqUid); HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks = null; + ArrayList<ChangeRec> allChanges = new ArrayList<>(); synchronized (this) { boolean changed = false; for (int i = mUidStates.size() - 1; i >= 0; i--) { @@ -2668,6 +2678,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); } } } @@ -2707,6 +2720,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); @@ -2741,6 +2755,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() { |