Expose ActivityOptions.fromBundle() as ModuleApi.

CarService mainline module will use it.
Changed to accept NonNull only.

Bug: 195598146
Test: atest android.app.cts.ActivityOptionsTest
Change-Id: Iae70522fe1ad8b17a01c230ca8afb7a18b83a7ed
This commit is contained in:
Yuncheol Heo
2021-08-04 17:36:50 -07:00
parent f69e40b3ec
commit c5bf49474f
7 changed files with 35 additions and 11 deletions

View File

@@ -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";
}

View File

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

View File

@@ -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;
@@ -1352,9 +1353,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 */

View File

@@ -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<LaunchActivityItem> CREATOR =
new Creator<LaunchActivityItem>() {
public LaunchActivityItem createFromParcel(Parcel in) {

View File

@@ -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<StartActivityItem> CREATOR =

View File

@@ -352,7 +352,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());
}

View File

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