Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 983b500c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add PermissionControllerService.isRoleVisible() for app info shortcut."

parents 5a95250b d895953d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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);
}
+71 −0
Original line number Diff line number Diff line
@@ -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
     */
@@ -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);
            }
        }
    }
}
+29 −1
Original line number Diff line number Diff line
@@ -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.
     *
@@ -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,
@@ -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) {