Loading core/java/android/window/TransitionRequestInfo.java +169 −30 Original line number Diff line number Diff line Loading @@ -44,10 +44,10 @@ public final class TransitionRequestInfo implements Parcelable { private @Nullable ActivityManager.RunningTaskInfo mTriggerTask; /** * If non-null, the task containing the pip activity that participates in this * transition. * If non-null, this request might lead to a PiP transition; {@code PipChange} caches both * {@code TaskFragment} token and the {@code TaskInfo} of the task with PiP candidate activity. */ private @Nullable ActivityManager.RunningTaskInfo mPipTask; private @Nullable TransitionRequestInfo.PipChange mPipChange; /** If non-null, a remote-transition associated with the source of this transition. */ private @Nullable RemoteTransition mRemoteTransition; Loading @@ -70,7 +70,7 @@ public final class TransitionRequestInfo implements Parcelable { @WindowManager.TransitionType int type, @Nullable ActivityManager.RunningTaskInfo triggerTask, @Nullable RemoteTransition remoteTransition) { this(type, triggerTask, null /* pipTask */, this(type, triggerTask, null /* pipChange */, remoteTransition, null /* displayChange */, 0 /* flags */, -1 /* debugId */); } Loading @@ -80,7 +80,7 @@ public final class TransitionRequestInfo implements Parcelable { @Nullable ActivityManager.RunningTaskInfo triggerTask, @Nullable RemoteTransition remoteTransition, int flags) { this(type, triggerTask, null /* pipTask */, this(type, triggerTask, null /* pipChange */, remoteTransition, null /* displayChange */, flags, -1 /* debugId */); } Loading @@ -91,7 +91,7 @@ public final class TransitionRequestInfo implements Parcelable { @Nullable RemoteTransition remoteTransition, @Nullable TransitionRequestInfo.DisplayChange displayChange, int flags) { this(type, triggerTask, null /* pipTask */, remoteTransition, displayChange, flags, this(type, triggerTask, null /* pipChange */, remoteTransition, displayChange, flags, -1 /* debugId */); } Loading @@ -103,7 +103,9 @@ public final class TransitionRequestInfo implements Parcelable { @Nullable RemoteTransition remoteTransition, @Nullable TransitionRequestInfo.DisplayChange displayChange, int flags) { this(type, triggerTask, pipTask, remoteTransition, displayChange, flags, -1 /* debugId */); this(type, triggerTask, pipTask != null ? new TransitionRequestInfo.PipChange(pipTask) : null, remoteTransition, displayChange, flags, -1 /* debugId */); } /** @hide */ Loading Loading @@ -252,7 +254,7 @@ public final class TransitionRequestInfo implements Parcelable { /** @hide */ @SuppressWarnings({"unchecked", "RedundantCast"}) @DataClass.Generated.Member protected DisplayChange(@android.annotation.NonNull android.os.Parcel in) { /* package-private */ DisplayChange(@android.annotation.NonNull android.os.Parcel in) { // You can override field unparcelling by defining methods like: // static FieldType unparcelFieldName(Parcel in) { ... } Loading Loading @@ -289,7 +291,7 @@ public final class TransitionRequestInfo implements Parcelable { }; @DataClass.Generated( time = 1697564781403L, time = 1733334462577L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", inputSignatures = "private final int mDisplayId\nprivate @android.annotation.Nullable android.graphics.Rect mStartAbsBounds\nprivate @android.annotation.Nullable android.graphics.Rect mEndAbsBounds\nprivate int mStartRotation\nprivate int mEndRotation\nprivate boolean mPhysicalDisplayChanged\nclass DisplayChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)") Loading @@ -302,6 +304,143 @@ public final class TransitionRequestInfo implements Parcelable { } @DataClass(genToString = true, genSetters = true, genBuilder = false, genConstructor = false) public static final class PipChange implements Parcelable { // In AE case, we might care about the TF token instead of the task token. @android.annotation.NonNull private WindowContainerToken mTaskFragmentToken; @android.annotation.NonNull private ActivityManager.RunningTaskInfo mTaskInfo; /** Create empty display-change. */ public PipChange(ActivityManager.RunningTaskInfo taskInfo) { mTaskFragmentToken = taskInfo.token; mTaskInfo = taskInfo; } /** Create a display-change representing a rotation. */ public PipChange(WindowContainerToken taskFragmentToken, ActivityManager.RunningTaskInfo taskInfo) { mTaskFragmentToken = taskFragmentToken; mTaskInfo = taskInfo; } // Code below generated by codegen v1.0.23. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code // // To regenerate run: // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/window/TransitionRequestInfo.java // // To exclude the generated code from IntelliJ auto-formatting enable (one-time): // Settings > Editor > Code Style > Formatter Control //@formatter:off @DataClass.Generated.Member public @android.annotation.NonNull WindowContainerToken getTaskFragmentToken() { return mTaskFragmentToken; } @DataClass.Generated.Member public @android.annotation.NonNull ActivityManager.RunningTaskInfo getTaskInfo() { return mTaskInfo; } @DataClass.Generated.Member public @android.annotation.NonNull PipChange setTaskFragmentToken(@android.annotation.NonNull WindowContainerToken value) { mTaskFragmentToken = value; com.android.internal.util.AnnotationValidations.validate( android.annotation.NonNull.class, null, mTaskFragmentToken); return this; } @DataClass.Generated.Member public @android.annotation.NonNull PipChange setTaskInfo(@android.annotation.NonNull ActivityManager.RunningTaskInfo value) { mTaskInfo = value; com.android.internal.util.AnnotationValidations.validate( android.annotation.NonNull.class, null, mTaskInfo); return this; } @Override @DataClass.Generated.Member public String toString() { // You can override field toString logic by defining methods like: // String fieldNameToString() { ... } return "PipChange { " + "taskFragmentToken = " + mTaskFragmentToken + ", " + "taskInfo = " + mTaskInfo + " }"; } @Override @DataClass.Generated.Member public void writeToParcel(@android.annotation.NonNull android.os.Parcel dest, int flags) { // You can override field parcelling by defining methods like: // void parcelFieldName(Parcel dest, int flags) { ... } dest.writeTypedObject(mTaskFragmentToken, flags); dest.writeTypedObject(mTaskInfo, flags); } @Override @DataClass.Generated.Member public int describeContents() { return 0; } /** @hide */ @SuppressWarnings({"unchecked", "RedundantCast"}) @DataClass.Generated.Member /* package-private */ PipChange(@android.annotation.NonNull android.os.Parcel in) { // You can override field unparcelling by defining methods like: // static FieldType unparcelFieldName(Parcel in) { ... } WindowContainerToken taskFragmentToken = (WindowContainerToken) in.readTypedObject(WindowContainerToken.CREATOR); ActivityManager.RunningTaskInfo taskInfo = (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); this.mTaskFragmentToken = taskFragmentToken; com.android.internal.util.AnnotationValidations.validate( android.annotation.NonNull.class, null, mTaskFragmentToken); this.mTaskInfo = taskInfo; com.android.internal.util.AnnotationValidations.validate( android.annotation.NonNull.class, null, mTaskInfo); // onConstructed(); // You can define this method to get a callback } @DataClass.Generated.Member public static final @android.annotation.NonNull Parcelable.Creator<PipChange> CREATOR = new Parcelable.Creator<PipChange>() { @Override public PipChange[] newArray(int size) { return new PipChange[size]; } @Override public PipChange createFromParcel(@android.annotation.NonNull android.os.Parcel in) { return new PipChange(in); } }; @DataClass.Generated( time = 1733334462588L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", inputSignatures = "private @android.annotation.NonNull android.window.WindowContainerToken mTaskFragmentToken\nprivate @android.annotation.NonNull android.app.ActivityManager.RunningTaskInfo mTaskInfo\nclass PipChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)") @Deprecated private void __metadata() {} //@formatter:on // End of generated code } Loading @@ -326,9 +465,9 @@ public final class TransitionRequestInfo implements Parcelable { * @param triggerTask * If non-null, the task containing the activity whose lifecycle change (start or * finish) has caused this transition to occur. * @param pipTask * If non-null, the task containing the pip activity that participates in this * transition. * @param pipChange * If non-null, this request might lead to a PiP transition; {@code PipChange} caches both * {@code TaskFragment} token and the {@code TaskInfo} of the task with PiP candidate activity. * @param remoteTransition * If non-null, a remote-transition associated with the source of this transition. * @param displayChange Loading @@ -344,7 +483,7 @@ public final class TransitionRequestInfo implements Parcelable { public TransitionRequestInfo( @WindowManager.TransitionType int type, @Nullable ActivityManager.RunningTaskInfo triggerTask, @Nullable ActivityManager.RunningTaskInfo pipTask, @Nullable TransitionRequestInfo.PipChange pipChange, @Nullable RemoteTransition remoteTransition, @Nullable TransitionRequestInfo.DisplayChange displayChange, int flags, Loading @@ -353,7 +492,7 @@ public final class TransitionRequestInfo implements Parcelable { com.android.internal.util.AnnotationValidations.validate( WindowManager.TransitionType.class, null, mType); this.mTriggerTask = triggerTask; this.mPipTask = pipTask; this.mPipChange = pipChange; this.mRemoteTransition = remoteTransition; this.mDisplayChange = displayChange; this.mFlags = flags; Loading @@ -380,12 +519,12 @@ public final class TransitionRequestInfo implements Parcelable { } /** * If non-null, the task containing the pip activity that participates in this * transition. * If non-null, this request might lead to a PiP transition; {@code PipChange} caches both * {@code TaskFragment} token and the {@code TaskInfo} of the task with PiP candidate activity. */ @DataClass.Generated.Member public @Nullable ActivityManager.RunningTaskInfo getPipTask() { return mPipTask; public @Nullable TransitionRequestInfo.PipChange getPipChange() { return mPipChange; } /** Loading Loading @@ -433,12 +572,12 @@ public final class TransitionRequestInfo implements Parcelable { } /** * If non-null, the task containing the pip activity that participates in this * transition. * If non-null, this request might lead to a PiP transition; {@code PipChange} caches both * {@code TaskFragment} token and the {@code TaskInfo} of the task with PiP candidate activity. */ @DataClass.Generated.Member public @android.annotation.NonNull TransitionRequestInfo setPipTask(@android.annotation.NonNull ActivityManager.RunningTaskInfo value) { mPipTask = value; public @android.annotation.NonNull TransitionRequestInfo setPipChange(@android.annotation.NonNull TransitionRequestInfo.PipChange value) { mPipChange = value; return this; } Loading Loading @@ -471,10 +610,10 @@ public final class TransitionRequestInfo implements Parcelable { return "TransitionRequestInfo { " + "type = " + typeToString() + ", " + "triggerTask = " + mTriggerTask + ", " + "pipTask = " + mPipTask + ", " + "pipChange = " + mPipChange + ", " + "remoteTransition = " + mRemoteTransition + ", " + "displayChange = " + mDisplayChange + ", " + "flags = " + Integer.toHexString(mFlags) + ", " + "flags = " + mFlags + ", " + "debugId = " + mDebugId + " }"; } Loading @@ -487,13 +626,13 @@ public final class TransitionRequestInfo implements Parcelable { byte flg = 0; if (mTriggerTask != null) flg |= 0x2; if (mPipTask != null) flg |= 0x4; if (mPipChange != null) flg |= 0x4; if (mRemoteTransition != null) flg |= 0x8; if (mDisplayChange != null) flg |= 0x10; dest.writeByte(flg); dest.writeInt(mType); if (mTriggerTask != null) dest.writeTypedObject(mTriggerTask, flags); if (mPipTask != null) dest.writeTypedObject(mPipTask, flags); if (mPipChange != null) dest.writeTypedObject(mPipChange, flags); if (mRemoteTransition != null) dest.writeTypedObject(mRemoteTransition, flags); if (mDisplayChange != null) dest.writeTypedObject(mDisplayChange, flags); dest.writeInt(mFlags); Loading @@ -514,7 +653,7 @@ public final class TransitionRequestInfo implements Parcelable { byte flg = in.readByte(); int type = in.readInt(); ActivityManager.RunningTaskInfo triggerTask = (flg & 0x2) == 0 ? null : (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); ActivityManager.RunningTaskInfo pipTask = (flg & 0x4) == 0 ? null : (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); TransitionRequestInfo.PipChange pipChange = (flg & 0x4) == 0 ? null : (TransitionRequestInfo.PipChange) in.readTypedObject(TransitionRequestInfo.PipChange.CREATOR); RemoteTransition remoteTransition = (flg & 0x8) == 0 ? null : (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR); TransitionRequestInfo.DisplayChange displayChange = (flg & 0x10) == 0 ? null : (TransitionRequestInfo.DisplayChange) in.readTypedObject(TransitionRequestInfo.DisplayChange.CREATOR); int flags = in.readInt(); Loading @@ -524,7 +663,7 @@ public final class TransitionRequestInfo implements Parcelable { com.android.internal.util.AnnotationValidations.validate( WindowManager.TransitionType.class, null, mType); this.mTriggerTask = triggerTask; this.mPipTask = pipTask; this.mPipChange = pipChange; this.mRemoteTransition = remoteTransition; this.mDisplayChange = displayChange; this.mFlags = flags; Loading @@ -548,10 +687,10 @@ public final class TransitionRequestInfo implements Parcelable { }; @DataClass.Generated( time = 1697564781438L, time = 1733334462604L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mPipTask\nprivate @android.annotation.Nullable android.window.RemoteTransition mRemoteTransition\nprivate @android.annotation.Nullable android.window.TransitionRequestInfo.DisplayChange mDisplayChange\nprivate final int mFlags\nprivate final int mDebugId\n java.lang.String typeToString()\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)") inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.window.TransitionRequestInfo.PipChange mPipChange\nprivate @android.annotation.Nullable android.window.RemoteTransition mRemoteTransition\nprivate @android.annotation.Nullable android.window.TransitionRequestInfo.DisplayChange mDisplayChange\nprivate final int mFlags\nprivate final int mDebugId\n java.lang.String typeToString()\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)") @Deprecated private void __metadata() {} Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +12 −7 Original line number Diff line number Diff line Loading @@ -196,7 +196,7 @@ public class PipTransition extends PipTransitionController implements @NonNull TransitionRequestInfo request) { if (isAutoEnterInButtonNavigation(request) || isEnterPictureInPictureModeRequest(request)) { mEnterTransition = transition; return getEnterPipTransaction(transition, request); return getEnterPipTransaction(transition, request.getPipChange()); } return null; } Loading @@ -205,7 +205,8 @@ public class PipTransition extends PipTransitionController implements public void augmentRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request, @NonNull WindowContainerTransaction outWct) { if (isAutoEnterInButtonNavigation(request) || isEnterPictureInPictureModeRequest(request)) { outWct.merge(getEnterPipTransaction(transition, request), true /* transfer */); outWct.merge(getEnterPipTransaction(transition, request.getPipChange()), true /* transfer */); mEnterTransition = transition; } } Loading Loading @@ -775,9 +776,9 @@ public class PipTransition extends PipTransitionController implements } private WindowContainerTransaction getEnterPipTransaction(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { @NonNull TransitionRequestInfo.PipChange pipChange) { // cache the original task token to check for multi-activity case later final ActivityManager.RunningTaskInfo pipTask = request.getPipTask(); final ActivityManager.RunningTaskInfo pipTask = pipChange.getTaskInfo(); PictureInPictureParams pipParams = pipTask.pictureInPictureParams; mPipTaskListener.setPictureInPictureParams(pipParams); mPipBoundsState.setBoundsStateForEntry(pipTask.topActivity, pipTask.topActivityInfo, Loading @@ -787,14 +788,18 @@ public class PipTransition extends PipTransitionController implements final Rect entryBounds = mPipBoundsAlgorithm.getEntryDestinationBounds(); mPipBoundsState.setBounds(entryBounds); // Operate on the TF token in case we are dealing with AE case; this should avoid marking // activities in other TFs as config-at-end. WindowContainerToken token = pipChange.getTaskFragmentToken(); WindowContainerTransaction wct = new WindowContainerTransaction(); wct.movePipActivityToPinnedRootTask(pipTask.token, entryBounds); wct.deferConfigToTransitionEnd(pipTask.token); wct.movePipActivityToPinnedRootTask(token, entryBounds); wct.deferConfigToTransitionEnd(token); return wct; } private boolean isAutoEnterInButtonNavigation(@NonNull TransitionRequestInfo requestInfo) { final ActivityManager.RunningTaskInfo pipTask = requestInfo.getPipTask(); final ActivityManager.RunningTaskInfo pipTask = requestInfo.getPipChange() != null ? requestInfo.getPipChange().getTaskInfo() : null; if (pipTask == null) { return false; } Loading services/core/java/com/android/server/wm/TransitionController.java +14 −3 Original line number Diff line number Diff line Loading @@ -791,19 +791,30 @@ class TransitionController { ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Requesting StartTransition: %s", transition); ActivityManager.RunningTaskInfo startTaskInfo = null; ActivityManager.RunningTaskInfo pipTaskInfo = null; TransitionRequestInfo.PipChange pipChange = null; if (startTask != null) { startTaskInfo = startTask.getTaskInfo(); } // set the pip task in the request if provided if (transition.getPipActivity() != null) { pipTaskInfo = transition.getPipActivity().getTask().getTaskInfo(); ActivityManager.RunningTaskInfo pipTaskInfo = transition.getPipActivity().getTask().getTaskInfo(); ActivityRecord pipActivity = transition.getPipActivity(); if (pipActivity.getTaskFragment() != null && pipActivity.getTaskFragment() != pipActivity.getTask()) { // If the PiP activity is in a TF different from its task, this could be // AE-to-PiP case, so PipChange will have the TF token cached separately. pipChange = new TransitionRequestInfo.PipChange(pipActivity.getTaskFragment() .mRemoteToken.toWindowContainerToken(), pipTaskInfo); } else { pipChange = new TransitionRequestInfo.PipChange(pipTaskInfo); } transition.setPipActivity(null); } final TransitionRequestInfo request = new TransitionRequestInfo(transition.mType, startTaskInfo, pipTaskInfo, remoteTransition, displayChange, startTaskInfo, pipChange, remoteTransition, displayChange, transition.getFlags(), transition.getSyncId()); transition.mLogger.mRequestTimeNs = SystemClock.elapsedRealtimeNanos(); Loading services/core/java/com/android/server/wm/WindowOrganizerController.java +3 −3 Original line number Diff line number Diff line Loading @@ -1335,11 +1335,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } case HIERARCHY_OP_TYPE_MOVE_PIP_ACTIVITY_TO_PINNED_TASK: { final WindowContainer container = WindowContainer.fromBinder(hop.getContainer()); Task pipTask = container.asTask(); if (pipTask == null) { TaskFragment pipTaskFragment = container.asTaskFragment(); if (pipTaskFragment == null) { break; } ActivityRecord pipActivity = pipTask.getActivity( ActivityRecord pipActivity = pipTaskFragment.getActivity( (activity) -> activity.pictureInPictureArgs != null); if (pipActivity.isState(RESUMED)) { Loading Loading
core/java/android/window/TransitionRequestInfo.java +169 −30 Original line number Diff line number Diff line Loading @@ -44,10 +44,10 @@ public final class TransitionRequestInfo implements Parcelable { private @Nullable ActivityManager.RunningTaskInfo mTriggerTask; /** * If non-null, the task containing the pip activity that participates in this * transition. * If non-null, this request might lead to a PiP transition; {@code PipChange} caches both * {@code TaskFragment} token and the {@code TaskInfo} of the task with PiP candidate activity. */ private @Nullable ActivityManager.RunningTaskInfo mPipTask; private @Nullable TransitionRequestInfo.PipChange mPipChange; /** If non-null, a remote-transition associated with the source of this transition. */ private @Nullable RemoteTransition mRemoteTransition; Loading @@ -70,7 +70,7 @@ public final class TransitionRequestInfo implements Parcelable { @WindowManager.TransitionType int type, @Nullable ActivityManager.RunningTaskInfo triggerTask, @Nullable RemoteTransition remoteTransition) { this(type, triggerTask, null /* pipTask */, this(type, triggerTask, null /* pipChange */, remoteTransition, null /* displayChange */, 0 /* flags */, -1 /* debugId */); } Loading @@ -80,7 +80,7 @@ public final class TransitionRequestInfo implements Parcelable { @Nullable ActivityManager.RunningTaskInfo triggerTask, @Nullable RemoteTransition remoteTransition, int flags) { this(type, triggerTask, null /* pipTask */, this(type, triggerTask, null /* pipChange */, remoteTransition, null /* displayChange */, flags, -1 /* debugId */); } Loading @@ -91,7 +91,7 @@ public final class TransitionRequestInfo implements Parcelable { @Nullable RemoteTransition remoteTransition, @Nullable TransitionRequestInfo.DisplayChange displayChange, int flags) { this(type, triggerTask, null /* pipTask */, remoteTransition, displayChange, flags, this(type, triggerTask, null /* pipChange */, remoteTransition, displayChange, flags, -1 /* debugId */); } Loading @@ -103,7 +103,9 @@ public final class TransitionRequestInfo implements Parcelable { @Nullable RemoteTransition remoteTransition, @Nullable TransitionRequestInfo.DisplayChange displayChange, int flags) { this(type, triggerTask, pipTask, remoteTransition, displayChange, flags, -1 /* debugId */); this(type, triggerTask, pipTask != null ? new TransitionRequestInfo.PipChange(pipTask) : null, remoteTransition, displayChange, flags, -1 /* debugId */); } /** @hide */ Loading Loading @@ -252,7 +254,7 @@ public final class TransitionRequestInfo implements Parcelable { /** @hide */ @SuppressWarnings({"unchecked", "RedundantCast"}) @DataClass.Generated.Member protected DisplayChange(@android.annotation.NonNull android.os.Parcel in) { /* package-private */ DisplayChange(@android.annotation.NonNull android.os.Parcel in) { // You can override field unparcelling by defining methods like: // static FieldType unparcelFieldName(Parcel in) { ... } Loading Loading @@ -289,7 +291,7 @@ public final class TransitionRequestInfo implements Parcelable { }; @DataClass.Generated( time = 1697564781403L, time = 1733334462577L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", inputSignatures = "private final int mDisplayId\nprivate @android.annotation.Nullable android.graphics.Rect mStartAbsBounds\nprivate @android.annotation.Nullable android.graphics.Rect mEndAbsBounds\nprivate int mStartRotation\nprivate int mEndRotation\nprivate boolean mPhysicalDisplayChanged\nclass DisplayChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)") Loading @@ -302,6 +304,143 @@ public final class TransitionRequestInfo implements Parcelable { } @DataClass(genToString = true, genSetters = true, genBuilder = false, genConstructor = false) public static final class PipChange implements Parcelable { // In AE case, we might care about the TF token instead of the task token. @android.annotation.NonNull private WindowContainerToken mTaskFragmentToken; @android.annotation.NonNull private ActivityManager.RunningTaskInfo mTaskInfo; /** Create empty display-change. */ public PipChange(ActivityManager.RunningTaskInfo taskInfo) { mTaskFragmentToken = taskInfo.token; mTaskInfo = taskInfo; } /** Create a display-change representing a rotation. */ public PipChange(WindowContainerToken taskFragmentToken, ActivityManager.RunningTaskInfo taskInfo) { mTaskFragmentToken = taskFragmentToken; mTaskInfo = taskInfo; } // Code below generated by codegen v1.0.23. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code // // To regenerate run: // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/window/TransitionRequestInfo.java // // To exclude the generated code from IntelliJ auto-formatting enable (one-time): // Settings > Editor > Code Style > Formatter Control //@formatter:off @DataClass.Generated.Member public @android.annotation.NonNull WindowContainerToken getTaskFragmentToken() { return mTaskFragmentToken; } @DataClass.Generated.Member public @android.annotation.NonNull ActivityManager.RunningTaskInfo getTaskInfo() { return mTaskInfo; } @DataClass.Generated.Member public @android.annotation.NonNull PipChange setTaskFragmentToken(@android.annotation.NonNull WindowContainerToken value) { mTaskFragmentToken = value; com.android.internal.util.AnnotationValidations.validate( android.annotation.NonNull.class, null, mTaskFragmentToken); return this; } @DataClass.Generated.Member public @android.annotation.NonNull PipChange setTaskInfo(@android.annotation.NonNull ActivityManager.RunningTaskInfo value) { mTaskInfo = value; com.android.internal.util.AnnotationValidations.validate( android.annotation.NonNull.class, null, mTaskInfo); return this; } @Override @DataClass.Generated.Member public String toString() { // You can override field toString logic by defining methods like: // String fieldNameToString() { ... } return "PipChange { " + "taskFragmentToken = " + mTaskFragmentToken + ", " + "taskInfo = " + mTaskInfo + " }"; } @Override @DataClass.Generated.Member public void writeToParcel(@android.annotation.NonNull android.os.Parcel dest, int flags) { // You can override field parcelling by defining methods like: // void parcelFieldName(Parcel dest, int flags) { ... } dest.writeTypedObject(mTaskFragmentToken, flags); dest.writeTypedObject(mTaskInfo, flags); } @Override @DataClass.Generated.Member public int describeContents() { return 0; } /** @hide */ @SuppressWarnings({"unchecked", "RedundantCast"}) @DataClass.Generated.Member /* package-private */ PipChange(@android.annotation.NonNull android.os.Parcel in) { // You can override field unparcelling by defining methods like: // static FieldType unparcelFieldName(Parcel in) { ... } WindowContainerToken taskFragmentToken = (WindowContainerToken) in.readTypedObject(WindowContainerToken.CREATOR); ActivityManager.RunningTaskInfo taskInfo = (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); this.mTaskFragmentToken = taskFragmentToken; com.android.internal.util.AnnotationValidations.validate( android.annotation.NonNull.class, null, mTaskFragmentToken); this.mTaskInfo = taskInfo; com.android.internal.util.AnnotationValidations.validate( android.annotation.NonNull.class, null, mTaskInfo); // onConstructed(); // You can define this method to get a callback } @DataClass.Generated.Member public static final @android.annotation.NonNull Parcelable.Creator<PipChange> CREATOR = new Parcelable.Creator<PipChange>() { @Override public PipChange[] newArray(int size) { return new PipChange[size]; } @Override public PipChange createFromParcel(@android.annotation.NonNull android.os.Parcel in) { return new PipChange(in); } }; @DataClass.Generated( time = 1733334462588L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", inputSignatures = "private @android.annotation.NonNull android.window.WindowContainerToken mTaskFragmentToken\nprivate @android.annotation.NonNull android.app.ActivityManager.RunningTaskInfo mTaskInfo\nclass PipChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)") @Deprecated private void __metadata() {} //@formatter:on // End of generated code } Loading @@ -326,9 +465,9 @@ public final class TransitionRequestInfo implements Parcelable { * @param triggerTask * If non-null, the task containing the activity whose lifecycle change (start or * finish) has caused this transition to occur. * @param pipTask * If non-null, the task containing the pip activity that participates in this * transition. * @param pipChange * If non-null, this request might lead to a PiP transition; {@code PipChange} caches both * {@code TaskFragment} token and the {@code TaskInfo} of the task with PiP candidate activity. * @param remoteTransition * If non-null, a remote-transition associated with the source of this transition. * @param displayChange Loading @@ -344,7 +483,7 @@ public final class TransitionRequestInfo implements Parcelable { public TransitionRequestInfo( @WindowManager.TransitionType int type, @Nullable ActivityManager.RunningTaskInfo triggerTask, @Nullable ActivityManager.RunningTaskInfo pipTask, @Nullable TransitionRequestInfo.PipChange pipChange, @Nullable RemoteTransition remoteTransition, @Nullable TransitionRequestInfo.DisplayChange displayChange, int flags, Loading @@ -353,7 +492,7 @@ public final class TransitionRequestInfo implements Parcelable { com.android.internal.util.AnnotationValidations.validate( WindowManager.TransitionType.class, null, mType); this.mTriggerTask = triggerTask; this.mPipTask = pipTask; this.mPipChange = pipChange; this.mRemoteTransition = remoteTransition; this.mDisplayChange = displayChange; this.mFlags = flags; Loading @@ -380,12 +519,12 @@ public final class TransitionRequestInfo implements Parcelable { } /** * If non-null, the task containing the pip activity that participates in this * transition. * If non-null, this request might lead to a PiP transition; {@code PipChange} caches both * {@code TaskFragment} token and the {@code TaskInfo} of the task with PiP candidate activity. */ @DataClass.Generated.Member public @Nullable ActivityManager.RunningTaskInfo getPipTask() { return mPipTask; public @Nullable TransitionRequestInfo.PipChange getPipChange() { return mPipChange; } /** Loading Loading @@ -433,12 +572,12 @@ public final class TransitionRequestInfo implements Parcelable { } /** * If non-null, the task containing the pip activity that participates in this * transition. * If non-null, this request might lead to a PiP transition; {@code PipChange} caches both * {@code TaskFragment} token and the {@code TaskInfo} of the task with PiP candidate activity. */ @DataClass.Generated.Member public @android.annotation.NonNull TransitionRequestInfo setPipTask(@android.annotation.NonNull ActivityManager.RunningTaskInfo value) { mPipTask = value; public @android.annotation.NonNull TransitionRequestInfo setPipChange(@android.annotation.NonNull TransitionRequestInfo.PipChange value) { mPipChange = value; return this; } Loading Loading @@ -471,10 +610,10 @@ public final class TransitionRequestInfo implements Parcelable { return "TransitionRequestInfo { " + "type = " + typeToString() + ", " + "triggerTask = " + mTriggerTask + ", " + "pipTask = " + mPipTask + ", " + "pipChange = " + mPipChange + ", " + "remoteTransition = " + mRemoteTransition + ", " + "displayChange = " + mDisplayChange + ", " + "flags = " + Integer.toHexString(mFlags) + ", " + "flags = " + mFlags + ", " + "debugId = " + mDebugId + " }"; } Loading @@ -487,13 +626,13 @@ public final class TransitionRequestInfo implements Parcelable { byte flg = 0; if (mTriggerTask != null) flg |= 0x2; if (mPipTask != null) flg |= 0x4; if (mPipChange != null) flg |= 0x4; if (mRemoteTransition != null) flg |= 0x8; if (mDisplayChange != null) flg |= 0x10; dest.writeByte(flg); dest.writeInt(mType); if (mTriggerTask != null) dest.writeTypedObject(mTriggerTask, flags); if (mPipTask != null) dest.writeTypedObject(mPipTask, flags); if (mPipChange != null) dest.writeTypedObject(mPipChange, flags); if (mRemoteTransition != null) dest.writeTypedObject(mRemoteTransition, flags); if (mDisplayChange != null) dest.writeTypedObject(mDisplayChange, flags); dest.writeInt(mFlags); Loading @@ -514,7 +653,7 @@ public final class TransitionRequestInfo implements Parcelable { byte flg = in.readByte(); int type = in.readInt(); ActivityManager.RunningTaskInfo triggerTask = (flg & 0x2) == 0 ? null : (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); ActivityManager.RunningTaskInfo pipTask = (flg & 0x4) == 0 ? null : (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); TransitionRequestInfo.PipChange pipChange = (flg & 0x4) == 0 ? null : (TransitionRequestInfo.PipChange) in.readTypedObject(TransitionRequestInfo.PipChange.CREATOR); RemoteTransition remoteTransition = (flg & 0x8) == 0 ? null : (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR); TransitionRequestInfo.DisplayChange displayChange = (flg & 0x10) == 0 ? null : (TransitionRequestInfo.DisplayChange) in.readTypedObject(TransitionRequestInfo.DisplayChange.CREATOR); int flags = in.readInt(); Loading @@ -524,7 +663,7 @@ public final class TransitionRequestInfo implements Parcelable { com.android.internal.util.AnnotationValidations.validate( WindowManager.TransitionType.class, null, mType); this.mTriggerTask = triggerTask; this.mPipTask = pipTask; this.mPipChange = pipChange; this.mRemoteTransition = remoteTransition; this.mDisplayChange = displayChange; this.mFlags = flags; Loading @@ -548,10 +687,10 @@ public final class TransitionRequestInfo implements Parcelable { }; @DataClass.Generated( time = 1697564781438L, time = 1733334462604L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mPipTask\nprivate @android.annotation.Nullable android.window.RemoteTransition mRemoteTransition\nprivate @android.annotation.Nullable android.window.TransitionRequestInfo.DisplayChange mDisplayChange\nprivate final int mFlags\nprivate final int mDebugId\n java.lang.String typeToString()\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)") inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.window.TransitionRequestInfo.PipChange mPipChange\nprivate @android.annotation.Nullable android.window.RemoteTransition mRemoteTransition\nprivate @android.annotation.Nullable android.window.TransitionRequestInfo.DisplayChange mDisplayChange\nprivate final int mFlags\nprivate final int mDebugId\n java.lang.String typeToString()\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)") @Deprecated private void __metadata() {} Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +12 −7 Original line number Diff line number Diff line Loading @@ -196,7 +196,7 @@ public class PipTransition extends PipTransitionController implements @NonNull TransitionRequestInfo request) { if (isAutoEnterInButtonNavigation(request) || isEnterPictureInPictureModeRequest(request)) { mEnterTransition = transition; return getEnterPipTransaction(transition, request); return getEnterPipTransaction(transition, request.getPipChange()); } return null; } Loading @@ -205,7 +205,8 @@ public class PipTransition extends PipTransitionController implements public void augmentRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request, @NonNull WindowContainerTransaction outWct) { if (isAutoEnterInButtonNavigation(request) || isEnterPictureInPictureModeRequest(request)) { outWct.merge(getEnterPipTransaction(transition, request), true /* transfer */); outWct.merge(getEnterPipTransaction(transition, request.getPipChange()), true /* transfer */); mEnterTransition = transition; } } Loading Loading @@ -775,9 +776,9 @@ public class PipTransition extends PipTransitionController implements } private WindowContainerTransaction getEnterPipTransaction(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { @NonNull TransitionRequestInfo.PipChange pipChange) { // cache the original task token to check for multi-activity case later final ActivityManager.RunningTaskInfo pipTask = request.getPipTask(); final ActivityManager.RunningTaskInfo pipTask = pipChange.getTaskInfo(); PictureInPictureParams pipParams = pipTask.pictureInPictureParams; mPipTaskListener.setPictureInPictureParams(pipParams); mPipBoundsState.setBoundsStateForEntry(pipTask.topActivity, pipTask.topActivityInfo, Loading @@ -787,14 +788,18 @@ public class PipTransition extends PipTransitionController implements final Rect entryBounds = mPipBoundsAlgorithm.getEntryDestinationBounds(); mPipBoundsState.setBounds(entryBounds); // Operate on the TF token in case we are dealing with AE case; this should avoid marking // activities in other TFs as config-at-end. WindowContainerToken token = pipChange.getTaskFragmentToken(); WindowContainerTransaction wct = new WindowContainerTransaction(); wct.movePipActivityToPinnedRootTask(pipTask.token, entryBounds); wct.deferConfigToTransitionEnd(pipTask.token); wct.movePipActivityToPinnedRootTask(token, entryBounds); wct.deferConfigToTransitionEnd(token); return wct; } private boolean isAutoEnterInButtonNavigation(@NonNull TransitionRequestInfo requestInfo) { final ActivityManager.RunningTaskInfo pipTask = requestInfo.getPipTask(); final ActivityManager.RunningTaskInfo pipTask = requestInfo.getPipChange() != null ? requestInfo.getPipChange().getTaskInfo() : null; if (pipTask == null) { return false; } Loading
services/core/java/com/android/server/wm/TransitionController.java +14 −3 Original line number Diff line number Diff line Loading @@ -791,19 +791,30 @@ class TransitionController { ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Requesting StartTransition: %s", transition); ActivityManager.RunningTaskInfo startTaskInfo = null; ActivityManager.RunningTaskInfo pipTaskInfo = null; TransitionRequestInfo.PipChange pipChange = null; if (startTask != null) { startTaskInfo = startTask.getTaskInfo(); } // set the pip task in the request if provided if (transition.getPipActivity() != null) { pipTaskInfo = transition.getPipActivity().getTask().getTaskInfo(); ActivityManager.RunningTaskInfo pipTaskInfo = transition.getPipActivity().getTask().getTaskInfo(); ActivityRecord pipActivity = transition.getPipActivity(); if (pipActivity.getTaskFragment() != null && pipActivity.getTaskFragment() != pipActivity.getTask()) { // If the PiP activity is in a TF different from its task, this could be // AE-to-PiP case, so PipChange will have the TF token cached separately. pipChange = new TransitionRequestInfo.PipChange(pipActivity.getTaskFragment() .mRemoteToken.toWindowContainerToken(), pipTaskInfo); } else { pipChange = new TransitionRequestInfo.PipChange(pipTaskInfo); } transition.setPipActivity(null); } final TransitionRequestInfo request = new TransitionRequestInfo(transition.mType, startTaskInfo, pipTaskInfo, remoteTransition, displayChange, startTaskInfo, pipChange, remoteTransition, displayChange, transition.getFlags(), transition.getSyncId()); transition.mLogger.mRequestTimeNs = SystemClock.elapsedRealtimeNanos(); Loading
services/core/java/com/android/server/wm/WindowOrganizerController.java +3 −3 Original line number Diff line number Diff line Loading @@ -1335,11 +1335,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } case HIERARCHY_OP_TYPE_MOVE_PIP_ACTIVITY_TO_PINNED_TASK: { final WindowContainer container = WindowContainer.fromBinder(hop.getContainer()); Task pipTask = container.asTask(); if (pipTask == null) { TaskFragment pipTaskFragment = container.asTaskFragment(); if (pipTaskFragment == null) { break; } ActivityRecord pipActivity = pipTask.getActivity( ActivityRecord pipActivity = pipTaskFragment.getActivity( (activity) -> activity.pictureInPictureArgs != null); if (pipActivity.isState(RESUMED)) { Loading