From a97e10b07f19bcab0f6e82b0b85ac5c111f27aaa Mon Sep 17 00:00:00 2001 From: Vadim Caen Date: Wed, 11 May 2022 20:36:53 +0200 Subject: [PATCH] Only rely on developer option for back animation BackNavigationController was still relying on a debug setting. Now the animation request is handled via a boolean parameter passed by sysui, which has access to the developer option. Test: Existing test modified Bug: 231502692 Change-Id: Icda4692e05396407d961610de0ce709492adadc1 Merged-In: Icda4692e05396407d961610de0ce709492adadc1 --- .../android/app/IActivityTaskManager.aidl | 3 ++- .../android/window/BackNavigationTest.java | 2 +- .../shell/back/BackAnimationController.java | 4 ++-- .../back/BackAnimationControllerTest.java | 10 ++++++--- .../server/wm/ActivityTaskManagerService.java | 4 ++-- .../server/wm/BackNavigationController.java | 21 ++++++++----------- .../wm/BackNavigationControllerTests.java | 4 ++-- 7 files changed, 25 insertions(+), 23 deletions(-) diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index 201473f4957ee..fe75dd302bebd 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -348,6 +348,7 @@ interface IActivityTaskManager { /** * Prepare the back navigation in the server. This setups the leashed for sysui to animate * the back gesture and returns the data needed for the animation. + * @param requestAnimation true if the caller wishes to animate the back navigation */ - android.window.BackNavigationInfo startBackNavigation(); + android.window.BackNavigationInfo startBackNavigation(in boolean requestAnimation); } diff --git a/core/tests/coretests/src/android/window/BackNavigationTest.java b/core/tests/coretests/src/android/window/BackNavigationTest.java index 678eef557fed1..ce69f12a065b1 100644 --- a/core/tests/coretests/src/android/window/BackNavigationTest.java +++ b/core/tests/coretests/src/android/window/BackNavigationTest.java @@ -91,7 +91,7 @@ public class BackNavigationTest { private void assertCallbackIsCalled(CountDownLatch latch) { try { mInstrumentation.getUiAutomation().waitForIdle(500, 1000); - BackNavigationInfo info = ActivityTaskManager.getService().startBackNavigation(); + BackNavigationInfo info = ActivityTaskManager.getService().startBackNavigation(true); assertNotNull("BackNavigationInfo is null", info); assertNotNull("OnBackInvokedCallback is null", info.getOnBackInvokedCallback()); info.getOnBackInvokedCallback().onBackInvoked(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index ac1c3ff2a33d1..89d262b17b59a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -67,7 +67,6 @@ public class BackAnimationController implements RemoteCallable {}), onBackInvokedCallback); try { - doReturn(navigationInfo).when(mActivityTaskManager).startBackNavigation(); + doReturn(navigationInfo).when(mActivityTaskManager).startBackNavigation(anyBoolean()); } catch (RemoteException ex) { ex.rethrowFromSystemServer(); } @@ -137,7 +138,7 @@ public class BackAnimationControllerTest { private void createNavigationInfo(BackNavigationInfo.Builder builder) { try { - doReturn(builder.build()).when(mActivityTaskManager).startBackNavigation(); + doReturn(builder.build()).when(mActivityTaskManager).startBackNavigation(anyBoolean()); } catch (RemoteException ex) { ex.rethrowFromSystemServer(); } @@ -217,8 +218,11 @@ public class BackAnimationControllerTest { // Check that back start and progress is dispatched when first move. doMotionEvent(MotionEvent.ACTION_MOVE, 100); verify(mIOnBackInvokedCallback).onBackStarted(); + + // Check that back progress is dispatched. + doMotionEvent(MotionEvent.ACTION_MOVE, 100); ArgumentCaptor backEventCaptor = ArgumentCaptor.forClass(BackEvent.class); - verify(mIOnBackInvokedCallback).onBackProgressed(backEventCaptor.capture()); + verify(mIOnBackInvokedCallback, atLeastOnce()).onBackProgressed(backEventCaptor.capture()); assertEquals(animationTarget, backEventCaptor.getValue().getDepartingAnimationTarget()); // Check that back invocation is dispatched. diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index d56afca8b4db2..fc287b8eac65c 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1811,13 +1811,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public BackNavigationInfo startBackNavigation() { + public BackNavigationInfo startBackNavigation(boolean requestAnimation) { mAmInternal.enforceCallingPermission(START_TASKS_FROM_RECENTS, "startBackNavigation()"); if (mBackNavigationController == null) { return null; } - return mBackNavigationController.startBackNavigation(mWindowManager); + return mBackNavigationController.startBackNavigation(mWindowManager, requestAnimation); } /** diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index dac72d8202512..d07cc68af8907 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -61,10 +61,6 @@ class BackNavigationController { return SystemProperties.getInt("persist.wm.debug.predictive_back_screenshot", 0) != 0; } - private static boolean isAnimationEnabled() { - return SystemProperties.getInt("persist.wm.debug.predictive_back_anim", 0) != 0; - } - /** * Set up the necessary leashes and build a {@link BackNavigationInfo} instance for an upcoming * back gesture animation. @@ -74,20 +70,21 @@ class BackNavigationController { * fallback on dispatching the key event. */ @Nullable - BackNavigationInfo startBackNavigation(@NonNull WindowManagerService wmService) { - return startBackNavigation(wmService, null); + BackNavigationInfo startBackNavigation(@NonNull WindowManagerService wmService, + boolean requestAnimation) { + return startBackNavigation(wmService, null, requestAnimation); } /** * @param tx, a transaction to be used for the attaching the animation leash. * This is used in tests. If null, the object will be initialized with a new {@link * SurfaceControl.Transaction} - * @see #startBackNavigation(WindowManagerService) + * @see #startBackNavigation(WindowManagerService, boolean) */ @VisibleForTesting @Nullable BackNavigationInfo startBackNavigation(WindowManagerService wmService, - @Nullable SurfaceControl.Transaction tx) { + @Nullable SurfaceControl.Transaction tx, boolean requestAnimation) { if (tx == null) { tx = new SurfaceControl.Transaction(); @@ -295,7 +292,7 @@ class BackNavigationController { } // Special handling for back to home animation - if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME && isAnimationEnabled() + if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME && requestAnimation && prevTask != null) { currentTask.mBackGestureStarted = true; // Make launcher show from behind by marking its top activity as visible and @@ -350,7 +347,7 @@ class BackNavigationController { Task finalTask = currentTask; RemoteCallback onBackNavigationDone = new RemoteCallback(result -> onBackNavigationDone( result, finalRemovedWindowContainer, finalBackType, finalTask, - finalprevActivity)); + finalprevActivity, requestAnimation)); infoBuilder.setOnBackNavigationDone(onBackNavigationDone); } @@ -384,14 +381,14 @@ class BackNavigationController { private void onBackNavigationDone( Bundle result, WindowContainer windowContainer, int backType, - Task task, ActivityRecord prevActivity) { + Task task, ActivityRecord prevActivity, boolean requestAnimation) { SurfaceControl surfaceControl = windowContainer.getSurfaceControl(); boolean triggerBack = result != null && result.getBoolean( BackNavigationInfo.KEY_TRIGGER_BACK); ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "onBackNavigationDone backType=%s, " + "task=%s, prevActivity=%s", backType, task, prevActivity); - if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME && isAnimationEnabled()) { + if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME && requestAnimation) { if (triggerBack) { if (surfaceControl != null && surfaceControl.isValid()) { // When going back to home, hide the task surface before it is re-parented to diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java index 873d9f3fc023e..2c1c38f3bee8f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java @@ -86,7 +86,7 @@ public class BackNavigationControllerTests extends WindowTestsBase { SurfaceControl.Transaction tx = mock(SurfaceControl.Transaction.class); BackNavigationInfo backNavigationInfo = mBackNavigationController.startBackNavigation(mWm, - tx); + tx, true); assertWithMessage("BackNavigationInfo").that(backNavigationInfo).isNotNull(); assertThat(backNavigationInfo.getDepartingAnimationTarget()).isNotNull(); assertThat(backNavigationInfo.getTaskWindowConfiguration()).isNotNull(); @@ -242,7 +242,7 @@ public class BackNavigationControllerTests extends WindowTestsBase { @Nullable private BackNavigationInfo startBackNavigation() { - return mBackNavigationController.startBackNavigation(mWm, new StubTransaction()); + return mBackNavigationController.startBackNavigation(mWm, new StubTransaction(), true); } @NonNull