Loading api/system-current.txt +2 −1 Original line number Diff line number Diff line Loading @@ -5493,8 +5493,9 @@ package android.permission { method public final android.os.IBinder onBind(android.content.Intent); method public abstract int onCountPermissionApps(@NonNull java.util.List<java.lang.String>, boolean, boolean); method @NonNull public abstract java.util.List<android.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(@NonNull String); 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 @NonNull public abstract java.util.List<android.permission.RuntimePermissionUsageInfo> onPermissionUsageResult(boolean, long); method public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String); method public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String); method @NonNull public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull String); field public static final String SERVICE_INTERFACE = "android.permission.PermissionControllerService"; Loading core/java/android/permission/IPermissionController.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -35,4 +35,6 @@ oneway interface IPermissionController { void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted, boolean countSystem, in RemoteCallback callback); void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback); void isApplicationQualifiedForRole(String roleName, String packageName, in RemoteCallback callback); } core/java/android/permission/PermissionControllerManager.java +77 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.permission.PermissionControllerService.SERVICE_INTERFACE; import static com.android.internal.util.Preconditions.checkArgumentNonnegative; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkStringNotEmpty; import android.Manifest; import android.annotation.CallbackExecutor; Loading Loading @@ -342,6 +343,28 @@ public final class PermissionControllerManager { countSystem, numMillis, executor, callback)); } /** * Check whether an application is qualified for a role. * * @param roleName name of the role to check for * @param packageName package name of the application 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 isApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { checkStringNotEmpty(roleName); checkStringNotEmpty(packageName); checkNotNull(executor); checkNotNull(callback); sRemoteService.scheduleRequest(new PendingIsApplicationQualifiedForRoleRequest( sRemoteService, roleName, packageName, executor, callback)); } /** * A connection to the remote service */ Loading Loading @@ -810,4 +833,58 @@ public final class PermissionControllerManager { } } } /** * Request for {@link #isApplicationQualifiedForRole}. */ private static final class PendingIsApplicationQualifiedForRoleRequest extends AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { private final @NonNull String mRoleName; private final @NonNull String mPackageName; private final @NonNull Consumer<Boolean> mCallback; private final @NonNull RemoteCallback mRemoteCallback; private PendingIsApplicationQualifiedForRoleRequest(@NonNull RemoteService service, @NonNull String roleName, @NonNull String packageName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { super(service); mRoleName = roleName; mPackageName = packageName; mCallback = callback; mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> { long token = Binder.clearCallingIdentity(); try { boolean qualified; if (result != null) { qualified = result.getBoolean(KEY_RESULT); } else { qualified = false; } callback.accept(qualified); } finally { Binder.restoreCallingIdentity(token); finish(); } }), null); } @Override protected void onTimeout(RemoteService remoteService) { mCallback.accept(false); } @Override public void run() { try { getService().getServiceInterface().isApplicationQualifiedForRole(mRoleName, mPackageName, mRemoteCallback); } catch (RemoteException e) { Log.e(TAG, "Error checking whether application qualifies for role", e); } } } } core/java/android/permission/PermissionControllerService.java +37 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ 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.checkNotNull; import static com.android.internal.util.Preconditions.checkStringNotEmpty; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.Manifest; Loading Loading @@ -136,8 +137,19 @@ public abstract class PermissionControllerService extends Service { * * @return descriptions of the users of permissions */ public abstract @NonNull List<RuntimePermissionUsageInfo> onPermissionUsageResult(boolean countSystem, long numMillis); public abstract @NonNull List<RuntimePermissionUsageInfo> onGetPermissionUsages( boolean countSystem, long numMillis); /** * Check whether an application is qualified for a role. * * @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. */ public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName); @Override public final IBinder onBind(Intent intent) { Loading Loading @@ -240,6 +252,20 @@ public abstract class PermissionControllerService extends Service { PermissionControllerService.this, countSystem, numMillis, callback)); } @Override public void isApplicationQualifiedForRole(String roleName, String packageName, RemoteCallback callback) { checkStringNotEmpty(roleName); checkStringNotEmpty(packageName); checkNotNull(callback, "callback"); enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null); mHandler.sendMessage(obtainMessage( PermissionControllerService::isApplicationQualifiedForRole, PermissionControllerService.this, roleName, packageName, callback)); } }; } Loading Loading @@ -296,7 +322,7 @@ public abstract class PermissionControllerService extends Service { private void getPermissionUsages(boolean countSystem, long numMillis, @NonNull RemoteCallback callback) { List<RuntimePermissionUsageInfo> users = onPermissionUsageResult(countSystem, numMillis); onGetPermissionUsages(countSystem, numMillis); if (users != null && !users.isEmpty()) { Bundle result = new Bundle(); result.putParcelableList(PermissionControllerManager.KEY_RESULT, users); Loading @@ -305,4 +331,12 @@ public abstract class PermissionControllerService extends Service { callback.sendResult(null); } } private void isApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName, @NonNull RemoteCallback callback) { boolean qualified = onIsApplicationQualifiedForRole(roleName, packageName); Bundle result = new Bundle(); result.putBoolean(PermissionControllerManager.KEY_RESULT, qualified); callback.sendResult(result); } } Loading
api/system-current.txt +2 −1 Original line number Diff line number Diff line Loading @@ -5493,8 +5493,9 @@ package android.permission { method public final android.os.IBinder onBind(android.content.Intent); method public abstract int onCountPermissionApps(@NonNull java.util.List<java.lang.String>, boolean, boolean); method @NonNull public abstract java.util.List<android.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(@NonNull String); 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 @NonNull public abstract java.util.List<android.permission.RuntimePermissionUsageInfo> onPermissionUsageResult(boolean, long); method public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String); method public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String); method @NonNull public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull String); field public static final String SERVICE_INTERFACE = "android.permission.PermissionControllerService"; Loading
core/java/android/permission/IPermissionController.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -35,4 +35,6 @@ oneway interface IPermissionController { void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted, boolean countSystem, in RemoteCallback callback); void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback); void isApplicationQualifiedForRole(String roleName, String packageName, in RemoteCallback callback); }
core/java/android/permission/PermissionControllerManager.java +77 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.permission.PermissionControllerService.SERVICE_INTERFACE; import static com.android.internal.util.Preconditions.checkArgumentNonnegative; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkStringNotEmpty; import android.Manifest; import android.annotation.CallbackExecutor; Loading Loading @@ -342,6 +343,28 @@ public final class PermissionControllerManager { countSystem, numMillis, executor, callback)); } /** * Check whether an application is qualified for a role. * * @param roleName name of the role to check for * @param packageName package name of the application 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 isApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { checkStringNotEmpty(roleName); checkStringNotEmpty(packageName); checkNotNull(executor); checkNotNull(callback); sRemoteService.scheduleRequest(new PendingIsApplicationQualifiedForRoleRequest( sRemoteService, roleName, packageName, executor, callback)); } /** * A connection to the remote service */ Loading Loading @@ -810,4 +833,58 @@ public final class PermissionControllerManager { } } } /** * Request for {@link #isApplicationQualifiedForRole}. */ private static final class PendingIsApplicationQualifiedForRoleRequest extends AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { private final @NonNull String mRoleName; private final @NonNull String mPackageName; private final @NonNull Consumer<Boolean> mCallback; private final @NonNull RemoteCallback mRemoteCallback; private PendingIsApplicationQualifiedForRoleRequest(@NonNull RemoteService service, @NonNull String roleName, @NonNull String packageName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { super(service); mRoleName = roleName; mPackageName = packageName; mCallback = callback; mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> { long token = Binder.clearCallingIdentity(); try { boolean qualified; if (result != null) { qualified = result.getBoolean(KEY_RESULT); } else { qualified = false; } callback.accept(qualified); } finally { Binder.restoreCallingIdentity(token); finish(); } }), null); } @Override protected void onTimeout(RemoteService remoteService) { mCallback.accept(false); } @Override public void run() { try { getService().getServiceInterface().isApplicationQualifiedForRole(mRoleName, mPackageName, mRemoteCallback); } catch (RemoteException e) { Log.e(TAG, "Error checking whether application qualifies for role", e); } } } }
core/java/android/permission/PermissionControllerService.java +37 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ 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.checkNotNull; import static com.android.internal.util.Preconditions.checkStringNotEmpty; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.Manifest; Loading Loading @@ -136,8 +137,19 @@ public abstract class PermissionControllerService extends Service { * * @return descriptions of the users of permissions */ public abstract @NonNull List<RuntimePermissionUsageInfo> onPermissionUsageResult(boolean countSystem, long numMillis); public abstract @NonNull List<RuntimePermissionUsageInfo> onGetPermissionUsages( boolean countSystem, long numMillis); /** * Check whether an application is qualified for a role. * * @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. */ public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName); @Override public final IBinder onBind(Intent intent) { Loading Loading @@ -240,6 +252,20 @@ public abstract class PermissionControllerService extends Service { PermissionControllerService.this, countSystem, numMillis, callback)); } @Override public void isApplicationQualifiedForRole(String roleName, String packageName, RemoteCallback callback) { checkStringNotEmpty(roleName); checkStringNotEmpty(packageName); checkNotNull(callback, "callback"); enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null); mHandler.sendMessage(obtainMessage( PermissionControllerService::isApplicationQualifiedForRole, PermissionControllerService.this, roleName, packageName, callback)); } }; } Loading Loading @@ -296,7 +322,7 @@ public abstract class PermissionControllerService extends Service { private void getPermissionUsages(boolean countSystem, long numMillis, @NonNull RemoteCallback callback) { List<RuntimePermissionUsageInfo> users = onPermissionUsageResult(countSystem, numMillis); onGetPermissionUsages(countSystem, numMillis); if (users != null && !users.isEmpty()) { Bundle result = new Bundle(); result.putParcelableList(PermissionControllerManager.KEY_RESULT, users); Loading @@ -305,4 +331,12 @@ public abstract class PermissionControllerService extends Service { callback.sendResult(null); } } private void isApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName, @NonNull RemoteCallback callback) { boolean qualified = onIsApplicationQualifiedForRole(roleName, packageName); Bundle result = new Bundle(); result.putBoolean(PermissionControllerManager.KEY_RESULT, qualified); callback.sendResult(result); } }