diff options
author | Dianne Hackborn <hackbod@google.com> | 2013-08-07 15:36:08 -0700 |
---|---|---|
committer | The Android Automerger <android-build@android.com> | 2013-08-07 16:08:23 -0700 |
commit | 172b29e8b35ab441a4481ba8348cb30d596957ff (patch) | |
tree | 023478fbf1072ca9fe0176bea59871ccdcefbde0 | |
parent | 6037ec56af9b38bc5603dc0073a0d8411b948294 (diff) | |
download | base-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.java | 18 |
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) { |