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
This commit is contained in:
Nate Myren
2022-01-10 09:56:23 -08:00
parent da94cf3658
commit 7d095bbc0b
2 changed files with 38 additions and 0 deletions

View File

@@ -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<java.lang.String> getAutoRevokeExemptionGrantedPackages();
method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionRequestedPackages();
method @IntRange(from=0) @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion();

View File

@@ -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