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

Commit 78cd3a8b authored by Riley Jones's avatar Riley Jones
Browse files

Flakiness fix for RadiiAnimatorTest#animationCanRepeat

Test: atest SystemUITests:RadiiAnimatorTest#animationCanRepeat
Bug: 308699480
Flag: ACONFIG com.android.systemui.flags.Flags.floating_menu_radii_animation ENABLED
Change-Id: Idefaa9ebd5b7a528909cc19bbc5e537bde0e1abe
parent 94a3a0be
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -18,4 +18,8 @@ package com.android.systemui.accessibility.floatingmenu;


interface IRadiiAnimationListener {
interface IRadiiAnimationListener {
    void onRadiiAnimationUpdate(float[] radii);
    void onRadiiAnimationUpdate(float[] radii);

    void onRadiiAnimationStart();

    void onRadiiAnimationStop();
}
}
+13 −1
Original line number Original line Diff line number Diff line
@@ -94,7 +94,19 @@ class MenuAnimationController {
        mFadeOutAnimator.setDuration(FADE_OUT_DURATION_MS);
        mFadeOutAnimator.setDuration(FADE_OUT_DURATION_MS);
        mFadeOutAnimator.addUpdateListener(
        mFadeOutAnimator.addUpdateListener(
                (animation) -> menuView.setAlpha((float) animation.getAnimatedValue()));
                (animation) -> menuView.setAlpha((float) animation.getAnimatedValue()));
        mRadiiAnimator = new RadiiAnimator(mMenuViewAppearance.getMenuRadii(), mMenuView::setRadii);
        mRadiiAnimator = new RadiiAnimator(mMenuViewAppearance.getMenuRadii(),
                new IRadiiAnimationListener() {
                    @Override
                    public void onRadiiAnimationUpdate(float[] radii) {
                        mMenuView.setRadii(radii);
                    }

                    @Override
                    public void onRadiiAnimationStart() {}

                    @Override
                    public void onRadiiAnimationStop() {}
                });
    }
    }


    void moveToPosition(PointF position) {
    void moveToPosition(PointF position) {
+5 −1
Original line number Original line Diff line number Diff line
@@ -55,15 +55,19 @@ class RadiiAnimator {
            @Override
            @Override
            public void onAnimationStart(@NonNull Animator animation) {
            public void onAnimationStart(@NonNull Animator animation) {
                animationListener.onRadiiAnimationUpdate(evaluate(/* t = */ 0.0f));
                animationListener.onRadiiAnimationUpdate(evaluate(/* t = */ 0.0f));
                animationListener.onRadiiAnimationStart();
            }
            }


            @Override
            @Override
            public void onAnimationEnd(@NonNull Animator animation) {}
            public void onAnimationEnd(@NonNull Animator animation) {
                animationListener.onRadiiAnimationStop();
            }


            @Override
            @Override
            public void onAnimationCancel(@NonNull Animator animation) {
            public void onAnimationCancel(@NonNull Animator animation) {
                animationListener.onRadiiAnimationUpdate(
                animationListener.onRadiiAnimationUpdate(
                        evaluate(mAnimationDriver.getAnimatedFraction()));
                        evaluate(mAnimationDriver.getAnimatedFraction()));
                animationListener.onRadiiAnimationStop();
            }
            }


            @Override
            @Override
+32 −14
Original line number Original line Diff line number Diff line
@@ -31,42 +31,60 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;


import java.util.Arrays;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;


/** Tests for {@link RadiiAnimator}. */
/** Tests for {@link RadiiAnimator}. */
@SmallTest
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWith(AndroidTestingRunner.class)
public class RadiiAnimatorTest extends SysuiTestCase {
public class RadiiAnimatorTest extends SysuiTestCase {
    float[] mResultRadii = new float[RadiiAnimator.RADII_COUNT];
    float[] mResultRadii = new float[RadiiAnimator.RADII_COUNT];
    final AtomicBoolean mAnimationStarted = new AtomicBoolean(false);
    final AtomicBoolean mAnimationStopped = new AtomicBoolean(false);
    final IRadiiAnimationListener mRadiiAnimationListener = new IRadiiAnimationListener() {
        @Override
        public void onRadiiAnimationUpdate(float[] radii) {
            mResultRadii = radii;
        }

        @Override
        public void onRadiiAnimationStart() {
            mAnimationStarted.set(true);
        }

        @Override
        public void onRadiiAnimationStop() {
            mAnimationStopped.set(true);
        }
    };


    @Test
    @Test
    public void constructor() {
    public void constructor() {
        final float[] radii = generateRadii(0.0f);
        final float[] radii = generateRadii(0.0f);
        final RadiiAnimator radiiAnimator = new RadiiAnimator(radii, newRadii -> {});
        final RadiiAnimator radiiAnimator = new RadiiAnimator(radii, mRadiiAnimationListener);

        assertThat(radiiAnimator.evaluate(0.0f)).isEqualTo(radii);
        assertThat(radiiAnimator.evaluate(0.0f)).isEqualTo(radii);
    }
    }


    @Test
    @Test
    public void skip_updates_to_end() {
    public void skipAnimation_updatesToEnd() {
        final float[] startRadii = generateRadii(0.0f);
        final float[] startRadii = generateRadii(0.0f);
        final float[] endRadii = generateRadii(1.0f);
        final float[] endRadii = generateRadii(1.0f);


        final RadiiAnimator radiiAnimator = setupAnimator(startRadii);
        final RadiiAnimator radiiAnimator = setupAnimator(startRadii);


        mAnimationStarted.set(false);
        mAnimationStopped.set(false);
        new Handler(Looper.getMainLooper()).post(() -> radiiAnimator.startAnimation(endRadii));
        new Handler(Looper.getMainLooper()).post(() -> radiiAnimator.startAnimation(endRadii));
        TestUtils.waitForCondition(radiiAnimator::isStarted, "Animation did not start.");
        TestUtils.waitForCondition(mAnimationStarted::get, "Animation did not start.");
        TestUtils.waitForCondition(() -> Arrays.equals(radiiAnimator.evaluate(0.0f), startRadii)
        TestUtils.waitForCondition(() -> Arrays.equals(radiiAnimator.evaluate(0.0f), startRadii)
                        && Arrays.equals(radiiAnimator.evaluate(1.0f), endRadii),
                        && Arrays.equals(radiiAnimator.evaluate(1.0f), endRadii),
                "Animator did not initialize to start and end values");
                "Animator did not initialize to start and end values");

        new Handler(Looper.getMainLooper()).post(radiiAnimator::skipAnimationToEnd);
        new Handler(Looper.getMainLooper()).post(radiiAnimator::skipAnimationToEnd);
        TestUtils.waitForCondition(
        TestUtils.waitForCondition(mAnimationStopped::get, "Animation did not stop.");
                () -> !radiiAnimator.isStarted(), "Animation did not end.");
        assertThat(mResultRadii).usingTolerance(0.001).containsExactly(endRadii);
        assertThat(mResultRadii).usingTolerance(0.001).containsExactly(endRadii);
    }
    }


    @Test
    @Test
    public void animation_can_repeat() {
    public void finishedAnimation_canRepeat() {
        final float[] startRadii = generateRadii(0.0f);
        final float[] startRadii = generateRadii(0.0f);
        final float[] midRadii = generateRadii(1.0f);
        final float[] midRadii = generateRadii(1.0f);
        final float[] endRadii = generateRadii(2.0f);
        final float[] endRadii = generateRadii(2.0f);
@@ -88,15 +106,15 @@ public class RadiiAnimatorTest extends SysuiTestCase {


    private RadiiAnimator setupAnimator(float[] startRadii) {
    private RadiiAnimator setupAnimator(float[] startRadii) {
        mResultRadii = new float[RadiiAnimator.RADII_COUNT];
        mResultRadii = new float[RadiiAnimator.RADII_COUNT];
        return new RadiiAnimator(startRadii,
        return new RadiiAnimator(startRadii, mRadiiAnimationListener);
                newRadii -> mResultRadii = newRadii);
    }
    }


    private void playAndSkipAnimation(RadiiAnimator animator, float[] endRadii) {
    private void playAndSkipAnimation(RadiiAnimator animator, float[] endRadii) {
        mAnimationStarted.set(false);
        mAnimationStopped.set(false);
        new Handler(Looper.getMainLooper()).post(() -> animator.startAnimation(endRadii));
        new Handler(Looper.getMainLooper()).post(() -> animator.startAnimation(endRadii));
        TestUtils.waitForCondition(animator::isStarted, "Animation did not start.");
        TestUtils.waitForCondition(mAnimationStarted::get, "Animation did not start.");
        new Handler(Looper.getMainLooper()).post(animator::skipAnimationToEnd);
        new Handler(Looper.getMainLooper()).post(animator::skipAnimationToEnd);
        TestUtils.waitForCondition(
        TestUtils.waitForCondition(mAnimationStopped::get, "Animation did not stop.");
                () -> !animator.isStarted(), "Animation did not end.");
    }
    }
}
}