Merge "Add dream overlay open animation." into tm-qpr-dev am: 8b9a75e599
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20246466 Change-Id: I66d1c17aad6ce86d4bb1300a6b2d254112acfaf1 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -76,6 +76,9 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
private final int mDreamOverlayMaxTranslationY;
|
private final int mDreamOverlayMaxTranslationY;
|
||||||
private final BouncerCallbackInteractor mBouncerCallbackInteractor;
|
private final BouncerCallbackInteractor mBouncerCallbackInteractor;
|
||||||
|
|
||||||
|
private final int mOpenAnimationDuration;
|
||||||
|
private final int mOpenAnimationDelay;
|
||||||
|
|
||||||
private long mJitterStartTimeMillis;
|
private long mJitterStartTimeMillis;
|
||||||
|
|
||||||
private boolean mBouncerAnimating;
|
private boolean mBouncerAnimating;
|
||||||
@@ -134,7 +137,9 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
@Named(DreamOverlayModule.BURN_IN_PROTECTION_UPDATE_INTERVAL) long
|
@Named(DreamOverlayModule.BURN_IN_PROTECTION_UPDATE_INTERVAL) long
|
||||||
burnInProtectionUpdateInterval,
|
burnInProtectionUpdateInterval,
|
||||||
@Named(DreamOverlayModule.MILLIS_UNTIL_FULL_JITTER) long millisUntilFullJitter,
|
@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);
|
super(containerView);
|
||||||
mDreamOverlayContentView = contentView;
|
mDreamOverlayContentView = contentView;
|
||||||
mStatusBarViewController = statusBarViewController;
|
mStatusBarViewController = statusBarViewController;
|
||||||
@@ -146,6 +151,7 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
R.dimen.dream_overlay_y_offset);
|
R.dimen.dream_overlay_y_offset);
|
||||||
final View view = mComplicationHostViewController.getView();
|
final View view = mComplicationHostViewController.getView();
|
||||||
|
|
||||||
|
mDreamOverlayContentView.setAlpha(0f);
|
||||||
mDreamOverlayContentView.addView(view,
|
mDreamOverlayContentView.addView(view,
|
||||||
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT));
|
ViewGroup.LayoutParams.MATCH_PARENT));
|
||||||
@@ -155,6 +161,8 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
mBurnInProtectionUpdateInterval = burnInProtectionUpdateInterval;
|
mBurnInProtectionUpdateInterval = burnInProtectionUpdateInterval;
|
||||||
mMillisUntilFullJitter = millisUntilFullJitter;
|
mMillisUntilFullJitter = millisUntilFullJitter;
|
||||||
mBouncerCallbackInteractor = bouncerCallbackInteractor;
|
mBouncerCallbackInteractor = bouncerCallbackInteractor;
|
||||||
|
mOpenAnimationDuration = openAnimDuration;
|
||||||
|
mOpenAnimationDelay = openAnimDelay;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -172,6 +180,11 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
bouncer.addBouncerExpansionCallback(mBouncerExpansionCallback);
|
bouncer.addBouncerExpansionCallback(mBouncerExpansionCallback);
|
||||||
}
|
}
|
||||||
mBouncerCallbackInteractor.addBouncerExpansionCallback(mBouncerExpansionCallback);
|
mBouncerCallbackInteractor.addBouncerExpansionCallback(mBouncerExpansionCallback);
|
||||||
|
|
||||||
|
mDreamOverlayContentView.animate()
|
||||||
|
.alpha(1f)
|
||||||
|
.setStartDelay(mOpenAnimationDelay)
|
||||||
|
.setDuration(mOpenAnimationDuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import com.android.systemui.R;
|
|||||||
import com.android.systemui.dagger.qualifiers.Main;
|
import com.android.systemui.dagger.qualifiers.Main;
|
||||||
import com.android.systemui.dreams.DreamOverlayStatusBarItemsProvider.StatusBarItem;
|
import com.android.systemui.dreams.DreamOverlayStatusBarItemsProvider.StatusBarItem;
|
||||||
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
|
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.IndividualSensorPrivacyController;
|
||||||
import com.android.systemui.statusbar.policy.NextAlarmController;
|
import com.android.systemui.statusbar.policy.NextAlarmController;
|
||||||
import com.android.systemui.statusbar.policy.ZenModeController;
|
import com.android.systemui.statusbar.policy.ZenModeController;
|
||||||
@@ -58,6 +59,7 @@ import java.util.concurrent.Executor;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* View controller for {@link DreamOverlayStatusBarView}.
|
* View controller for {@link DreamOverlayStatusBarView}.
|
||||||
@@ -83,6 +85,9 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
|
|||||||
|
|
||||||
private boolean mIsAttached;
|
private boolean mIsAttached;
|
||||||
|
|
||||||
|
private final int mOpenAnimationDuration;
|
||||||
|
private final int mOpenAnimationDelay;
|
||||||
|
|
||||||
private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
|
private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
|
||||||
.clearCapabilities()
|
.clearCapabilities()
|
||||||
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
|
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
|
||||||
@@ -152,7 +157,9 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
|
|||||||
ZenModeController zenModeController,
|
ZenModeController zenModeController,
|
||||||
StatusBarWindowStateController statusBarWindowStateController,
|
StatusBarWindowStateController statusBarWindowStateController,
|
||||||
DreamOverlayStatusBarItemsProvider statusBarItemsProvider,
|
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);
|
super(view);
|
||||||
mResources = resources;
|
mResources = resources;
|
||||||
mMainExecutor = mainExecutor;
|
mMainExecutor = mainExecutor;
|
||||||
@@ -167,6 +174,10 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
|
|||||||
mStatusBarItemsProvider = statusBarItemsProvider;
|
mStatusBarItemsProvider = statusBarItemsProvider;
|
||||||
mZenModeController = zenModeController;
|
mZenModeController = zenModeController;
|
||||||
mDreamOverlayStateController = dreamOverlayStateController;
|
mDreamOverlayStateController = dreamOverlayStateController;
|
||||||
|
mOpenAnimationDuration = openAnimDuration;
|
||||||
|
mOpenAnimationDelay = openAnimDelay;
|
||||||
|
|
||||||
|
mView.setAlpha(0f);
|
||||||
|
|
||||||
// Register to receive show/hide updates for the system status bar. Our custom status bar
|
// 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.
|
// 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();
|
updateLowLightState();
|
||||||
|
|
||||||
mTouchInsetSession.addViewToTracking(mView);
|
mTouchInsetSession.addViewToTracking(mView);
|
||||||
|
|
||||||
|
mView.animate()
|
||||||
|
.alpha(1f)
|
||||||
|
.setStartDelay(mOpenAnimationDelay)
|
||||||
|
.setDuration(mOpenAnimationDuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ public abstract class DreamOverlayModule {
|
|||||||
public static final String BURN_IN_PROTECTION_UPDATE_INTERVAL =
|
public static final String BURN_IN_PROTECTION_UPDATE_INTERVAL =
|
||||||
"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 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
|
@Provides
|
||||||
@@ -114,6 +116,28 @@ public abstract class DreamOverlayModule {
|
|||||||
return resources.getInteger(R.integer.config_dreamOverlayMillisUntilFullJitter);
|
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
|
@Provides
|
||||||
@DreamOverlayComponent.DreamOverlayScope
|
@DreamOverlayComponent.DreamOverlayScope
|
||||||
static LifecycleOwner providesLifecycleOwner(Lazy<LifecycleRegistry> lifecycleRegistryLazy) {
|
static LifecycleOwner providesLifecycleOwner(Lazy<LifecycleRegistry> lifecycleRegistryLazy) {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.systemui.dreams;
|
|||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyLong;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
@@ -28,6 +29,7 @@ import android.content.res.Resources;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.ViewPropertyAnimator;
|
||||||
import android.view.ViewRootImpl;
|
import android.view.ViewRootImpl;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
|
|
||||||
@@ -92,6 +94,9 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
|
|||||||
@Mock
|
@Mock
|
||||||
BouncerCallbackInteractor mBouncerCallbackInteractor;
|
BouncerCallbackInteractor mBouncerCallbackInteractor;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
ViewPropertyAnimator mViewPropertyAnimator;
|
||||||
|
|
||||||
DreamOverlayContainerViewController mController;
|
DreamOverlayContainerViewController mController;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -100,8 +105,12 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
when(mDreamOverlayContainerView.getResources()).thenReturn(mResources);
|
when(mDreamOverlayContainerView.getResources()).thenReturn(mResources);
|
||||||
when(mDreamOverlayContainerView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
|
when(mDreamOverlayContainerView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
|
||||||
|
when(mDreamOverlayContainerView.animate()).thenReturn(mViewPropertyAnimator);
|
||||||
when(mStatusBarKeyguardViewManager.getBouncer()).thenReturn(mBouncer);
|
when(mStatusBarKeyguardViewManager.getBouncer()).thenReturn(mBouncer);
|
||||||
when(mDreamOverlayContainerView.getViewRootImpl()).thenReturn(mViewRoot);
|
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(
|
mController = new DreamOverlayContainerViewController(
|
||||||
mDreamOverlayContainerView,
|
mDreamOverlayContainerView,
|
||||||
@@ -115,7 +124,9 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
|
|||||||
MAX_BURN_IN_OFFSET,
|
MAX_BURN_IN_OFFSET,
|
||||||
BURN_IN_PROTECTION_UPDATE_INTERVAL,
|
BURN_IN_PROTECTION_UPDATE_INTERVAL,
|
||||||
MILLIS_UNTIL_FULL_JITTER,
|
MILLIS_UNTIL_FULL_JITTER,
|
||||||
mBouncerCallbackInteractor);
|
mBouncerCallbackInteractor,
|
||||||
|
100 /*openAnimationDuration*/,
|
||||||
|
100 /*openAnimationDelay*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
|
|||||||
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
|
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyLong;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.ArgumentMatchers.isNull;
|
import static org.mockito.ArgumentMatchers.isNull;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
@@ -38,6 +40,7 @@ import android.net.NetworkRequest;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.ViewPropertyAnimator;
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
@@ -104,6 +107,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
|
|||||||
View mStatusBarItemView;
|
View mStatusBarItemView;
|
||||||
@Mock
|
@Mock
|
||||||
DreamOverlayStateController mDreamOverlayStateController;
|
DreamOverlayStateController mDreamOverlayStateController;
|
||||||
|
@Mock
|
||||||
|
ViewPropertyAnimator mViewPropertyAnimator;
|
||||||
|
|
||||||
private final Executor mMainExecutor = Runnable::run;
|
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))
|
when(mResources.getString(R.string.dream_overlay_status_bar_notification_indicator))
|
||||||
.thenReturn(NOTIFICATION_INDICATOR_FORMATTER_STRING);
|
.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(
|
mController = new DreamOverlayStatusBarViewController(
|
||||||
mView,
|
mView,
|
||||||
@@ -130,7 +139,9 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
|
|||||||
mZenModeController,
|
mZenModeController,
|
||||||
mStatusBarWindowStateController,
|
mStatusBarWindowStateController,
|
||||||
mDreamOverlayStatusBarItemsProvider,
|
mDreamOverlayStatusBarItemsProvider,
|
||||||
mDreamOverlayStateController);
|
mDreamOverlayStateController,
|
||||||
|
100 /*openAnimationDuration*/,
|
||||||
|
100 /*openAnimationDelay*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -272,7 +283,9 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
|
|||||||
mZenModeController,
|
mZenModeController,
|
||||||
mStatusBarWindowStateController,
|
mStatusBarWindowStateController,
|
||||||
mDreamOverlayStatusBarItemsProvider,
|
mDreamOverlayStatusBarItemsProvider,
|
||||||
mDreamOverlayStateController);
|
mDreamOverlayStateController,
|
||||||
|
100 /*openAnimationDuration*/,
|
||||||
|
100 /*openAnimationDelay*/);
|
||||||
controller.onViewAttached();
|
controller.onViewAttached();
|
||||||
verify(mView, never()).showIcon(
|
verify(mView, never()).showIcon(
|
||||||
eq(DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS), eq(true), any());
|
eq(DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS), eq(true), any());
|
||||||
|
|||||||
Reference in New Issue
Block a user