Fix split cannot active if app trampoline launch new task
This reverts commit2a47e6a6edand commit76ab53a384. Both CL cause regression which lead to users cannot active split by some apps use trampoline launch new task on launcher icon. So fix it by revert both CLs. Other changes are also for fixing this case. There is a timing issue and we cannot ensure the old trampoline still remain under split root when we get remote animation callback. Fix it by only checking any children tasks are under split root or not. Bug: 278172065 Test: manual Test: pass existing tests Change-Id: Ibd6d9a8377e4b5327a473f8b9adf4e569e826172
This commit is contained in:
@@ -727,10 +727,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
|
||||
getRefBounds2(mTempRect);
|
||||
t.setPosition(leash2, mTempRect.left, mTempRect.top)
|
||||
.setWindowCrop(leash2, mTempRect.width(), mTempRect.height());
|
||||
// Make right or bottom side surface always higher than left or top side to avoid weird
|
||||
// animation when dismiss split. e.g. App surface fling above on decor surface.
|
||||
t.setLayer(leash1, 1);
|
||||
t.setLayer(leash2, 2);
|
||||
|
||||
if (mImePositionProcessor.adjustSurfaceLayoutForIme(
|
||||
t, dividerLeash, leash1, leash2, dimLayer1, dimLayer2)) {
|
||||
|
||||
@@ -468,26 +468,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
RemoteAnimationTarget[] wallpapers,
|
||||
RemoteAnimationTarget[] nonApps,
|
||||
final IRemoteAnimationFinishedCallback finishedCallback) {
|
||||
boolean openingToSide = false;
|
||||
if (apps != null) {
|
||||
for (int i = 0; i < apps.length; ++i) {
|
||||
if (apps[i].mode == MODE_OPENING
|
||||
&& mSideStage.containsTask(apps[i].taskId)) {
|
||||
openingToSide = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (mSideStage.getChildCount() != 0) {
|
||||
// There are chances the entering app transition got canceled by performing
|
||||
// rotation transition. Checks if there is any child task existed in split
|
||||
// screen before fallback to cancel entering flow.
|
||||
openingToSide = true;
|
||||
}
|
||||
|
||||
if (isEnteringSplit && !openingToSide) {
|
||||
if (isEnteringSplit && mSideStage.getChildCount() == 0) {
|
||||
mMainExecutor.execute(() -> exitSplitScreen(
|
||||
mSideStage.getChildCount() == 0 ? mMainStage : mSideStage,
|
||||
EXIT_REASON_UNKNOWN));
|
||||
null /* childrenToTop */, EXIT_REASON_UNKNOWN));
|
||||
mSplitUnsupportedToast.show();
|
||||
}
|
||||
|
||||
if (finishedCallback != null) {
|
||||
@@ -572,26 +556,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
|
||||
IRemoteAnimationFinishedCallback finishedCallback,
|
||||
SurfaceControl.Transaction t) {
|
||||
boolean openingToSide = false;
|
||||
if (apps != null) {
|
||||
for (int i = 0; i < apps.length; ++i) {
|
||||
if (apps[i].mode == MODE_OPENING
|
||||
&& mSideStage.containsTask(apps[i].taskId)) {
|
||||
openingToSide = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (mSideStage.getChildCount() != 0) {
|
||||
// There are chances the entering app transition got canceled by performing
|
||||
// rotation transition. Checks if there is any child task existed in split
|
||||
// screen before fallback to cancel entering flow.
|
||||
openingToSide = true;
|
||||
}
|
||||
|
||||
if (isEnteringSplit && !openingToSide && apps != null) {
|
||||
if (isEnteringSplit && mSideStage.getChildCount() == 0) {
|
||||
mMainExecutor.execute(() -> exitSplitScreen(
|
||||
mSideStage.getChildCount() == 0 ? mMainStage : mSideStage,
|
||||
EXIT_REASON_UNKNOWN));
|
||||
null /* childrenToTop */, EXIT_REASON_UNKNOWN));
|
||||
mSplitUnsupportedToast.show();
|
||||
}
|
||||
|
||||
if (apps != null) {
|
||||
|
||||
@@ -220,20 +220,12 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
|
||||
mCallbacks.onNoLongerSupportMultiWindow();
|
||||
return;
|
||||
}
|
||||
if (taskInfo.topActivity == null && mChildrenTaskInfo.contains(taskInfo.taskId)
|
||||
&& mChildrenTaskInfo.get(taskInfo.taskId).topActivity != null) {
|
||||
// If top activity become null, it means the task is about to vanish, we use this
|
||||
// signal to remove it from children list earlier for smooth dismiss transition.
|
||||
mChildrenTaskInfo.remove(taskInfo.taskId);
|
||||
mChildrenLeashes.remove(taskInfo.taskId);
|
||||
} else {
|
||||
mChildrenTaskInfo.put(taskInfo.taskId, taskInfo);
|
||||
}
|
||||
mChildrenTaskInfo.put(taskInfo.taskId, taskInfo);
|
||||
mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */,
|
||||
taskInfo.isVisible);
|
||||
if (!ENABLE_SHELL_TRANSITIONS && mChildrenLeashes.contains(taskInfo.taskId)) {
|
||||
updateChildTaskSurface(taskInfo, mChildrenLeashes.get(taskInfo.taskId),
|
||||
false /* firstAppeared */);
|
||||
if (!ENABLE_SHELL_TRANSITIONS) {
|
||||
updateChildTaskSurface(
|
||||
taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */);
|
||||
}
|
||||
} else {
|
||||
throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo
|
||||
@@ -267,6 +259,9 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
|
||||
return;
|
||||
}
|
||||
sendStatusChanged();
|
||||
} else {
|
||||
throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo
|
||||
+ "\n mRootTaskInfo: " + mRootTaskInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -126,6 +126,12 @@ public final class StageTaskListenerTests extends ShellTestCase {
|
||||
verify(mCallbacks).onStatusChanged(eq(mRootTask.isVisible), eq(true));
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testUnknownTaskVanished() {
|
||||
final ActivityManager.RunningTaskInfo task = new TestRunningTaskInfoBuilder().build();
|
||||
mStageTaskListener.onTaskVanished(task);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTaskVanished() {
|
||||
// With shell transitions, the transition manages status changes, so skip this test.
|
||||
|
||||
Reference in New Issue
Block a user