diff options
4 files changed, 42 insertions, 20 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 fed336b17f19..65fa9b4b5529 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 @@ -52,6 +52,7 @@ import com.android.wm.shell.common.split.SplitDecorManager; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.shared.TransactionPool; import com.android.wm.shell.shared.TransitionUtil; +import com.android.wm.shell.shared.split.SplitScreenConstants; import com.android.wm.shell.transition.OneShotRemoteHandler; import com.android.wm.shell.transition.Transitions; @@ -362,7 +363,8 @@ class SplitScreenTransitions { WindowContainerTransaction wct, @Nullable RemoteTransition remoteTransition, Transitions.TransitionHandler handler, - int extraTransitType, boolean resizeAnim) { + int extraTransitType, boolean resizeAnim, + @SplitScreenConstants.PersistentSnapPosition int snapPosition) { if (mPendingEnter != null) { ProtoLog.v(WM_SHELL_TRANSITIONS, " splitTransition " + " skip to start enter split transition since it already exist. "); @@ -373,16 +375,18 @@ class SplitScreenTransitions { .onSplitAnimationInvoked(true /*animationRunning*/)); } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); - setEnterTransition(transition, remoteTransition, extraTransitType, resizeAnim); + setEnterTransition(transition, remoteTransition, extraTransitType, resizeAnim, + snapPosition); return transition; } /** Sets a transition to enter split. */ void setEnterTransition(@NonNull IBinder transition, @Nullable RemoteTransition remoteTransition, - int extraTransitType, boolean resizeAnim) { + int extraTransitType, boolean resizeAnim, + int snapPosition) { mPendingEnter = new EnterSession( - transition, remoteTransition, extraTransitType, resizeAnim); + transition, remoteTransition, extraTransitType, resizeAnim, snapPosition); ProtoLog.v(WM_SHELL_TRANSITIONS, " splitTransition " + " deduced Enter split screen"); @@ -675,13 +679,16 @@ class SplitScreenTransitions { /** Bundled information of enter transition. */ class EnterSession extends TransitSession { final boolean mResizeAnim; + /** The starting snap position we'll enter into with this transition. */ + final @SplitScreenConstants.PersistentSnapPosition int mEnteringPosition; EnterSession(IBinder transition, @Nullable RemoteTransition remoteTransition, - int extraTransitType, boolean resizeAnim) { + int extraTransitType, boolean resizeAnim, int snapPosition) { super(transition, null /* consumedCallback */, null /* finishedCallback */, remoteTransition, extraTransitType); this.mResizeAnim = resizeAnim; + this.mEnteringPosition = snapPosition; } } 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 a3a808de6ff1..9eb61d793e9d 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 @@ -653,7 +653,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, null, this, isSplitScreenVisible() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN, - !mIsDropEntering); + !mIsDropEntering, SNAP_TO_2_50_50); // Due to drag already pip task entering split by this method so need to reset flag here. mIsDropEntering = false; @@ -787,7 +787,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, prepareEnterSplitScreen(wct, null /* taskInfo */, position, !mIsDropEntering, index); mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, - extraTransitType, !mIsDropEntering); + extraTransitType, !mIsDropEntering, SNAP_TO_2_50_50); } /** @@ -833,7 +833,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, prepareEnterSplitScreen(wct, null /* taskInfo */, position, !mIsDropEntering, index); mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, - extraTransitType, !mIsDropEntering); + extraTransitType, !mIsDropEntering, SNAP_TO_2_50_50); } /** @@ -1029,7 +1029,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mPausingTasks.clear(); } mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, remoteTransition, this, - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false, snapPosition); setEnterInstanceId(instanceId); } @@ -1119,7 +1119,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, remoteTransition, this, - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false, snapPosition); setEnterInstanceId(instanceId); } @@ -1624,6 +1624,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, grantFocusToStage(stageToFocus); } + private void grantFocusForSnapPosition(@PersistentSnapPosition int enteringPosition) { + switch (enteringPosition) { + case SNAP_TO_2_90_10 -> grantFocusToPosition(true /*leftOrTop*/); + case SNAP_TO_2_10_90 -> grantFocusToPosition(false /*leftOrTop*/); + default -> { /*no-op*/ } + } + } + private void clearRequestIfPresented() { ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "clearRequestIfPresented"); if (mSideStage.mVisible && mSideStage.mHasChildren @@ -2890,7 +2898,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // split, prepare to enter split screen. prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering); + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering, SNAP_TO_2_50_50); } else if (isSplitScreenVisible() && isOpening) { // launching into an existing split stage; possibly launchAdjacent // If we're replacing a pip-able app, we need to let mixed handler take care of @@ -2899,7 +2907,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // updated layout will get applied in startAnimation pendingResize mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, true /*resizeAnim*/); + TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, true /*resizeAnim*/, + SNAP_TO_2_50_50); } } else if (inFullscreen && isSplitScreenVisible()) { // If the trigger task is in fullscreen and in split, exit split and place @@ -2977,14 +2986,15 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, out = new WindowContainerTransaction(); prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering); + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering, SNAP_TO_2_50_50); return out; } ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "handleRequest: transition=%d " + "restoring to split", request.getDebugId()); out = new WindowContainerTransaction(); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, false /* resizeAnim */); + TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, false /* resizeAnim */, + SNAP_TO_2_50_50); } return out; } @@ -3171,7 +3181,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (keepSplitWithPip) { // Set an enter transition for when startAnimation gets called again mSplitTransitions.setEnterTransition(transition, /*remoteTransition*/ null, - TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, /*resizeAnim*/ false); + TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, /*resizeAnim*/ false, + SNAP_TO_2_50_50); } else { int finalClosingTaskId = closingSplitTaskId; mRecentTasks.ifPresent(recentTasks -> @@ -3556,6 +3567,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } }); mPausingTasks.clear(); + if (enableFlexibleTwoAppSplit()) { + grantFocusForSnapPosition(enterTransition.mEnteringPosition); + } }); if (info.getType() == TRANSIT_CHANGE && !isSplitActive() 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 e5a6a6d258dd..70603fad37b9 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 @@ -27,6 +27,7 @@ import static android.view.WindowManager.TRANSIT_TO_FRONT; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER; +import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW; @@ -213,7 +214,7 @@ public class SplitTransitionTests extends ShellTestCase { IBinder transition = mSplitScreenTransitions.startEnterTransition( TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(testRemote, "Test"), mStageCoordinator, - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false, SNAP_TO_2_50_50); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); boolean accepted = mStageCoordinator.startAnimation(transition, info, @@ -239,7 +240,7 @@ public class SplitTransitionTests extends ShellTestCase { IBinder transition = mSplitScreenTransitions.startEnterTransition( TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(testRemote, "Test"), mStageCoordinator, - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false, SNAP_TO_2_50_50); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); boolean accepted = mStageCoordinator.startAnimation(transition, info, mock(SurfaceControl.Transaction.class), @@ -262,7 +263,7 @@ public class SplitTransitionTests extends ShellTestCase { IBinder transition = mSplitScreenTransitions.startEnterTransition( TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(testRemote, "Test"), mStageCoordinator, - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false, SNAP_TO_2_50_50); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mStageCoordinator.startAnimation(transition, info, mock(SurfaceControl.Transaction.class), @@ -524,7 +525,7 @@ public class SplitTransitionTests extends ShellTestCase { IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(new TestRemoteTransition(), "Test"), - mStageCoordinator, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false); + mStageCoordinator, TRANSIT_SPLIT_SCREEN_PAIR_OPEN, false, SNAP_TO_2_50_50); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); mStageCoordinator.startAnimation(enterTransit, enterInfo, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java index e9c4c31729e9..e246329446dc 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java @@ -475,7 +475,7 @@ public class StageCoordinatorTests extends ShellTestCase { mStageCoordinator.startTask(mTaskId, SPLIT_POSITION_TOP_OR_LEFT, null /*options*/, null, SPLIT_INDEX_UNDEFINED); verify(mSplitScreenTransitions).startEnterTransition(anyInt(), - mWctCaptor.capture(), any(), any(), anyInt(), anyBoolean()); + mWctCaptor.capture(), any(), any(), anyInt(), anyBoolean(), anyInt()); int windowingMode = mWctCaptor.getValue().getChanges().get(mBinder).getWindowingMode(); assertEquals(windowingMode, WINDOWING_MODE_UNDEFINED); |