From 8c7cb1e446dd5505d1a7f6a5035bfab715f586df Mon Sep 17 00:00:00 2001 From: shawnlin Date: Mon, 10 May 2021 11:54:04 +0800 Subject: [PATCH] Support nav fade anim for the case of swiping left/right to a new task The ReorderMode of the swiping left/right to a new task is REORDER_MOVE_TO_ORIGINAL_POSITION which is the same as the case swiping up and then down to back to the original task. Add a new flag to distinguish between these two cases. Bug: 187783109 Test: atest RecentsAnimationControllerTests Change-Id: I0bd1005b23041459286fcd7f6488b09b43ef3867 --- .../server/wm/RecentsAnimationController.java | 9 +++++-- .../wm/RecentsAnimationControllerTest.java | 25 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index b44a9808023d4..9501951373891 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -151,6 +151,8 @@ public class RecentsAnimationController implements DeathRecipient { // Whether to take a screenshot when handling a deferred cancel private boolean mCancelDeferredWithScreenshot; + @VisibleForTesting + boolean mIsAddingTaskToTargets; @VisibleForTesting boolean mShouldAttachNavBarToAppDuringTransition; private boolean mNavigationBarAttachedToApp; @@ -375,7 +377,8 @@ public class RecentsAnimationController implements DeathRecipient { final long token = Binder.clearCallingIdentity(); try { synchronized (mService.getWindowManagerLock()) { - restoreNavigationBarFromApp(moveHomeToTop); + restoreNavigationBarFromApp( + moveHomeToTop || mIsAddingTaskToTargets /* animate */); mService.mWindowPlacerLocked.requestTraversal(); } } finally { @@ -684,6 +687,7 @@ public class RecentsAnimationController implements DeathRecipient { void addTaskToTargets(Task task, OnAnimationFinishedCallback finishedCallback) { if (mRunner != null) { + mIsAddingTaskToTargets = task != null; // No need to send task appeared when the task target already exists, or when the // task is being managed as a multi-window mode outside of recents (e.g. bubbles). if (isAnimatingTask(task) || skipAnimation(task)) { @@ -900,7 +904,8 @@ public class RecentsAnimationController implements DeathRecipient { removeWallpaperAnimation(wallpaperAdapter); } - restoreNavigationBarFromApp(reorderMode == REORDER_MOVE_TO_TOP); + restoreNavigationBarFromApp( + reorderMode == REORDER_MOVE_TO_TOP || mIsAddingTaskToTargets /* animate */); // Clear any pending failsafe runnables mService.mH.removeCallbacks(mFailsafeRunnable); diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java index 3082a5cc61147..41506f6ad9211 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java @@ -552,6 +552,31 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { verify(transaction).reparent(navToken.getSurfaceControl(), parent.getSurfaceControl()); } + @Test + public void testAddTaskToTargets_expectAnimation() { + setupForShouldAttachNavBarDuringTransition(); + final ActivityRecord activity = createActivityRecord(mDefaultDisplay); + final ActivityRecord homeActivity = createHomeActivity(); + initializeRecentsAnimationController(mController, homeActivity); + + final WindowToken navToken = mDefaultDisplay.getDisplayPolicy().getNavigationBar().mToken; + final SurfaceControl.Transaction transaction = navToken.getPendingTransaction(); + + verify(mController.mStatusBar).setNavigationBarLumaSamplingEnabled( + eq(mDefaultDisplay.mDisplayId), eq(false)); + verify(transaction).reparent(navToken.getSurfaceControl(), activity.getSurfaceControl()); + verify(transaction).setLayer(navToken.getSurfaceControl(), Integer.MAX_VALUE); + + final WindowContainer parent = navToken.getParent(); + + mController.addTaskToTargets(createTask(mDefaultDisplay), (type, anim) -> {}); + mController.cleanupAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION); + verify(mController).restoreNavigationBarFromApp(eq(true)); + verify(mController.mStatusBar).setNavigationBarLumaSamplingEnabled( + eq(mDefaultDisplay.mDisplayId), eq(true)); + verify(transaction).setLayer(navToken.getSurfaceControl(), 0); + } + @Test public void testNotAttachNavigationBar_controlledByFadeRotationAnimation() { setupForShouldAttachNavBarDuringTransition();