Loading services/core/java/com/android/server/appop/AppOpsService.java +39 −16 Original line number Original line Diff line number Diff line Loading @@ -2582,23 +2582,11 @@ public class AppOpsService extends IAppOpsService.Stub { } } } } private static HashMap<ModeCallback, ArrayList<ChangeRec>> addCallbacks( private static ArrayList<ChangeRec> addChange(ArrayList<ChangeRec> reports, HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks, int op, int uid, String packageName) { int op, int uid, String packageName, ArraySet<ModeCallback> cbs) { if (cbs == null) { return callbacks; } if (callbacks == null) { callbacks = new HashMap<>(); } final int N = cbs.size(); for (int i=0; i<N; i++) { ModeCallback cb = cbs.valueAt(i); ArrayList<ChangeRec> reports = callbacks.get(cb); boolean duplicate = false; boolean duplicate = false; if (reports == null) { if (reports == null) { reports = new ArrayList<>(); reports = new ArrayList<>(); callbacks.put(cb, reports); } else { } else { final int reportCount = reports.size(); final int reportCount = reports.size(); for (int j = 0; j < reportCount; j++) { for (int j = 0; j < reportCount; j++) { Loading @@ -2612,6 +2600,27 @@ public class AppOpsService extends IAppOpsService.Stub { if (!duplicate) { if (!duplicate) { reports.add(new ChangeRec(op, uid, packageName)); 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) { if (cbs == null) { return callbacks; } if (callbacks == null) { callbacks = new HashMap<>(); } final int N = cbs.size(); for (int i=0; i<N; i++) { ModeCallback cb = cbs.valueAt(i); ArrayList<ChangeRec> reports = callbacks.get(cb); ArrayList<ChangeRec> changed = addChange(reports, op, uid, packageName); if (changed != reports) { callbacks.put(cb, changed); } } } return callbacks; return callbacks; } } Loading Loading @@ -2648,6 +2657,7 @@ public class AppOpsService extends IAppOpsService.Stub { enforceManageAppOpsModes(callingPid, callingUid, reqUid); enforceManageAppOpsModes(callingPid, callingUid, reqUid); HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks = null; HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks = null; ArrayList<ChangeRec> allChanges = new ArrayList<>(); synchronized (this) { synchronized (this) { boolean changed = false; boolean changed = false; for (int i = mUidStates.size() - 1; i >= 0; i--) { for (int i = mUidStates.size() - 1; i >= 0; i--) { Loading @@ -2668,6 +2678,9 @@ public class AppOpsService extends IAppOpsService.Stub { mOpModeWatchers.get(code)); mOpModeWatchers.get(code)); callbacks = addCallbacks(callbacks, code, uidState.uid, packageName, callbacks = addCallbacks(callbacks, code, uidState.uid, packageName, mPackageModeWatchers.get(packageName)); mPackageModeWatchers.get(packageName)); allChanges = addChange(allChanges, code, uidState.uid, packageName); } } } } } } Loading Loading @@ -2707,6 +2720,7 @@ public class AppOpsService extends IAppOpsService.Stub { callbacks = addCallbacks(callbacks, curOp.op, uid, packageName, callbacks = addCallbacks(callbacks, curOp.op, uid, packageName, mPackageModeWatchers.get(packageName)); mPackageModeWatchers.get(packageName)); allChanges = addChange(allChanges, curOp.op, uid, packageName); curOp.removeAttributionsWithNoTime(); curOp.removeAttributionsWithNoTime(); if (curOp.mAttributions.isEmpty()) { if (curOp.mAttributions.isEmpty()) { pkgOps.removeAt(j); pkgOps.removeAt(j); Loading Loading @@ -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() { private void evalAllForegroundOpsLocked() { Loading Loading
services/core/java/com/android/server/appop/AppOpsService.java +39 −16 Original line number Original line Diff line number Diff line Loading @@ -2582,23 +2582,11 @@ public class AppOpsService extends IAppOpsService.Stub { } } } } private static HashMap<ModeCallback, ArrayList<ChangeRec>> addCallbacks( private static ArrayList<ChangeRec> addChange(ArrayList<ChangeRec> reports, HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks, int op, int uid, String packageName) { int op, int uid, String packageName, ArraySet<ModeCallback> cbs) { if (cbs == null) { return callbacks; } if (callbacks == null) { callbacks = new HashMap<>(); } final int N = cbs.size(); for (int i=0; i<N; i++) { ModeCallback cb = cbs.valueAt(i); ArrayList<ChangeRec> reports = callbacks.get(cb); boolean duplicate = false; boolean duplicate = false; if (reports == null) { if (reports == null) { reports = new ArrayList<>(); reports = new ArrayList<>(); callbacks.put(cb, reports); } else { } else { final int reportCount = reports.size(); final int reportCount = reports.size(); for (int j = 0; j < reportCount; j++) { for (int j = 0; j < reportCount; j++) { Loading @@ -2612,6 +2600,27 @@ public class AppOpsService extends IAppOpsService.Stub { if (!duplicate) { if (!duplicate) { reports.add(new ChangeRec(op, uid, packageName)); 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) { if (cbs == null) { return callbacks; } if (callbacks == null) { callbacks = new HashMap<>(); } final int N = cbs.size(); for (int i=0; i<N; i++) { ModeCallback cb = cbs.valueAt(i); ArrayList<ChangeRec> reports = callbacks.get(cb); ArrayList<ChangeRec> changed = addChange(reports, op, uid, packageName); if (changed != reports) { callbacks.put(cb, changed); } } } return callbacks; return callbacks; } } Loading Loading @@ -2648,6 +2657,7 @@ public class AppOpsService extends IAppOpsService.Stub { enforceManageAppOpsModes(callingPid, callingUid, reqUid); enforceManageAppOpsModes(callingPid, callingUid, reqUid); HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks = null; HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks = null; ArrayList<ChangeRec> allChanges = new ArrayList<>(); synchronized (this) { synchronized (this) { boolean changed = false; boolean changed = false; for (int i = mUidStates.size() - 1; i >= 0; i--) { for (int i = mUidStates.size() - 1; i >= 0; i--) { Loading @@ -2668,6 +2678,9 @@ public class AppOpsService extends IAppOpsService.Stub { mOpModeWatchers.get(code)); mOpModeWatchers.get(code)); callbacks = addCallbacks(callbacks, code, uidState.uid, packageName, callbacks = addCallbacks(callbacks, code, uidState.uid, packageName, mPackageModeWatchers.get(packageName)); mPackageModeWatchers.get(packageName)); allChanges = addChange(allChanges, code, uidState.uid, packageName); } } } } } } Loading Loading @@ -2707,6 +2720,7 @@ public class AppOpsService extends IAppOpsService.Stub { callbacks = addCallbacks(callbacks, curOp.op, uid, packageName, callbacks = addCallbacks(callbacks, curOp.op, uid, packageName, mPackageModeWatchers.get(packageName)); mPackageModeWatchers.get(packageName)); allChanges = addChange(allChanges, curOp.op, uid, packageName); curOp.removeAttributionsWithNoTime(); curOp.removeAttributionsWithNoTime(); if (curOp.mAttributions.isEmpty()) { if (curOp.mAttributions.isEmpty()) { pkgOps.removeAt(j); pkgOps.removeAt(j); Loading Loading @@ -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() { private void evalAllForegroundOpsLocked() { Loading