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

Commit 5c38ba8a authored by Tony Huang's avatar Tony Huang Committed by Automerger Merge Worker
Browse files

Merge "Do not exit first if split running background" into udc-dev am: 34007030 am: 67da3a02

parents 01b3c805 67da3a02
Loading
Loading
Loading
Loading
+30 −43
Original line number Original line Diff line number Diff line
@@ -582,7 +582,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            return;
            return;
        }
        }


        prepareEvictChildTasksIfSplitActive(wct);
        setSideStagePosition(splitPosition, wct);
        setSideStagePosition(splitPosition, wct);
        options1 = options1 != null ? options1 : new Bundle();
        options1 = options1 != null ? options1 : new Bundle();
        addActivityOptions(options1, mSideStage);
        addActivityOptions(options1, mSideStage);
@@ -604,7 +603,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            return;
            return;
        }
        }


        prepareEvictChildTasksIfSplitActive(wct);
        setSideStagePosition(splitPosition, wct);
        setSideStagePosition(splitPosition, wct);
        options1 = options1 != null ? options1 : new Bundle();
        options1 = options1 != null ? options1 : new Bundle();
        addActivityOptions(options1, mSideStage);
        addActivityOptions(options1, mSideStage);
@@ -625,7 +623,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            return;
            return;
        }
        }


        prepareEvictChildTasksIfSplitActive(wct);
        setSideStagePosition(splitPosition, wct);
        setSideStagePosition(splitPosition, wct);
        options1 = options1 != null ? options1 : new Bundle();
        options1 = options1 != null ? options1 : new Bundle();
        addActivityOptions(options1, mSideStage);
        addActivityOptions(options1, mSideStage);
@@ -691,7 +688,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            mMainStage.activate(wct, false /* reparent */);
            mMainStage.activate(wct, false /* reparent */);
        }
        }


        prepareEvictChildTasksIfSplitActive(wct);
        mSplitLayout.setDivideRatio(splitRatio);
        mSplitLayout.setDivideRatio(splitRatio);
        updateWindowBounds(mSplitLayout, wct);
        updateWindowBounds(mSplitLayout, wct);
        wct.reorder(mRootTaskInfo.token, true);
        wct.reorder(mRootTaskInfo.token, true);
@@ -1075,24 +1071,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        }
        }


        final WindowContainerTransaction evictWct = new WindowContainerTransaction();
        final WindowContainerTransaction evictWct = new WindowContainerTransaction();
        prepareEvictNonOpeningChildTasks(SPLIT_POSITION_TOP_OR_LEFT, apps, evictWct);
        mMainStage.evictNonOpeningChildren(apps, evictWct);
        prepareEvictNonOpeningChildTasks(SPLIT_POSITION_BOTTOM_OR_RIGHT, apps, evictWct);
        mSideStage.evictNonOpeningChildren(apps, evictWct);
        mSyncQueue.queue(evictWct);
        mSyncQueue.queue(evictWct);
    }
    }



    /**
     * Collects all the current child tasks of a specific split and prepares transaction to evict
     * them to display.
     */
    void prepareEvictChildTasks(@SplitPosition int position, WindowContainerTransaction wct) {
        if (position == mSideStagePosition) {
            mSideStage.evictAllChildren(wct);
        } else {
            mMainStage.evictAllChildren(wct);
        }
    }

    void prepareEvictNonOpeningChildTasks(@SplitPosition int position, RemoteAnimationTarget[] apps,
    void prepareEvictNonOpeningChildTasks(@SplitPosition int position, RemoteAnimationTarget[] apps,
            WindowContainerTransaction wct) {
            WindowContainerTransaction wct) {
        if (position == mSideStagePosition) {
        if (position == mSideStagePosition) {
@@ -1107,13 +1090,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mSideStage.evictInvisibleChildren(wct);
        mSideStage.evictInvisibleChildren(wct);
    }
    }


    void prepareEvictChildTasksIfSplitActive(WindowContainerTransaction wct) {
        if (mMainStage.isActive()) {
            mMainStage.evictAllChildren(wct);
            mSideStage.evictAllChildren(wct);
        }
    }

    Bundle resolveStartStage(@StageType int stage, @SplitPosition int position,
    Bundle resolveStartStage(@StageType int stage, @SplitPosition int position,
            @Nullable Bundle options, @Nullable WindowContainerTransaction wct) {
            @Nullable Bundle options, @Nullable WindowContainerTransaction wct) {
        switch (stage) {
        switch (stage) {
@@ -1500,10 +1476,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            wct.startTask(taskInfo.taskId,
            wct.startTask(taskInfo.taskId,
                    resolveStartStage(STAGE_TYPE_UNDEFINED, startPosition, null, wct));
                    resolveStartStage(STAGE_TYPE_UNDEFINED, startPosition, null, wct));
        }
        }
        // If running background, we need to reparent current top visible task to another stage
        // If running background, we need to reparent current top visible task to main stage.
        // and evict all tasks current under its.
        if (!isSplitScreenVisible()) {
        if (!isSplitScreenVisible()) {
            // Recreate so we need to reset position rather than keep position of background split.
            mMainStage.reparentTopTask(wct);
            mMainStage.reparentTopTask(wct);
            prepareSplitLayout(wct);
            prepareSplitLayout(wct);
        }
        }
@@ -2337,7 +2311,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                prepareEnterSplitScreen(out);
                prepareEnterSplitScreen(out);
                mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(),
                mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(),
                        null /* consumedCallback */, null /* finishedCallback */,
                        null /* consumedCallback */, null /* finishedCallback */,
                        0 /* extraTransitType */, !mIsDropEntering);
                        TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, !mIsDropEntering);
            }
            }
        }
        }
        return out;
        return out;
