From 6d7cbf74f6607a43a0f704ddf5e6fcd5fed413ba Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Tue, 30 Mar 2021 13:26:47 -0700 Subject: [PATCH] Add Api to get permission group info from PermissionController Bug: 182094776 Test: atest GetPermissionGroupInfoTest Change-Id: I872b0658ea0d8a5aca80a83cff1e29f25b7d6d3d --- core/api/system-current.txt | 4 ++ .../permission/IPermissionController.aidl | 6 +++ .../PermissionControllerManager.java | 44 +++++++++++++++ .../PermissionControllerService.java | 53 +++++++++++++++++++ 4 files changed, 107 insertions(+) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 92c21f3ef3fc5..9c2c21eaa5d01 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -8740,6 +8740,8 @@ package android.permission { public final class PermissionControllerManager { method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer); + method @Nullable public String getGroupOfPlatformPermission(@NonNull String); + method @NonNull public java.util.Set getPlatformPermissionsForGroup(@NonNull String); method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer); method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback); method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle); @@ -8761,7 +8763,9 @@ package android.permission { method @NonNull public final android.os.IBinder onBind(android.content.Intent); method @BinderThread public abstract void onCountPermissionApps(@NonNull java.util.List, int, @NonNull java.util.function.IntConsumer); method @BinderThread public abstract void onGetAppPermissions(@NonNull String, @NonNull java.util.function.Consumer>); + method @BinderThread public void onGetGroupOfPlatformPermission(@NonNull String, @NonNull java.util.function.Consumer); method @BinderThread public abstract void onGetPermissionUsages(boolean, long, @NonNull java.util.function.Consumer>); + method @BinderThread public void onGetPlatformPermissionsForGroup(@NonNull String, @NonNull java.util.function.Consumer>); method @BinderThread public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream, @NonNull Runnable); method @BinderThread public abstract void onGrantOrUpgradeDefaultRuntimePermissions(@NonNull Runnable); method @BinderThread public void onOneTimePermissionSessionTimeout(@NonNull String); diff --git a/core/java/android/permission/IPermissionController.aidl b/core/java/android/permission/IPermissionController.aidl index 6d677f35b563a..66e1c5a93f160 100644 --- a/core/java/android/permission/IPermissionController.aidl +++ b/core/java/android/permission/IPermissionController.aidl @@ -48,4 +48,10 @@ oneway interface IPermissionController { void getPrivilegesDescriptionStringForProfile( in String deviceProfileName, in AndroidFuture callback); + void getPlatformPermissionsForGroup( + in String permissionGroupName, + in AndroidFuture> callback); + void getGroupOfPlatformPermission( + in String permissionName, + in AndroidFuture callback); } diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index 913b827332bf4..05eb23ad705dc 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -45,6 +45,7 @@ import android.os.Handler; import android.os.Process; import android.os.UserHandle; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.util.Pair; @@ -66,6 +67,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -720,4 +722,46 @@ public final class PermissionControllerManager { mRemoteService.run( service -> service.notifyOneTimePermissionSessionTimeout(packageName)); } + + /** + * Get the platform permissions which belong to a particular permission group + * + * @param permissionGroupName The permission group whose permissions are desired + * @return A list of the platform permissions in the group, or empty if the group is not a valid + * platform group. + */ + public @NonNull Set getPlatformPermissionsForGroup( + @NonNull String permissionGroupName) { + try { + return new ArraySet<>(mRemoteService.postAsync(service -> { + AndroidFuture> future = new AndroidFuture<>(); + service.getPlatformPermissionsForGroup(permissionGroupName, future); + return future; + }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)); + } catch (Exception e) { + Log.e(TAG, "Failed to get permissions of " + permissionGroupName, e); + return null; + } + } + + /** + * Get the platform group of a particular permission, if the permission is a platform permission + * + * @param permissionName The permission name whose group is desired + * @return The name of the permission group this permission belongs to, or null if it has no + * group, or is not a platform permission + */ + public @Nullable String getGroupOfPlatformPermission( + @NonNull String permissionName) { + try { + return mRemoteService.postAsync(service -> { + AndroidFuture future = new AndroidFuture<>(); + service.getGroupOfPlatformPermission(permissionName, future); + return future; + }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); + } catch (Exception e) { + Log.e(TAG, "Failed to get group of " + permissionName, e); + return null; + } + } } diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java index ad9e8b3d6dd43..0b99b85fdf240 100644 --- a/core/java/android/permission/PermissionControllerService.java +++ b/core/java/android/permission/PermissionControllerService.java @@ -300,6 +300,29 @@ public abstract class PermissionControllerService extends Service { throw new AbstractMethodError("Must be overridden in implementing class"); } + /** + * Get the platform permissions which belong to a particular permission group + * + * @param permissionGroupName The permission group whose permissions are desired + * @param callback A callback the permission names will be passed to + */ + @BinderThread + public void onGetPlatformPermissionsForGroup(@NonNull String permissionGroupName, + @NonNull Consumer> callback) { + throw new AbstractMethodError("Must be overridden in implementing class"); + } + + /** + * Get the platform group of a particular permission, if the permission is a platform permission + * + * @param permissionName The permission name whose group is desired + * @param callback A callback the group name will be passed to + */ + @BinderThread + public void onGetGroupOfPlatformPermission(@NonNull String permissionName, + @NonNull Consumer callback) { + throw new AbstractMethodError("Must be overridden in implementing class"); + } /** * Get a user-readable sentence, describing the set of privileges that are to be granted to a * companion app managing a device of the given profile. @@ -563,6 +586,36 @@ public abstract class PermissionControllerService extends Service { callback.completeExceptionally(t); } } + + @Override + public void getPlatformPermissionsForGroup( + @NonNull String permissionName, + @NonNull AndroidFuture> callback) { + try { + Objects.requireNonNull(permissionName); + Objects.requireNonNull(callback); + PermissionControllerService.this.onGetPlatformPermissionsForGroup( + permissionName, callback::complete); + } catch (Throwable t) { + callback.completeExceptionally(t); + } + } + + @Override + public void getGroupOfPlatformPermission( + @NonNull String permissionGroupName, + @NonNull AndroidFuture callback) { + try { + Objects.requireNonNull(permissionGroupName); + Objects.requireNonNull(callback); + PermissionControllerService + .this + .onGetGroupOfPlatformPermission( + permissionGroupName, callback::complete); + } catch (Throwable t) { + callback.completeExceptionally(t); + } + } }; } }