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