Merge "Force-finish pending cancellation of the recents animation when process dies" into sc-dev am: b7ac726393

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15262265

Change-Id: I872bb2df7c3d741027fef2d7aebbaba62244005e
This commit is contained in:
TreeHugger Robot
2021-07-13 05:53:24 +00:00
committed by Automerger Merge Worker
2 changed files with 30 additions and 1 deletions

View File

@@ -1030,7 +1030,13 @@ public class RecentsAnimationController implements DeathRecipient {
@Override @Override
public void binderDied() { public void binderDied() {
cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION, "binderDied"); if (!mCanceled) {
cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION, "binderDied");
} else {
// If we are already canceled but with a screenshot, and are waiting for the
// cleanupScreenshot() callback, then force-finish the animation now
continueDeferredCancelAnimation();
}
synchronized (mService.getWindowManagerLock()) { synchronized (mService.getWindowManagerLock()) {
// Clear associated input consumers on runner death // Clear associated input consumers on runner death

View File

@@ -306,6 +306,29 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
assertTrue(activity.shouldAnimate()); assertTrue(activity.shouldAnimate());
} }
@Test
public void testBinderDiedAfterCancelWithDeferredScreenshot() throws Exception {
mWm.setRecentsAnimationController(mController);
final ActivityRecord homeActivity = createHomeActivity();
final ActivityRecord activity = createActivityRecord(mDefaultDisplay);
final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "win1");
activity.addWindow(win1);
initializeRecentsAnimationController(mController, homeActivity);
mController.setWillFinishToHome(true);
// Verify cancel is called with a snapshot and that we've created an overlay
spyOn(mWm.mTaskSnapshotController);
doReturn(mMockTaskSnapshot).when(mWm.mTaskSnapshotController).getSnapshot(anyInt(),
anyInt(), eq(false) /* restoreFromDisk */, eq(false) /* isLowResolution */);
mController.cancelAnimationWithScreenshot(true /* screenshot */);
verify(mMockRunner).onAnimationCanceled(any());
// Simulate process crashing and ensure the animation is still canceled
mController.binderDied();
verify(mAnimationCallbacks).onAnimationFinished(REORDER_KEEP_IN_PLACE, false);
}
@Test @Test
public void testRecentViewInFixedPortraitWhenTopAppInLandscape() { public void testRecentViewInFixedPortraitWhenTopAppInLandscape() {
unblockDisplayRotation(mDefaultDisplay); unblockDisplayRotation(mDefaultDisplay);