diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index 5bc342c768e7a..64d4456d105e8 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -15,6 +15,10 @@ package android.app { method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public boolean updateMccMncConfiguration(@NonNull String, @NonNull String); } + public class ActivityOptions { + method @NonNull public static android.app.ActivityOptions fromBundle(@NonNull android.os.Bundle); + } + public class AppOpsManager { field public static final String OPSTR_NO_ISOLATED_STORAGE = "android:no_isolated_storage"; } diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 4a1c237a3d6f6..d2754a134527e 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -140,6 +140,7 @@ package android.app { } public class ActivityOptions { + method @NonNull public static android.app.ActivityOptions fromBundle(@NonNull android.os.Bundle); method @NonNull public static android.app.ActivityOptions makeCustomAnimation(@NonNull android.content.Context, int, int, @Nullable android.os.Handler, @Nullable android.app.ActivityOptions.OnAnimationStartedListener, @Nullable android.app.ActivityOptions.OnAnimationFinishedListener); method @NonNull @RequiresPermission(android.Manifest.permission.START_TASKS_FROM_RECENTS) public static android.app.ActivityOptions makeCustomTaskAnimation(@NonNull android.content.Context, int, int, @Nullable android.os.Handler, @Nullable android.app.ActivityOptions.OnAnimationStartedListener, @Nullable android.app.ActivityOptions.OnAnimationFinishedListener); method public static void setExitTransitionTimeout(long); diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index 763a65f52c12c..860224cc7256c 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -26,6 +26,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.annotation.SystemApi; import android.annotation.TestApi; import android.app.ExitTransitionCoordinator.ActivityExitTransitionCallbacks; import android.app.ExitTransitionCoordinator.ExitTransitionCallbacks; @@ -1368,9 +1369,17 @@ public class ActivityOptions { return mRemoteTransition; } - /** @hide */ - public static ActivityOptions fromBundle(Bundle bOptions) { - return bOptions != null ? new ActivityOptions(bOptions) : null; + /** + * Creates an ActivityOptions from the Bundle generated from {@link ActivityOptions#toBundle()}. + * Returns an instance of ActivityOptions populated with options with known keys from the + * provided Bundle, stripping out unknown entries. + * @hide + */ + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + @TestApi + @NonNull + public static ActivityOptions fromBundle(@NonNull Bundle bOptions) { + return new ActivityOptions(bOptions); } /** @hide */ diff --git a/core/java/android/app/servertransaction/LaunchActivityItem.java b/core/java/android/app/servertransaction/LaunchActivityItem.java index 37cbccb897358..019d5ba39b356 100644 --- a/core/java/android/app/servertransaction/LaunchActivityItem.java +++ b/core/java/android/app/servertransaction/LaunchActivityItem.java @@ -187,7 +187,7 @@ public class LaunchActivityItem extends ClientTransactionItem { in.readPersistableBundle(getClass().getClassLoader()), in.createTypedArrayList(ResultInfo.CREATOR), in.createTypedArrayList(ReferrerIntent.CREATOR), - ActivityOptions.fromBundle(in.readBundle()), in.readBoolean(), + readActivityOptions(in), in.readBoolean(), in.readTypedObject(ProfilerInfo.CREATOR), in.readStrongBinder(), IActivityClientController.Stub.asInterface(in.readStrongBinder()), @@ -196,6 +196,11 @@ public class LaunchActivityItem extends ClientTransactionItem { in.readStrongBinder()); } + private static ActivityOptions readActivityOptions(Parcel in) { + Bundle bundle = in.readBundle(); + return bundle != null ? ActivityOptions.fromBundle(bundle) : null; + } + public static final @NonNull Creator CREATOR = new Creator() { public LaunchActivityItem createFromParcel(Parcel in) { diff --git a/core/java/android/app/servertransaction/StartActivityItem.java b/core/java/android/app/servertransaction/StartActivityItem.java index 15f65f6d9d26b..f267060d1be6c 100644 --- a/core/java/android/app/servertransaction/StartActivityItem.java +++ b/core/java/android/app/servertransaction/StartActivityItem.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.ActivityOptions; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; +import android.os.Bundle; import android.os.Parcel; import android.os.Trace; @@ -83,7 +84,8 @@ public class StartActivityItem extends ActivityLifecycleItem { /** Read from Parcel. */ private StartActivityItem(Parcel in) { - mActivityOptions = ActivityOptions.fromBundle(in.readBundle()); + Bundle bundle = in.readBundle(); + mActivityOptions = bundle != null ? ActivityOptions.fromBundle(bundle) : null; } public static final @NonNull Creator CREATOR = diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index 81a8680cdbf0f..b1c91ba4a79d6 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -368,7 +368,8 @@ public final class PendingIntentRecord extends IIntentSender.Stub { // Apply any launch flags from the ActivityOptions. This is to ensure that the caller // can specify a consistent launch mode even if the PendingIntent is immutable - final ActivityOptions opts = ActivityOptions.fromBundle(options); + final ActivityOptions opts = options != null ? ActivityOptions.fromBundle(options) + : null; if (opts != null) { finalIntent.addFlags(opts.getPendingIntentLaunchFlags()); } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 6f02138bbab61..edaae47298ef3 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -995,11 +995,13 @@ public class LauncherAppsService extends SystemService { // Note the target activity doesn't have to be exported. // Flag for bubble - ActivityOptions options = ActivityOptions.fromBundle(startActivityOptions); - if (options != null && options.isApplyActivityFlagsForBubbles()) { - // Flag for bubble to make behaviour match documentLaunchMode=always. - intents[0].addFlags(FLAG_ACTIVITY_NEW_DOCUMENT); - intents[0].addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + if (startActivityOptions != null) { + ActivityOptions options = ActivityOptions.fromBundle(startActivityOptions); + if (options.isApplyActivityFlagsForBubbles()) { + // Flag for bubble to make behaviour match documentLaunchMode=always. + intents[0].addFlags(FLAG_ACTIVITY_NEW_DOCUMENT); + intents[0].addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + } } intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);