From 7fa945fcc9d0ee24ddae5ddca04de0828beefa60 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 21 Jan 2022 22:46:42 +0000 Subject: [PATCH] Remove the previous animation split tasks container when recreating Bug: 197919703 Test: Invoke split and swipe up a couple times, ensure the sf dump doesn't show multiple lingering split containers layers Change-Id: Iad8b9d9a0d75bdaaa2a7255a33208c2c0c3fc25b --- .../wm/shell/splitscreen/SplitScreenController.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 6921448ba9eee..3e6dc8241f4f3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -137,6 +137,9 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, private final Provider> mUnfoldControllerProvider; private StageCoordinator mStageCoordinator; + // Only used for the legacy recents animation from splitscreen to allow the tasks to be animated + // outside the bounds of the roots by being reparented into a higher level fullscreen container + private SurfaceControl mSplitTasksContainerLayer; public SplitScreenController(ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue, Context context, @@ -378,20 +381,24 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel, RemoteAnimationTarget[] apps) { if (ENABLE_SHELL_TRANSITIONS || apps.length < 2) return null; // TODO(b/206487881): Integrate this with shell transition. + SurfaceControl.Transaction transaction = new SurfaceControl.Transaction(); + if (mSplitTasksContainerLayer != null) { + // Remove the previous layer before recreating + transaction.remove(mSplitTasksContainerLayer); + } final SurfaceControl.Builder builder = new SurfaceControl.Builder(new SurfaceSession()) .setContainerLayer() .setName("RecentsAnimationSplitTasks") .setHidden(false) .setCallsite("SplitScreenController#onGoingtoRecentsLegacy"); mRootTDAOrganizer.attachToDisplayArea(DEFAULT_DISPLAY, builder); - SurfaceControl sc = builder.build(); - SurfaceControl.Transaction transaction = new SurfaceControl.Transaction(); + mSplitTasksContainerLayer = builder.build(); // Ensure that we order these in the parent in the right z-order as their previous order Arrays.sort(apps, (a1, a2) -> a1.prefixOrderIndex - a2.prefixOrderIndex); int layer = 1; for (RemoteAnimationTarget appTarget : apps) { - transaction.reparent(appTarget.leash, sc); + transaction.reparent(appTarget.leash, mSplitTasksContainerLayer); transaction.setPosition(appTarget.leash, appTarget.screenSpaceBounds.left, appTarget.screenSpaceBounds.top); transaction.setLayer(appTarget.leash, layer++);