Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +21 −15 Original line number Diff line number Diff line Loading @@ -2376,6 +2376,7 @@ public class StageCoordinator extends StageCoordinatorAbstract { return; } int stageToTop = STAGE_TYPE_UNDEFINED; if (isSplitScreenVisible()) { if (enableFlexibleSplit()) { for (StageTaskListener activeStage : mStageOrderOperator.getActiveStages()) { // See if any other stage still has children Loading @@ -2385,11 +2386,13 @@ public class StageCoordinator extends StageCoordinatorAbstract { } } } else { final StageTaskListener remainingStage = stage == mMainStage ? mSideStage : mMainStage; final StageTaskListener remainingStage = stage == mMainStage ? mSideStage : mMainStage; if (remainingStage.getChildCount() > 0) { stageToTop = remainingStage.getId(); } } } ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onChildTaskMovedToBubble: taskId=%d in stage=%s moved to bubble exit split " + "stageToTop=%s", Loading Loading @@ -3572,10 +3575,13 @@ public class StageCoordinator extends StageCoordinatorAbstract { recentTasks -> recentTasks.removeSplitPair(triggerTask.taskId)); logExit(EXIT_REASON_CHILD_TASK_ENTER_BUBBLE); int topStage = STAGE_TYPE_UNDEFINED; if (isSplitScreenVisible()) { int stage = getStageOfTask(triggerTask.taskId); int topStage = (stage == STAGE_TYPE_MAIN) topStage = (stage == STAGE_TYPE_MAIN) ? STAGE_TYPE_SIDE : STAGE_TYPE_MAIN; } prepareExitSplitScreen(topStage, outWCT, EXIT_REASON_UNKNOWN); } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +52 −0 Original line number Diff line number Diff line Loading @@ -780,6 +780,7 @@ public class StageCoordinatorTests extends ShellTestCase { when(mMainStage.isActive()).thenReturn(true); when(mMainStage.getChildCount()).thenReturn(1); when(mSideStage.getChildCount()).thenReturn(0); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(true); mStageCoordinator.onChildTaskMovedToBubble(mSideStage, /* taskId= */ 8); verify(mSplitScreenTransitions).startDismissTransition(any(), any(), eq(STAGE_TYPE_MAIN), eq(SplitScreenController.EXIT_REASON_CHILD_TASK_ENTER_BUBBLE)); Loading @@ -790,6 +791,7 @@ public class StageCoordinatorTests extends ShellTestCase { when(mMainStage.isActive()).thenReturn(true); when(mMainStage.getChildCount()).thenReturn(0); when(mSideStage.getChildCount()).thenReturn(0); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(true); mStageCoordinator.onChildTaskMovedToBubble(mSideStage, /* taskId= */ 8); verify(mSplitScreenTransitions).startDismissTransition(any(), any(), eq(STAGE_TYPE_UNDEFINED), Loading @@ -805,6 +807,20 @@ public class StageCoordinatorTests extends ShellTestCase { anyInt()); } @Test public void testOnChildTaskMovedToBubble_splitNotVisible_dismissesSplitWithUndefinedTopStage() { when(mMainStage.isActive()).thenReturn(true); when(mMainStage.getChildCount()).thenReturn(1); when(mSideStage.getChildCount()).thenReturn(0); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(false); mStageCoordinator.onChildTaskMovedToBubble(mSideStage, /* taskId= */ 8); verify(mSplitScreenTransitions).startDismissTransition(any(), any(), eq(STAGE_TYPE_UNDEFINED), eq(SplitScreenController.EXIT_REASON_CHILD_TASK_ENTER_BUBBLE)); } @Test @EnableFlags(FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT) public void startTasks_withFlexibleTwoAppSplit_hidesDividerWhenStagesInactive() { Loading Loading @@ -872,6 +888,42 @@ public class StageCoordinatorTests extends ShellTestCase { verify(mStageCoordinator, never()).setDividerVisibility(eq(false), any()); } @Test public void testAddExitForBubblesIfNeeded_splitVisible_hasStageToTop() { when(mStageCoordinator.isSplitActive()).thenReturn(true); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(true); doReturn(STAGE_TYPE_MAIN).when(mStageCoordinator).getStageOfTask(anyInt()); android.window.TransitionRequestInfo request = mock(android.window.TransitionRequestInfo.class); ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder().build(); when(request.getTriggerTask()).thenReturn(taskInfo); WindowContainerTransaction wct = new WindowContainerTransaction(); mStageCoordinator.addExitForBubblesIfNeeded(request, wct); verify(mStageCoordinator).prepareExitSplitScreen(eq(STAGE_TYPE_SIDE), eq(wct), anyInt()); } @Test public void testAddExitForBubblesIfNeeded_splitNotVisible_noStageToTop() { when(mStageCoordinator.isSplitActive()).thenReturn(true); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(false); doReturn(STAGE_TYPE_MAIN).when(mStageCoordinator).getStageOfTask(anyInt()); android.window.TransitionRequestInfo request = mock(android.window.TransitionRequestInfo.class); ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder().build(); when(request.getTriggerTask()).thenReturn(taskInfo); WindowContainerTransaction wct = new WindowContainerTransaction(); mStageCoordinator.addExitForBubblesIfNeeded(request, wct); verify(mStageCoordinator).prepareExitSplitScreen(eq(STAGE_TYPE_UNDEFINED), eq(wct), anyInt()); } private Transitions createTestTransitions() { ShellInit shellInit = new ShellInit(mMainExecutor); final Transitions t = new Transitions(mContext, shellInit, mock(ShellController.class), Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +21 −15 Original line number Diff line number Diff line Loading @@ -2376,6 +2376,7 @@ public class StageCoordinator extends StageCoordinatorAbstract { return; } int stageToTop = STAGE_TYPE_UNDEFINED; if (isSplitScreenVisible()) { if (enableFlexibleSplit()) { for (StageTaskListener activeStage : mStageOrderOperator.getActiveStages()) { // See if any other stage still has children Loading @@ -2385,11 +2386,13 @@ public class StageCoordinator extends StageCoordinatorAbstract { } } } else { final StageTaskListener remainingStage = stage == mMainStage ? mSideStage : mMainStage; final StageTaskListener remainingStage = stage == mMainStage ? mSideStage : mMainStage; if (remainingStage.getChildCount() > 0) { stageToTop = remainingStage.getId(); } } } ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onChildTaskMovedToBubble: taskId=%d in stage=%s moved to bubble exit split " + "stageToTop=%s", Loading Loading @@ -3572,10 +3575,13 @@ public class StageCoordinator extends StageCoordinatorAbstract { recentTasks -> recentTasks.removeSplitPair(triggerTask.taskId)); logExit(EXIT_REASON_CHILD_TASK_ENTER_BUBBLE); int topStage = STAGE_TYPE_UNDEFINED; if (isSplitScreenVisible()) { int stage = getStageOfTask(triggerTask.taskId); int topStage = (stage == STAGE_TYPE_MAIN) topStage = (stage == STAGE_TYPE_MAIN) ? STAGE_TYPE_SIDE : STAGE_TYPE_MAIN; } prepareExitSplitScreen(topStage, outWCT, EXIT_REASON_UNKNOWN); } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +52 −0 Original line number Diff line number Diff line Loading @@ -780,6 +780,7 @@ public class StageCoordinatorTests extends ShellTestCase { when(mMainStage.isActive()).thenReturn(true); when(mMainStage.getChildCount()).thenReturn(1); when(mSideStage.getChildCount()).thenReturn(0); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(true); mStageCoordinator.onChildTaskMovedToBubble(mSideStage, /* taskId= */ 8); verify(mSplitScreenTransitions).startDismissTransition(any(), any(), eq(STAGE_TYPE_MAIN), eq(SplitScreenController.EXIT_REASON_CHILD_TASK_ENTER_BUBBLE)); Loading @@ -790,6 +791,7 @@ public class StageCoordinatorTests extends ShellTestCase { when(mMainStage.isActive()).thenReturn(true); when(mMainStage.getChildCount()).thenReturn(0); when(mSideStage.getChildCount()).thenReturn(0); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(true); mStageCoordinator.onChildTaskMovedToBubble(mSideStage, /* taskId= */ 8); verify(mSplitScreenTransitions).startDismissTransition(any(), any(), eq(STAGE_TYPE_UNDEFINED), Loading @@ -805,6 +807,20 @@ public class StageCoordinatorTests extends ShellTestCase { anyInt()); } @Test public void testOnChildTaskMovedToBubble_splitNotVisible_dismissesSplitWithUndefinedTopStage() { when(mMainStage.isActive()).thenReturn(true); when(mMainStage.getChildCount()).thenReturn(1); when(mSideStage.getChildCount()).thenReturn(0); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(false); mStageCoordinator.onChildTaskMovedToBubble(mSideStage, /* taskId= */ 8); verify(mSplitScreenTransitions).startDismissTransition(any(), any(), eq(STAGE_TYPE_UNDEFINED), eq(SplitScreenController.EXIT_REASON_CHILD_TASK_ENTER_BUBBLE)); } @Test @EnableFlags(FLAG_ENABLE_FLEXIBLE_TWO_APP_SPLIT) public void startTasks_withFlexibleTwoAppSplit_hidesDividerWhenStagesInactive() { Loading Loading @@ -872,6 +888,42 @@ public class StageCoordinatorTests extends ShellTestCase { verify(mStageCoordinator, never()).setDividerVisibility(eq(false), any()); } @Test public void testAddExitForBubblesIfNeeded_splitVisible_hasStageToTop() { when(mStageCoordinator.isSplitActive()).thenReturn(true); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(true); doReturn(STAGE_TYPE_MAIN).when(mStageCoordinator).getStageOfTask(anyInt()); android.window.TransitionRequestInfo request = mock(android.window.TransitionRequestInfo.class); ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder().build(); when(request.getTriggerTask()).thenReturn(taskInfo); WindowContainerTransaction wct = new WindowContainerTransaction(); mStageCoordinator.addExitForBubblesIfNeeded(request, wct); verify(mStageCoordinator).prepareExitSplitScreen(eq(STAGE_TYPE_SIDE), eq(wct), anyInt()); } @Test public void testAddExitForBubblesIfNeeded_splitNotVisible_noStageToTop() { when(mStageCoordinator.isSplitActive()).thenReturn(true); when(mStageCoordinator.isSplitScreenVisible()).thenReturn(false); doReturn(STAGE_TYPE_MAIN).when(mStageCoordinator).getStageOfTask(anyInt()); android.window.TransitionRequestInfo request = mock(android.window.TransitionRequestInfo.class); ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder().build(); when(request.getTriggerTask()).thenReturn(taskInfo); WindowContainerTransaction wct = new WindowContainerTransaction(); mStageCoordinator.addExitForBubblesIfNeeded(request, wct); verify(mStageCoordinator).prepareExitSplitScreen(eq(STAGE_TYPE_UNDEFINED), eq(wct), anyInt()); } private Transitions createTestTransitions() { ShellInit shellInit = new ShellInit(mMainExecutor); final Transitions t = new Transitions(mContext, shellInit, mock(ShellController.class), Loading