From 14ba6a9b336f621122c84d16f680148fb6ddacb9 Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Fri, 19 May 2023 15:47:36 +0000 Subject: [PATCH] Handle openning transition while animating a pair to home There is a timing opening one of the splitting apps while animating a pair to home. Which should launch the app into fullscreen instead of bring back the split pair. This makes sure to dismiss split properly with the openning transition. Also makes sure to restore reparent leaf task flag to prevent split screen being dismissed by relaunching a splitting app while it is in the foreground. Fix: 280387453 Fix: 283462648 Test: atest WMShellUnitTests Test: compose a split piar, swipe-to-home and quickly click one of the app icons, it won't bring back the split pair Change-Id: Ia4e0b5f74f3b980ab3ecce18bebb14fcb9530f87 --- .../splitscreen/SplitScreenTransitions.java | 16 +++------ .../shell/splitscreen/StageCoordinator.java | 34 ++++++++++--------- .../splitscreen/SplitTransitionTests.java | 4 +-- 3 files changed, 24 insertions(+), 30 deletions(-) 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 d2b0e2800dc93..986309948adab 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 @@ -348,8 +348,6 @@ class SplitScreenTransitions { WindowContainerTransaction wct, @Nullable RemoteTransition remoteTransition, Transitions.TransitionHandler handler, - @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback, int extraTransitType, boolean resizeAnim) { if (mPendingEnter != null) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " @@ -357,20 +355,16 @@ class SplitScreenTransitions { return null; } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); - setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback, - extraTransitType, resizeAnim); + setEnterTransition(transition, remoteTransition, extraTransitType, resizeAnim); return transition; } /** Sets a transition to enter split. */ void setEnterTransition(@NonNull IBinder transition, @Nullable RemoteTransition remoteTransition, - @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback, int extraTransitType, boolean resizeAnim) { mPendingEnter = new EnterSession( - transition, consumedCallback, finishedCallback, remoteTransition, extraTransitType, - resizeAnim); + transition, remoteTransition, extraTransitType, resizeAnim); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " deduced Enter split screen"); @@ -608,12 +602,10 @@ class SplitScreenTransitions { final boolean mResizeAnim; EnterSession(IBinder transition, - @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback, @Nullable RemoteTransition remoteTransition, int extraTransitType, boolean resizeAnim) { - super(transition, consumedCallback, finishedCallback, remoteTransition, - extraTransitType); + super(transition, null /* consumedCallback */, null /* finishedCallback */, + remoteTransition, extraTransitType); this.mResizeAnim = resizeAnim; } } 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 56258ffbf632e..b2526ee97a210 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 @@ -396,7 +396,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, prepareEnterSplitScreen(wct, task, stagePosition); if (ENABLE_SHELL_TRANSITIONS) { mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, - null, this, null /* consumedCallback */, null /* finishedCallback */, + null, this, isSplitScreenVisible() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering); @@ -507,8 +507,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, prepareEnterSplitScreen(wct, null /* taskInfo */, position); mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, - null /* consumedCallback */, null /* finishedCallback */, extraTransitType, - !mIsDropEntering); + extraTransitType, !mIsDropEntering); } /** Launches an activity into split by legacy transition. */ @@ -665,8 +664,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (mPausingTasks.contains(mainTaskId)) { mPausingTasks.clear(); } - mSplitTransitions.startEnterTransition( - TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, + mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, remoteTransition, this, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); setEnterInstanceId(instanceId); } @@ -716,8 +714,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.sendPendingIntent(pendingIntent2, fillInIntent2, options2); } - mSplitTransitions.startEnterTransition( - TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, + mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, remoteTransition, this, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); setEnterInstanceId(instanceId); } @@ -1453,8 +1450,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (!mMainStage.isActive()) return; mSideStage.removeAllTasks(wct, stageToTop == STAGE_TYPE_SIDE); mMainStage.deactivate(wct, stageToTop == STAGE_TYPE_MAIN); - wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, - false /* reparentLeafTaskIfRelaunch */); } private void prepareEnterSplitScreen(WindowContainerTransaction wct) { @@ -2295,11 +2290,19 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, out = new WindowContainerTransaction(); final StageTaskListener stage = getStageOfTask(triggerTask); if (stage != null) { - // Dismiss split if the last task in one of the stages is going away if (isClosingType(type) && stage.getChildCount() == 1) { + // Dismiss split if the last task in one of the stages is going away // The top should be the opposite side that is closing: - int dismissTop = getStageType(stage) == STAGE_TYPE_MAIN ? STAGE_TYPE_SIDE - : STAGE_TYPE_MAIN; + int dismissTop = getStageType(stage) == STAGE_TYPE_MAIN + ? STAGE_TYPE_SIDE : STAGE_TYPE_MAIN; + prepareExitSplitScreen(dismissTop, out); + mSplitTransitions.setDismissTransition(transition, dismissTop, + EXIT_REASON_APP_FINISHED); + } else if (isOpening && !mPausingTasks.isEmpty()) { + // One of the splitting task is opening while animating the split pair in + // recents, which means to dismiss the split pair to this task. + int dismissTop = getStageType(stage) == STAGE_TYPE_MAIN + ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE; prepareExitSplitScreen(dismissTop, out); mSplitTransitions.setDismissTransition(transition, dismissTop, EXIT_REASON_APP_FINISHED); @@ -2308,7 +2311,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // prepare to enter split screen. prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - null /* consumedCallback */, null /* finishedCallback */, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering); } } else if (isOpening && inFullscreen) { @@ -2334,7 +2336,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, out = new WindowContainerTransaction(); prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - null /* consumedCallback */, null /* finishedCallback */, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering); } } @@ -2680,6 +2681,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mShowDecorImmediately = true; mSplitLayout.flingDividerToCenter(); } + callbackWct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, false); mPausingTasks.clear(); }); @@ -2830,6 +2832,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, dismissTransition.setFinishedCallback((callbackWct, callbackT) -> { mMainStage.getSplitDecorManager().release(callbackT); mSideStage.getSplitDecorManager().release(callbackT); + callbackWct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, false); }); addDividerBarToTransition(info, false /* show */); @@ -2883,8 +2886,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } setSplitsVisible(false); - finishWct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, - true /* reparentLeafTaskIfRelaunch */); + prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, finishWct); logExit(EXIT_REASON_UNKNOWN); } 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 5f705d743601b..3b05651f884b9 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 @@ -185,7 +185,7 @@ public class SplitTransitionTests extends ShellTestCase { IBinder transition = mSplitScreenTransitions.startEnterTransition( TRANSIT_OPEN, new WindowContainerTransaction(), - new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null, + new RemoteTransition(testRemote, "Test"), mStageCoordinator, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); @@ -412,7 +412,7 @@ public class SplitTransitionTests extends ShellTestCase { IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(new TestRemoteTransition(), "Test"), - mStageCoordinator, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); + mStageCoordinator, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); mStageCoordinator.startAnimation(enterTransit, enterInfo,