From 7d095bbc0b529280ac9d07caf2b88a5b82a4e916 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Mon, 10 Jan 2022 09:56:23 -0800 Subject: [PATCH] create systemApi checkPermissionForStartDataDelivery in PermissionManager This allows us to check attribution for started ops in tests, and support starting in system apps Test: atest CameraMicIndicatorsPermissionTest Bug: 212434116 Change-Id: Iacdf1d339588cd680c20b3fb55ada9cedb2e70b0 --- core/api/system-current.txt | 2 ++ .../android/permission/PermissionManager.java | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 913718635266e..878bb97d58fae 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -9576,6 +9576,8 @@ package android.permission { method public int checkPermissionForDataDelivery(@NonNull String, @NonNull android.content.AttributionSource, @Nullable String); method public int checkPermissionForDataDeliveryFromDataSource(@NonNull String, @NonNull android.content.AttributionSource, @Nullable String); method public int checkPermissionForPreflight(@NonNull String, @NonNull android.content.AttributionSource); + method public int checkPermissionForStartDataDelivery(@NonNull String, @NonNull android.content.AttributionSource, @Nullable String); + method public void finishDataDelivery(@NonNull String, @NonNull android.content.AttributionSource); method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set getAutoRevokeExemptionGrantedPackages(); method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set getAutoRevokeExemptionRequestedPackages(); method @IntRange(from=0) @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion(); diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index 61e48c587e1b6..88adbbfddcf53 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -33,6 +33,7 @@ import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityThread; import android.app.AppGlobals; +import android.app.AppOpsManager; import android.app.IActivityManager; import android.app.PropertyInvalidatedCache; import android.compat.annotation.ChangeId; @@ -237,6 +238,41 @@ public final class PermissionManager { PermissionChecker.PID_UNKNOWN, attributionSource, message); } + /** + * + * Similar to checkPermissionForDataDelivery, except it results in an app op start, rather than + * a note. If this method is used, then {@link #finishDataDelivery(String, AttributionSource)} + * must be used when access is finished. + * + * @param permission The permission to check. + * @param attributionSource the permission identity + * @param message A message describing the reason the permission was checked + * @return The permission check result which is either {@link #PERMISSION_GRANTED} + * or {@link #PERMISSION_SOFT_DENIED} or {@link #PERMISSION_HARD_DENIED}. + * + * @see #checkPermissionForDataDelivery(String, AttributionSource, String) + */ + @PermissionCheckerManager.PermissionResult + public int checkPermissionForStartDataDelivery(@NonNull String permission, + @NonNull AttributionSource attributionSource, @Nullable String message) { + return PermissionChecker.checkPermissionForDataDelivery(mContext, permission, + // FIXME(b/199526514): PID should be passed inside AttributionSource. + PermissionChecker.PID_UNKNOWN, attributionSource, message, true); + } + + /** + * Indicate that usage has finished for an {@link AttributionSource} started with + * {@link #checkPermissionForStartDataDelivery(String, AttributionSource, String)} + * + * @param permission The permission to check. + * @param attributionSource the permission identity to finish + */ + public void finishDataDelivery(@NonNull String permission, + @NonNull AttributionSource attributionSource) { + PermissionChecker.finishDataDelivery(mContext, AppOpsManager.permissionToOp(permission), + attributionSource); + } + /** * Checks whether a given data access chain described by the given {@link AttributionSource} * has a given permission. Call this method if you are the datasource which would not blame you