Loading api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -5689,6 +5689,7 @@ package android.permission { method @NonNull public abstract java.util.List<android.permission.RuntimePermissionUsageInfo> onGetPermissionUsages(boolean, long); method public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream); method public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String); method public abstract boolean onIsRoleVisible(@NonNull String); method @BinderThread public abstract boolean onRestoreDelayedRuntimePermissionsBackup(@NonNull String, @NonNull android.os.UserHandle); method @BinderThread public abstract void onRestoreRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.InputStream); method public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String); Loading core/java/android/permission/IPermissionController.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ oneway interface IPermissionController { void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback); void isApplicationQualifiedForRole(String roleName, String packageName, in RemoteCallback callback); void isRoleVisible(String roleName, in RemoteCallback callback); void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName, String packageName, String permission, int grantState, in RemoteCallback callback); } core/java/android/permission/PermissionControllerManager.java +71 −0 Original line number Diff line number Diff line Loading @@ -475,6 +475,26 @@ public final class PermissionControllerManager { mRemoteService, roleName, packageName, executor, callback)); } /** * Check whether a role should be visible to user. * * @param roleName name of the role to check for * @param executor Executor on which to invoke the callback * @param callback Callback to receive the result * * @hide */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) public void isRoleVisible(@NonNull String roleName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { checkStringNotEmpty(roleName); checkNotNull(executor); checkNotNull(callback); mRemoteService.scheduleRequest(new PendingIsRoleVisibleRequest(mRemoteService, roleName, executor, callback)); } /** * A connection to the remote service */ Loading Loading @@ -1222,4 +1242,55 @@ public final class PermissionControllerManager { } } } /** * Request for {@link #isRoleVisible}. */ private static final class PendingIsRoleVisibleRequest extends AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { private final @NonNull String mRoleName; private final @NonNull Consumer<Boolean> mCallback; private final @NonNull RemoteCallback mRemoteCallback; private PendingIsRoleVisibleRequest(@NonNull RemoteService service, @NonNull String roleName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { super(service); mRoleName = roleName; mCallback = callback; mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> { long token = Binder.clearCallingIdentity(); try { boolean visible; if (result != null) { visible = result.getBoolean(KEY_RESULT); } else { visible = false; } callback.accept(visible); } finally { Binder.restoreCallingIdentity(token); finish(); } }), null); } @Override protected void onTimeout(RemoteService remoteService) { mCallback.accept(false); } @Override public void run() { try { getService().getServiceInterface().isRoleVisible(mRoleName, mRemoteCallback); } catch (RemoteException e) { Log.e(TAG, "Error checking whether role should be visible", e); } } } } core/java/android/permission/PermissionControllerService.java +29 −1 Original line number Diff line number Diff line Loading @@ -179,11 +179,20 @@ public abstract class PermissionControllerService extends Service { * @param roleName name of the role to check for * @param packageName package name of the application to check for * * @return whether the application is qualified for the role. * @return whether the application is qualified for the role */ public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName); /** * Check whether a role should be visible to user. * * @param roleName name of the role to check for * * @return whether the role should be visible to user */ public abstract boolean onIsRoleVisible(@NonNull String roleName); /** * Set the runtime permission state from a device admin. * Loading Loading @@ -343,6 +352,18 @@ public abstract class PermissionControllerService extends Service { PermissionControllerService.this, roleName, packageName, callback)); } @Override public void isRoleVisible(String roleName, RemoteCallback callback) { checkStringNotEmpty(roleName); checkNotNull(callback, "callback"); enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null); mHandler.sendMessage(obtainMessage( PermissionControllerService::isRoleVisible, PermissionControllerService.this, roleName, callback)); } @Override public void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName, String packageName, String permission, int grantState, Loading Loading @@ -445,6 +466,13 @@ public abstract class PermissionControllerService extends Service { callback.sendResult(result); } private void isRoleVisible(@NonNull String roleName, @NonNull RemoteCallback callback) { boolean visible = onIsRoleVisible(roleName); Bundle result = new Bundle(); result.putBoolean(PermissionControllerManager.KEY_RESULT, visible); callback.sendResult(result); } private void setRuntimePermissionGrantStateByDeviceAdmin(@NonNull String callerPackageName, @NonNull String packageName, @NonNull String permission, @PermissionGrantState int grantState, @NonNull RemoteCallback callback) { Loading Loading
api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -5689,6 +5689,7 @@ package android.permission { method @NonNull public abstract java.util.List<android.permission.RuntimePermissionUsageInfo> onGetPermissionUsages(boolean, long); method public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream); method public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String); method public abstract boolean onIsRoleVisible(@NonNull String); method @BinderThread public abstract boolean onRestoreDelayedRuntimePermissionsBackup(@NonNull String, @NonNull android.os.UserHandle); method @BinderThread public abstract void onRestoreRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.InputStream); method public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String); Loading
core/java/android/permission/IPermissionController.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ oneway interface IPermissionController { void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback); void isApplicationQualifiedForRole(String roleName, String packageName, in RemoteCallback callback); void isRoleVisible(String roleName, in RemoteCallback callback); void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName, String packageName, String permission, int grantState, in RemoteCallback callback); }
core/java/android/permission/PermissionControllerManager.java +71 −0 Original line number Diff line number Diff line Loading @@ -475,6 +475,26 @@ public final class PermissionControllerManager { mRemoteService, roleName, packageName, executor, callback)); } /** * Check whether a role should be visible to user. * * @param roleName name of the role to check for * @param executor Executor on which to invoke the callback * @param callback Callback to receive the result * * @hide */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) public void isRoleVisible(@NonNull String roleName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { checkStringNotEmpty(roleName); checkNotNull(executor); checkNotNull(callback); mRemoteService.scheduleRequest(new PendingIsRoleVisibleRequest(mRemoteService, roleName, executor, callback)); } /** * A connection to the remote service */ Loading Loading @@ -1222,4 +1242,55 @@ public final class PermissionControllerManager { } } } /** * Request for {@link #isRoleVisible}. */ private static final class PendingIsRoleVisibleRequest extends AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { private final @NonNull String mRoleName; private final @NonNull Consumer<Boolean> mCallback; private final @NonNull RemoteCallback mRemoteCallback; private PendingIsRoleVisibleRequest(@NonNull RemoteService service, @NonNull String roleName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { super(service); mRoleName = roleName; mCallback = callback; mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> { long token = Binder.clearCallingIdentity(); try { boolean visible; if (result != null) { visible = result.getBoolean(KEY_RESULT); } else { visible = false; } callback.accept(visible); } finally { Binder.restoreCallingIdentity(token); finish(); } }), null); } @Override protected void onTimeout(RemoteService remoteService) { mCallback.accept(false); } @Override public void run() { try { getService().getServiceInterface().isRoleVisible(mRoleName, mRemoteCallback); } catch (RemoteException e) { Log.e(TAG, "Error checking whether role should be visible", e); } } } }
core/java/android/permission/PermissionControllerService.java +29 −1 Original line number Diff line number Diff line Loading @@ -179,11 +179,20 @@ public abstract class PermissionControllerService extends Service { * @param roleName name of the role to check for * @param packageName package name of the application to check for * * @return whether the application is qualified for the role. * @return whether the application is qualified for the role */ public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName); /** * Check whether a role should be visible to user. * * @param roleName name of the role to check for * * @return whether the role should be visible to user */ public abstract boolean onIsRoleVisible(@NonNull String roleName); /** * Set the runtime permission state from a device admin. * Loading Loading @@ -343,6 +352,18 @@ public abstract class PermissionControllerService extends Service { PermissionControllerService.this, roleName, packageName, callback)); } @Override public void isRoleVisible(String roleName, RemoteCallback callback) { checkStringNotEmpty(roleName); checkNotNull(callback, "callback"); enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null); mHandler.sendMessage(obtainMessage( PermissionControllerService::isRoleVisible, PermissionControllerService.this, roleName, callback)); } @Override public void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName, String packageName, String permission, int grantState, Loading Loading @@ -445,6 +466,13 @@ public abstract class PermissionControllerService extends Service { callback.sendResult(result); } private void isRoleVisible(@NonNull String roleName, @NonNull RemoteCallback callback) { boolean visible = onIsRoleVisible(roleName); Bundle result = new Bundle(); result.putBoolean(PermissionControllerManager.KEY_RESULT, visible); callback.sendResult(result); } private void setRuntimePermissionGrantStateByDeviceAdmin(@NonNull String callerPackageName, @NonNull String packageName, @NonNull String permission, @PermissionGrantState int grantState, @NonNull RemoteCallback callback) { Loading