From 7d57652eb90d274e4eebf689d5442cf47b6f98b7 Mon Sep 17 00:00:00 2001
From: Jeff Sharkey <jsharkey@google.com>
Date: Thu, 8 Feb 2024 11:38:54 -0700
Subject: [PATCH] `ComponentOptions` on Ravenwood.

These are lightweight holder objects, so they're prime candidates
for inclusion on Ravenwood.  Also enables `BroadcastRecordTest` on
Ravenwood too.

Bring CTS to verify we're in sync with devices, and split
dynamic integration tests into a separate file to avoid complex
dependency build rules.

Bug: 324417456
Test: atest CtsAppTestCasesRavenwood
Test: atest CtsAppTestCases:ActivityOptionsTest
Test: atest CtsAppTestCases:BroadcastOptionsTest
Test: atest CtsAppTestCases:BroadcastOptionsIntegrationTest
Change-Id: I5b496b4d212a3504d8ce56faf0ffe34998dfbae9
---
 core/java/android/app/ActivityOptions.java    | 26 +++++++++++++++++++
 core/java/android/app/BroadcastOptions.java   |  2 ++
 core/java/android/app/ComponentOptions.java   |  1 +
 ...ramework-minus-apex-ravenwood-policies.txt |  2 ++
 .../ravenwood-annotation-allowed-classes.txt  |  3 +++
 .../tests/mockingservicestests/Android.bp     | 16 ++++++++++++
 6 files changed, 50 insertions(+)

diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 1edf4bdb0d7e..e14bf68bde53 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -75,6 +75,7 @@ import java.util.ArrayList;
  * {@link android.content.Context#startActivity(android.content.Intent, android.os.Bundle)
  * Context.startActivity(Intent, Bundle)} and related methods.
  */
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
 public class ActivityOptions extends ComponentOptions {
     private static final String TAG = "ActivityOptions";
 
@@ -527,6 +528,7 @@ public class ActivityOptions extends ComponentOptions {
      * @return Returns a new ActivityOptions object that you can use to
      * supply these options as the options Bundle when starting an activity.
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Context.class)
     public static ActivityOptions makeCustomAnimation(Context context,
             int enterResId, int exitResId) {
         return makeCustomAnimation(context, enterResId, exitResId, 0, null, null);
@@ -547,6 +549,7 @@ public class ActivityOptions extends ComponentOptions {
      * @return Returns a new ActivityOptions object that you can use to
      * supply these options as the options Bundle when starting an activity.
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Context.class)
     public static @NonNull ActivityOptions makeCustomAnimation(@NonNull Context context,
             int enterResId, int exitResId, int backgroundColor) {
         return makeCustomAnimation(context, enterResId, exitResId, backgroundColor, null, null);
@@ -572,6 +575,7 @@ public class ActivityOptions extends ComponentOptions {
      * @hide
      */
     @UnsupportedAppUsage
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Context.class)
     public static ActivityOptions makeCustomAnimation(Context context,
             int enterResId, int exitResId, int backgroundColor, Handler handler,
             OnAnimationStartedListener listener) {
@@ -607,6 +611,7 @@ public class ActivityOptions extends ComponentOptions {
      * @hide
      */
     @TestApi
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Context.class)
     public static @NonNull ActivityOptions makeCustomAnimation(@NonNull Context context,
             int enterResId, int exitResId, int backgroundColor, @Nullable Handler handler,
             @Nullable OnAnimationStartedListener startedListener,
@@ -641,6 +646,7 @@ public class ActivityOptions extends ComponentOptions {
      */
     @RequiresPermission(START_TASKS_FROM_RECENTS)
     @TestApi
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Context.class)
     public static @NonNull ActivityOptions makeCustomTaskAnimation(@NonNull Context context,
             int enterResId, int exitResId, @Nullable Handler handler,
             @Nullable OnAnimationStartedListener startedListener,
@@ -663,6 +669,7 @@ public class ActivityOptions extends ComponentOptions {
      * supply these options as the options Bundle when running an in-place animation.
      * @hide
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Context.class)
     public static ActivityOptions makeCustomInPlaceAnimation(Context context, int animId) {
         if (animId == 0) {
             throw new RuntimeException("You must specify a valid animation.");
@@ -769,6 +776,7 @@ public class ActivityOptions extends ComponentOptions {
      * @return Returns a new ActivityOptions object that you can use to
      * supply these options as the options Bundle when starting an activity.
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = View.class)
     public static ActivityOptions makeScaleUpAnimation(View source,
             int startX, int startY, int width, int height) {
         ActivityOptions opts = new ActivityOptions();
@@ -797,6 +805,7 @@ public class ActivityOptions extends ComponentOptions {
      * @return Returns a new ActivityOptions object that you can use to
      * supply these options as the options Bundle when starting an activity.
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = View.class)
     public static ActivityOptions makeClipRevealAnimation(View source,
             int startX, int startY, int width, int height) {
         ActivityOptions opts = new ActivityOptions();
@@ -842,6 +851,7 @@ public class ActivityOptions extends ComponentOptions {
      * @return Returns a new ActivityOptions object that you can use to
      * supply these options as the options Bundle when starting an activity.
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = View.class)
     public static ActivityOptions makeThumbnailScaleUpAnimation(View source,
             Bitmap thumbnail, int startX, int startY) {
         return makeThumbnailScaleUpAnimation(source, thumbnail, startX, startY, null);
@@ -864,11 +874,13 @@ public class ActivityOptions extends ComponentOptions {
      * @return Returns a new ActivityOptions object that you can use to
      * supply these options as the options Bundle when starting an activity.
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = View.class)
     private static ActivityOptions makeThumbnailScaleUpAnimation(View source,
             Bitmap thumbnail, int startX, int startY, OnAnimationStartedListener listener) {
         return makeThumbnailAnimation(source, thumbnail, startX, startY, listener, true);
     }
 
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = View.class)
     private static ActivityOptions makeThumbnailAnimation(View source,
             Bitmap thumbnail, int startX, int startY, OnAnimationStartedListener listener,
             boolean scaleUp) {
@@ -890,6 +902,7 @@ public class ActivityOptions extends ComponentOptions {
      * @hide
      */
     @UnsupportedAppUsage
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Context.class)
     public static ActivityOptions makeMultiThumbFutureAspectScaleAnimation(Context context,
             Handler handler, IAppTransitionAnimationSpecsFuture specsFuture,
             OnAnimationStartedListener listener, boolean scaleUp) {
@@ -922,6 +935,7 @@ public class ActivityOptions extends ComponentOptions {
      * supply these options as the options Bundle when starting an activity.
      * @hide
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = View.class)
     public static ActivityOptions makeThumbnailAspectScaleDownAnimation(View source,
             Bitmap thumbnail, int startX, int startY, int targetWidth, int targetHeight,
             Handler handler, OnAnimationStartedListener listener) {
@@ -929,6 +943,7 @@ public class ActivityOptions extends ComponentOptions {
                 targetWidth, targetHeight, handler, listener, false);
     }
 
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = View.class)
     private static ActivityOptions makeAspectScaledThumbnailAnimation(View source, Bitmap thumbnail,
             int startX, int startY, int targetWidth, int targetHeight,
             Handler handler, OnAnimationStartedListener listener, boolean scaleUp) {
@@ -948,6 +963,7 @@ public class ActivityOptions extends ComponentOptions {
     }
 
     /** @hide */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = View.class)
     public static ActivityOptions makeThumbnailAspectScaleDownAnimation(View source,
             AppTransitionAnimationSpec[] specs, Handler handler,
             OnAnimationStartedListener onAnimationStartedListener,
@@ -980,6 +996,7 @@ public class ActivityOptions extends ComponentOptions {
      * @see android.transition.Transition#setEpicenterCallback(
      *          android.transition.Transition.EpicenterCallback)
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Activity.class)
     public static ActivityOptions makeSceneTransitionAnimation(Activity activity,
             View sharedElement, String sharedElementName) {
         return makeSceneTransitionAnimation(activity, Pair.create(sharedElement, sharedElementName));
@@ -1005,6 +1022,7 @@ public class ActivityOptions extends ComponentOptions {
      *          android.transition.Transition.EpicenterCallback)
      */
     @SafeVarargs
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Activity.class)
     public static ActivityOptions makeSceneTransitionAnimation(Activity activity,
             Pair<View, String>... sharedElements) {
         ActivityOptions opts = new ActivityOptions();
@@ -1031,6 +1049,7 @@ public class ActivityOptions extends ComponentOptions {
      * @hide
      */
     @SafeVarargs
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Window.class)
     public static Pair<ActivityOptions, ExitTransitionCoordinator> startSharedElementAnimation(
             Window window, ExitTransitionCallbacks exitCallbacks, SharedElementCallback callback,
             Pair<View, String>... sharedElements) {
@@ -1052,6 +1071,7 @@ public class ActivityOptions extends ComponentOptions {
      *
      * @hide
      */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Window.class)
     public static void stopSharedElementAnimation(Window window) {
         final View decorView = window.getDecorView();
         if (decorView == null) {
@@ -1069,6 +1089,7 @@ public class ActivityOptions extends ComponentOptions {
         }
     }
 
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Window.class)
     static ExitTransitionCoordinator makeSceneTransitionAnimation(
             ExitTransitionCallbacks exitCallbacks, SharedElementCallback callback, Window window,
             ActivityOptions opts, Pair<View, String>[] sharedElements) {
@@ -1119,6 +1140,7 @@ public class ActivityOptions extends ComponentOptions {
     }
 
     /** @hide */
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = Activity.class)
     static ActivityOptions makeSceneTransitionAnimation(Activity activity,
             ExitTransitionCoordinator exitCoordinator, ArrayList<String> sharedElementNames,
             int resultCode, Intent resultData) {
@@ -1173,6 +1195,7 @@ public class ActivityOptions extends ComponentOptions {
      */
     @RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS)
     @UnsupportedAppUsage
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = RemoteAnimationAdapter.class)
     public static ActivityOptions makeRemoteAnimation(
             RemoteAnimationAdapter remoteAnimationAdapter) {
         final ActivityOptions opts = new ActivityOptions();
@@ -1187,6 +1210,7 @@ public class ActivityOptions extends ComponentOptions {
      * @hide
      */
     @RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS)
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = RemoteAnimationAdapter.class)
     public static ActivityOptions makeRemoteAnimation(RemoteAnimationAdapter remoteAnimationAdapter,
             RemoteTransition remoteTransition) {
         final ActivityOptions opts = new ActivityOptions();
@@ -1202,6 +1226,7 @@ public class ActivityOptions extends ComponentOptions {
      * @hide
      */
     @RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS)
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = RemoteAnimationAdapter.class)
     public static ActivityOptions makeRemoteTransition(RemoteTransition remoteTransition) {
         final ActivityOptions opts = new ActivityOptions();
         opts.mRemoteTransition = remoteTransition;
@@ -1216,6 +1241,7 @@ public class ActivityOptions extends ComponentOptions {
      *                               picture-in-picture mode.
      */
     @NonNull
+    @android.ravenwood.annotation.RavenwoodThrow(blockedBy = PictureInPictureParams.class)
     public static ActivityOptions makeLaunchIntoPip(
             @NonNull PictureInPictureParams pictureInPictureParams) {
         final ActivityOptions opts = new ActivityOptions();
diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java
index 41b400459526..f727ee5a95fe 100644
--- a/core/java/android/app/BroadcastOptions.java
+++ b/core/java/android/app/BroadcastOptions.java
@@ -46,6 +46,7 @@ import java.util.Objects;
  * {@link android.content.Context#sendBroadcast(android.content.Intent)
  * Context.sendBroadcast(Intent)} and related methods.
  */
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
 public class BroadcastOptions extends ComponentOptions {
     private @Flags int mFlags;
     private long mTemporaryAppAllowlistDuration;
@@ -751,6 +752,7 @@ public class BroadcastOptions extends ComponentOptions {
      * @hide
      */
     @TestApi
+    @android.ravenwood.annotation.RavenwoodThrow
     public boolean testRequireCompatChange(int uid) {
         if (mRequireCompatChangeId != CHANGE_INVALID) {
             final boolean requireEnabled = (mFlags & FLAG_REQUIRE_COMPAT_CHANGE_ENABLED) != 0;
diff --git a/core/java/android/app/ComponentOptions.java b/core/java/android/app/ComponentOptions.java
index e0e285525208..ce16ddf5c05f 100644
--- a/core/java/android/app/ComponentOptions.java
+++ b/core/java/android/app/ComponentOptions.java
@@ -34,6 +34,7 @@ import java.lang.annotation.RetentionPolicy;
 @TestApi
 // Suppressed since lint is recommending class have a suffix of Params.
 @SuppressLint("UserHandleName")
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
 public class ComponentOptions {
 
     /**
diff --git a/ravenwood/framework-minus-apex-ravenwood-policies.txt b/ravenwood/framework-minus-apex-ravenwood-policies.txt
index 16f99e9289db..022961164b84 100644
--- a/ravenwood/framework-minus-apex-ravenwood-policies.txt
+++ b/ravenwood/framework-minus-apex-ravenwood-policies.txt
@@ -142,6 +142,8 @@ class android.net.UriCodec stubclass
 class android.telephony.PinResult stubclass
 
 # Just enough to support mocking, no further functionality
+class android.content.BroadcastReceiver stub
+    method <init> ()V stub
 class android.content.Context stub
     method <init> ()V stub
 class android.content.pm.PackageManager stub
diff --git a/ravenwood/ravenwood-annotation-allowed-classes.txt b/ravenwood/ravenwood-annotation-allowed-classes.txt
index a5ecd20b8b4f..627d413a8f6f 100644
--- a/ravenwood/ravenwood-annotation-allowed-classes.txt
+++ b/ravenwood/ravenwood-annotation-allowed-classes.txt
@@ -147,6 +147,9 @@ android.graphics.RectF
 android.content.ContentProvider
 
 android.app.ActivityManager
+android.app.ActivityOptions
+android.app.BroadcastOptions
+android.app.ComponentOptions
 android.app.Instrumentation
 
 android.metrics.LogMaker
diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp
index 9f97551bf5e7..a3998180303f 100644
--- a/services/tests/mockingservicestests/Android.bp
+++ b/services/tests/mockingservicestests/Android.bp
@@ -118,3 +118,19 @@ java_library {
         "android.test.runner",
     ],
 }
+
+android_ravenwood_test {
+    name: "FrameworksMockingServicesTestsRavenwood",
+    libs: [
+        "android.test.mock",
+    ],
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.test.rules",
+        "services.core",
+    ],
+    srcs: [
+        "src/com/android/server/am/BroadcastRecordTest.java",
+    ],
+    auto_gen_config: true,
+}
-- 
GitLab