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

Commit f103588c authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Fix missing finish callback to fix running animation leak

Make sure finish callback gets called when
applyChangeInsets gets called synchronously from
scheduleApplyChangeInsets

Bug: 152071027
Test: InsetsAnimationControlImplTest
Change-Id: I6808b3527f1d2e15de681c5260208d238dcf53e2
parent 884aa6af
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -136,7 +136,12 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll


    @Override
    @Override
    public void setInsetsAndAlpha(Insets insets, float alpha, float fraction) {
    public void setInsetsAndAlpha(Insets insets, float alpha, float fraction) {
        if (mFinished) {
        setInsetsAndAlpha(insets, alpha, fraction, false /* allowWhenFinished */);
    }

    private void setInsetsAndAlpha(Insets insets, float alpha, float fraction,
            boolean allowWhenFinished) {
        if (!allowWhenFinished && mFinished) {
            throw new IllegalStateException(
            throw new IllegalStateException(
                    "Can't change insets on an animation that is finished.");
                    "Can't change insets on an animation that is finished.");
        }
        }
@@ -197,8 +202,9 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
            return;
            return;
        }
        }
        mShownOnFinish = shown;
        mShownOnFinish = shown;
        setInsetsAndAlpha(shown ? mShownInsets : mHiddenInsets, 1f /* alpha */, 1f /* fraction */);
        mFinished = true;
        mFinished = true;
        setInsetsAndAlpha(shown ? mShownInsets : mHiddenInsets, 1f /* alpha */, 1f /* fraction */,
                true /* allowWhenFinished */);
        mListener.onFinished(this);
        mListener.onFinished(this);
    }
    }


+17 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;
@@ -206,6 +207,22 @@ public class InsetsAnimationControlImplTest {
        mController.finish(true /* shown */);
        mController.finish(true /* shown */);
    }
    }


    @Test
    public void testFinish_immediately() {
        when(mMockController.getState()).thenReturn(mInsetsState);
        doAnswer(invocation -> {
            mController.applyChangeInsets(mInsetsState);
            return null;
        }).when(mMockController).scheduleApplyChangeInsets();
        mController.finish(true /* shown */);
        assertEquals(Insets.of(0, 100, 100, 0), mController.getCurrentInsets());
        verify(mMockController).notifyFinished(eq(mController), eq(true /* shown */));
        assertFalse(mController.isReady());
        assertTrue(mController.isFinished());
        assertFalse(mController.isCancelled());
        verify(mMockListener).onFinished(mController);
    }

    private void assertPosition(Matrix m, Rect original, Rect transformed) {
    private void assertPosition(Matrix m, Rect original, Rect transformed) {
        RectF rect = new RectF(original);
        RectF rect = new RectF(original);
        rect.offsetTo(0, 0);
        rect.offsetTo(0, 0);
+0 −1
Original line number Original line Diff line number Diff line
@@ -367,7 +367,6 @@ class InsetsPolicy {
        @Override
        @Override
        protected void onAnimationFinish() {
        protected void onAnimationFinish() {
            super.onAnimationFinish();
            super.onAnimationFinish();
            mControlCallbacks.mAnimationControl.finish(mAnimatingShown);
            DisplayThread.getHandler().post(mFinishCallback);
            DisplayThread.getHandler().post(mFinishCallback);
        }
        }