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

Commit 9a868a7d authored by Darrell Shi's avatar Darrell Shi
Browse files

Add dream overlay open animation.

After dream content has fully animated in, dream overlay starts fading
in in a duration of 500ms.

Bug: 222507937
Test: start dream on device and observe overlay animate in correctly
Change-Id: Ic648b42c5cb23b6e8e40d32be4185a399d3d44f8
parent 58adc765
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -76,6 +76,9 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
    private final int mDreamOverlayMaxTranslationY;
    private final BouncerCallbackInteractor mBouncerCallbackInteractor;

    private final int mOpenAnimationDuration;
    private final int mOpenAnimationDelay;

    private long mJitterStartTimeMillis;

    private boolean mBouncerAnimating;
@@ -134,7 +137,9 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
            @Named(DreamOverlayModule.BURN_IN_PROTECTION_UPDATE_INTERVAL) long
                    burnInProtectionUpdateInterval,
            @Named(DreamOverlayModule.MILLIS_UNTIL_FULL_JITTER) long millisUntilFullJitter,
            BouncerCallbackInteractor bouncerCallbackInteractor) {
            BouncerCallbackInteractor bouncerCallbackInteractor,
            @Named(DreamOverlayModule.DREAM_OVERLAY_OPEN_ANIMATION_DURATION) int openAnimDuration,
            @Named(DreamOverlayModule.DREAM_OVERLAY_OPEN_ANIMATION_DELAY) int openAnimDelay) {
        super(containerView);
        mDreamOverlayContentView = contentView;
        mStatusBarViewController = statusBarViewController;
@@ -146,6 +151,7 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
                R.dimen.dream_overlay_y_offset);
        final View view = mComplicationHostViewController.getView();

        mDreamOverlayContentView.setAlpha(0f);
        mDreamOverlayContentView.addView(view,
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.MATCH_PARENT));
@@ -155,6 +161,8 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
        mBurnInProtectionUpdateInterval = burnInProtectionUpdateInterval;
        mMillisUntilFullJitter = millisUntilFullJitter;
        mBouncerCallbackInteractor = bouncerCallbackInteractor;
        mOpenAnimationDuration = openAnimDuration;
        mOpenAnimationDelay = openAnimDelay;
    }

    @Override
@@ -172,6 +180,11 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
            bouncer.addBouncerExpansionCallback(mBouncerExpansionCallback);
        }
        mBouncerCallbackInteractor.addBouncerExpansionCallback(mBouncerExpansionCallback);

        mDreamOverlayContentView.animate()
                .alpha(1f)
                .setStartDelay(mOpenAnimationDelay)
                .setDuration(mOpenAnimationDuration);
    }

    @Override
+17 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.DreamOverlayStatusBarItemsProvider.StatusBarItem;
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
import com.android.systemui.dreams.dagger.DreamOverlayModule;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -58,6 +59,7 @@ import java.util.concurrent.Executor;
import java.util.stream.Collectors;

import javax.inject.Inject;
import javax.inject.Named;

/**
 * View controller for {@link DreamOverlayStatusBarView}.
@@ -83,6 +85,9 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve

    private boolean mIsAttached;

    private final int mOpenAnimationDuration;
    private final int mOpenAnimationDelay;

    private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
            .clearCapabilities()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
@@ -152,7 +157,9 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
            ZenModeController zenModeController,
            StatusBarWindowStateController statusBarWindowStateController,
            DreamOverlayStatusBarItemsProvider statusBarItemsProvider,
            DreamOverlayStateController dreamOverlayStateController) {
            DreamOverlayStateController dreamOverlayStateController,
            @Named(DreamOverlayModule.DREAM_OVERLAY_OPEN_ANIMATION_DURATION) int openAnimDuration,
            @Named(DreamOverlayModule.DREAM_OVERLAY_OPEN_ANIMATION_DELAY) int openAnimDelay) {
        super(view);
        mResources = resources;
        mMainExecutor = mainExecutor;
@@ -167,6 +174,10 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
        mStatusBarItemsProvider = statusBarItemsProvider;
        mZenModeController = zenModeController;
        mDreamOverlayStateController = dreamOverlayStateController;
        mOpenAnimationDuration = openAnimDuration;
        mOpenAnimationDelay = openAnimDelay;

        mView.setAlpha(0f);

        // Register to receive show/hide updates for the system status bar. Our custom status bar
        // needs to hide when the system status bar is showing to ovoid overlapping status bars.
@@ -198,6 +209,11 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
        updateLowLightState();

        mTouchInsetSession.addViewToTracking(mView);

        mView.animate()
                .alpha(1f)
                .setStartDelay(mOpenAnimationDelay)
                .setDuration(mOpenAnimationDuration);
    }

    @Override
+24 −0
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ public abstract class DreamOverlayModule {
    public static final String BURN_IN_PROTECTION_UPDATE_INTERVAL =
            "burn_in_protection_update_interval";
    public static final String MILLIS_UNTIL_FULL_JITTER = "millis_until_full_jitter";
    public static final String DREAM_OVERLAY_OPEN_ANIMATION_DURATION = "over_open_anim_duration";
    public static final String DREAM_OVERLAY_OPEN_ANIMATION_DELAY = "over_open_anim_delay";

    /** */
    @Provides