@@ -2604,7 +2578,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) {
                == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) {
            if (mainChild == null && sideChild == null) {
            if (mainChild == null && sideChild == null) {
                Log.w(TAG, "Launched a task in split, but didn't receive any task in transition.");
                Log.w(TAG, "Launched a task in split, but didn't receive any task in transition.");
                mSplitTransitions.mPendingEnter.cancel(null /* finishedCb */);
                mSplitTransitions.mPendingEnter.cancel((cancelWct, cancelT)
                        -> prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, cancelWct));
                return true;
                return true;
            }
            }
        } else {
        } else {
@@ -2614,10 +2589,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                final int dismissTop = mainChild != null ? STAGE_TYPE_MAIN :
                final int dismissTop = mainChild != null ? STAGE_TYPE_MAIN :
                        (sideChild != null ? STAGE_TYPE_SIDE : STAGE_TYPE_UNDEFINED);
                        (sideChild != null ? STAGE_TYPE_SIDE : STAGE_TYPE_UNDEFINED);
                mSplitTransitions.mPendingEnter.cancel(
                mSplitTransitions.mPendingEnter.cancel(
                        (cancelWct, cancelT) -> {
                        (cancelWct, cancelT) -> prepareExitSplitScreen(dismissTop, cancelWct));
                            mSideStage.removeAllTasks(cancelWct, dismissTop == STAGE_TYPE_SIDE);
                            mMainStage.deactivate(cancelWct, dismissTop == STAGE_TYPE_MAIN);
                        });
                return true;
                return true;
            }
            }
        }
        }
