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

Commit 324334e4 authored by Tony Huang's avatar Tony Huang
Browse files

Set force translucent by split visibility

In order to ensure right life cycle and visiblity of launcher,
we should still set right translucent state for top root task
by split root visibility changed.

But we also need to prvent b/264690550 happen again. Use a flag
to record current of translucent state and prevent it set after
split entered and become visible.
(It should already set when entering)

Also remove uncessary using of setForceTanslucent on moveToStage
and correct some codes

Fix: 267674372
Test: manual
Test: pass existing tests
Change-Id: Ide8a171435027054e053bb8609d7182bf13cfd84
parent a2076c8b
Loading
Loading
Loading
Loading
+27 −29
Original line number Diff line number Diff line
@@ -207,6 +207,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    private boolean mIsDividerRemoteAnimating;
    private boolean mIsDropEntering;
    private boolean mIsExiting;
    private boolean mIsRootTranslucent;

    private DefaultMixedHandler mMixedHandler;
    private final Toast mSplitUnsupportedToast;
@@ -422,6 +423,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            }
        }

        if (!isSplitActive()) {
            // prevent the fling divider to center transitioni if split screen didn't active.
            mIsDropEntering = true;
        }

        setSideStagePosition(sideStagePosition, wct);
        final WindowContainerTransaction evictWct = new WindowContainerTransaction();
        targetStage.evictAllChildren(evictWct);
@@ -436,28 +442,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        // reparent the task to an invisible split root will make the activity invisible.  Reorder
        // the root task to front to make the entering transition from pip to split smooth.
        wct.reorder(mRootTaskInfo.token, true);
        wct.setForceTranslucent(mRootTaskInfo.token, true);
        wct.reorder(targetStage.mRootTaskInfo.token, true);
        wct.setForceTranslucent(targetStage.mRootTaskInfo.token, true);
        // prevent the fling divider to center transition
        mIsDropEntering = true;

        targetStage.addTask(task, wct);

        if (ENABLE_SHELL_TRANSITIONS) {
            prepareEnterSplitScreen(wct);
            mSplitTransitions.startEnterTransition(TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, wct,
                    null, this, null /* consumedCallback */, (finishWct, finishT) -> {
                        if (!evictWct.isEmpty()) {
                            finishWct.merge(evictWct, true);
                        }
                    } /* finishedCallback */);
        } else {
        if (!evictWct.isEmpty()) {
            wct.merge(evictWct, true /* transfer */);
        }
        mTaskOrganizer.applyTransaction(wct);
        }
        return true;
    }

@@ -716,7 +707,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mSplitLayout.setDivideRatio(splitRatio);
        updateWindowBounds(mSplitLayout, wct);
        wct.reorder(mRootTaskInfo.token, true);
        wct.setForceTranslucent(mRootTaskInfo.token, false);
        setRootForceTranslucent(false, wct);

        // Make sure the launch options will put tasks in the corresponding split roots
        mainOptions = mainOptions != null ? mainOptions : new Bundle();
@@ -923,7 +914,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,

        updateWindowBounds(mSplitLayout, wct);
        wct.reorder(mRootTaskInfo.token, true);
        wct.setForceTranslucent(mRootTaskInfo.token, false);
        setRootForceTranslucent(false, wct);

        // TODO(b/268008375): Merge APIs to start a split pair into one.
        if (mainTaskId != INVALID_TASK_ID) {
@@ -1344,7 +1335,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            mSideStage.removeAllTasks(wct, false /* toTop */);
            mMainStage.deactivate(wct, false /* toTop */);
            wct.reorder(mRootTaskInfo.token, false /* onTop */);
            wct.setForceTranslucent(mRootTaskInfo.token, true);
            setRootForceTranslucent(true, wct);
            wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1);
            onTransitionAnimationComplete();
        } else {
@@ -1376,7 +1367,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                    mMainStage.deactivate(finishedWCT, childrenToTop == mMainStage /* toTop */);
                    mSideStage.removeAllTasks(finishedWCT, childrenToTop == mSideStage /* toTop */);
                    finishedWCT.reorder(mRootTaskInfo.token, false /* toTop */);
                    finishedWCT.setForceTranslucent(mRootTaskInfo.token, true);
                    setRootForceTranslucent(true, wct);
                    finishedWCT.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1);
                    mSyncQueue.queue(finishedWCT);
                    mSyncQueue.runInSync(at -> {
@@ -1488,7 +1479,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mMainStage.activate(wct, true /* includingTopTask */);
        updateWindowBounds(mSplitLayout, wct);
        wct.reorder(mRootTaskInfo.token, true);
        wct.setForceTranslucent(mRootTaskInfo.token, false);
        setRootForceTranslucent(false, wct);
    }

    void finishEnterSplitScreen(SurfaceControl.Transaction t) {
@@ -1692,6 +1683,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,

        mRootTaskInfo = null;
        mRootTaskLeash = null;
        mIsRootTranslucent = false;
    }


@@ -1710,7 +1702,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        // Make the stages adjacent to each other so they occlude what's behind them.
        wct.setAdjacentRoots(mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token);
        wct.setLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token);
        wct.setForceTranslucent(mRootTaskInfo.token, true);
        setRootForceTranslucent(true, wct);
        mSplitLayout.getInvisibleBounds(mTempRect1);
        wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1);
        mSyncQueue.queue(wct);
@@ -1734,7 +1726,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            mSideStage.evictOtherChildren(wct, taskId);
            updateWindowBounds(mSplitLayout, wct);
            wct.reorder(mRootTaskInfo.token, true);
            wct.setForceTranslucent(mRootTaskInfo.token, false);
            setRootForceTranslucent(false, wct);

            mSyncQueue.queue(wct);
            mSyncQueue.runInSync(t -> {
@@ -1758,6 +1750,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mDisplayInsetsController.removeInsetsChangedListener(mDisplayId, mSplitLayout);
    }

    private void setRootForceTranslucent(boolean translucent, WindowContainerTransaction wct) {
        if (mIsRootTranslucent == translucent) return;

        mIsRootTranslucent = translucent;
        wct.setForceTranslucent(mRootTaskInfo.token, translucent);
    }

    private void onStageVisibilityChanged(StageListenerImpl stageListener) {
        // If split didn't active, just ignore this callback because we should already did these
        // on #applyExitSplitScreen.
@@ -1784,12 +1783,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            // Split entering background.
            wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token,
                    true /* setReparentLeafTaskIfRelaunch */);
            if (!mMainStage.mRootTaskInfo.isSleeping && !mSideStage.mRootTaskInfo.isSleeping) {
                wct.setForceTranslucent(mRootTaskInfo.token, true);
            }
            setRootForceTranslucent(true, wct);
        } else {
            wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token,
                    false /* setReparentLeafTaskIfRelaunch */);
            setRootForceTranslucent(false, wct);
        }

        mSyncQueue.queue(wct);
@@ -1921,7 +1919,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                mMainStage.activate(wct, true /* includingTopTask */);
                updateWindowBounds(mSplitLayout, wct);
                wct.reorder(mRootTaskInfo.token, true);
                wct.setForceTranslucent(mRootTaskInfo.token, false);
                setRootForceTranslucent(false, wct);
            }

            mSyncQueue.queue(wct);