Keep splitting tasks in the background with shell transition

Align with legacy transition to not breaks splitting tasks in the
background and set the flag to support relaunching background splitting
tasks to fullscreen.
Also fix not collecting move_to_front transition changes when
reparenting an existing task to top.

Bug: 275664132
Fix: 280523948
Test: atest WMShellUnitTests WMShellFlickerTests
Test: having a fullscreen app occludings a split pair, launching one of
      the splitting task breaks the split and brings up in fullscreen
Test: going from a split pair to home, launching one of the splitting
      task breaks the split and brings up in fullscreen
Test: having a task supporting auto-pip in split, going to home breaks
      the split pair and entering pip
Change-Id: I134c8c4ecdfe3ee29df9de7b32cfa501c88510c6
This commit is contained in:
Jerry Chang
2023-05-03 15:16:15 +00:00
parent 22cc6b6352
commit f79c8e9191
2 changed files with 32 additions and 10 deletions

View File

@@ -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);
}

View File

@@ -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;