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

Commit f43cd7d7 authored by Vinit Nayak's avatar Vinit Nayak Committed by Android (Google) Code Review
Browse files

Merge "Pass in end snap position in EnterSession for entering split screen" into main

parents f3596e1d 67a67f3a
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);
    }

    /**
@@ -1050,7 +1050,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);
    }

@@ -1140,7 +1140,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);
    }

@@ -1645,6 +1645,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
@@ -2911,7 +2919,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
@@ -2920,7 +2928,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
@@ -2998,14 +3007,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;
    }
@@ -3192,7 +3202,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 ->
@@ -3577,6 +3588,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);