From 3486e303314e22fe06b59904e31bc179e4e4d353 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Thu, 14 Apr 2022 20:05:59 -0700 Subject: [PATCH] Fix Split animations after single-root The animations were modifying the single-root surface, but that surface isn't expected to be modified. This would cause the single-root to be alpha=0 permanently. This also disables pip-entry when drag-divider-to-dismiss since that isn't supposed to happen. Bug: 226673164 Test: split with auto-pipable, drag-divider to dismiss pipable, go to recents, enter-split again with same apps. Change-Id: Ia1f304efd1dbf4434e628d2b7723a2afaae43a34 --- .../wm/shell/splitscreen/SplitScreenTransitions.java | 12 ++++++++---- .../wm/shell/splitscreen/StageCoordinator.java | 6 +++++- .../android/server/wm/WindowOrganizerController.java | 10 ++++++---- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java index 4ff9d48a37075..78cea628d6858 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java @@ -90,7 +90,8 @@ class SplitScreenTransitions { @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback, - @NonNull WindowContainerToken mainRoot, @NonNull WindowContainerToken sideRoot) { + @NonNull WindowContainerToken mainRoot, @NonNull WindowContainerToken sideRoot, + @NonNull WindowContainerToken topRoot) { mFinishCallback = finishCallback; mAnimatingTransition = transition; if (mPendingRemoteHandler != null) { @@ -100,12 +101,12 @@ class SplitScreenTransitions { mPendingRemoteHandler = null; return; } - playInternalAnimation(transition, info, startTransaction, mainRoot, sideRoot); + playInternalAnimation(transition, info, startTransaction, mainRoot, sideRoot, topRoot); } private void playInternalAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t, @NonNull WindowContainerToken mainRoot, - @NonNull WindowContainerToken sideRoot) { + @NonNull WindowContainerToken sideRoot, @NonNull WindowContainerToken topRoot) { mFinishTransaction = mTransactionPool.acquire(); // Play some place-holder fade animations @@ -136,7 +137,10 @@ class SplitScreenTransitions { endBounds.offset(-info.getRootOffset().x, -info.getRootOffset().y); startExampleResizeAnimation(leash, startBounds, endBounds); } - if (change.getParent() != null) { + boolean isRootOrSplitSideRoot = change.getParent() == null + || topRoot.equals(change.getParent()); + // For enter or exit, we only want to animate the side roots but not the top-root. + if (!isRootOrSplitSideRoot || topRoot.equals(change.getContainer())) { continue; } 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 bb434e26bb0a2..826d78c16404c 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 @@ -1128,6 +1128,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, final int dismissTop = mainStageToTop ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE; final WindowContainerTransaction wct = new WindowContainerTransaction(); prepareExitSplitScreen(dismissTop, wct); + if (mRootTaskInfo != null) { + wct.setDoNotPip(mRootTaskInfo.token); + } mSplitTransitions.startDismissTransition(wct, this, dismissTop, EXIT_REASON_DRAG_DIVIDER); } @@ -1505,7 +1508,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (!shouldAnimate) return false; mSplitTransitions.playAnimation(transition, info, startTransaction, finishTransaction, - finishCallback, mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token); + finishCallback, mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token, + mRootTaskInfo.token); return true; } diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index c1c8b81f2c324..59ca99a915bfb 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -411,11 +411,13 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } if (transition != null) transition.collect(wc); - if (finishTransition != null) { - // Deal with edge-cases in recents where it pretends to finish itself. - if ((entry.getValue().getChangeMask() - & WindowContainerTransaction.Change.CHANGE_FORCE_NO_PIP) != 0) { + if ((entry.getValue().getChangeMask() + & WindowContainerTransaction.Change.CHANGE_FORCE_NO_PIP) != 0) { + // Disable entering pip (eg. when recents pretends to finish itself) + if (finishTransition != null) { finishTransition.setCanPipOnFinish(false /* canPipOnFinish */); + } else if (transition != null) { + transition.setCanPipOnFinish(false /* canPipOnFinish */); } }