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

Commit 6d7cbf74 authored by Nate Myren's avatar Nate Myren
Browse files

Add Api to get permission group info from PermissionController

Bug: 182094776
Test: atest GetPermissionGroupInfoTest
Change-Id: I872b0658ea0d8a5aca80a83cff1e29f25b7d6d3d
parent e3585e10
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -8740,6 +8740,8 @@ package android.permission {
  public final class PermissionControllerManager {
    method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
    method @Nullable public String getGroupOfPlatformPermission(@NonNull String);
    method @NonNull public java.util.Set<java.lang.String> getPlatformPermissionsForGroup(@NonNull String);
    method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<byte[]>);
    method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback);
    method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle);
@@ -8761,7 +8763,9 @@ package android.permission {
    method @NonNull public final android.os.IBinder onBind(android.content.Intent);
    method @BinderThread public abstract void onCountPermissionApps(@NonNull java.util.List<java.lang.String>, int, @NonNull java.util.function.IntConsumer);
    method @BinderThread public abstract void onGetAppPermissions(@NonNull String, @NonNull java.util.function.Consumer<java.util.List<android.permission.RuntimePermissionPresentationInfo>>);
    method @BinderThread public void onGetGroupOfPlatformPermission(@NonNull String, @NonNull java.util.function.Consumer<java.lang.String>);
    method @BinderThread public abstract void onGetPermissionUsages(boolean, long, @NonNull java.util.function.Consumer<java.util.List<android.permission.RuntimePermissionUsageInfo>>);
    method @BinderThread public void onGetPlatformPermissionsForGroup(@NonNull String, @NonNull java.util.function.Consumer<java.util.List<java.lang.String>>);
    method @BinderThread public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream, @NonNull Runnable);
    method @BinderThread public abstract void onGrantOrUpgradeDefaultRuntimePermissions(@NonNull Runnable);
    method @BinderThread public void onOneTimePermissionSessionTimeout(@NonNull String);
+6 −0
Original line number Diff line number Diff line
@@ -48,4 +48,10 @@ oneway interface IPermissionController {
    void getPrivilegesDescriptionStringForProfile(
            in String deviceProfileName,
            in AndroidFuture<String> callback);
    void getPlatformPermissionsForGroup(
            in String permissionGroupName,
            in AndroidFuture<List<String>> callback);
    void getGroupOfPlatformPermission(
            in String permissionName,
            in AndroidFuture<String> callback);
}
+44 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import android.os.Handler;
import android.os.Process;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;

@@ -66,6 +67,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@@ -720,4 +722,46 @@ public final class PermissionControllerManager {
        mRemoteService.run(
                service -> service.notifyOneTimePermissionSessionTimeout(packageName));
    }

    /**
     * Get the platform permissions which belong to a particular permission group
     *
     * @param permissionGroupName The permission group whose permissions are desired
     * @return A list of the platform permissions in the group, or empty if the group is not a valid
     * platform group.
     */
    public @NonNull Set<String> getPlatformPermissionsForGroup(
            @NonNull String permissionGroupName) {
        try {
            return new ArraySet<>(mRemoteService.postAsync(service -> {
                AndroidFuture<List<String>> future = new AndroidFuture<>();
                service.getPlatformPermissionsForGroup(permissionGroupName, future);
                return future;
            }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
        } catch (Exception e) {
            Log.e(TAG, "Failed to get permissions of " + permissionGroupName, e);
            return null;
        }
    }

    /**
     * Get the platform group of a particular permission, if the permission is a platform permission
     *
     * @param permissionName The permission name whose group is desired
     * @return The name of the permission group this permission belongs to, or null if it has no
     * group, or is not a platform permission
     */
    public @Nullable String getGroupOfPlatformPermission(
            @NonNull String permissionName) {
        try {
            return mRemoteService.postAsync(service -> {
                AndroidFuture<String> future = new AndroidFuture<>();
                service.getGroupOfPlatformPermission(permissionName, future);
                return future;
            }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            Log.e(TAG, "Failed to get group of " + permissionName, e);
            return null;
        }
    }
}
+53 −0
Original line number Diff line number Diff line
@@ -300,6 +300,29 @@ public abstract class PermissionControllerService extends Service {
        throw new AbstractMethodError("Must be overridden in implementing class");
    }

    /**
     * Get the platform permissions which belong to a particular permission group
     *
     * @param permissionGroupName The permission group whose permissions are desired
     * @param callback A callback the permission names will be passed to
     */
    @BinderThread
    public void onGetPlatformPermissionsForGroup(@NonNull String permissionGroupName,
            @NonNull Consumer<List<String>> callback) {
        throw new AbstractMethodError("Must be overridden in implementing class");
    }

    /**
     * Get the platform group of a particular permission, if the permission is a platform permission
     *
     * @param permissionName The permission name whose group is desired
     * @param callback A callback the group name will be passed to
     */
    @BinderThread
    public void onGetGroupOfPlatformPermission(@NonNull String permissionName,
            @NonNull Consumer<String> callback) {
        throw new AbstractMethodError("Must be overridden in implementing class");
    }
    /**
     * Get a user-readable sentence, describing the set of privileges that are to be granted to a
     * companion app managing a device of the given profile.
@@ -563,6 +586,36 @@ public abstract class PermissionControllerService extends Service {
                    callback.completeExceptionally(t);
                }
            }

            @Override
            public void getPlatformPermissionsForGroup(
                    @NonNull String permissionName,
                    @NonNull AndroidFuture<List<String>> callback) {
                try {
                    Objects.requireNonNull(permissionName);
                    Objects.requireNonNull(callback);
                    PermissionControllerService.this.onGetPlatformPermissionsForGroup(
                            permissionName, callback::complete);
                } catch (Throwable t) {
                    callback.completeExceptionally(t);
                }
            }

            @Override
            public void getGroupOfPlatformPermission(
                    @NonNull String permissionGroupName,
                    @NonNull AndroidFuture<String> callback) {
                try {
                    Objects.requireNonNull(permissionGroupName);
                    Objects.requireNonNull(callback);
                    PermissionControllerService
                            .this
                            .onGetGroupOfPlatformPermission(
                            permissionGroupName, callback::complete);
                } catch (Throwable t) {
                    callback.completeExceptionally(t);
                }
            }
        };
    }
}