summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tony Huang <tonyychuang@google.com> 2023-05-22 18:21:48 +0800
committer Tony Huang <tonyychuang@google.com> 2023-05-22 18:27:28 +0800
commit72cecb84f97c02e2ae988c71bffd2c61b9ec6550 (patch)
tree8969e7b14ce5064762a31b365523ec7aa29ed1de
parent2907102b7b3b4a2c12ec5fd6dcb6f88c0ede82d8 (diff)
Fix launch adjacent behavior if split background
We should handle the transition request if task is open under stage but split invisible ant treat it same as split inactive. Fix: 283738741 Test: pass existing tests Test: manual Change-Id: Icdde8bba0d246c91b95322924f9a468a5c01b199
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java21
1 files changed, 18 insertions, 3 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 bf20567834e0..24d22eec0faf 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
@@ -2291,6 +2291,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
prepareExitSplitScreen(dismissTop, out);
mSplitTransitions.setDismissTransition(transition, dismissTop,
EXIT_REASON_APP_FINISHED);
+ } else if (!isSplitScreenVisible() && isOpening) {
+ // If split running backgroud and trigger task is appearing into split,
+ // prepare to enter split screen.
+ prepareEnterSplitScreen(out);
+ mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(),
+ null /* consumedCallback */, null /* finishedCallback */,
+ TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering);
}
} else if (isOpening && inFullscreen) {
final int activityType = triggerTask.getActivityType();
@@ -2316,7 +2323,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
prepareEnterSplitScreen(out);
mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(),
null /* consumedCallback */, null /* finishedCallback */,
- TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE, !mIsDropEntering);
+ TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering);
}
}
return out;
@@ -2565,17 +2572,22 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
// First, verify that we actually have opened apps in both splits.
TransitionInfo.Change mainChild = null;
TransitionInfo.Change sideChild = null;
+ final WindowContainerTransaction evictWct = new WindowContainerTransaction();
for (int iC = 0; iC < info.getChanges().size(); ++iC) {
final TransitionInfo.Change change = info.getChanges().get(iC);
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
if (taskInfo == null || !taskInfo.hasParentTask()) continue;
final @StageType int stageType = getStageType(getStageOfTask(taskInfo));
- if (stageType == STAGE_TYPE_MAIN
+ if (mainChild == null && stageType == STAGE_TYPE_MAIN
&& (isOpeningType(change.getMode()) || change.getMode() == TRANSIT_CHANGE)) {
// Includes TRANSIT_CHANGE to cover reparenting top-most task to split.
mainChild = change;
- } else if (stageType == STAGE_TYPE_SIDE && isOpeningType(change.getMode())) {
+ } else if (sideChild == null && stageType == STAGE_TYPE_SIDE
+ && isOpeningType(change.getMode())) {
sideChild = change;
+ } else if (stageType != STAGE_TYPE_UNDEFINED && change.getMode() == TRANSIT_TO_BACK) {
+ // Collect all to back task's and evict them when transition finished.
+ evictWct.reparent(taskInfo.token, null /* parent */, false /* onTop */);
}
}
@@ -2637,6 +2649,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
mSideStage.evictInvisibleChildren(callbackWct);
}
}
+ if (!evictWct.isEmpty()) {
+ callbackWct.merge(evictWct, true);
+ }
if (enterTransition.mResizeAnim) {
mShowDecorImmediately = true;
mSplitLayout.flingDividerToCenter();