Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c080545 authored by Shuming Hao's avatar Shuming Hao
Browse files

Reset side stage position after child task vanishes

This CL resets side stage position in split screen when all stages has no child tasks. This ensures the new split screen can be opened from the default position.

Bug: 33270112
Test: open links from Gmail
Flag: EXEMPT bugfix
Change-Id: I330290025c98db2eea9b5b323f84eec392ab5c78
parent 85d3dbf4
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -55,7 +55,6 @@ 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.SplitScreen.STAGE_TYPE_UNDEFINED;
import static com.android.wm.shell.splitscreen.SplitScreenController.ENTER_REASON_LAUNCHER;
import static com.android.wm.shell.splitscreen.SplitScreenController.ENTER_REASON_MULTI_INSTANCE;
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW;
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_FINISHED;
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_CHILD_TASK_ENTER_PIP;
@@ -1099,16 +1098,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,

    void setSideStagePosition(@SplitPosition int sideStagePosition,
            @Nullable WindowContainerTransaction wct) {
        setSideStagePosition(sideStagePosition, true /* updateBounds */, wct);
    }

    private void setSideStagePosition(@SplitPosition int sideStagePosition, boolean updateBounds,
            @Nullable WindowContainerTransaction wct) {
        if (mSideStagePosition == sideStagePosition) return;
        mSideStagePosition = sideStagePosition;
        sendOnStagePositionChanged();

        if (mSideStage.mVisible && updateBounds) {
        if (mSideStage.mVisible) {
            if (wct == null) {
                // onLayoutChanged builds/applies a wct with the contents of updateWindowBounds.
                onLayoutSizeChanged(mSplitLayout);
@@ -1199,6 +1193,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        if (!isSplitActive()) return;

        final WindowContainerTransaction wct = new WindowContainerTransaction();
        setSideStagePosition(SPLIT_POSITION_BOTTOM_OR_RIGHT, wct);
        applyExitSplitScreen(childrenToTop, wct, exitReason);
    }

@@ -1598,6 +1593,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        }
        if (present) {
            updateRecentTasksSplitPair();
        } else if (mMainStage.getChildCount() == 0 && mSideStage.getChildCount() == 0) {
            mRecentTasks.ifPresent(recentTasks -> {
                // remove the split pair mapping from recentTasks, and disable further updates
                // to splits in the recents until we enter split again.
                recentTasks.removeSplitPair(taskId);
            });
            exitSplitScreen(mMainStage, EXIT_REASON_ROOT_TASK_VANISHED);
        }

        for (int i = mListeners.size() - 1; i >= 0; --i) {