@@ -114,6 +116,28 @@ public abstract class DreamOverlayModule {
        return resources.getInteger(R.integer.config_dreamOverlayMillisUntilFullJitter);
    }

    /**
     * The duration in milliseconds of the dream overlay open animation.
     */
    @Provides
    @Named(DREAM_OVERLAY_OPEN_ANIMATION_DURATION)
    static int providesOverlayOpenAnimationDuration(@Main Resources resources) {
        return resources.getInteger(R.integer.complicationFadeInMs);
    }

    /**
     * The delay in milliseconds before dream overlay starts animating in.
     *
     * We use the dream open animation duration here so overlay starts animating after dream content
     * has fully animated in.
     */
    @Provides
    @Named(DREAM_OVERLAY_OPEN_ANIMATION_DELAY)
    static int providesOverlayOpenAnimationDelay(@Main Resources resources) {
        return resources.getInteger(
                com.android.internal.R.integer.config_dreamOpenAnimationDuration);
    }

    @Provides
    @DreamOverlayComponent.DreamOverlayScope
    static LifecycleOwner providesLifecycleOwner(Lazy<LifecycleRegistry> lifecycleRegistryLazy) {
+12 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.dreams;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -28,6 +29,7 @@ import android.content.res.Resources;
import android.os.Handler;
import android.testing.AndroidTestingRunner;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import android.view.ViewRootImpl;
import android.view.ViewTreeObserver;

@@ -92,6 +94,9 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
    @Mock
    BouncerCallbackInteractor mBouncerCallbackInteractor;

    @Mock
    ViewPropertyAnimator mViewPropertyAnimator;

    DreamOverlayContainerViewController mController;

    @Before
@@ -100,8 +105,12 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {

        when(mDreamOverlayContainerView.getResources()).thenReturn(mResources);
        when(mDreamOverlayContainerView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
        when(mDreamOverlayContainerView.animate()).thenReturn(mViewPropertyAnimator);
        when(mStatusBarKeyguardViewManager.getBouncer()).thenReturn(mBouncer);
        when(mDreamOverlayContainerView.getViewRootImpl()).thenReturn(mViewRoot);
        when(mViewPropertyAnimator.alpha(anyFloat())).thenReturn(mViewPropertyAnimator);
        when(mViewPropertyAnimator.setStartDelay(anyLong())).thenReturn(mViewPropertyAnimator);
        when(mViewPropertyAnimator.setDuration(anyLong())).thenReturn(mViewPropertyAnimator);

        mController = new DreamOverlayContainerViewController(
                mDreamOverlayContainerView,
@@ -115,7 +124,9 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
                MAX_BURN_IN_OFFSET,
                BURN_IN_PROTECTION_UPDATE_INTERVAL,
                MILLIS_UNTIL_FULL_JITTER,
                mBouncerCallbackInteractor);
                mBouncerCallbackInteractor,
                100 /*openAnimationDuration*/,
                100 /*openAnimationDelay*/);
    }

    @Test
+15 −2
Original line number Diff line number Diff line
@@ -20,7 +20,9 @@ import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.never;
@@ -38,6 +40,7 @@ import android.net.NetworkRequest;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.view.View;
import android.view.ViewPropertyAnimator;

import androidx.test.filters.SmallTest;

@@ -104,6 +107,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
    View mStatusBarItemView;
    @Mock
    DreamOverlayStateController mDreamOverlayStateController;
    @Mock
    ViewPropertyAnimator mViewPropertyAnimator;

    private final Executor mMainExecutor = Runnable::run;

@@ -115,6 +120,10 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {

        when(mResources.getString(R.string.dream_overlay_status_bar_notification_indicator))
                .thenReturn(NOTIFICATION_INDICATOR_FORMATTER_STRING);
        when(mView.animate()).thenReturn(mViewPropertyAnimator);
        when(mViewPropertyAnimator.alpha(anyFloat())).thenReturn(mViewPropertyAnimator);
        when(mViewPropertyAnimator.setStartDelay(anyLong())).thenReturn(mViewPropertyAnimator);
        when(mViewPropertyAnimator.setDuration(anyLong())).thenReturn(mViewPropertyAnimator);

        mController = new DreamOverlayStatusBarViewController(
                mView,
@@ -130,7 +139,9 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
                mZenModeController,
                mStatusBarWindowStateController,
                mDreamOverlayStatusBarItemsProvider,
                mDreamOverlayStateController);
                mDreamOverlayStateController,
                100 /*openAnimationDuration*/,
                100 /*openAnimationDelay*/);
    }

    @Test
@@ -272,7 +283,9 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
                mZenModeController,
                mStatusBarWindowStateController,
                mDreamOverlayStatusBarItemsProvider,
                mDreamOverlayStateController);
                mDreamOverlayStateController,
                100 /*openAnimationDuration*/,
                100 /*openAnimationDelay*/);
        controller.onViewAttached();
        verify(mView, never()).showIcon(
                eq(DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS), eq(true), any());