Merge "create systemApi checkPermissionForStartDataDelivery in PermissionManager"
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 299497f..ea2a641 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -9951,6 +9951,8 @@
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();
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index e4aee76..15f13eb 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -33,6 +33,7 @@
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;
@@ -239,6 +240,41 @@
}
/**
+ *
+ * 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
* for access to the data since you are the data. Use this API if you are the datasource of the