Merge "Skip dream overlay animations when exiting low light" into tm-qpr-dev
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user