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

Commit 67a67f3a authored by Vinit Nayak's avatar Vinit Nayak
Browse files

Pass in end snap position in EnterSession for entering split screen

* Depending on the end layout, we can determine which app needs
to be in focus. For flex split it should always be the larger one

Fixes: 396026394
Flag: com.android.wm.shell.enable_flexible_two_app_split
Test: Back gesture always goes to 90 app. For 50/50 split back
gesture behavior unaffected.

Change-Id: Id9218e21d6335eebc6243722ebd057b42c096c51
parent bdb2c65f
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -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;
        }
    }

+24 −10
Original line number Diff line number Diff line
@@ -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()
+5 −4
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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);