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";
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);
}
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;
}
/**
+ * 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
*/
static final class RemoteService extends
}
}
}
+
+ /**
+ * 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);
+ }
+ }
+ }
}
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;
*
* @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) {
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));
+ }
};
}
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);
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);
+ }
}