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

Commit d895953d authored by Hai Zhang's avatar Hai Zhang
Browse files

Add PermissionControllerService.isRoleVisible() for app info shortcut.

The default app shortcut in app info inside Settings needs to know if
a role is visible, and whether it is visible is controlled logic in
PermissionController, hence add this API.

Bug: 124452117
Bug: 124457823
Test: manual
Change-Id: I6058dea3bbda8b06d2fb9bab35268397227dd37b
parent 89b58a49
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5634,6 +5634,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) {