diff options
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java | 36 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityStarter.java | 6 |
2 files changed, 32 insertions, 10 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 e5ae10c097a5..6125768fdb4d 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 @@ -1476,6 +1476,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSideStage.removeAllTasks(wct, false /* toTop */); mMainStage.deactivate(wct, false /* toTop */); } + wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, + false /* reparentLeafTaskIfRelaunch */); } private void prepareEnterSplitScreen(WindowContainerTransaction wct) { @@ -2327,6 +2329,15 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // the remote handler. return null; } + + if ((mMainStage.containsTask(triggerTask.taskId) + && mMainStage.getChildCount() == 1) + || (mSideStage.containsTask(triggerTask.taskId) + && mSideStage.getChildCount() == 1)) { + // A splitting task is opening to fullscreen causes one side of the split empty, + // so appends operations to exit split. + prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, out); + } } } else { if (isOpening && getStageOfTask(triggerTask) != null) { @@ -2409,9 +2420,23 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (isOpeningType(change.getMode())) { // Split is opened by someone so set it as visible. setSplitsVisible(true); + // TODO(b/275664132): Find a way to integrate this with finishWct. + // This is setting the flag to a task and not interfering with the + // transition. + final WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, + false /* reparentLeafTaskIfRelaunch */); + mTaskOrganizer.applyTransaction(wct); } else if (isClosingType(change.getMode())) { // Split is closed by someone so set it as invisible. setSplitsVisible(false); + // TODO(b/275664132): Find a way to integrate this with finishWct. + // This is setting the flag to a task and not interfering with the + // transition. + final WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, + true /* reparentLeafTaskIfRelaunch */); + mTaskOrganizer.applyTransaction(wct); } continue; } @@ -2811,16 +2836,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - // TODO(b/275664132): Remove dismissing split screen here to fit in back-to-split support. - // Dismiss the split screen if it's not returning to split. - prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, finishWct); - for (TransitionInfo.Change change : info.getChanges()) { - if (change.getTaskInfo() != null && TransitionUtil.isClosingType(change.getMode())) { - finishT.setCrop(change.getLeash(), null).hide(change.getLeash()); - } - } setSplitsVisible(false); - setDividerVisibility(false, finishT); + finishWct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, + true /* reparentLeafTaskIfRelaunch */); logExit(EXIT_REASON_UNKNOWN); } diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 19a12f2b9cc0..e8acbe43689c 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2909,6 +2909,9 @@ class ActivityStarter { private void setTargetRootTaskIfNeeded(ActivityRecord intentActivity) { intentActivity.getTaskFragment().clearLastPausedActivity(); Task intentTask = intentActivity.getTask(); + // The intent task might be reparented while in getOrCreateRootTask, caches the original + // root task to distinguish if it is moving to front or not. + final Task origRootTask = intentTask != null ? intentTask.getRootTask() : null; if (mTargetRootTask == null) { // Update launch target task when it is not indicated. @@ -2941,7 +2944,8 @@ class ActivityStarter { ? null : focusRootTask.topRunningNonDelayedActivityLocked(mNotTop); final Task topTask = curTop != null ? curTop.getTask() : null; differentTopTask = topTask != intentTask - || (focusRootTask != null && topTask != focusRootTask.getTopMostTask()); + || (focusRootTask != null && topTask != focusRootTask.getTopMostTask()) + || (focusRootTask != null && focusRootTask != origRootTask); } else { // The existing task should always be different from those in other displays. differentTopTask = true; |