Merge "Don't check pkg<->uid when called from internal"
diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java
index da45054..08cad04 100644
--- a/core/java/android/app/AppOpsManagerInternal.java
+++ b/core/java/android/app/AppOpsManagerInternal.java
@@ -16,6 +16,7 @@
package android.app;
+import android.annotation.NonNull;
import android.util.SparseIntArray;
import com.android.internal.util.function.QuadFunction;
@@ -96,4 +97,18 @@
* @param uid The uid
*/
public abstract void setAllPkgModesToDefault(int code, int uid);
+
+ /**
+ * Get the (raw) mode of an app-op.
+ *
+ * <p>Does <u>not</u> verify that package belongs to uid. The caller needs to do that.
+ *
+ * @param code The code of the op
+ * @param uid The uid of the package the op belongs to
+ * @param packageName The package the op belongs to
+ *
+ * @return The mode of the op
+ */
+ public abstract @AppOpsManager.Mode int checkOperationUnchecked(int code, int uid,
+ @NonNull String packageName);
}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index ba7288e..9c26526 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -1742,10 +1742,31 @@
return checkOperationUnchecked(code, uid, resolvedPackageName, raw);
}
- private int checkOperationUnchecked(int code, int uid, String packageName,
- boolean raw) {
+ /**
+ * @see #checkOperationUnchecked(int, int, String, boolean, boolean)
+ */
+ private @Mode int checkOperationUnchecked(int code, int uid, @NonNull String packageName,
+ boolean raw) {
+ return checkOperationUnchecked(code, uid, packageName, raw, true);
+ }
+
+ /**
+ * Get the mode of an app-op.
+ *
+ * @param code The code of the op
+ * @param uid The uid of the package the op belongs to
+ * @param packageName The package the op belongs to
+ * @param raw If the raw state of eval-ed state should be checked.
+ * @param verify If the code should check the package belongs to the uid
+ *
+ * @return The mode of the op
+ */
+ private @Mode int checkOperationUnchecked(int code, int uid, @NonNull String packageName,
+ boolean raw, boolean verify) {
synchronized (this) {
- checkPackage(uid, packageName);
+ if (verify) {
+ checkPackage(uid, packageName);
+ }
if (isOpRestrictedLocked(uid, code, packageName)) {
return AppOpsManager.MODE_IGNORED;
}
@@ -1756,7 +1777,7 @@
final int rawMode = uidState.opModes.get(code);
return raw ? rawMode : uidState.evalMode(code, rawMode);
}
- Op op = getOpLocked(code, uid, packageName, false, true, false);
+ Op op = getOpLocked(code, uid, packageName, false, verify, false);
if (op == null) {
return AppOpsManager.opToDefaultMode(code);
}
@@ -2359,7 +2380,7 @@
throw new IllegalArgumentException("Bad operation #" + op);
}
- private @NonNull UidState getUidStateLocked(int uid, boolean edit) {
+ private @Nullable UidState getUidStateLocked(int uid, boolean edit) {
UidState uidState = mUidStates.get(uid);
if (uidState == null) {
if (!edit) {
@@ -4535,5 +4556,10 @@
public void setAllPkgModesToDefault(int code, int uid) {
AppOpsService.this.setAllPkgModesToDefault(code, uid);
}
+
+ @Override
+ public @Mode int checkOperationUnchecked(int code, int uid, @NonNull String packageName) {
+ return AppOpsService.this.checkOperationUnchecked(code, uid, packageName, true, false);
+ }
}
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index f7d8e0e..897b885 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -1273,7 +1273,7 @@
@NonNull ArraySet<String> sourcePerms, @NonNull String newPerm,
@NonNull PermissionsState ps, @NonNull PackageParser.Package pkg,
@UserIdInt int userId) {
- AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
+ AppOpsManagerInternal appOpsManager = LocalServices.getService(AppOpsManagerInternal.class);
String pkgName = pkg.packageName;
if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
@@ -1287,10 +1287,10 @@
String sourcePerm = sourcePerms.valueAt(i);
if (ps.hasRuntimePermission(sourcePerm, userId)) {
- String sourceOp = permissionToOp(sourcePerm);
+ int sourceOp = permissionToOpCode(sourcePerm);
- if (sourceOp != null) {
- int mode = appOpsManager.unsafeCheckOpRaw(sourceOp,
+ if (sourceOp != OP_NONE) {
+ int mode = appOpsManager.checkOperationUnchecked(sourceOp,
getUid(userId, getAppId(pkg.applicationInfo.uid)), pkgName);
if (mode == MODE_FOREGROUND || mode == MODE_ERRORED) {