Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bf68858 authored by Winson Chung's avatar Winson Chung
Browse files

Force-finish pending cancellation of the recents animation when process dies

- If the recents animation is cancelled, then we need to continue the
  deferred cancel when the process dies to ensure that the animation
  is cleaned up correctly (just calling cancel will no-op if the
  animation was already canceled and waiting for cleanupScreenshot()).

  This call to continue the deferred cancel is a no-op if there is no
  deferred cleanup.

Bug: 192564669
Test: atest RecentsAnimationControllerTest
Test: Defer cleanupScreenshot() and kill launcher process after canceling
Change-Id: I500b12dff2b3263e9e1529b4c094e4a422762d66
parent 224f7152
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -1029,7 +1029,13 @@ public class RecentsAnimationController implements DeathRecipient {

    @Override
    public void 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()) {
            // Clear associated input consumers on runner death
+23 −0
Original line number Diff line number Diff line
@@ -306,6 +306,29 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
        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
    public void testRecentViewInFixedPortraitWhenTopAppInLandscape() {
        unblockDisplayRotation(mDefaultDisplay);