diff options
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 188 |
1 files changed, 130 insertions, 58 deletions
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 052b0c2078d1..1bf30227eb69 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -531,19 +531,6 @@ public class AppOpsService extends IAppOpsService.Stub { } } - // Functions for uid mode access and manipulation. - public SparseIntArray getNonDefaultUidModes() { - return mAppOpsCheckingService.getNonDefaultUidModes(uid); - } - - public int getUidMode(int op) { - return mAppOpsCheckingService.getUidMode(uid, op); - } - - public boolean setUidMode(int op, int mode) { - return mAppOpsCheckingService.setUidMode(uid, op, mode); - } - @SuppressWarnings("GuardedBy") int evalMode(int op, int mode) { return getUidStateTracker().evalMode(uid, op, mode); @@ -613,15 +600,6 @@ public class AppOpsService extends IAppOpsService.Stub { this.packageName = packageName; } - @Mode int getMode() { - return mAppOpsCheckingService.getPackageMode(packageName, this.op, - UserHandle.getUserId(this.uid)); - } - void setMode(@Mode int mode) { - mAppOpsCheckingService.setPackageMode(packageName, this.op, mode, - UserHandle.getUserId(this.uid)); - } - void removeAttributionsWithNoTime() { for (int i = mAttributions.size() - 1; i >= 0; i--) { if (!mAttributions.valueAt(i).hasAnyTime()) { @@ -653,7 +631,11 @@ public class AppOpsService extends IAppOpsService.Stub { mAttributions.valueAt(i).createAttributedOpEntryLocked()); } - return new OpEntry(op, getMode(), attributionEntries); + return new OpEntry( + op, + mAppOpsCheckingService.getPackageMode( + this.packageName, this.op, UserHandle.getUserId(this.uid)), + attributionEntries); } @NonNull OpEntry createSingleAttributionEntryLocked(@Nullable String attributionTag) { @@ -668,7 +650,11 @@ public class AppOpsService extends IAppOpsService.Stub { } } - return new OpEntry(op, getMode(), attributionEntries); + return new OpEntry( + op, + mAppOpsCheckingService.getPackageMode( + this.packageName, this.op, UserHandle.getUserId(this.uid)), + attributionEntries); } boolean isRunning() { @@ -1384,8 +1370,10 @@ public class AppOpsService extends IAppOpsService.Stub { } final int code = foregroundOps.keyAt(fgi); - if (uidState.getUidMode(code) != AppOpsManager.opToDefaultMode(code) - && uidState.getUidMode(code) == AppOpsManager.MODE_FOREGROUND) { + if (mAppOpsCheckingService.getUidMode(uidState.uid, code) + != AppOpsManager.opToDefaultMode(code) + && mAppOpsCheckingService.getUidMode(uidState.uid, code) + == AppOpsManager.MODE_FOREGROUND) { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpChangedForAllPkgsInUid, this, code, uidState.uid, true)); @@ -1405,7 +1393,11 @@ public class AppOpsService extends IAppOpsService.Stub { if (op == null) { continue; } - if (op.getMode() == AppOpsManager.MODE_FOREGROUND) { + if (mAppOpsCheckingService.getPackageMode( + op.packageName, + op.op, + UserHandle.getUserId(op.uid)) + == AppOpsManager.MODE_FOREGROUND) { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpChanged, this, listenerSet.valueAt(cbi), code, uidState.uid, @@ -1497,7 +1489,7 @@ public class AppOpsService extends IAppOpsService.Stub { @Nullable private ArrayList<AppOpsManager.OpEntry> collectUidOps(@NonNull UidState uidState, @Nullable int[] ops) { - final SparseIntArray opModes = uidState.getNonDefaultUidModes(); + final SparseIntArray opModes = mAppOpsCheckingService.getNonDefaultUidModes(uidState.uid); if (opModes == null) { return null; } @@ -1778,7 +1770,11 @@ public class AppOpsService extends IAppOpsService.Stub { Ops ops = getOpsLocked(uid, packageName, null, false, null, /* edit */ false); if (ops != null) { ops.remove(op.op); - op.setMode(AppOpsManager.opToDefaultMode(op.op)); + mAppOpsCheckingService.setPackageMode( + packageName, + op.op, + AppOpsManager.opToDefaultMode(op.op), + UserHandle.getUserId(op.uid)); if (ops.size() <= 0) { UidState uidState = ops.uidState; ArrayMap<String, Ops> pkgOps = uidState.pkgOps; @@ -1848,15 +1844,16 @@ public class AppOpsService extends IAppOpsService.Stub { uidState = new UidState(uid); mUidStates.put(uid, uidState); } - if (uidState.getUidMode(code) != AppOpsManager.opToDefaultMode(code)) { - previousMode = uidState.getUidMode(code); + if (mAppOpsCheckingService.getUidMode(uidState.uid, code) + != AppOpsManager.opToDefaultMode(code)) { + previousMode = mAppOpsCheckingService.getUidMode(uidState.uid, code); } else { // doesn't look right but is legacy behavior. previousMode = MODE_DEFAULT; } mIgnoredCallback = permissionPolicyCallback; - if (!uidState.setUidMode(code, mode)) { + if (!mAppOpsCheckingService.setUidMode(uidState.uid, code, mode)) { return; } if (mode != MODE_ERRORED && mode != previousMode) { @@ -2133,10 +2130,15 @@ public class AppOpsService extends IAppOpsService.Stub { synchronized (this) { Op op = getOpLocked(code, uid, packageName, null, false, pvr.bypass, /* edit */ true); if (op != null) { - if (op.getMode() != mode) { - previousMode = op.getMode(); + if (mAppOpsCheckingService.getPackageMode( + op.packageName, op.op, UserHandle.getUserId(op.uid)) + != mode) { + previousMode = + mAppOpsCheckingService.getPackageMode( + op.packageName, op.op, UserHandle.getUserId(op.uid)); mIgnoredCallback = permissionPolicyCallback; - op.setMode(mode); + mAppOpsCheckingService.setPackageMode(op.packageName, op.op, mode, + UserHandle.getUserId(op.uid)); } } } @@ -2274,7 +2276,7 @@ public class AppOpsService extends IAppOpsService.Stub { for (int i = mUidStates.size() - 1; i >= 0; i--) { UidState uidState = mUidStates.valueAt(i); - SparseIntArray opModes = uidState.getNonDefaultUidModes(); + SparseIntArray opModes = mAppOpsCheckingService.getNonDefaultUidModes(uidState.uid); if (opModes != null && (uidState.uid == reqUid || reqUid == -1)) { final int uidOpCount = opModes.size(); for (int j = uidOpCount - 1; j >= 0; j--) { @@ -2283,7 +2285,7 @@ public class AppOpsService extends IAppOpsService.Stub { int previousMode = opModes.valueAt(j); int newMode = isUidOpGrantedByRole(uidState.uid, code) ? MODE_ALLOWED : AppOpsManager.opToDefaultMode(code); - uidState.setUidMode(code, newMode); + mAppOpsCheckingService.setUidMode(uidState.uid, code, newMode); for (String packageName : getPackagesForUid(uidState.uid)) { callbacks = addCallbacks(callbacks, code, uidState.uid, packageName, previousMode, mOpModeWatchers.get(code)); @@ -2325,14 +2327,22 @@ public class AppOpsService extends IAppOpsService.Stub { continue; } if (AppOpsManager.opAllowsReset(curOp.op)) { - int previousMode = curOp.getMode(); + int previousMode = + mAppOpsCheckingService.getPackageMode( + curOp.packageName, + curOp.op, + UserHandle.getUserId(curOp.uid)); int newMode = isPackageOpGrantedByRole(packageName, uidState.uid, curOp.op) ? MODE_ALLOWED : AppOpsManager.opToDefaultMode( curOp.op); if (previousMode == newMode) { continue; } - curOp.setMode(newMode); + mAppOpsCheckingService.setPackageMode( + curOp.packageName, + curOp.op, + newMode, + UserHandle.getUserId(curOp.uid)); changed = true; uidChanged = true; final int uid = curOp.uidState.uid; @@ -2591,15 +2601,22 @@ public class AppOpsService extends IAppOpsService.Stub { code = AppOpsManager.opToSwitch(code); UidState uidState = getUidStateLocked(uid, false); if (uidState != null - && uidState.getUidMode(code) != AppOpsManager.opToDefaultMode(code)) { - final int rawMode = uidState.getUidMode(code); + && mAppOpsCheckingService.getUidMode(uidState.uid, code) + != AppOpsManager.opToDefaultMode(code)) { + final int rawMode = mAppOpsCheckingService.getUidMode(uidState.uid, code); return raw ? rawMode : uidState.evalMode(code, rawMode); } Op op = getOpLocked(code, uid, packageName, null, false, pvr.bypass, /* edit */ false); if (op == null) { return AppOpsManager.opToDefaultMode(code); } - return raw ? op.getMode() : op.uidState.evalMode(op.op, op.getMode()); + return raw + ? mAppOpsCheckingService.getPackageMode( + op.packageName, op.op, UserHandle.getUserId(op.uid)) + : op.uidState.evalMode( + op.op, + mAppOpsCheckingService.getPackageMode( + op.packageName, op.op, UserHandle.getUserId(op.uid))); } } @@ -2835,8 +2852,11 @@ public class AppOpsService extends IAppOpsService.Stub { } // If there is a non-default per UID policy (we set UID op mode only if // non-default) it takes over, otherwise use the per package policy. - if (uidState.getUidMode(switchCode) != AppOpsManager.opToDefaultMode(switchCode)) { - final int uidMode = uidState.evalMode(code, uidState.getUidMode(switchCode)); + if (mAppOpsCheckingService.getUidMode(uidState.uid, switchCode) + != AppOpsManager.opToDefaultMode(switchCode)) { + final int uidMode = + uidState.evalMode( + code, mAppOpsCheckingService.getUidMode(uidState.uid, switchCode)); if (uidMode != AppOpsManager.MODE_ALLOWED) { if (DEBUG) Slog.d(TAG, "noteOperation: uid reject #" + uidMode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " @@ -2849,7 +2869,13 @@ public class AppOpsService extends IAppOpsService.Stub { } else { final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, uid, true) : op; - final int mode = switchOp.uidState.evalMode(switchOp.op, switchOp.getMode()); + final int mode = + switchOp.uidState.evalMode( + switchOp.op, + mAppOpsCheckingService.getPackageMode( + switchOp.packageName, + switchOp.op, + UserHandle.getUserId(switchOp.uid))); if (mode != AppOpsManager.MODE_ALLOWED) { if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + mode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " @@ -3371,8 +3397,11 @@ public class AppOpsService extends IAppOpsService.Stub { final int switchCode = AppOpsManager.opToSwitch(code); // If there is a non-default per UID policy (we set UID op mode only if // non-default) it takes over, otherwise use the per package policy. - if (uidState.getUidMode(switchCode) != AppOpsManager.opToDefaultMode(switchCode)) { - final int uidMode = uidState.evalMode(code, uidState.getUidMode(switchCode)); + if (mAppOpsCheckingService.getUidMode(uidState.uid, switchCode) + != AppOpsManager.opToDefaultMode(switchCode)) { + final int uidMode = + uidState.evalMode( + code, mAppOpsCheckingService.getUidMode(uidState.uid, switchCode)); if (!shouldStartForMode(uidMode, startIfModeDefault)) { if (DEBUG) { Slog.d(TAG, "startOperation: uid reject #" + uidMode + " for code " @@ -3387,7 +3416,13 @@ public class AppOpsService extends IAppOpsService.Stub { } else { final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, uid, true) : op; - final int mode = switchOp.uidState.evalMode(switchOp.op, switchOp.getMode()); + final int mode = + switchOp.uidState.evalMode( + switchOp.op, + mAppOpsCheckingService.getPackageMode( + switchOp.packageName, + switchOp.op, + UserHandle.getUserId(switchOp.uid))); if (mode != AppOpsManager.MODE_ALLOWED && (!startIfModeDefault || mode != MODE_DEFAULT)) { if (DEBUG) Slog.d(TAG, "startOperation: reject #" + mode + " for code " @@ -3477,8 +3512,11 @@ public class AppOpsService extends IAppOpsService.Stub { final int switchCode = AppOpsManager.opToSwitch(code); // If there is a non-default mode per UID policy (we set UID op mode only if // non-default) it takes over, otherwise use the per package policy. - if (uidState.getUidMode(switchCode) != AppOpsManager.opToDefaultMode(switchCode)) { - final int uidMode = uidState.evalMode(code, uidState.getUidMode(switchCode)); + if (mAppOpsCheckingService.getUidMode(uidState.uid, switchCode) + != AppOpsManager.opToDefaultMode(switchCode)) { + final int uidMode = + uidState.evalMode( + code, mAppOpsCheckingService.getUidMode(uidState.uid, switchCode)); if (!shouldStartForMode(uidMode, startIfModeDefault)) { if (DEBUG) { Slog.d(TAG, "startOperation: uid reject #" + uidMode + " for code " @@ -3490,7 +3528,13 @@ public class AppOpsService extends IAppOpsService.Stub { } else { final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, uid, true) : op; - final int mode = switchOp.uidState.evalMode(switchOp.op, switchOp.getMode()); + final int mode = + switchOp.uidState.evalMode( + switchOp.op, + mAppOpsCheckingService.getPackageMode( + switchOp.packageName, + switchOp.op, + UserHandle.getUserId(switchOp.uid))); if (mode != AppOpsManager.MODE_ALLOWED && (!startIfModeDefault || mode != MODE_DEFAULT)) { if (DEBUG) { @@ -5619,7 +5663,8 @@ public class AppOpsService extends IAppOpsService.Stub { } for (int i=0; i<mUidStates.size(); i++) { UidState uidState = mUidStates.valueAt(i); - final SparseIntArray opModes = uidState.getNonDefaultUidModes(); + final SparseIntArray opModes = + mAppOpsCheckingService.getNonDefaultUidModes(uidState.uid); final ArrayMap<String, Ops> pkgOps = uidState.pkgOps; if (dumpWatchers || dumpHistory) { @@ -5647,7 +5692,12 @@ public class AppOpsService extends IAppOpsService.Stub { } if (!hasMode) { for (int opi = 0; !hasMode && opi < ops.size(); opi++) { - if (ops.valueAt(opi).getMode() == dumpMode) { + final Op op = ops.valueAt(opi); + if (mAppOpsCheckingService.getPackageMode( + op.packageName, + op.op, + UserHandle.getUserId(op.uid)) + == dumpMode) { hasMode = true; } } @@ -5698,7 +5748,12 @@ public class AppOpsService extends IAppOpsService.Stub { if (dumpOp >= 0 && dumpOp != opCode) { continue; } - if (dumpMode >= 0 && dumpMode != op.getMode()) { + if (dumpMode >= 0 + && dumpMode + != mAppOpsCheckingService.getPackageMode( + op.packageName, + op.op, + UserHandle.getUserId(op.uid))) { continue; } if (!printedPackage) { @@ -5706,14 +5761,25 @@ public class AppOpsService extends IAppOpsService.Stub { printedPackage = true; } pw.print(" "); pw.print(AppOpsManager.opToName(opCode)); - pw.print(" ("); pw.print(AppOpsManager.modeToName(op.getMode())); + pw.print(" ("); + pw.print( + AppOpsManager.modeToName( + mAppOpsCheckingService.getPackageMode( + op.packageName, + op.op, + UserHandle.getUserId(op.uid)))); final int switchOp = AppOpsManager.opToSwitch(opCode); if (switchOp != opCode) { pw.print(" / switch "); pw.print(AppOpsManager.opToName(switchOp)); final Op switchObj = ops.get(switchOp); - int mode = switchObj == null - ? AppOpsManager.opToDefaultMode(switchOp) : switchObj.getMode(); + int mode = + switchObj == null + ? AppOpsManager.opToDefaultMode(switchOp) + : mAppOpsCheckingService.getPackageMode( + switchObj.packageName, + switchObj.op, + UserHandle.getUserId(switchObj.uid)); pw.print("="); pw.print(AppOpsManager.modeToName(mode)); } pw.println("): "); @@ -5847,7 +5913,13 @@ public class AppOpsService extends IAppOpsService.Stub { for (int pkgNum = 0; pkgNum < numPkgOps; pkgNum++) { Ops ops = uidState.pkgOps.valueAt(pkgNum); Op op = ops != null ? ops.get(code) : null; - if (op == null || (op.getMode() != MODE_ALLOWED && op.getMode() != MODE_FOREGROUND)) { + if (op == null) { + continue; + } + final int mode = + mAppOpsCheckingService.getPackageMode( + op.packageName, op.op, UserHandle.getUserId(op.uid)); + if (mode != MODE_ALLOWED && mode != MODE_FOREGROUND) { continue; } int numAttrTags = op.mAttributions.size(); |