Merge "Only rely on developer option for back animation"

This commit is contained in:
Shan Huang
2022-06-17 23:40:34 +00:00
committed by Android (Google) Code Review
7 changed files with 25 additions and 23 deletions

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -67,7 +67,6 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
SETTING_VALUE_ON) != SETTING_VALUE_OFF;
private static final int PROGRESS_THRESHOLD = SystemProperties
.getInt(PREDICTIVE_BACK_PROGRESS_THRESHOLD_PROP, -1);
/**
* Max duration to wait for a transition to finish before accepting another gesture start
* request.
@@ -290,7 +289,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
mBackGestureStarted = true;
try {
mBackNavigationInfo = mActivityTaskManager.startBackNavigation();
boolean requestAnimation = mEnableAnimations.get();
mBackNavigationInfo = mActivityTaskManager.startBackNavigation(requestAnimation);
onBackNavigationInfoReceived(mBackNavigationInfo);
} catch (RemoteException remoteException) {
Log.e(TAG, "Failed to initAnimation", remoteException);

View File

@@ -20,6 +20,7 @@ import static android.window.BackNavigationInfo.KEY_TRIGGER_BACK;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
@@ -129,7 +130,7 @@ public class BackAnimationControllerTest {
new RemoteCallback((bundle) -> {}),
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<BackEvent> 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.

View File

@@ -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);
}
/**

View File

@@ -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

View File

@@ -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