Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1470f1f6 authored by Narayan Kamath's avatar Narayan Kamath
Browse files

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
parent 43799554
Loading
Loading
Loading
Loading
+39 −16
Original line number Diff line number Diff line
@@ -2536,23 +2536,11 @@ public class AppOpsService extends IAppOpsService.Stub {
        }
    }

    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);
    private static ArrayList<ChangeRec> addChange(ArrayList<ChangeRec> reports,
            int op, int uid, String packageName) {
        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++) {
@@ -2566,6 +2554,27 @@ public class AppOpsService extends IAppOpsService.Stub {
        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) {
        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;
    }
@@ -2602,6 +2611,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--) {
@@ -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() {