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

Commit b3d0379f authored by Jerry Chang's avatar Jerry Chang
Browse files

Make sure to release split layout when returning to home

When returning to home from recent apps, the splitting tasks were
already hidden while performing the recent transition, so dismiss split
screen directly without requesting dismiss transition. Also reorder to
make sure it collects all clean-up operations before finishing the
transition.

Fix: 226682648
Bug: 206487881
Test: verify with the repro steps of the bug
Change-Id: I05e7ae6fa26631203d652ccb532fb57f532794d7
parent 82c6e424
Loading
Loading
Loading
Loading
+18 −14
Original line number Diff line number Diff line
@@ -231,16 +231,6 @@ class SplitScreenTransitions {

    void onFinish(WindowContainerTransaction wct, WindowContainerTransactionCallback wctCB) {
        if (!mAnimations.isEmpty()) return;
        mOnFinish.run();
        if (mFinishTransaction != null) {
            mFinishTransaction.apply();
            mTransactionPool.release(mFinishTransaction);
            mFinishTransaction = null;
        }
        if (mFinishCallback != null) {
            mFinishCallback.onTransitionFinished(wct /* wct */, wctCB /* wctCB */);
            mFinishCallback = null;
        }
        if (mAnimatingTransition == mPendingEnter) {
            mPendingEnter = null;
        }
@@ -248,15 +238,29 @@ class SplitScreenTransitions {
            mPendingDismiss = null;
        }
        if (mAnimatingTransition == mPendingRecent) {
            // If the wct is not null while finishing recent transition, it indicates it's not
            // dismissing split and thus need to reorder split task so they can be on top again.
            final boolean dismissSplit = wct == null;
            mStageCoordinator.finishRecentAnimation(dismissSplit);
            // If the clean-up wct is null when finishing recent transition, it indicates it's
            // returning to home and thus no need to reorder tasks.
            final boolean returnToHome = wct == null;
            if (returnToHome) {
                wct = new WindowContainerTransaction();
            }
            mStageCoordinator.onRecentTransitionFinished(returnToHome, wct, mFinishTransaction);
            mPendingRecent = null;
        }
        mPendingRemoteHandler = null;
        mActiveRemoteHandler = null;
        mAnimatingTransition = null;

        mOnFinish.run();
        if (mFinishTransaction != null) {
            mFinishTransaction.apply();
            mTransactionPool.release(mFinishTransaction);
            mFinishTransaction = null;
        }
        if (mFinishCallback != null) {
            mFinishCallback.onTransitionFinished(wct /* wct */, wctCB /* wctCB */);
            mFinishCallback = null;
        }
    }

    // TODO(shell-transitions): real animations
+9 −8
Original line number Diff line number Diff line
@@ -1568,8 +1568,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            logExit(dismissTransition.mReason);
            // TODO: Have a proper remote for this. Until then, though, reset state and use the
            //       normal animation stuff (which falls back to the normal launcher remote).
            setDividerVisibility(false, t);
            mSplitLayout.release();
            mSplitLayout.release(t);
            mSplitTransitions.mPendingDismiss = null;
            return false;
        } else {
@@ -1595,7 +1594,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        return true;
    }

    void finishRecentAnimation(boolean dismissSplit) {
    void onRecentTransitionFinished(boolean returnToHome, WindowContainerTransaction wct,
            SurfaceControl.Transaction finishT) {
        // Exclude the case that the split screen has been dismissed already.
        if (!mMainStage.isActive()) {
            // The latest split dismissing transition might be a no-op transition and thus won't
@@ -1605,13 +1605,14 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            return;
        }

        if (dismissSplit) {
            final WindowContainerTransaction wct = new WindowContainerTransaction();
        if (returnToHome) {
            // When returning to home from recent apps, the splitting tasks are already hidden, so
            // append the reset of dismissing operations into the clean-up wct.
            prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, wct);
            mSplitTransitions.startDismissTransition(null /* transition */, wct, this,
                    STAGE_TYPE_UNDEFINED, EXIT_REASON_RETURN_HOME);
            setSplitsVisible(false);
            logExit(EXIT_REASON_RETURN_HOME);
        } else {
            setDividerVisibility(true, null /* t */);
            setDividerVisibility(true, finishT);
        }
    }