Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6753977b authored by Tony Huang's avatar Tony Huang Committed by Android Build Coastguard Worker
Browse files

Fix split cannot active if app trampoline launch new task

This reverts commit 2a47e6a6 and
commit 76ab53a3.

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
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:6e29d4ddb8ab2cb9b66539c0b9bc3e15efe8b885)
Merged-In: Ibd6d9a8377e4b5327a473f8b9adf4e569e826172
Change-Id: Ibd6d9a8377e4b5327a473f8b9adf4e569e826172
parent 7d0ee5b6
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -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)) {
+6 −38
Original line number Diff line number Diff line
@@ -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) {
+7 −12
Original line number Diff line number Diff line
@@ -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);
            }
            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);
        }
    }

+6 −0
Original line number Diff line number Diff line
@@ -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.