summaryrefslogtreecommitdiff
path: root/core/java/android/permission/PermissionControllerManager.java
diff options
context:
space:
mode:
authorPhilip P. Moltmann <moltmann@google.com>2019-02-08 13:07:57 -0800
committerPhilip P. Moltmann <moltmann@google.com>2019-02-21 16:56:25 -0800
commit41df9f94aee658f53cf520c80d3ec67e2406a51a (patch)
tree2b6c70c32faa60097436921aa5c439ccf574053a /core/java/android/permission/PermissionControllerManager.java
parent2a537a6ef5e21bb87dcf295a28d465fcb70b55ac (diff)
Ask Perm Controller to set policy-fixed perms
This is much slower than the old way as we need to call into a different process. On the other hand this handles the following cases correctly: - foreground / background permissions - pre-M apps - split permissions Test: CtsDevicePolicyManagerTestCases:com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionGrant,testPermissionPolicy,testPermissionMixedPolicies,testPermissionAppUpdate,testPermissionGrantPreMApp Change-Id: I5cd139ad29e5b77b77b02e12c75eb774984a7759 Bug: 124128308
Diffstat (limited to 'core/java/android/permission/PermissionControllerManager.java')
-rw-r--r--core/java/android/permission/PermissionControllerManager.java100
1 files changed, 100 insertions, 0 deletions
diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java
index d62bc6c5a872..cd7bbfddbbd5 100644
--- a/core/java/android/permission/PermissionControllerManager.java
+++ b/core/java/android/permission/PermissionControllerManager.java
@@ -16,8 +16,12 @@
package android.permission;
+import static android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT;
+import static android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED;
+import static android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED;
import static android.permission.PermissionControllerService.SERVICE_INTERFACE;
+import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkArgumentNonnegative;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkFlagsArgument;
@@ -35,6 +39,7 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
+import android.app.admin.DevicePolicyManager.PermissionGrantState;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -268,6 +273,40 @@ public final class PermissionControllerManager {
}
/**
+ * Set the runtime permission state from a device admin.
+ *
+ * @param callerPackageName The package name of the admin requesting the change
+ * @param packageName Package the permission belongs to
+ * @param permission Permission to change
+ * @param grantState State to set the permission into
+ * @param executor Executor to run the {@code callback} on
+ * @param callback The callback
+ *
+ * @hide
+ */
+ @RequiresPermission(allOf = {Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
+ Manifest.permission.REVOKE_RUNTIME_PERMISSIONS,
+ Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY},
+ conditional = true)
+ public void setRuntimePermissionGrantStateByDeviceAdmin(@NonNull String callerPackageName,
+ @NonNull String packageName, @NonNull String permission,
+ @PermissionGrantState int grantState, @NonNull @CallbackExecutor Executor executor,
+ @NonNull Consumer<Boolean> callback) {
+ checkStringNotEmpty(callerPackageName);
+ checkStringNotEmpty(packageName);
+ checkStringNotEmpty(permission);
+ checkArgument(grantState == PERMISSION_GRANT_STATE_GRANTED
+ || grantState == PERMISSION_GRANT_STATE_DENIED
+ || grantState == PERMISSION_GRANT_STATE_DEFAULT);
+ checkNotNull(executor);
+ checkNotNull(callback);
+
+ mRemoteService.scheduleRequest(new PendingSetRuntimePermissionGrantStateByDeviceAdmin(
+ mRemoteService, callerPackageName, packageName, permission, grantState, executor,
+ callback));
+ }
+
+ /**
* Create a backup of the runtime permissions.
*
* @param user The user to be backed up
@@ -797,6 +836,67 @@ public final class PermissionControllerManager {
}
/**
+ * Request for {@link #getRuntimePermissionBackup}
+ */
+ private static final class PendingSetRuntimePermissionGrantStateByDeviceAdmin extends
+ AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> {
+ private final @NonNull String mCallerPackageName;
+ private final @NonNull String mPackageName;
+ private final @NonNull String mPermission;
+ private final @PermissionGrantState int mGrantState;
+
+ private final @NonNull Executor mExecutor;
+ private final @NonNull Consumer<Boolean> mCallback;
+ private final @NonNull RemoteCallback mRemoteCallback;
+
+ private PendingSetRuntimePermissionGrantStateByDeviceAdmin(@NonNull RemoteService service,
+ @NonNull String callerPackageName, @NonNull String packageName,
+ @NonNull String permission, @PermissionGrantState int grantState,
+ @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ super(service);
+
+ mCallerPackageName = callerPackageName;
+ mPackageName = packageName;
+ mPermission = permission;
+ mGrantState = grantState;
+ mExecutor = executor;
+ mCallback = callback;
+
+ mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> {
+ long token = Binder.clearCallingIdentity();
+ try {
+ callback.accept(result.getBoolean(KEY_RESULT, false));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+
+ finish();
+ }
+ }), null);
+ }
+
+ @Override
+ protected void onTimeout(RemoteService remoteService) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.accept(false));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void run() {
+ try {
+ getService().getServiceInterface().setRuntimePermissionGrantStateByDeviceAdmin(
+ mCallerPackageName, mPackageName, mPermission, mGrantState, mRemoteCallback);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error setting permissions state for device admin " + mPackageName,
+ e);
+ }
+ }
+ }
+
+ /**
* Request for {@link #restoreRuntimePermissionBackup}
*/
private static final class PendingRestoreRuntimePermissionBackup implements