Merge "Don't mutate permission state when setting app op from PermissionPolicyService."

This commit is contained in:
Nate Myren
2020-02-18 17:08:59 +00:00
committed by Android (Google) Code Review
3 changed files with 25 additions and 21 deletions

View File

@@ -94,14 +94,16 @@ public abstract class AppOpsManagerInternal {
boolean visible);
/**
* Like {@link AppOpsManager#setUidMode}, but allows ignoring a certain callback.
* Like {@link AppOpsManager#setUidMode}, but allows ignoring our own callback and not updating
* the REVOKED_COMPAT flag.
*/
public abstract void setUidModeIgnoringCallback(int code, int uid, int mode,
@Nullable IAppOpsCallback callbackToIgnore);
public abstract void setUidModeFromPermissionPolicy(int code, int uid, int mode,
@Nullable IAppOpsCallback callback);
/**
* Like {@link AppOpsManager#setMode}, but allows ignoring a certain callback.
* Like {@link AppOpsManager#setMode}, but allows ignoring our own callback and not updating the
* REVOKED_COMPAT flag.
*/
public abstract void setModeIgnoringCallback(int code, int uid, @NonNull String packageName,
int mode, @Nullable IAppOpsCallback callbackToIgnore);
public abstract void setModeFromPermissionPolicy(int code, int uid, @NonNull String packageName,
int mode, @Nullable IAppOpsCallback callback);
}

View File

@@ -2087,7 +2087,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
private void setUidMode(int code, int uid, int mode,
@Nullable IAppOpsCallback callbackToIgnore) {
@Nullable IAppOpsCallback permissionPolicyCallback) {
if (DEBUG) {
Slog.i(TAG, "uid " + uid + " OP_" + opToName(code) + " := " + modeToName(mode)
+ " by uid " + Binder.getCallingUid());
@@ -2097,7 +2097,9 @@ public class AppOpsService extends IAppOpsService.Stub {
verifyIncomingOp(code);
code = AppOpsManager.opToSwitch(code);
updatePermissionRevokedCompat(uid, code, mode);
if (permissionPolicyCallback == null) {
updatePermissionRevokedCompat(uid, code, mode);
}
synchronized (this) {
final int defaultMode = AppOpsManager.opToDefaultMode(code);
@@ -2135,7 +2137,7 @@ public class AppOpsService extends IAppOpsService.Stub {
uidState.evalForegroundOps(mOpModeWatchers);
}
notifyOpChangedForAllPkgsInUid(code, uid, false, callbackToIgnore);
notifyOpChangedForAllPkgsInUid(code, uid, false, permissionPolicyCallback);
notifyOpChangedSync(code, uid, null, mode);
}
@@ -2337,7 +2339,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
private void setMode(int code, int uid, @NonNull String packageName, int mode,
@Nullable IAppOpsCallback callbackToIgnore) {
@Nullable IAppOpsCallback permissionPolicyCallback) {
enforceManageAppOpsModes(Binder.getCallingPid(), Binder.getCallingUid(), uid);
verifyIncomingOp(code);
ArraySet<ModeCallback> repCbs = null;
@@ -2381,8 +2383,8 @@ public class AppOpsService extends IAppOpsService.Stub {
}
repCbs.addAll(cbs);
}
if (repCbs != null && callbackToIgnore != null) {
repCbs.remove(mModeWatchers.get(callbackToIgnore.asBinder()));
if (repCbs != null && permissionPolicyCallback != null) {
repCbs.remove(mModeWatchers.get(permissionPolicyCallback.asBinder()));
}
if (mode == AppOpsManager.opToDefaultMode(op.op)) {
// If going into the default mode, prune this op
@@ -6036,15 +6038,15 @@ public class AppOpsService extends IAppOpsService.Stub {
}
@Override
public void setUidModeIgnoringCallback(int code, int uid, int mode,
@Nullable IAppOpsCallback callbackToIgnore) {
setUidMode(code, uid, mode, callbackToIgnore);
public void setUidModeFromPermissionPolicy(int code, int uid, int mode,
@Nullable IAppOpsCallback callback) {
setUidMode(code, uid, mode, callback);
}
@Override
public void setModeIgnoringCallback(int code, int uid, @NonNull String packageName,
int mode, @Nullable IAppOpsCallback callbackToIgnore) {
setMode(code, uid, packageName, mode, callbackToIgnore);
public void setModeFromPermissionPolicy(int code, int uid, @NonNull String packageName,
int mode, @Nullable IAppOpsCallback callback) {
setMode(code, uid, packageName, mode, callback);
}
}
}

View File

@@ -683,7 +683,7 @@ public final class PermissionPolicyService extends SystemService {
opCode), uid, pkgsOfUid[0]);
if (currentMode != MODE_ALLOWED) {
if (currentMode != MODE_IGNORED) {
mAppOpsManagerInternal.setUidModeIgnoringCallback(opCode, uid, MODE_IGNORED,
mAppOpsManagerInternal.setUidModeFromPermissionPolicy(opCode, uid, MODE_IGNORED,
mAppOpsCallback);
}
return true;
@@ -700,7 +700,7 @@ public final class PermissionPolicyService extends SystemService {
final int oldMode = mAppOpsManager.unsafeCheckOpRaw(AppOpsManager.opToPublicName(
opCode), uid, pkgsOfUid[0]);
if (oldMode != mode) {
mAppOpsManagerInternal.setUidModeIgnoringCallback(opCode, uid, mode,
mAppOpsManagerInternal.setUidModeFromPermissionPolicy(opCode, uid, mode,
mAppOpsCallback);
final int newMode = mAppOpsManager.unsafeCheckOpRaw(AppOpsManager.opToPublicName(
opCode), uid, pkgsOfUid[0]);
@@ -708,7 +708,7 @@ public final class PermissionPolicyService extends SystemService {
// Work around incorrectly-set package mode. It never makes sense for app ops
// related to runtime permissions, but can get in the way and we have to reset
// it.
mAppOpsManagerInternal.setModeIgnoringCallback(opCode, uid, pkgsOfUid[0],
mAppOpsManagerInternal.setModeFromPermissionPolicy(opCode, uid, pkgsOfUid[0],
AppOpsManager.opToDefaultMode(opCode), mAppOpsCallback);
}
}