diff options
| author | 2023-11-15 21:38:06 +0000 | |
|---|---|---|
| committer | 2023-11-22 23:54:44 +0000 | |
| commit | 319379cfee9fb16bacc582e3f83b58ecedc730d9 (patch) | |
| tree | e8bed83f802b636588be51c78690c01bcfafa032 | |
| parent | 75b7df249b551ee6127ef36d8204de3475910ac1 (diff) | |
[DeviceAware] Make AppOpsCheckingServiceInterface device-aware
This is to allow working on b/266164193 in parallel to making app ops
tracking device-aware. The actual usage of
device id to calculate op mode will be done in that bug, however
modifying the interface at this time allows us to make AppOpsService
device-aware.
Bug: 299330771
Test: atest CtsAppOpsTestCases CtsAppOps2TestCases
Change-Id: I9edc249379474d710f45a49877389b6a94846544
8 files changed, 143 insertions, 68 deletions
diff --git a/services/core/java/com/android/server/appop/AppOpsCheckingServiceImpl.java b/services/core/java/com/android/server/appop/AppOpsCheckingServiceImpl.java index 0ee7d9cdd3d4..091696737dcf 100644 --- a/services/core/java/com/android/server/appop/AppOpsCheckingServiceImpl.java +++ b/services/core/java/com/android/server/appop/AppOpsCheckingServiceImpl.java @@ -20,6 +20,7 @@ import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_FOREGROUND; import static android.app.AppOpsManager.OP_SCHEDULE_EXACT_ALARM; import static android.app.AppOpsManager.OP_USE_FULL_SCREEN_INTENT; +import static android.companion.virtual.VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT; import android.annotation.NonNull; import android.annotation.UserIdInt; @@ -150,7 +151,7 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface } @Override - public SparseIntArray getNonDefaultUidModes(int uid) { + public SparseIntArray getNonDefaultUidModes(int uid, String persistentDeviceId) { synchronized (mLock) { SparseIntArray opModes = mUidModes.get(uid, null); if (opModes == null) { @@ -176,7 +177,7 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface } @Override - public int getUidMode(int uid, int op) { + public int getUidMode(int uid, String persistentDeviceId, int op) { synchronized (mLock) { SparseIntArray opModes = mUidModes.get(uid, null); if (opModes == null) { @@ -187,7 +188,7 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface } @Override - public boolean setUidMode(int uid, int op, int mode) { + public boolean setUidMode(int uid, String persistentDeviceId, int op, int mode) { final int defaultMode = AppOpsManager.opToDefaultMode(op); List<AppOpsModeChangedListener> listenersCopy; synchronized (mLock) { @@ -329,7 +330,7 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface } @Override - public SparseBooleanArray getForegroundOps(int uid) { + public SparseBooleanArray getForegroundOps(int uid, String persistentDeviceId) { SparseBooleanArray result = new SparseBooleanArray(); synchronized (mLock) { SparseIntArray modes = mUidModes.get(uid); @@ -606,9 +607,17 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface for (final String pkg : packagesDeclaringPermission) { for (int userId : userIds) { final int uid = pmi.getPackageUid(pkg, 0, userId); - final int oldMode = getUidMode(uid, OP_SCHEDULE_EXACT_ALARM); + final int oldMode = + getUidMode( + uid, + PERSISTENT_DEVICE_ID_DEFAULT, + OP_SCHEDULE_EXACT_ALARM); if (oldMode == AppOpsManager.opToDefaultMode(OP_SCHEDULE_EXACT_ALARM)) { - setUidMode(uid, OP_SCHEDULE_EXACT_ALARM, MODE_ALLOWED); + setUidMode( + uid, + PERSISTENT_DEVICE_ID_DEFAULT, + OP_SCHEDULE_EXACT_ALARM, + MODE_ALLOWED); } } // This appop is meant to be controlled at a uid level. So we leave package modes as @@ -641,7 +650,10 @@ public class AppOpsCheckingServiceImpl implements AppOpsCheckingServiceInterface final int flags = permissionManager.getPermissionFlags(pkg, permissionName, UserHandle.of(userId)); if ((flags & PackageManager.FLAG_PERMISSION_USER_SET) == 0) { - setUidMode(uid, OP_USE_FULL_SCREEN_INTENT, + setUidMode( + uid, + PERSISTENT_DEVICE_ID_DEFAULT, + OP_USE_FULL_SCREEN_INTENT, AppOpsManager.opToDefaultMode(OP_USE_FULL_SCREEN_INTENT)); } } diff --git a/services/core/java/com/android/server/appop/AppOpsCheckingServiceInterface.java b/services/core/java/com/android/server/appop/AppOpsCheckingServiceInterface.java index f6e6bc0be8fa..f056f6b10b0d 100644 --- a/services/core/java/com/android/server/appop/AppOpsCheckingServiceInterface.java +++ b/services/core/java/com/android/server/appop/AppOpsCheckingServiceInterface.java @@ -59,8 +59,9 @@ public interface AppOpsCheckingServiceInterface { * Returns a copy of non-default app-ops with op as keys and their modes as values for a uid. * Returns an empty SparseIntArray if nothing is set. * @param uid for which we need the app-ops and their modes. + * @param persistentDeviceId device for which we need the app-ops and their modes */ - SparseIntArray getNonDefaultUidModes(int uid); + SparseIntArray getNonDefaultUidModes(int uid, String persistentDeviceId); /** * Returns a copy of non-default app-ops with op as keys and their modes as values for a package @@ -75,20 +76,22 @@ public interface AppOpsCheckingServiceInterface { * Returns the app-op mode for a particular app-op of a uid. * Returns default op mode if the op mode for particular uid and op is not set. * @param uid user id for which we need the mode. + * @param persistentDeviceId device for which we need the mode * @param op app-op for which we need the mode. * @return mode of the app-op. */ - int getUidMode(int uid, int op); + int getUidMode(int uid, String persistentDeviceId, int op); /** * Set the app-op mode for a particular uid and op. * The mode is not set if the mode is the same as the default mode for the op. * @param uid user id for which we want to set the mode. + * @param persistentDeviceId device for which we want to set the mode. * @param op app-op for which we want to set the mode. * @param mode mode for the app-op. * @return true if op mode is changed. */ - boolean setUidMode(int uid, int op, @Mode int mode); + boolean setUidMode(int uid, String persistentDeviceId, int op, @Mode int mode); /** * Gets the app-op mode for a particular package. @@ -130,10 +133,11 @@ public interface AppOpsCheckingServiceInterface { /** * @param uid UID to query foreground ops for. + * @param persistentDeviceId device to query foreground ops for * @return SparseBooleanArray where the keys are the op codes for which their modes are * MODE_FOREGROUND for the passed UID. */ - SparseBooleanArray getForegroundOps(int uid); + SparseBooleanArray getForegroundOps(int uid, String persistentDeviceId); /** * diff --git a/services/core/java/com/android/server/appop/AppOpsCheckingServiceLoggingDecorator.java b/services/core/java/com/android/server/appop/AppOpsCheckingServiceLoggingDecorator.java index ccdf3a5baa7b..f6da166d9a34 100644 --- a/services/core/java/com/android/server/appop/AppOpsCheckingServiceLoggingDecorator.java +++ b/services/core/java/com/android/server/appop/AppOpsCheckingServiceLoggingDecorator.java @@ -60,9 +60,9 @@ public class AppOpsCheckingServiceLoggingDecorator implements AppOpsCheckingServ } @Override - public SparseIntArray getNonDefaultUidModes(int uid) { + public SparseIntArray getNonDefaultUidModes(int uid, String persistentDeviceId) { Log.i(LOG_TAG, "getNonDefaultUidModes(uid = " + uid + ")"); - return mService.getNonDefaultUidModes(uid); + return mService.getNonDefaultUidModes(uid, persistentDeviceId); } @Override @@ -73,15 +73,15 @@ public class AppOpsCheckingServiceLoggingDecorator implements AppOpsCheckingServ } @Override - public int getUidMode(int uid, int op) { + public int getUidMode(int uid, String persistentDeviceId, int op) { Log.i(LOG_TAG, "getUidMode(uid = " + uid + ", op = " + op + ")"); - return mService.getUidMode(uid, op); + return mService.getUidMode(uid, persistentDeviceId, op); } @Override - public boolean setUidMode(int uid, int op, int mode) { + public boolean setUidMode(int uid, String persistentDeviceId, int op, int mode) { Log.i(LOG_TAG, "setUidMode(uid = " + uid + ", op = " + op + ", mode = " + mode + ")"); - return mService.setUidMode(uid, op, mode); + return mService.setUidMode(uid, persistentDeviceId, op, mode); } @Override @@ -117,9 +117,9 @@ public class AppOpsCheckingServiceLoggingDecorator implements AppOpsCheckingServ } @Override - public SparseBooleanArray getForegroundOps(int uid) { + public SparseBooleanArray getForegroundOps(int uid, String persistentDeviceId) { Log.i(LOG_TAG, "getForegroundOps(uid = " + uid + ")"); - return mService.getForegroundOps(uid); + return mService.getForegroundOps(uid, persistentDeviceId); } @Override diff --git a/services/core/java/com/android/server/appop/AppOpsCheckingServiceTracingDecorator.java b/services/core/java/com/android/server/appop/AppOpsCheckingServiceTracingDecorator.java index c3a02a84a277..55cf7ed80483 100644 --- a/services/core/java/com/android/server/appop/AppOpsCheckingServiceTracingDecorator.java +++ b/services/core/java/com/android/server/appop/AppOpsCheckingServiceTracingDecorator.java @@ -81,11 +81,11 @@ public class AppOpsCheckingServiceTracingDecorator implements AppOpsCheckingServ } @Override - public SparseIntArray getNonDefaultUidModes(int uid) { + public SparseIntArray getNonDefaultUidModes(int uid, String persistentDeviceId) { Trace.traceBegin(TRACE_TAG, "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getNonDefaultUidModes"); try { - return mService.getNonDefaultUidModes(uid); + return mService.getNonDefaultUidModes(uid, persistentDeviceId); } finally { Trace.traceEnd(TRACE_TAG); } @@ -103,20 +103,21 @@ public class AppOpsCheckingServiceTracingDecorator implements AppOpsCheckingServ } @Override - public int getUidMode(int uid, int op) { + public int getUidMode(int uid, String persistentDeviceId, int op) { Trace.traceBegin(TRACE_TAG, "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getUidMode"); try { - return mService.getUidMode(uid, op); + return mService.getUidMode(uid, persistentDeviceId, op); } finally { Trace.traceEnd(TRACE_TAG); } } @Override - public boolean setUidMode(int uid, int op, @AppOpsManager.Mode int mode) { + public boolean setUidMode( + int uid, String persistentDeviceId, int op, @AppOpsManager.Mode int mode) { Trace.traceBegin(TRACE_TAG, "TaggedTracingAppOpsCheckingServiceInterfaceImpl#setUidMode"); try { - return mService.setUidMode(uid, op, mode); + return mService.setUidMode(uid, persistentDeviceId, op, mode); } finally { Trace.traceEnd(TRACE_TAG); } @@ -179,11 +180,11 @@ public class AppOpsCheckingServiceTracingDecorator implements AppOpsCheckingServ } @Override - public SparseBooleanArray getForegroundOps(int uid) { + public SparseBooleanArray getForegroundOps(int uid, String persistentDeviceId) { Trace.traceBegin(TRACE_TAG, "TaggedTracingAppOpsCheckingServiceInterfaceImpl#getForegroundOps"); try { - return mService.getForegroundOps(uid); + return mService.getForegroundOps(uid, persistentDeviceId); } finally { Trace.traceEnd(TRACE_TAG); } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 613416c0bbad..3133a889ad5a 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -63,6 +63,7 @@ import static android.app.AppOpsManager.opAllowSystemBypassRestriction; import static android.app.AppOpsManager.opRestrictsRead; import static android.app.AppOpsManager.opToName; import static android.app.AppOpsManager.opToPublicName; +import static android.companion.virtual.VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; import static android.content.pm.PermissionInfo.PROTECTION_FLAG_APPOP; @@ -1355,7 +1356,10 @@ public class AppOpsService extends IAppOpsService.Stub { SparseBooleanArray foregroundOps = new SparseBooleanArray(); - SparseBooleanArray uidForegroundOps = mAppOpsCheckingService.getForegroundOps(uid); + // TODO(b/299330771): Check uidForegroundOps for all devices. + SparseBooleanArray uidForegroundOps = + mAppOpsCheckingService.getForegroundOps( + uid, PERSISTENT_DEVICE_ID_DEFAULT); for (int i = 0; i < uidForegroundOps.size(); i++) { foregroundOps.put(uidForegroundOps.keyAt(i), true); } @@ -1375,10 +1379,16 @@ public class AppOpsService extends IAppOpsService.Stub { continue; } final int code = foregroundOps.keyAt(fgi); - - if (mAppOpsCheckingService.getUidMode(uidState.uid, code) + // TODO(b/299330771): Notify op changes for all relevant devices. + if (mAppOpsCheckingService.getUidMode( + uidState.uid, + PERSISTENT_DEVICE_ID_DEFAULT, + code) != AppOpsManager.opToDefaultMode(code) - && mAppOpsCheckingService.getUidMode(uidState.uid, code) + && mAppOpsCheckingService.getUidMode( + uidState.uid, + PERSISTENT_DEVICE_ID_DEFAULT, + code) == AppOpsManager.MODE_FOREGROUND) { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpChangedForAllPkgsInUid, @@ -1495,7 +1505,11 @@ public class AppOpsService extends IAppOpsService.Stub { @Nullable private ArrayList<AppOpsManager.OpEntry> collectUidOps(@NonNull UidState uidState, @Nullable int[] ops) { - final SparseIntArray opModes = mAppOpsCheckingService.getNonDefaultUidModes(uidState.uid); + // TODO(b/299330771): Make this methods device-aware, currently it represents only the + // primary device. + final SparseIntArray opModes = + mAppOpsCheckingService.getNonDefaultUidModes( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT); if (opModes == null) { return null; } @@ -1850,16 +1864,22 @@ public class AppOpsService extends IAppOpsService.Stub { uidState = new UidState(uid); mUidStates.put(uid, uidState); } - if (mAppOpsCheckingService.getUidMode(uidState.uid, code) + // TODO(b/266164193): Ensure this behavior is device-aware after uid op mode for runtime + // permissions is deprecated. + if (mAppOpsCheckingService.getUidMode( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT, code) != AppOpsManager.opToDefaultMode(code)) { - previousMode = mAppOpsCheckingService.getUidMode(uidState.uid, code); + previousMode = + mAppOpsCheckingService.getUidMode( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT, code); } else { // doesn't look right but is legacy behavior. previousMode = MODE_DEFAULT; } mIgnoredCallback = permissionPolicyCallback; - if (!mAppOpsCheckingService.setUidMode(uidState.uid, code, mode)) { + if (!mAppOpsCheckingService.setUidMode( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT, code, mode)) { return; } if (mode != MODE_ERRORED && mode != previousMode) { @@ -2281,8 +2301,10 @@ public class AppOpsService extends IAppOpsService.Stub { boolean changed = false; for (int i = mUidStates.size() - 1; i >= 0; i--) { UidState uidState = mUidStates.valueAt(i); - - SparseIntArray opModes = mAppOpsCheckingService.getNonDefaultUidModes(uidState.uid); + // TODO(b/299330771): Check non default modes for all devices. + SparseIntArray opModes = + mAppOpsCheckingService.getNonDefaultUidModes( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT); if (opModes != null && (uidState.uid == reqUid || reqUid == -1)) { final int uidOpCount = opModes.size(); for (int j = uidOpCount - 1; j >= 0; j--) { @@ -2291,7 +2313,12 @@ public class AppOpsService extends IAppOpsService.Stub { int previousMode = opModes.valueAt(j); int newMode = isUidOpGrantedByRole(uidState.uid, code) ? MODE_ALLOWED : AppOpsManager.opToDefaultMode(code); - mAppOpsCheckingService.setUidMode(uidState.uid, code, newMode); + // TODO(b/299330771): Set mode for all necessary devices. + mAppOpsCheckingService.setUidMode( + uidState.uid, + PERSISTENT_DEVICE_ID_DEFAULT, + code, + newMode); for (String packageName : getPackagesForUid(uidState.uid)) { callbacks = addCallbacks(callbacks, code, uidState.uid, packageName, previousMode, mOpModeWatchers.get(code)); @@ -2607,10 +2634,14 @@ public class AppOpsService extends IAppOpsService.Stub { } code = AppOpsManager.opToSwitch(code); UidState uidState = getUidStateLocked(uid, false); + // TODO(b/299330771): Check mode for the relevant device. if (uidState != null - && mAppOpsCheckingService.getUidMode(uidState.uid, code) + && mAppOpsCheckingService.getUidMode( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT, code) != AppOpsManager.opToDefaultMode(code)) { - final int rawMode = mAppOpsCheckingService.getUidMode(uidState.uid, code); + final int rawMode = + mAppOpsCheckingService.getUidMode( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT, code); return raw ? rawMode : uidState.evalMode(code, rawMode); } Op op = getOpLocked(code, uid, packageName, null, false, pvr.bypass, /* edit */ false); @@ -2857,13 +2888,19 @@ public class AppOpsService extends IAppOpsService.Stub { return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, packageName); } + // TODO(b/299330771): Check mode for the relevant device. // 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 (mAppOpsCheckingService.getUidMode(uidState.uid, switchCode) + if (mAppOpsCheckingService.getUidMode( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT, switchCode) != AppOpsManager.opToDefaultMode(switchCode)) { final int uidMode = uidState.evalMode( - code, mAppOpsCheckingService.getUidMode(uidState.uid, switchCode)); + code, + mAppOpsCheckingService.getUidMode( + uidState.uid, + PERSISTENT_DEVICE_ID_DEFAULT, + switchCode)); if (uidMode != AppOpsManager.MODE_ALLOWED) { if (DEBUG) Slog.d(TAG, "noteOperation: uid reject #" + uidMode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " @@ -3402,13 +3439,19 @@ public class AppOpsService extends IAppOpsService.Stub { isRestricted = isOpRestrictedLocked(uid, code, packageName, attributionTag, pvr.bypass, false); final int switchCode = AppOpsManager.opToSwitch(code); + // TODO(b/299330771): Check mode for the relevant device. // 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 (mAppOpsCheckingService.getUidMode(uidState.uid, switchCode) + if (mAppOpsCheckingService.getUidMode( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT, switchCode) != AppOpsManager.opToDefaultMode(switchCode)) { final int uidMode = uidState.evalMode( - code, mAppOpsCheckingService.getUidMode(uidState.uid, switchCode)); + code, + mAppOpsCheckingService.getUidMode( + uidState.uid, + PERSISTENT_DEVICE_ID_DEFAULT, + switchCode)); if (!shouldStartForMode(uidMode, startIfModeDefault)) { if (DEBUG) { Slog.d(TAG, "startOperation: uid reject #" + uidMode + " for code " @@ -3517,13 +3560,19 @@ public class AppOpsService extends IAppOpsService.Stub { isRestricted = isOpRestrictedLocked(uid, code, packageName, attributionTag, pvr.bypass, false); final int switchCode = AppOpsManager.opToSwitch(code); + // TODO(b/299330771): Check mode for the relevant device. // 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 (mAppOpsCheckingService.getUidMode(uidState.uid, switchCode) + if (mAppOpsCheckingService.getUidMode( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT, switchCode) != AppOpsManager.opToDefaultMode(switchCode)) { final int uidMode = uidState.evalMode( - code, mAppOpsCheckingService.getUidMode(uidState.uid, switchCode)); + code, + mAppOpsCheckingService.getUidMode( + uidState.uid, + PERSISTENT_DEVICE_ID_DEFAULT, + switchCode)); if (!shouldStartForMode(uidMode, startIfModeDefault)) { if (DEBUG) { Slog.d(TAG, "startOperation: uid reject #" + uidMode + " for code " @@ -5685,8 +5734,10 @@ public class AppOpsService extends IAppOpsService.Stub { } for (int i=0; i<mUidStates.size(); i++) { UidState uidState = mUidStates.valueAt(i); + // TODO(b/299330771): Get modes for all devices. final SparseIntArray opModes = - mAppOpsCheckingService.getNonDefaultUidModes(uidState.uid); + mAppOpsCheckingService.getNonDefaultUidModes( + uidState.uid, PERSISTENT_DEVICE_ID_DEFAULT); final ArrayMap<String, Ops> pkgOps = uidState.pkgOps; if (dumpWatchers || dumpHistory) { diff --git a/services/core/java/com/android/server/appop/AppOpsServiceTestingShim.java b/services/core/java/com/android/server/appop/AppOpsServiceTestingShim.java index 98e6476e9707..c9fa9e600ecc 100644 --- a/services/core/java/com/android/server/appop/AppOpsServiceTestingShim.java +++ b/services/core/java/com/android/server/appop/AppOpsServiceTestingShim.java @@ -65,9 +65,9 @@ public class AppOpsServiceTestingShim implements AppOpsCheckingServiceInterface } @Override - public SparseIntArray getNonDefaultUidModes(int uid) { - SparseIntArray oldVal = mOldImplementation.getNonDefaultUidModes(uid); - SparseIntArray newVal = mNewImplementation.getNonDefaultUidModes(uid); + public SparseIntArray getNonDefaultUidModes(int uid, String persistentDeviceId) { + SparseIntArray oldVal = mOldImplementation.getNonDefaultUidModes(uid, persistentDeviceId); + SparseIntArray newVal = mNewImplementation.getNonDefaultUidModes(uid, persistentDeviceId); if (!Objects.equals(oldVal, newVal)) { signalImplDifference("getNonDefaultUidModes"); @@ -89,9 +89,9 @@ public class AppOpsServiceTestingShim implements AppOpsCheckingServiceInterface } @Override - public int getUidMode(int uid, int op) { - int oldVal = mOldImplementation.getUidMode(uid, op); - int newVal = mNewImplementation.getUidMode(uid, op); + public int getUidMode(int uid, String persistentDeviceId, int op) { + int oldVal = mOldImplementation.getUidMode(uid, persistentDeviceId, op); + int newVal = mNewImplementation.getUidMode(uid, persistentDeviceId, op); if (oldVal != newVal) { signalImplDifference("getUidMode"); @@ -101,9 +101,9 @@ public class AppOpsServiceTestingShim implements AppOpsCheckingServiceInterface } @Override - public boolean setUidMode(int uid, int op, int mode) { - boolean oldVal = mOldImplementation.setUidMode(uid, op, mode); - boolean newVal = mNewImplementation.setUidMode(uid, op, mode); + public boolean setUidMode(int uid, String persistentDeviceId, int op, int mode) { + boolean oldVal = mOldImplementation.setUidMode(uid, persistentDeviceId, op, mode); + boolean newVal = mNewImplementation.setUidMode(uid, persistentDeviceId, op, mode); if (oldVal != newVal) { signalImplDifference("setUidMode"); @@ -155,9 +155,9 @@ public class AppOpsServiceTestingShim implements AppOpsCheckingServiceInterface } @Override - public SparseBooleanArray getForegroundOps(int uid) { - SparseBooleanArray oldVal = mOldImplementation.getForegroundOps(uid); - SparseBooleanArray newVal = mNewImplementation.getForegroundOps(uid); + public SparseBooleanArray getForegroundOps(int uid, String persistentDeviceId) { + SparseBooleanArray oldVal = mOldImplementation.getForegroundOps(uid, persistentDeviceId); + SparseBooleanArray newVal = mNewImplementation.getForegroundOps(uid, persistentDeviceId); if (!Objects.equals(oldVal, newVal)) { signalImplDifference("getForegroundOps"); diff --git a/services/permission/java/com/android/server/permission/access/appop/AppOpService.kt b/services/permission/java/com/android/server/permission/access/appop/AppOpService.kt index f94a0d664a69..8f464d41792d 100644 --- a/services/permission/java/com/android/server/permission/access/appop/AppOpService.kt +++ b/services/permission/java/com/android/server/permission/access/appop/AppOpService.kt @@ -71,7 +71,7 @@ class AppOpService(private val service: AccessCheckingService) : AppOpsCheckingS // Not implemented because upgrades are handled automatically. } - override fun getNonDefaultUidModes(uid: Int): SparseIntArray { + override fun getNonDefaultUidModes(uid: Int, persistentDeviceId: String): SparseIntArray { return opNameMapToOpSparseArray(getUidModes(uid)) } @@ -79,7 +79,7 @@ class AppOpService(private val service: AccessCheckingService) : AppOpsCheckingS return opNameMapToOpSparseArray(getPackageModes(packageName, userId)) } - override fun getUidMode(uid: Int, op: Int): Int { + override fun getUidMode(uid: Int, persistentDeviceId: String, op: Int): Int { val appId = UserHandle.getAppId(uid) val userId = UserHandle.getUserId(uid) val opName = AppOpsManager.opToPublicName(op) @@ -92,7 +92,7 @@ class AppOpService(private val service: AccessCheckingService) : AppOpsCheckingS return service.getState { with(appIdPolicy) { getAppOpModes(appId, userId) } }?.map } - override fun setUidMode(uid: Int, op: Int, mode: Int): Boolean { + override fun setUidMode(uid: Int, persistentDeviceId: String, op: Int, mode: Int): Boolean { val appId = UserHandle.getAppId(uid) val userId = UserHandle.getUserId(uid) val opName = AppOpsManager.opToPublicName(op) @@ -150,7 +150,7 @@ class AppOpService(private val service: AccessCheckingService) : AppOpsCheckingS // and we have our own persistence. } - override fun getForegroundOps(uid: Int): SparseBooleanArray { + override fun getForegroundOps(uid: Int, persistentDeviceId: String): SparseBooleanArray { return SparseBooleanArray().apply { getUidModes(uid)?.forEachIndexed { _, op, mode -> if (mode == AppOpsManager.MODE_FOREGROUND) { diff --git a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsUpgradeTest.java b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsUpgradeTest.java index 92d1118d0f1e..4f672f81a9cb 100644 --- a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsUpgradeTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsUpgradeTest.java @@ -19,6 +19,7 @@ package com.android.server.appop; import static android.app.AppOpsManager.OP_SCHEDULE_EXACT_ALARM; import static android.app.AppOpsManager.OP_USE_FULL_SCREEN_INTENT; import static android.app.AppOpsManager._NUM_OP; +import static android.companion.virtual.VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -208,8 +209,8 @@ public class AppOpsUpgradeTest { private void assertSameModes(AppOpsCheckingServiceImpl testService, int op1, int op2) { for (int uid : testService.getUidsWithNonDefaultModes()) { assertEquals( - testService.getUidMode(uid, op1), - testService.getUidMode(uid, op2) + testService.getUidMode(uid, PERSISTENT_DEVICE_ID_DEFAULT, op1), + testService.getUidMode(uid, PERSISTENT_DEVICE_ID_DEFAULT, op2) ); } for (UserPackage pkg : testService.getPackagesWithNonDefaultModes()) { @@ -275,7 +276,9 @@ public class AppOpsUpgradeTest { } else { expectedMode = previousMode; } - int mode = testService.getUidMode(uid, OP_SCHEDULE_EXACT_ALARM); + int mode = + testService.getUidMode( + uid, PERSISTENT_DEVICE_ID_DEFAULT, OP_SCHEDULE_EXACT_ALARM); assertEquals(expectedMode, mode); } } @@ -284,7 +287,9 @@ public class AppOpsUpgradeTest { int[] unrelatedUidsInFile = {10225, 10178}; for (int uid : unrelatedUidsInFile) { - int mode = testService.getUidMode(uid, OP_SCHEDULE_EXACT_ALARM); + int mode = + testService.getUidMode( + uid, PERSISTENT_DEVICE_ID_DEFAULT, OP_SCHEDULE_EXACT_ALARM); assertEquals(AppOpsManager.opToDefaultMode(OP_SCHEDULE_EXACT_ALARM), mode); } } @@ -331,7 +336,9 @@ public class AppOpsUpgradeTest { final int uid = UserHandle.getUid(userId, appId); final int expectedMode = AppOpsManager.opToDefaultMode(OP_USE_FULL_SCREEN_INTENT); synchronized (testService) { - int mode = testService.getUidMode(uid, OP_USE_FULL_SCREEN_INTENT); + int mode = + testService.getUidMode( + uid, PERSISTENT_DEVICE_ID_DEFAULT, OP_USE_FULL_SCREEN_INTENT); assertEquals(expectedMode, mode); } } |