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

Commit 6fb611c9 authored by William Xiao's avatar William Xiao Committed by Android (Google) Code Review
Browse files

Merge "Skip dream overlay animations when exiting low light" into tm-qpr-dev

parents d5ead3ae e412b167
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -182,6 +182,18 @@ constructor(
            }
    }

    /**
     * Ends the dream content and dream overlay animations, if they're currently running.
     * @see [AnimatorSet.end]
     */
    fun endAnimations() {
        mAnimator =
            mAnimator?.let {
                it.end()
                null
            }
    }

    private fun blurAnimator(
        view: View,
        fromBlurRadius: Float,
+25 −0
Original line number Diff line number Diff line
@@ -124,6 +124,23 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
                }
            };

    /**
     * If true, overlay entry animations should be skipped once.
     *
     * This is turned on when exiting low light and should be turned off once the entry animations
     * are skipped once.
     */
    private boolean mSkipEntryAnimations;

    private final DreamOverlayStateController.Callback
            mDreamOverlayStateCallback =
            new DreamOverlayStateController.Callback() {
                @Override
                public void onExitLowLight() {
                    mSkipEntryAnimations = true;
                }
            };

    @Inject
    public DreamOverlayContainerViewController(
            DreamOverlayContainerView containerView,
@@ -165,6 +182,7 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve

    @Override
    protected void onInit() {
        mStateController.addCallback(mDreamOverlayStateCallback);
        mStatusBarViewController.init();
        mComplicationHostViewController.init();
        mDreamOverlayAnimationsController.init(mView);
@@ -179,6 +197,13 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
        // Start dream entry animations. Skip animations for low light clock.
        if (!mStateController.isLowLightActive()) {
            mDreamOverlayAnimationsController.startEntryAnimations();

            if (mSkipEntryAnimations) {
                // If we're transitioning from the low light dream back to the user dream, skip the
                // overlay animations and show immediately.
                mDreamOverlayAnimationsController.endAnimations();
                mSkipEntryAnimations = false;
            }
        }
    }

+10 −0
Original line number Diff line number Diff line
@@ -83,6 +83,12 @@ public class DreamOverlayStateController implements
         */
        default void onAvailableComplicationTypesChanged() {
        }

        /**
         * Called when the low light dream is exiting and transitioning back to the user dream.
         */
        default void onExitLowLight() {
        }
    }

    private final Executor mExecutor;
@@ -278,6 +284,10 @@ public class DreamOverlayStateController implements
     * @param active {@code true} if low light mode is active, {@code false} otherwise.
     */
    public void setLowLightActive(boolean active) {
        if (isLowLightActive() && !active) {
            // Notify that we're exiting low light only on the transition from active to not active.
            mCallbacks.forEach(Callback::onExitLowLight);
        }
        modifyState(active ? OP_SET_STATE : OP_CLEAR_STATE, STATE_LOW_LIGHT_ACTIVE);
    }

+21 −0
Original line number Diff line number Diff line
@@ -208,6 +208,27 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
        verify(mAnimationsController, never()).startEntryAnimations();
    }

    @Test
    public void testSkipEntryAnimationsWhenExitingLowLight() {
        ArgumentCaptor<DreamOverlayStateController.Callback> callbackCaptor =
                ArgumentCaptor.forClass(DreamOverlayStateController.Callback.class);
        when(mStateController.isLowLightActive()).thenReturn(false);

        // Call onInit so that the callback is added.
        mController.onInit();
        verify(mStateController).addCallback(callbackCaptor.capture());

        // Send the signal that low light is exiting
        callbackCaptor.getValue().onExitLowLight();

        // View is attached to trigger animations.
        mController.onViewAttached();

        // Entry animations should be started then immediately ended to skip to the end.
        verify(mAnimationsController).startEntryAnimations();
        verify(mAnimationsController).endAnimations();
    }

    @Test
    public void testCancelDreamEntryAnimationsOnDetached() {
        mController.onViewAttached();
+24 −0
Original line number Diff line number Diff line
@@ -250,6 +250,30 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {
        assertThat(stateController.isLowLightActive()).isTrue();
    }

    @Test
    public void testNotifyLowLightExit() {
        final DreamOverlayStateController stateController =
                new DreamOverlayStateController(mExecutor, true);

        stateController.addCallback(mCallback);
        mExecutor.runAllReady();
        assertThat(stateController.isLowLightActive()).isFalse();

        // Turn low light on then off to trigger the exiting callback.
        stateController.setLowLightActive(true);
        stateController.setLowLightActive(false);

        // Callback was only called once, when
        mExecutor.runAllReady();
        verify(mCallback, times(1)).onExitLowLight();
        assertThat(stateController.isLowLightActive()).isFalse();

        // Set with false again, which should not cause the callback to trigger again.
        stateController.setLowLightActive(false);
        mExecutor.runAllReady();
        verify(mCallback, times(1)).onExitLowLight();
    }

    @Test
    public void testNotifyEntryAnimationsFinishedChanged() {
        final DreamOverlayStateController stateController =