diff options
| -rw-r--r-- | api/system-current.txt | 4 | ||||
| -rw-r--r-- | api/test-current.txt | 2 | ||||
| -rw-r--r-- | core/java/android/permission/IPermissionController.aidl | 4 | ||||
| -rw-r--r-- | core/java/android/permission/PermissionControllerManager.java | 39 | ||||
| -rw-r--r-- | core/java/android/permission/PermissionControllerService.java | 24 |
5 files changed, 48 insertions, 25 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 43d055b1199b..69de04092c38 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5501,6 +5501,8 @@ package android.permission { public final class PermissionControllerManager { 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); + field public static final int COUNT_ONLY_WHEN_GRANTED = 1; // 0x1 + field public static final int COUNT_WHEN_SYSTEM = 2; // 0x2 field public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; // 0x2 field public static final int REASON_MALWARE = 1; // 0x1 } @@ -5514,7 +5516,7 @@ package android.permission { ctor public PermissionControllerService(); method public final void attachBaseContext(android.content.Context); 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 public abstract int onCountPermissionApps(@NonNull java.util.List<java.lang.String>, int); 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); diff --git a/api/test-current.txt b/api/test-current.txt index 9023a859a286..b81fa763bb8b 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1691,6 +1691,8 @@ package android.permission { public final class PermissionControllerManager { method @RequiresPermission("android.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); + field public static final int COUNT_ONLY_WHEN_GRANTED = 1; // 0x1 + field public static final int COUNT_WHEN_SYSTEM = 2; // 0x2 field public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; // 0x2 field public static final int REASON_MALWARE = 1; // 0x1 } diff --git a/core/java/android/permission/IPermissionController.aidl b/core/java/android/permission/IPermissionController.aidl index 5dd869f46b4e..ee6744b320f2 100644 --- a/core/java/android/permission/IPermissionController.aidl +++ b/core/java/android/permission/IPermissionController.aidl @@ -32,8 +32,8 @@ oneway interface IPermissionController { void getRuntimePermissionBackup(in UserHandle user, in ParcelFileDescriptor pipe); void getAppPermissions(String packageName, in RemoteCallback callback); void revokeRuntimePermission(String packageName, String permissionName); - void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted, - boolean countSystem, in RemoteCallback callback); + void countPermissionApps(in List<String> permissionNames, int flags, + in RemoteCallback callback); void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback); void isApplicationQualifiedForRole(String roleName, String packageName, in RemoteCallback callback); diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index b59d0c7a660e..850d02021a1e 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -20,6 +20,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.checkFlagsArgument; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkStringNotEmpty; @@ -113,6 +114,20 @@ public final class PermissionControllerManager { */ public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; + /** @hide */ + @IntDef(prefix = { "COUNT_" }, value = { + COUNT_ONLY_WHEN_GRANTED, + COUNT_WHEN_SYSTEM, + }, flag = true) + @Retention(RetentionPolicy.SOURCE) + public @interface CountPermissionAppsFlag {} + + /** Count an app only if the permission is granted to the app. */ + public static final int COUNT_ONLY_WHEN_GRANTED = 1; + + /** Count and app even if it is a system app. */ + public static final int COUNT_WHEN_SYSTEM = 2; + /** * Callback for delivering the result of {@link #revokeRuntimePermissions}. */ @@ -162,7 +177,7 @@ public final class PermissionControllerManager { */ public interface OnCountPermissionAppsResultCallback { /** - * The result for {@link #countPermissionApps(List, boolean, boolean, + * The result for {@link #countPermissionApps(List, int, * OnCountPermissionAppsResultCallback, Handler)}. * * @param numApps The number of apps that have one of the permissions @@ -302,8 +317,8 @@ public final class PermissionControllerManager { * Count how many apps have one of a set of permissions. * * @param permissionNames The permissions the app might have - * @param countOnlyGranted Count an app only if the permission is granted to the app - * @param countSystem Also count system apps + * @param flags Modify which apps to count. By default all non-system apps that request a + * permission are counted * @param callback Callback to receive the result * @param handler Handler on which to invoke the callback * @@ -311,13 +326,14 @@ public final class PermissionControllerManager { */ @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS) public void countPermissionApps(@NonNull List<String> permissionNames, - boolean countOnlyGranted, boolean countSystem, + @CountPermissionAppsFlag int flags, @NonNull OnCountPermissionAppsResultCallback callback, @Nullable Handler handler) { checkCollectionElementsNotNull(permissionNames, "permissionNames"); + checkFlagsArgument(flags, COUNT_WHEN_SYSTEM | COUNT_ONLY_WHEN_GRANTED); checkNotNull(callback); sRemoteService.scheduleRequest(new PendingCountPermissionAppsRequest(sRemoteService, - permissionNames, countOnlyGranted, countSystem, callback, + permissionNames, flags, callback, handler == null ? sRemoteService.getHandler() : handler)); } @@ -731,20 +747,17 @@ public final class PermissionControllerManager { AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { private final @NonNull List<String> mPermissionNames; private final @NonNull OnCountPermissionAppsResultCallback mCallback; - private final boolean mCountOnlyGranted; - private final boolean mCountSystem; + private final @CountPermissionAppsFlag int mFlags; private final @NonNull RemoteCallback mRemoteCallback; private PendingCountPermissionAppsRequest(@NonNull RemoteService service, - @NonNull List<String> permissionNames, boolean countOnlyGranted, - boolean countSystem, @NonNull OnCountPermissionAppsResultCallback callback, - @NonNull Handler handler) { + @NonNull List<String> permissionNames, @CountPermissionAppsFlag int flags, + @NonNull OnCountPermissionAppsResultCallback callback, @NonNull Handler handler) { super(service); mPermissionNames = permissionNames; - mCountOnlyGranted = countOnlyGranted; - mCountSystem = countSystem; + mFlags = flags; mCallback = callback; mRemoteCallback = new RemoteCallback(result -> { @@ -770,7 +783,7 @@ public final class PermissionControllerManager { public void run() { try { getService().getServiceInterface().countPermissionApps(mPermissionNames, - mCountOnlyGranted, mCountSystem, mRemoteCallback); + mFlags, mRemoteCallback); } catch (RemoteException e) { Log.e(TAG, "Error counting permission apps", e); } diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java index 9a58b971baf5..70404c35fa45 100644 --- a/core/java/android/permission/PermissionControllerService.java +++ b/core/java/android/permission/PermissionControllerService.java @@ -16,9 +16,13 @@ package android.permission; +import static android.permission.PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED; +import static android.permission.PermissionControllerManager.COUNT_WHEN_SYSTEM; + 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.checkFlagsArgument; 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; @@ -37,6 +41,7 @@ import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteCallback; import android.os.UserHandle; +import android.permission.PermissionControllerManager.CountPermissionAppsFlag; import android.util.ArrayMap; import android.util.Log; @@ -121,13 +126,13 @@ public abstract class PermissionControllerService extends Service { * Count how many apps have one of a set of permissions. * * @param permissionNames The permissions the app might have - * @param countOnlyGranted Count an app only if the permission is granted to the app - * @param countSystem Also count system apps + * @param flags Modify which apps to count. By default all non-system apps that request a + * permission are counted * * @return the number of apps that have one of the permissions */ public abstract int onCountPermissionApps(@NonNull List<String> permissionNames, - boolean countOnlyGranted, boolean countSystem); + @CountPermissionAppsFlag int flags); /** * Count how many apps have used permissions. @@ -226,17 +231,18 @@ public abstract class PermissionControllerService extends Service { } @Override - public void countPermissionApps(List<String> permissionNames, boolean countOnlyGranted, - boolean countSystem, RemoteCallback callback) { + public void countPermissionApps(List<String> permissionNames, int flags, + RemoteCallback callback) { checkCollectionElementsNotNull(permissionNames, "permissionNames"); + checkFlagsArgument(flags, COUNT_WHEN_SYSTEM | COUNT_ONLY_WHEN_GRANTED); checkNotNull(callback, "callback"); enforceCallingPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS, null); mHandler.sendMessage( obtainMessage(PermissionControllerService::countPermissionApps, - PermissionControllerService.this, permissionNames, countOnlyGranted, - countSystem, callback)); + PermissionControllerService.this, permissionNames, flags, + callback)); } @Override @@ -311,8 +317,8 @@ public abstract class PermissionControllerService extends Service { } private void countPermissionApps(@NonNull List<String> permissionNames, - boolean countOnlyGranted, boolean countSystem, @NonNull RemoteCallback callback) { - int numApps = onCountPermissionApps(permissionNames, countOnlyGranted, countSystem); + @CountPermissionAppsFlag int flags, @NonNull RemoteCallback callback) { + int numApps = onCountPermissionApps(permissionNames, flags); Bundle result = new Bundle(); result.putInt(PermissionControllerManager.KEY_RESULT, numApps); |