@@ -2626,14 +2598,19 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        // transitions locally, but remotes (like Launcher) may get confused if they were
        // transitions locally, but remotes (like Launcher) may get confused if they were
        // depending on listener callbacks. This can happen because task-organizer callbacks
        // depending on listener callbacks. This can happen because task-organizer callbacks
        // aren't serialized with transition callbacks.
        // aren't serialized with transition callbacks.
        // This usually occurred on app use trampoline launch new task and finish itself.
        // TODO(b/184679596): Find a way to either include task-org information in
        // TODO(b/184679596): Find a way to either include task-org information in
        //                    the transition, or synchronize task-org callbacks.
        //                    the transition, or synchronize task-org callbacks.
        if (mainChild != null && !mMainStage.containsTask(mainChild.getTaskInfo().taskId)) {
        final boolean mainNotContainOpenTask =
                mainChild != null && !mMainStage.containsTask(mainChild.getTaskInfo().taskId);
        final boolean sideNotContainOpenTask =
                sideChild != null && !mSideStage.containsTask(sideChild.getTaskInfo().taskId);
        if (mainNotContainOpenTask) {
            Log.w(TAG, "Expected onTaskAppeared on " + mMainStage
            Log.w(TAG, "Expected onTaskAppeared on " + mMainStage
                    + " to have been called with " + mainChild.getTaskInfo().taskId
                    + " to have been called with " + mainChild.getTaskInfo().taskId
                    + " before startAnimation().");
                    + " before startAnimation().");
        }
        }
        if (sideChild != null && !mSideStage.containsTask(sideChild.getTaskInfo().taskId)) {
        if (sideNotContainOpenTask) {
            Log.w(TAG, "Expected onTaskAppeared on " + mSideStage
            Log.w(TAG, "Expected onTaskAppeared on " + mSideStage
                    + " to have been called with " + sideChild.getTaskInfo().taskId
                    + " to have been called with " + sideChild.getTaskInfo().taskId
                    + " before startAnimation().");
                    + " before startAnimation().");
@@ -2642,10 +2619,18 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        final TransitionInfo.Change finalSideChild = sideChild;
        final TransitionInfo.Change finalSideChild = sideChild;
        enterTransition.setFinishedCallback((callbackWct, callbackT) -> {
        enterTransition.setFinishedCallback((callbackWct, callbackT) -> {
            if (finalMainChild != null) {
            if (finalMainChild != null) {
                if (!mainNotContainOpenTask) {
                    mMainStage.evictOtherChildren(callbackWct, finalMainChild.getTaskInfo().taskId);
                    mMainStage.evictOtherChildren(callbackWct, finalMainChild.getTaskInfo().taskId);
                } else {
                    mMainStage.evictInvisibleChildren(callbackWct);
                }
            }
            }
            if (finalSideChild != null) {
            if (finalSideChild != null) {
                if (!sideNotContainOpenTask) {
                    mSideStage.evictOtherChildren(callbackWct, finalSideChild.getTaskInfo().taskId);
                    mSideStage.evictOtherChildren(callbackWct, finalSideChild.getTaskInfo().taskId);
                } else {
                    mSideStage.evictInvisibleChildren(callbackWct);
                }
            }
            }
            if (enterTransition.mResizeAnim) {
            if (enterTransition.mResizeAnim) {
                mShowDecorImmediately = true;
                mShowDecorImmediately = true;
@@ -2904,9 +2889,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        if (!isSplitScreenVisible()) {
        if (!isSplitScreenVisible()) {
            mIsDropEntering = true;
            mIsDropEntering = true;
        }
        }
        if (!isSplitScreenVisible()) {
        if (!isSplitScreenVisible() && !ENABLE_SHELL_TRANSITIONS) {
            // If split running background, exit split first.
            // If split running background, exit split first.
            // TODO(b/280392203) : skip doing this on shell transition once this bug is fixed.
            // Skip this on shell transition due to we could evict existing tasks on transition
            // finished.
            exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT);
            exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT);
        }
        }
        mLogger.enterRequestedByDrag(position, dragSessionId);
        mLogger.enterRequestedByDrag(position, dragSessionId);
@@ -2916,9 +2902,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
     * Sets info to be logged when splitscreen is next entered.
     * Sets info to be logged when splitscreen is next entered.
     */
     */
    public void onRequestToSplit(InstanceId sessionId, int enterReason) {
    public void onRequestToSplit(InstanceId sessionId, int enterReason) {
        if (!isSplitScreenVisible()) {
        if (!isSplitScreenVisible() && !ENABLE_SHELL_TRANSITIONS) {
            // If split running background, exit split first.
            // If split running background, exit split first.
            // TODO(b/280392203) : skip doing this on shell transition once this bug is fixed.
            // Skip this on shell transition due to we could evict existing tasks on transition
            // finished.
            exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT);
            exitSplitScreen(null /* childrenToTop */, EXIT_REASON_RECREATE_SPLIT);
        }
        }
        mLogger.enterRequested(sessionId, enterReason);
        mLogger.enterRequested(sessionId, enterReason);