diff options
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 8921ceb6175d..f0dd86787457 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -424,6 +424,15 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return mMainStage.isActive(); } + /** + * Deactivates main stage by removing the stage from the top level split root (usually when a + * task underneath gets removed from the stage root). + * @param reparentToTop whether we want to put the stage root back on top + */ + private void deactivateSplit(WindowContainerTransaction wct, boolean reparentToTop) { + mMainStage.deactivate(wct, reparentToTop); + } + /** @return whether this transition-request has the launch-adjacent flag. */ public boolean requestHasLaunchAdjacentFlag(TransitionRequestInfo request) { final ActivityManager.RunningTaskInfo triggerTask = request.getTriggerTask(); @@ -501,7 +510,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, * {@link SideStage} no longer has children. */ final boolean result = mSideStage.removeTask(taskId, - mMainStage.isActive() ? mMainStage.mRootTaskInfo.token : null, + isSplitActive() ? mMainStage.mRootTaskInfo.token : null, wct); mTaskOrganizer.applyTransaction(wct); return result; @@ -618,7 +627,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } // If split screen is not activated, we're expecting to open a pair of apps to split. - final int extraTransitType = mMainStage.isActive() + final int extraTransitType = isSplitActive() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN; prepareEnterSplitScreen(wct, null /* taskInfo */, position, !mIsDropEntering); @@ -661,7 +670,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } // If split screen is not activated, we're expecting to open a pair of apps to split. - final int extraTransitType = mMainStage.isActive() + final int extraTransitType = isSplitActive() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN; prepareEnterSplitScreen(wct, null /* taskInfo */, position, !mIsDropEntering); @@ -793,7 +802,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void startWithTask(WindowContainerTransaction wct, int mainTaskId, @Nullable Bundle mainOptions, @PersistentSnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { - if (!mMainStage.isActive()) { + if (!isSplitActive()) { // Build a request WCT that will launch both apps such that task 0 is on the main stage // while task 1 is on the side stage. mMainStage.activate(wct, false /* reparent */); @@ -860,7 +869,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return; } - if (!mMainStage.isActive()) { + if (!isSplitActive()) { // Build a request WCT that will launch both apps such that task 0 is on the main stage // while task 1 is on the side stage. mMainStage.activate(wct, false /* reparent */); @@ -1110,7 +1119,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, */ void onKeyguardStateChanged(boolean active, boolean occludingTaskRunning) { mKeyguardActive = active; - if (!mMainStage.isActive()) { + if (!isSplitActive()) { return; } ProtoLog.d(WM_SHELL_SPLIT_SCREEN, @@ -1154,7 +1163,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, * will do a no-op. */ void dismissSplitKeepingLastActiveStage(@ExitReason int reason) { - if (!mMainStage.isActive() || mLastActiveStage == STAGE_TYPE_UNDEFINED) { + if (!isSplitActive() || mLastActiveStage == STAGE_TYPE_UNDEFINED) { // no-op return; } @@ -1177,8 +1186,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void exitSplitScreen(@Nullable StageTaskListener childrenToTop, @ExitReason int exitReason) { ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "exitSplitScreen: mainStageToTop=%b reason=%s active=%b", - childrenToTop == mMainStage, exitReasonToString(exitReason), mMainStage.isActive()); - if (!mMainStage.isActive()) return; + childrenToTop == mMainStage, exitReasonToString(exitReason), isSplitActive()); + if (!isSplitActive()) return; final WindowContainerTransaction wct = new WindowContainerTransaction(); applyExitSplitScreen(childrenToTop, wct, exitReason); @@ -1188,7 +1197,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, WindowContainerTransaction wct, @ExitReason int exitReason) { ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "applyExitSplitScreen: reason=%s", exitReasonToString(exitReason)); - if (!mMainStage.isActive() || mIsExiting) return; + if (!isSplitActive() || mIsExiting) return; onSplitScreenExit(); clearSplitPairedInRecents(exitReason); @@ -1200,7 +1209,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSplitLayout.getInvisibleBounds(mTempRect1); if (childrenToTop == null || childrenToTop.getTopVisibleChildTaskId() == INVALID_TASK_ID) { mSideStage.removeAllTasks(wct, false /* toTop */); - mMainStage.deactivate(wct, false /* toTop */); + deactivateSplit(wct, false /* reparentToTop */); wct.reorder(mRootTaskInfo.token, false /* onTop */); setRootForceTranslucent(true, wct); wct.setBounds(mSideStage.mRootTaskInfo.token, mTempRect1); @@ -1229,7 +1238,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, childrenToTop.fadeOutDecor(() -> { WindowContainerTransaction finishedWCT = new WindowContainerTransaction(); mIsExiting = false; - mMainStage.deactivate(finishedWCT, childrenToTop == mMainStage /* toTop */); + deactivateSplit(finishedWCT, childrenToTop == mMainStage /* reparentToTop */); mSideStage.removeAllTasks(finishedWCT, childrenToTop == mSideStage /* toTop */); finishedWCT.reorder(mRootTaskInfo.token, false /* toTop */); setRootForceTranslucent(true, finishedWCT); @@ -1252,7 +1261,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } void dismissSplitScreen(int toTopTaskId, @ExitReason int exitReason) { - if (!mMainStage.isActive()) return; + if (!isSplitActive()) return; final int stage = getStageOfTask(toTopTaskId); final WindowContainerTransaction wct = new WindowContainerTransaction(); prepareExitSplitScreen(stage, wct); @@ -1362,10 +1371,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, */ void prepareExitSplitScreen(@StageType int stageToTop, @NonNull WindowContainerTransaction wct) { - if (!mMainStage.isActive()) return; + if (!isSplitActive()) return; ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "prepareExitSplitScreen: stageToTop=%d", stageToTop); mSideStage.removeAllTasks(wct, stageToTop == STAGE_TYPE_SIDE); - mMainStage.deactivate(wct, stageToTop == STAGE_TYPE_MAIN); + deactivateSplit(wct, stageToTop == STAGE_TYPE_MAIN); } private void prepareEnterSplitScreen(WindowContainerTransaction wct) { @@ -1662,7 +1671,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mRootTaskInfo = taskInfo; if (mSplitLayout != null && mSplitLayout.updateConfiguration(mRootTaskInfo.configuration) - && mMainStage.isActive()) { + && isSplitActive()) { ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onTaskInfoChanged: task=%d updating", taskInfo.taskId); // Clear the divider remote animating flag as the divider will be re-rendered to apply @@ -1916,7 +1925,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, stageListener == mMainStageListener); final boolean hasChildren = stageListener.mHasChildren; final boolean isSideStage = stageListener == mSideStageListener; - if (!hasChildren && !mIsExiting && mMainStage.isActive()) { + if (!hasChildren && !mIsExiting && isSplitActive()) { if (isSideStage && mMainStageListener.mVisible) { // Exit to main stage if side stage no longer has children. mSplitLayout.flingDividerToDismiss( @@ -1931,7 +1940,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Dismiss split screen in the background once any sides of the split become empty. exitSplitScreen(null /* childrenToTop */, EXIT_REASON_APP_FINISHED); } - } else if (isSideStage && hasChildren && !mMainStage.isActive()) { + } else if (isSideStage && hasChildren && !isSplitActive()) { final WindowContainerTransaction wct = new WindowContainerTransaction(); prepareEnterSplitScreen(wct); @@ -2146,7 +2155,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void onDisplayChange(int displayId, int fromRotation, int toRotation, @Nullable DisplayAreaInfo newDisplayAreaInfo, WindowContainerTransaction wct) { - if (displayId != DEFAULT_DISPLAY || !mMainStage.isActive()) { + if (displayId != DEFAULT_DISPLAY || !isSplitActive()) { return; } @@ -2441,7 +2450,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // Not entering or exiting, so just do some house-keeping and validation. // If we're not in split-mode, just abort so something else can handle it. - if (!mMainStage.isActive()) return false; + if (!isSplitActive()) return false; ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "startAnimation: transition=%d", info.getDebugId()); mSplitLayout.setFreezeDividerWindow(false); @@ -2683,7 +2692,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, public void onTransitionAnimationComplete() { ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onTransitionAnimationComplete"); // If still playing, let it finish. - if (!mMainStage.isActive() && !mIsExiting) { + if (!isSplitActive() && !mIsExiting) { // Update divider state after animation so that it is still around and positioned // properly for the animation itself. mSplitLayout.release(); @@ -3147,7 +3156,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, + (mSplitLayout != null ? mSplitLayout.isLeftRightSplit() : "null")); pw.println(innerPrefix + "MainStage"); pw.println(childPrefix + "stagePosition=" + splitPositionToString(getMainStagePosition())); - pw.println(childPrefix + "isActive=" + mMainStage.isActive()); + pw.println(childPrefix + "isActive=" + isSplitActive()); mMainStage.dump(pw, childPrefix); pw.println(innerPrefix + "MainStageListener"); mMainStageListener.dump(pw, childPrefix); @@ -3267,7 +3276,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onNoLongerSupportMultiWindow(ActivityManager.RunningTaskInfo taskInfo) { ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onNoLongerSupportMultiWindow: task=%s", taskInfo); - if (mMainStage.isActive()) { + if (isSplitActive()) { final boolean isMainStage = mMainStageListener == this; // If visible, we preserve the app and keep it running. If an app becomes |