summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2013-08-07 15:36:08 -0700
committerThe Android Automerger <android-build@android.com>2013-08-07 16:08:23 -0700
commit172b29e8b35ab441a4481ba8348cb30d596957ff (patch)
tree023478fbf1072ca9fe0176bea59871ccdcefbde0
parent6037ec56af9b38bc5603dc0073a0d8411b948294 (diff)
downloadbase-172b29e8b35ab441a4481ba8348cb30d596957ff.tar.gz
Fix issue #10226007: Reset apps restores most of the changed settings...
...to original but not all modified ones Very stupid mistakes in messing up the iteration when pruning op entries. Change-Id: Ie536b9095f797fcd2b86c9a386a72746796430d1
-rw-r--r--services/java/com/android/server/AppOpsService.java18
1 files changed, 14 insertions, 4 deletions
diff --git a/services/java/com/android/server/AppOpsService.java b/services/java/com/android/server/AppOpsService.java
index 20ad63683acd..a55fddcd7ed8 100644
--- a/services/java/com/android/server/AppOpsService.java
+++ b/services/java/com/android/server/AppOpsService.java
@@ -380,12 +380,14 @@ public class AppOpsService extends IAppOpsService.Stub {
HashMap<Callback, ArrayList<Pair<String, Integer>>> callbacks = null;
synchronized (this) {
boolean changed = false;
- for (int i=0; i<mUidOps.size(); i++) {
+ for (int i=mUidOps.size()-1; i>=0; i--) {
HashMap<String, Ops> packages = mUidOps.valueAt(i);
- for (Map.Entry<String, Ops> ent : packages.entrySet()) {
+ Iterator<Map.Entry<String, Ops>> it = packages.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry<String, Ops> ent = it.next();
String packageName = ent.getKey();
Ops pkgOps = ent.getValue();
- for (int j=0; j<pkgOps.size(); j++) {
+ for (int j=pkgOps.size()-1; j>=0; j--) {
Op curOp = pkgOps.valueAt(j);
if (curOp.mode != AppOpsManager.MODE_ALLOWED) {
curOp.mode = AppOpsManager.MODE_ALLOWED;
@@ -394,9 +396,17 @@ public class AppOpsService extends IAppOpsService.Stub {
mOpModeWatchers.get(curOp.op));
callbacks = addCallbacks(callbacks, packageName, curOp.op,
mPackageModeWatchers.get(packageName));
- pruneOp(curOp, mUidOps.keyAt(i), packageName);
+ if (curOp.time == 0 && curOp.rejectTime == 0) {
+ pkgOps.removeAt(j);
+ }
}
}
+ if (pkgOps.size() == 0) {
+ it.remove();
+ }
+ }
+ if (packages.size() == 0) {
+ mUidOps.removeAt(i);
}
}
if (changed) {