Loading services/core/java/com/android/server/appop/AppOpsService.java +38 −16 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION; import static android.app.AppOpsManager.UID_STATE_MAX_LAST_NON_RESTRICTED; import static android.app.AppOpsManager.UID_STATE_PERSISTENT; import static android.app.AppOpsManager.UID_STATE_TOP; import static android.app.AppOpsManager.WATCH_FOREGROUND_CHANGES; import static android.app.AppOpsManager.modeToName; import static android.app.AppOpsManager.opToName; import static android.app.AppOpsManager.resolveFirstUnrestrictedUidState; Loading Loading @@ -1285,6 +1286,18 @@ public class AppOpsService extends IAppOpsService.Stub { uidState.evalForegroundOps(mOpModeWatchers); } notifyOpChangedForAllPkgsInUid(code, uid, false); notifyOpChangedSync(code, uid, null, mode); } /** * Notify that an op changed for all packages in an uid. * * @param code The op that changed * @param uid The uid the op was changed for * @param onlyForeground Only notify watchers that watch for foreground changes */ private void notifyOpChangedForAllPkgsInUid(int code, int uid, boolean onlyForeground) { String[] uidPackageNames = getPackagesForUid(uid); ArrayMap<ModeCallback, ArraySet<String>> callbackSpecs = null; Loading @@ -1294,6 +1307,10 @@ public class AppOpsService extends IAppOpsService.Stub { final int callbackCount = callbacks.size(); for (int i = 0; i < callbackCount; i++) { ModeCallback callback = callbacks.valueAt(i); if (onlyForeground && (callback.mFlags & WATCH_FOREGROUND_CHANGES) == 0) { continue; } ArraySet<String> changedPackages = new ArraySet<>(); Collections.addAll(changedPackages, uidPackageNames); if (callbackSpecs == null) { Loading @@ -1312,6 +1329,10 @@ public class AppOpsService extends IAppOpsService.Stub { final int callbackCount = callbacks.size(); for (int i = 0; i < callbackCount; i++) { ModeCallback callback = callbacks.valueAt(i); if (onlyForeground && (callback.mFlags & WATCH_FOREGROUND_CHANGES) == 0) { continue; } ArraySet<String> changedPackages = callbackSpecs.get(callback); if (changedPackages == null) { changedPackages = new ArraySet<>(); Loading @@ -1324,7 +1345,6 @@ public class AppOpsService extends IAppOpsService.Stub { } if (callbackSpecs == null) { notifyOpChangedSync(code, uid, null, mode); return; } Loading @@ -1346,8 +1366,6 @@ public class AppOpsService extends IAppOpsService.Stub { } } } notifyOpChangedSync(code, uid, null, mode); } private void notifyOpChangedSync(int code, int uid, @NonNull String packageName, int mode) { Loading Loading @@ -2471,6 +2489,14 @@ public class AppOpsService extends IAppOpsService.Stub { if (resolvedLastFg == resolvedNowFg) { continue; } if (uidState.opModes != null && uidState.opModes.indexOfKey(code) >= 0 && uidState.opModes.get(code) == AppOpsManager.MODE_FOREGROUND) { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpChangedForAllPkgsInUid, this, code, uidState.uid, true)); } else { final ArraySet<ModeCallback> callbacks = mOpModeWatchers.get(code); if (callbacks != null) { for (int cbi = callbacks.size() - 1; cbi >= 0; cbi--) { Loading @@ -2479,16 +2505,12 @@ public class AppOpsService extends IAppOpsService.Stub { || !callback.isWatchingUid(uidState.uid)) { continue; } boolean doAllPackages = uidState.opModes != null && uidState.opModes.indexOfKey(code) >= 0 && uidState.opModes.get(code) == AppOpsManager.MODE_FOREGROUND; if (uidState.pkgOps != null) { for (int pkgi = uidState.pkgOps.size() - 1; pkgi >= 0; pkgi--) { final Op op = uidState.pkgOps.valueAt(pkgi).get(code); if (op == null) { continue; } if (doAllPackages || op.mode == AppOpsManager.MODE_FOREGROUND) { if (op.mode == AppOpsManager.MODE_FOREGROUND) { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpChanged, this, callback, code, uidState.uid, Loading Loading
services/core/java/com/android/server/appop/AppOpsService.java +38 −16 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION; import static android.app.AppOpsManager.UID_STATE_MAX_LAST_NON_RESTRICTED; import static android.app.AppOpsManager.UID_STATE_PERSISTENT; import static android.app.AppOpsManager.UID_STATE_TOP; import static android.app.AppOpsManager.WATCH_FOREGROUND_CHANGES; import static android.app.AppOpsManager.modeToName; import static android.app.AppOpsManager.opToName; import static android.app.AppOpsManager.resolveFirstUnrestrictedUidState; Loading Loading @@ -1285,6 +1286,18 @@ public class AppOpsService extends IAppOpsService.Stub { uidState.evalForegroundOps(mOpModeWatchers); } notifyOpChangedForAllPkgsInUid(code, uid, false); notifyOpChangedSync(code, uid, null, mode); } /** * Notify that an op changed for all packages in an uid. * * @param code The op that changed * @param uid The uid the op was changed for * @param onlyForeground Only notify watchers that watch for foreground changes */ private void notifyOpChangedForAllPkgsInUid(int code, int uid, boolean onlyForeground) { String[] uidPackageNames = getPackagesForUid(uid); ArrayMap<ModeCallback, ArraySet<String>> callbackSpecs = null; Loading @@ -1294,6 +1307,10 @@ public class AppOpsService extends IAppOpsService.Stub { final int callbackCount = callbacks.size(); for (int i = 0; i < callbackCount; i++) { ModeCallback callback = callbacks.valueAt(i); if (onlyForeground && (callback.mFlags & WATCH_FOREGROUND_CHANGES) == 0) { continue; } ArraySet<String> changedPackages = new ArraySet<>(); Collections.addAll(changedPackages, uidPackageNames); if (callbackSpecs == null) { Loading @@ -1312,6 +1329,10 @@ public class AppOpsService extends IAppOpsService.Stub { final int callbackCount = callbacks.size(); for (int i = 0; i < callbackCount; i++) { ModeCallback callback = callbacks.valueAt(i); if (onlyForeground && (callback.mFlags & WATCH_FOREGROUND_CHANGES) == 0) { continue; } ArraySet<String> changedPackages = callbackSpecs.get(callback); if (changedPackages == null) { changedPackages = new ArraySet<>(); Loading @@ -1324,7 +1345,6 @@ public class AppOpsService extends IAppOpsService.Stub { } if (callbackSpecs == null) { notifyOpChangedSync(code, uid, null, mode); return; } Loading @@ -1346,8 +1366,6 @@ public class AppOpsService extends IAppOpsService.Stub { } } } notifyOpChangedSync(code, uid, null, mode); } private void notifyOpChangedSync(int code, int uid, @NonNull String packageName, int mode) { Loading Loading @@ -2471,6 +2489,14 @@ public class AppOpsService extends IAppOpsService.Stub { if (resolvedLastFg == resolvedNowFg) { continue; } if (uidState.opModes != null && uidState.opModes.indexOfKey(code) >= 0 && uidState.opModes.get(code) == AppOpsManager.MODE_FOREGROUND) { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpChangedForAllPkgsInUid, this, code, uidState.uid, true)); } else { final ArraySet<ModeCallback> callbacks = mOpModeWatchers.get(code); if (callbacks != null) { for (int cbi = callbacks.size() - 1; cbi >= 0; cbi--) { Loading @@ -2479,16 +2505,12 @@ public class AppOpsService extends IAppOpsService.Stub { || !callback.isWatchingUid(uidState.uid)) { continue; } boolean doAllPackages = uidState.opModes != null && uidState.opModes.indexOfKey(code) >= 0 && uidState.opModes.get(code) == AppOpsManager.MODE_FOREGROUND; if (uidState.pkgOps != null) { for (int pkgi = uidState.pkgOps.size() - 1; pkgi >= 0; pkgi--) { final Op op = uidState.pkgOps.valueAt(pkgi).get(code); if (op == null) { continue; } if (doAllPackages || op.mode == AppOpsManager.MODE_FOREGROUND) { if (op.mode == AppOpsManager.MODE_FOREGROUND) { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpChanged, this, callback, code, uidState.uid, Loading