Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +34 −2 Original line number Diff line number Diff line Loading @@ -2242,6 +2242,25 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return SPLIT_POSITION_UNDEFINED; } /** * Returns the {@link StageType} where {@param token} is being used * {@link SplitScreen#STAGE_TYPE_UNDEFINED} otherwise */ @StageType public int getSplitItemStage(@Nullable WindowContainerToken token) { if (token == null) { return STAGE_TYPE_UNDEFINED; } if (mMainStage.containsToken(token)) { return STAGE_TYPE_MAIN; } else if (mSideStage.containsToken(token)) { return STAGE_TYPE_SIDE; } return STAGE_TYPE_UNDEFINED; } @Override public void setLayoutOffsetTarget(int offsetX, int offsetY, SplitLayout layout) { final StageTaskListener topLeftStage = Loading Loading @@ -2479,7 +2498,16 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mRecentTasks.ifPresent( recentTasks -> recentTasks.removeSplitPair(triggerTask.taskId)); } prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, outWCT); @StageType int topStage = STAGE_TYPE_UNDEFINED; if (isSplitScreenVisible()) { // Get the stage where a child exists to keep that stage onTop if (mMainStage.getChildCount() != 0 && mSideStage.getChildCount() == 0) { topStage = STAGE_TYPE_MAIN; } else if (mSideStage.getChildCount() != 0 && mMainStage.getChildCount() == 0) { topStage = STAGE_TYPE_SIDE; } } prepareExitSplitScreen(topStage, outWCT); } } Loading Loading @@ -2903,7 +2931,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return SPLIT_POSITION_UNDEFINED; } /** Synchronize split-screen state with transition and make appropriate preparations. */ /** * Synchronize split-screen state with transition and make appropriate preparations. * @param toStage The stage that will not be dismissed. If set to * {@link SplitScreen#STAGE_TYPE_UNDEFINED} then both stages will be dismissed */ public void prepareDismissAnimation(@StageType int toStage, @ExitReason int dismissReason, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java +20 −1 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import com.android.wm.shell.keyguard.KeyguardTransitionHandler; import com.android.wm.shell.pip.PipTransitionController; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.recents.RecentsTransitionHandler; import com.android.wm.shell.splitscreen.SplitScreen; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.splitscreen.StageCoordinator; import com.android.wm.shell.sysui.ShellInit; Loading Loading @@ -511,8 +512,26 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler, // make a new startTransaction because pip's startEnterAnimation "consumes" it so // we need a separate one to send over to launcher. SurfaceControl.Transaction otherStartT = new SurfaceControl.Transaction(); @SplitScreen.StageType int topStageToKeep = STAGE_TYPE_UNDEFINED; if (mSplitHandler.isSplitScreenVisible()) { // The non-going home case, we could be pip-ing one of the split stages and keep // showing the other for (int i = info.getChanges().size() - 1; i >= 0; --i) { TransitionInfo.Change change = info.getChanges().get(i); if (change == pipChange) { // Ignore the change/task that's going into Pip continue; } @SplitScreen.StageType int splitItemStage = mSplitHandler.getSplitItemStage(change.getLastParent()); if (splitItemStage != STAGE_TYPE_UNDEFINED) { topStageToKeep = splitItemStage; break; } } } // Let split update internal state for dismiss. mSplitHandler.prepareDismissAnimation(STAGE_TYPE_UNDEFINED, mSplitHandler.prepareDismissAnimation(topStageToKeep, EXIT_REASON_CHILD_TASK_ENTER_PIP, everythingElse, otherStartT, finishTransaction); Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +34 −2 Original line number Diff line number Diff line Loading @@ -2242,6 +2242,25 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return SPLIT_POSITION_UNDEFINED; } /** * Returns the {@link StageType} where {@param token} is being used * {@link SplitScreen#STAGE_TYPE_UNDEFINED} otherwise */ @StageType public int getSplitItemStage(@Nullable WindowContainerToken token) { if (token == null) { return STAGE_TYPE_UNDEFINED; } if (mMainStage.containsToken(token)) { return STAGE_TYPE_MAIN; } else if (mSideStage.containsToken(token)) { return STAGE_TYPE_SIDE; } return STAGE_TYPE_UNDEFINED; } @Override public void setLayoutOffsetTarget(int offsetX, int offsetY, SplitLayout layout) { final StageTaskListener topLeftStage = Loading Loading @@ -2479,7 +2498,16 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mRecentTasks.ifPresent( recentTasks -> recentTasks.removeSplitPair(triggerTask.taskId)); } prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, outWCT); @StageType int topStage = STAGE_TYPE_UNDEFINED; if (isSplitScreenVisible()) { // Get the stage where a child exists to keep that stage onTop if (mMainStage.getChildCount() != 0 && mSideStage.getChildCount() == 0) { topStage = STAGE_TYPE_MAIN; } else if (mSideStage.getChildCount() != 0 && mMainStage.getChildCount() == 0) { topStage = STAGE_TYPE_SIDE; } } prepareExitSplitScreen(topStage, outWCT); } } Loading Loading @@ -2903,7 +2931,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return SPLIT_POSITION_UNDEFINED; } /** Synchronize split-screen state with transition and make appropriate preparations. */ /** * Synchronize split-screen state with transition and make appropriate preparations. * @param toStage The stage that will not be dismissed. If set to * {@link SplitScreen#STAGE_TYPE_UNDEFINED} then both stages will be dismissed */ public void prepareDismissAnimation(@StageType int toStage, @ExitReason int dismissReason, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java +20 −1 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import com.android.wm.shell.keyguard.KeyguardTransitionHandler; import com.android.wm.shell.pip.PipTransitionController; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.recents.RecentsTransitionHandler; import com.android.wm.shell.splitscreen.SplitScreen; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.splitscreen.StageCoordinator; import com.android.wm.shell.sysui.ShellInit; Loading Loading @@ -511,8 +512,26 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler, // make a new startTransaction because pip's startEnterAnimation "consumes" it so // we need a separate one to send over to launcher. SurfaceControl.Transaction otherStartT = new SurfaceControl.Transaction(); @SplitScreen.StageType int topStageToKeep = STAGE_TYPE_UNDEFINED; if (mSplitHandler.isSplitScreenVisible()) { // The non-going home case, we could be pip-ing one of the split stages and keep // showing the other for (int i = info.getChanges().size() - 1; i >= 0; --i) { TransitionInfo.Change change = info.getChanges().get(i); if (change == pipChange) { // Ignore the change/task that's going into Pip continue; } @SplitScreen.StageType int splitItemStage = mSplitHandler.getSplitItemStage(change.getLastParent()); if (splitItemStage != STAGE_TYPE_UNDEFINED) { topStageToKeep = splitItemStage; break; } } } // Let split update internal state for dismiss. mSplitHandler.prepareDismissAnimation(STAGE_TYPE_UNDEFINED, mSplitHandler.prepareDismissAnimation(topStageToKeep, EXIT_REASON_CHILD_TASK_ENTER_PIP, everythingElse, otherStartT, finishTransaction); Loading