diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java index 51b8000f14bb4..a2af93fc42c60 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java @@ -30,8 +30,6 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON import static com.android.wm.shell.splitscreen.SplitScreenController.exitReasonToString; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP; -import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE; -import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -165,7 +163,7 @@ class SplitScreenTransitions { t.setLayer(leash, Integer.MAX_VALUE); t.show(leash); } - boolean isOpening = isOpeningTransition(info); + boolean isOpening = TransitionUtil.isOpeningType(info.getType()); if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) { // fade in startExampleAnimation(leash, true /* show */); @@ -295,14 +293,16 @@ class SplitScreenTransitions { @Nullable RemoteTransition remoteTransition, Transitions.TransitionHandler handler, @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback) { + @Nullable TransitionFinishedCallback finishedCallback, + int extraTransitType) { if (mPendingEnter != null) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " skip to start enter split transition since it already exist. "); return null; } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); - setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback); + setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback, + extraTransitType); return transition; } @@ -310,9 +310,10 @@ class SplitScreenTransitions { void setEnterTransition(@NonNull IBinder transition, @Nullable RemoteTransition remoteTransition, @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback) { + @Nullable TransitionFinishedCallback finishedCallback, + int extraTransitType) { mPendingEnter = new TransitSession( - transition, consumedCallback, finishedCallback, remoteTransition); + transition, consumedCallback, finishedCallback, remoteTransition, extraTransitType); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " deduced Enter split screen"); @@ -513,12 +514,6 @@ class SplitScreenTransitions { mTransitions.getAnimExecutor().execute(va::start); } - private boolean isOpeningTransition(TransitionInfo info) { - return TransitionUtil.isOpeningType(info.getType()) - || info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE - || info.getType() == TRANSIT_SPLIT_SCREEN_PAIR_OPEN; - } - /** Calls when the transition got consumed. */ interface TransitionConsumedCallback { void onConsumed(boolean aborted); @@ -539,16 +534,19 @@ class SplitScreenTransitions { /** Whether the transition was canceled. */ boolean mCanceled; + /** A note for extra transit type, to help indicate custom transition. */ + final int mExtraTransitType; + TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { - this(transition, consumedCallback, finishedCallback, null /* remoteTransition */); + this(transition, consumedCallback, finishedCallback, null /* remoteTransition */, 0); } TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback, - @Nullable RemoteTransition remoteTransition) { + @Nullable RemoteTransition remoteTransition, int extraTransitType) { mTransition = transition; mConsumedCallback = consumedCallback; mFinishedCallback = finishedCallback; @@ -560,6 +558,7 @@ class SplitScreenTransitions { mTransitions.getMainExecutor(), remoteTransition); mRemoteHandler.setTransition(transition); } + mExtraTransitType = extraTransitType; } /** Sets transition consumed callback. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index cca63ef2b5d68..f46241cc7c101 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -525,17 +525,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.sendPendingIntent(intent, fillInIntent, options); // If split screen is not activated, we're expecting to open a pair of apps to split. - final int transitType = mMainStage.isActive() + final int extraTransitType = mMainStage.isActive() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN; prepareEnterSplitScreen(wct, null /* taskInfo */, position); - mSplitTransitions.startEnterTransition(transitType, wct, null, this, + mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, null /* consumedCallback */, (finishWct, finishT) -> { if (!evictWct.isEmpty()) { finishWct.merge(evictWct, true); } - } /* finishedCallback */); + } /* finishedCallback */, extraTransitType); } /** Launches an activity into split by legacy transition. */ @@ -708,7 +708,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.startTask(mainTaskId, mainOptions); mSplitTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); + TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } @@ -759,7 +760,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } mSplitTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); + TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } @@ -2333,7 +2335,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, out = new WindowContainerTransaction(); prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - null /* consumedCallback */, null /* finishedCallback */); + null /* consumedCallback */, null /* finishedCallback */, + 0 /* extraTransitType */); } } return out; @@ -2572,7 +2575,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - if (info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { + if (mSplitTransitions.mPendingEnter.mExtraTransitType + == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { if (mainChild == null && sideChild == null) { Log.w(TAG, "Launched a task in split, but didn't receive any task in transition."); mSplitTransitions.mPendingEnter.cancel(null /* finishedCb */); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java index a9f311f9e9eb0..92cbf7f068b4f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -180,8 +180,9 @@ public class SplitTransitionTests extends ShellTestCase { TestRemoteTransition testRemote = new TestRemoteTransition(); IBinder transition = mSplitScreenTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), - new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null); + TRANSIT_OPEN, new WindowContainerTransaction(), + new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); boolean accepted = mStageCoordinator.startAnimation(transition, info, @@ -397,7 +398,7 @@ public class SplitTransitionTests extends ShellTestCase { } private TransitionInfo createEnterPairInfo() { - return new TransitionInfoBuilder(TRANSIT_SPLIT_SCREEN_PAIR_OPEN, 0) + return new TransitionInfoBuilder(TRANSIT_OPEN, 0) .addChange(TRANSIT_OPEN, mMainChild) .addChange(TRANSIT_OPEN, mSideChild) .build(); @@ -406,9 +407,9 @@ public class SplitTransitionTests extends ShellTestCase { private void enterSplit() { TransitionInfo enterInfo = createEnterPairInfo(); IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), + TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(new TestRemoteTransition(), "Test"), - mStageCoordinator, null, null); + mStageCoordinator, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); mStageCoordinator.startAnimation(enterTransit, enterInfo,