Merge "Implement dream to bouncer animation." into tm-dev am: 7dc1b2d651
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17138853 Change-Id: Iea77ed40e7d8db06449d9f235faaf8147778e8a1
This commit is contained in:
@@ -27,6 +27,9 @@ import com.android.systemui.dagger.qualifiers.Main;
|
|||||||
import com.android.systemui.dreams.complication.ComplicationHostViewController;
|
import com.android.systemui.dreams.complication.ComplicationHostViewController;
|
||||||
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.dreams.dagger.DreamOverlayModule;
|
||||||
|
import com.android.systemui.statusbar.BlurUtils;
|
||||||
|
import com.android.systemui.statusbar.phone.KeyguardBouncer;
|
||||||
|
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||||
import com.android.systemui.util.ViewController;
|
import com.android.systemui.util.ViewController;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
@@ -38,6 +41,8 @@ import javax.inject.Named;
|
|||||||
@DreamOverlayComponent.DreamOverlayScope
|
@DreamOverlayComponent.DreamOverlayScope
|
||||||
public class DreamOverlayContainerViewController extends ViewController<DreamOverlayContainerView> {
|
public class DreamOverlayContainerViewController extends ViewController<DreamOverlayContainerView> {
|
||||||
private final DreamOverlayStatusBarViewController mStatusBarViewController;
|
private final DreamOverlayStatusBarViewController mStatusBarViewController;
|
||||||
|
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||||
|
private final BlurUtils mBlurUtils;
|
||||||
|
|
||||||
private final ComplicationHostViewController mComplicationHostViewController;
|
private final ComplicationHostViewController mComplicationHostViewController;
|
||||||
|
|
||||||
@@ -60,12 +65,57 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
|
|
||||||
private long mJitterStartTimeMillis;
|
private long mJitterStartTimeMillis;
|
||||||
|
|
||||||
|
private boolean mBouncerAnimating;
|
||||||
|
|
||||||
|
private final KeyguardBouncer.BouncerExpansionCallback mBouncerExpansionCallback =
|
||||||
|
new KeyguardBouncer.BouncerExpansionCallback() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartingToShow() {
|
||||||
|
mBouncerAnimating = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartingToHide() {
|
||||||
|
mBouncerAnimating = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFullyHidden() {
|
||||||
|
mBouncerAnimating = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFullyShown() {
|
||||||
|
mBouncerAnimating = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onExpansionChanged(float bouncerHideAmount) {
|
||||||
|
if (!mBouncerAnimating) return;
|
||||||
|
final int blurRadius =
|
||||||
|
(int) mBlurUtils.blurRadiusOfRatio(1 - bouncerHideAmount);
|
||||||
|
updateTransitionState(blurRadius, bouncerHideAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onVisibilityChanged(boolean isVisible) {
|
||||||
|
// The bouncer may be hidden abruptly without triggering onExpansionChanged.
|
||||||
|
// In this case, we should reset the transition state.
|
||||||
|
if (!isVisible) {
|
||||||
|
updateTransitionState(0, 1f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public DreamOverlayContainerViewController(
|
public DreamOverlayContainerViewController(
|
||||||
DreamOverlayContainerView containerView,
|
DreamOverlayContainerView containerView,
|
||||||
ComplicationHostViewController complicationHostViewController,
|
ComplicationHostViewController complicationHostViewController,
|
||||||
@Named(DreamOverlayModule.DREAM_OVERLAY_CONTENT_VIEW) ViewGroup contentView,
|
@Named(DreamOverlayModule.DREAM_OVERLAY_CONTENT_VIEW) ViewGroup contentView,
|
||||||
DreamOverlayStatusBarViewController statusBarViewController,
|
DreamOverlayStatusBarViewController statusBarViewController,
|
||||||
|
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
|
||||||
|
BlurUtils blurUtils,
|
||||||
@Main Handler handler,
|
@Main Handler handler,
|
||||||
@Named(DreamOverlayModule.MAX_BURN_IN_OFFSET) int maxBurnInOffset,
|
@Named(DreamOverlayModule.MAX_BURN_IN_OFFSET) int maxBurnInOffset,
|
||||||
@Named(DreamOverlayModule.BURN_IN_PROTECTION_UPDATE_INTERVAL) long
|
@Named(DreamOverlayModule.BURN_IN_PROTECTION_UPDATE_INTERVAL) long
|
||||||
@@ -74,6 +124,8 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
super(containerView);
|
super(containerView);
|
||||||
mDreamOverlayContentView = contentView;
|
mDreamOverlayContentView = contentView;
|
||||||
mStatusBarViewController = statusBarViewController;
|
mStatusBarViewController = statusBarViewController;
|
||||||
|
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
|
||||||
|
mBlurUtils = blurUtils;
|
||||||
|
|
||||||
mComplicationHostViewController = complicationHostViewController;
|
mComplicationHostViewController = complicationHostViewController;
|
||||||
final View view = mComplicationHostViewController.getView();
|
final View view = mComplicationHostViewController.getView();
|
||||||
@@ -98,11 +150,19 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
protected void onViewAttached() {
|
protected void onViewAttached() {
|
||||||
mJitterStartTimeMillis = System.currentTimeMillis();
|
mJitterStartTimeMillis = System.currentTimeMillis();
|
||||||
mHandler.postDelayed(this::updateBurnInOffsets, mBurnInProtectionUpdateInterval);
|
mHandler.postDelayed(this::updateBurnInOffsets, mBurnInProtectionUpdateInterval);
|
||||||
|
final KeyguardBouncer bouncer = mStatusBarKeyguardViewManager.getBouncer();
|
||||||
|
if (bouncer != null) {
|
||||||
|
bouncer.addBouncerExpansionCallback(mBouncerExpansionCallback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onViewDetached() {
|
protected void onViewDetached() {
|
||||||
mHandler.removeCallbacks(this::updateBurnInOffsets);
|
mHandler.removeCallbacks(this::updateBurnInOffsets);
|
||||||
|
final KeyguardBouncer bouncer = mStatusBarKeyguardViewManager.getBouncer();
|
||||||
|
if (bouncer != null) {
|
||||||
|
bouncer.removeBouncerExpansionCallback(mBouncerExpansionCallback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
View getContainerView() {
|
View getContainerView() {
|
||||||
@@ -131,4 +191,9 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve
|
|||||||
|
|
||||||
mHandler.postDelayed(this::updateBurnInOffsets, mBurnInProtectionUpdateInterval);
|
mHandler.postDelayed(this::updateBurnInOffsets, mBurnInProtectionUpdateInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateTransitionState(int blurRadiusPixels, float alpha) {
|
||||||
|
mBlurUtils.applyBlur(mView.getViewRootImpl(), blurRadiusPixels, false);
|
||||||
|
mView.setAlpha(alpha);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -606,11 +606,47 @@ public class KeyguardBouncer {
|
|||||||
mResetCallbacks.remove(callback);
|
mResetCallbacks.remove(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a callback to listen to bouncer expansion updates.
|
||||||
|
*/
|
||||||
|
public void addBouncerExpansionCallback(BouncerExpansionCallback callback) {
|
||||||
|
if (!mExpansionCallbacks.contains(callback)) {
|
||||||
|
mExpansionCallbacks.add(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a previously added callback. If the callback was never added, this methood
|
||||||
|
* does nothing.
|
||||||
|
*/
|
||||||
|
public void removeBouncerExpansionCallback(BouncerExpansionCallback callback) {
|
||||||
|
mExpansionCallbacks.remove(callback);
|
||||||
|
}
|
||||||
|
|
||||||
public interface BouncerExpansionCallback {
|
public interface BouncerExpansionCallback {
|
||||||
void onFullyShown();
|
/**
|
||||||
void onStartingToHide();
|
* Invoked when the bouncer expansion reaches {@link KeyguardBouncer#EXPANSION_VISIBLE}.
|
||||||
void onStartingToShow();
|
*/
|
||||||
void onFullyHidden();
|
default void onFullyShown() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when the bouncer is starting to transition to a hidden state.
|
||||||
|
*/
|
||||||
|
default void onStartingToHide() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when the bouncer is starting to transition to a visible state.
|
||||||
|
*/
|
||||||
|
default void onStartingToShow() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when the bouncer expansion reaches {@link KeyguardBouncer#EXPANSION_HIDDEN}.
|
||||||
|
*/
|
||||||
|
default void onFullyHidden() {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* From 0f {@link KeyguardBouncer#EXPANSION_VISIBLE} when fully visible
|
* From 0f {@link KeyguardBouncer#EXPANSION_VISIBLE} when fully visible
|
||||||
|
|||||||
@@ -17,7 +17,10 @@
|
|||||||
package com.android.systemui.dreams;
|
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.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@@ -25,12 +28,17 @@ 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.ViewRootImpl;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.dreams.complication.ComplicationHostViewController;
|
import com.android.systemui.dreams.complication.ComplicationHostViewController;
|
||||||
|
import com.android.systemui.statusbar.BlurUtils;
|
||||||
|
import com.android.systemui.statusbar.phone.KeyguardBouncer;
|
||||||
|
import com.android.systemui.statusbar.phone.KeyguardBouncer.BouncerExpansionCallback;
|
||||||
|
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -67,6 +75,18 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
|
|||||||
@Mock
|
@Mock
|
||||||
Handler mHandler;
|
Handler mHandler;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
BlurUtils mBlurUtils;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
KeyguardBouncer mBouncer;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
ViewRootImpl mViewRoot;
|
||||||
|
|
||||||
DreamOverlayContainerViewController mController;
|
DreamOverlayContainerViewController mController;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -75,12 +95,16 @@ 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(mStatusBarKeyguardViewManager.getBouncer()).thenReturn(mBouncer);
|
||||||
|
when(mDreamOverlayContainerView.getViewRootImpl()).thenReturn(mViewRoot);
|
||||||
|
|
||||||
mController = new DreamOverlayContainerViewController(
|
mController = new DreamOverlayContainerViewController(
|
||||||
mDreamOverlayContainerView,
|
mDreamOverlayContainerView,
|
||||||
mComplicationHostViewController,
|
mComplicationHostViewController,
|
||||||
mDreamOverlayContentView,
|
mDreamOverlayContentView,
|
||||||
mDreamOverlayStatusBarViewController,
|
mDreamOverlayStatusBarViewController,
|
||||||
|
mStatusBarKeyguardViewManager,
|
||||||
|
mBlurUtils,
|
||||||
mHandler,
|
mHandler,
|
||||||
MAX_BURN_IN_OFFSET,
|
MAX_BURN_IN_OFFSET,
|
||||||
BURN_IN_PROTECTION_UPDATE_INTERVAL,
|
BURN_IN_PROTECTION_UPDATE_INTERVAL,
|
||||||
@@ -125,4 +149,34 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
|
|||||||
runnableCaptor.getValue().run();
|
runnableCaptor.getValue().run();
|
||||||
verify(mHandler).postDelayed(runnableCaptor.getValue(), BURN_IN_PROTECTION_UPDATE_INTERVAL);
|
verify(mHandler).postDelayed(runnableCaptor.getValue(), BURN_IN_PROTECTION_UPDATE_INTERVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBouncerAnimation_doesNotApply() {
|
||||||
|
final ArgumentCaptor<BouncerExpansionCallback> bouncerExpansionCaptor =
|
||||||
|
ArgumentCaptor.forClass(BouncerExpansionCallback.class);
|
||||||
|
mController.onViewAttached();
|
||||||
|
verify(mBouncer).addBouncerExpansionCallback(bouncerExpansionCaptor.capture());
|
||||||
|
|
||||||
|
bouncerExpansionCaptor.getValue().onExpansionChanged(0.5f);
|
||||||
|
verify(mBlurUtils, never()).applyBlur(eq(mViewRoot), anyInt(), eq(false));
|
||||||
|
verify(mDreamOverlayContainerView, never()).setAlpha(anyFloat());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBouncerAnimation_updateBlurAndAlpha() {
|
||||||
|
final ArgumentCaptor<BouncerExpansionCallback> bouncerExpansionCaptor =
|
||||||
|
ArgumentCaptor.forClass(BouncerExpansionCallback.class);
|
||||||
|
mController.onViewAttached();
|
||||||
|
verify(mBouncer).addBouncerExpansionCallback(bouncerExpansionCaptor.capture());
|
||||||
|
|
||||||
|
final float blurRadius = 1337f;
|
||||||
|
when(mBlurUtils.blurRadiusOfRatio(anyFloat())).thenReturn(blurRadius);
|
||||||
|
|
||||||
|
bouncerExpansionCaptor.getValue().onStartingToShow();
|
||||||
|
final float bouncerHideAmount = 0.1f;
|
||||||
|
bouncerExpansionCaptor.getValue().onExpansionChanged(bouncerHideAmount);
|
||||||
|
verify(mBlurUtils).blurRadiusOfRatio(1 - bouncerHideAmount);
|
||||||
|
verify(mBlurUtils).applyBlur(mViewRoot, (int) blurRadius, false);
|
||||||
|
verify(mDreamOverlayContainerView).setAlpha(bouncerHideAmount);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,9 @@
|
|||||||
|
|
||||||
package com.android.systemui.statusbar.phone;
|
package com.android.systemui.statusbar.phone;
|
||||||
|
|
||||||
|
import static com.android.systemui.statusbar.phone.KeyguardBouncer.EXPANSION_HIDDEN;
|
||||||
|
import static com.android.systemui.statusbar.phone.KeyguardBouncer.EXPANSION_VISIBLE;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
@@ -24,9 +27,11 @@ import static org.mockito.ArgumentMatchers.anyInt;
|
|||||||
import static org.mockito.ArgumentMatchers.anyLong;
|
import static org.mockito.ArgumentMatchers.anyLong;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.doAnswer;
|
import static org.mockito.Mockito.doAnswer;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.reset;
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||||
@@ -53,6 +58,7 @@ import com.android.systemui.SysuiTestCase;
|
|||||||
import com.android.systemui.classifier.FalsingCollector;
|
import com.android.systemui.classifier.FalsingCollector;
|
||||||
import com.android.systemui.keyguard.DismissCallbackRegistry;
|
import com.android.systemui.keyguard.DismissCallbackRegistry;
|
||||||
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
|
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
|
||||||
|
import com.android.systemui.statusbar.phone.KeyguardBouncer.BouncerExpansionCallback;
|
||||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
@@ -62,6 +68,7 @@ import org.junit.Test;
|
|||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.Mockito;
|
||||||
import org.mockito.junit.MockitoJUnit;
|
import org.mockito.junit.MockitoJUnit;
|
||||||
import org.mockito.junit.MockitoRule;
|
import org.mockito.junit.MockitoRule;
|
||||||
|
|
||||||
@@ -79,7 +86,7 @@ public class KeyguardBouncerTest extends SysuiTestCase {
|
|||||||
@Mock
|
@Mock
|
||||||
private KeyguardHostViewController mKeyguardHostViewController;
|
private KeyguardHostViewController mKeyguardHostViewController;
|
||||||
@Mock
|
@Mock
|
||||||
private KeyguardBouncer.BouncerExpansionCallback mExpansionCallback;
|
private BouncerExpansionCallback mExpansionCallback;
|
||||||
@Mock
|
@Mock
|
||||||
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||||
@Mock
|
@Mock
|
||||||
@@ -197,11 +204,11 @@ public class KeyguardBouncerTest extends SysuiTestCase {
|
|||||||
mBouncer.ensureView();
|
mBouncer.ensureView();
|
||||||
mBouncer.setExpansion(0.5f);
|
mBouncer.setExpansion(0.5f);
|
||||||
|
|
||||||
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);
|
mBouncer.setExpansion(EXPANSION_HIDDEN);
|
||||||
verify(mFalsingCollector).onBouncerHidden();
|
verify(mFalsingCollector).onBouncerHidden();
|
||||||
verify(mExpansionCallback).onFullyHidden();
|
verify(mExpansionCallback).onFullyHidden();
|
||||||
|
|
||||||
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
|
mBouncer.setExpansion(EXPANSION_VISIBLE);
|
||||||
verify(mFalsingCollector).onBouncerShown();
|
verify(mFalsingCollector).onBouncerShown();
|
||||||
verify(mExpansionCallback).onFullyShown();
|
verify(mExpansionCallback).onFullyShown();
|
||||||
|
|
||||||
@@ -410,11 +417,11 @@ public class KeyguardBouncerTest extends SysuiTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testInTransit_whenTranslation() {
|
public void testInTransit_whenTranslation() {
|
||||||
mBouncer.show(true);
|
mBouncer.show(true);
|
||||||
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);
|
mBouncer.setExpansion(EXPANSION_HIDDEN);
|
||||||
assertThat(mBouncer.inTransit()).isFalse();
|
assertThat(mBouncer.inTransit()).isFalse();
|
||||||
mBouncer.setExpansion(0.5f);
|
mBouncer.setExpansion(0.5f);
|
||||||
assertThat(mBouncer.inTransit()).isTrue();
|
assertThat(mBouncer.inTransit()).isTrue();
|
||||||
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
|
mBouncer.setExpansion(EXPANSION_VISIBLE);
|
||||||
assertThat(mBouncer.inTransit()).isFalse();
|
assertThat(mBouncer.inTransit()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,4 +442,37 @@ public class KeyguardBouncerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
verify(mKeyguardHostViewController).updateKeyguardPosition(1.0f);
|
verify(mKeyguardHostViewController).updateKeyguardPosition(1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExpansion_notifiesCallback() {
|
||||||
|
mBouncer.ensureView();
|
||||||
|
mBouncer.setExpansion(0.5f);
|
||||||
|
|
||||||
|
final BouncerExpansionCallback callback = mock(BouncerExpansionCallback.class);
|
||||||
|
mBouncer.addBouncerExpansionCallback(callback);
|
||||||
|
|
||||||
|
mBouncer.setExpansion(EXPANSION_HIDDEN);
|
||||||
|
verify(callback).onFullyHidden();
|
||||||
|
verify(callback).onExpansionChanged(EXPANSION_HIDDEN);
|
||||||
|
|
||||||
|
Mockito.clearInvocations(callback);
|
||||||
|
mBouncer.setExpansion(EXPANSION_VISIBLE);
|
||||||
|
verify(callback).onFullyShown();
|
||||||
|
verify(callback).onExpansionChanged(EXPANSION_VISIBLE);
|
||||||
|
|
||||||
|
Mockito.clearInvocations(callback);
|
||||||
|
float bouncerHideAmount = 0.9f;
|
||||||
|
// Ensure the callback only triggers once despite multiple calls to setExpansion
|
||||||
|
// with the same value.
|
||||||
|
mBouncer.setExpansion(bouncerHideAmount);
|
||||||
|
mBouncer.setExpansion(bouncerHideAmount);
|
||||||
|
verify(callback, times(1)).onStartingToHide();
|
||||||
|
verify(callback, times(1)).onExpansionChanged(bouncerHideAmount);
|
||||||
|
|
||||||
|
Mockito.clearInvocations(callback);
|
||||||
|
mBouncer.removeBouncerExpansionCallback(callback);
|
||||||
|
bouncerHideAmount = 0.5f;
|
||||||
|
mBouncer.setExpansion(bouncerHideAmount);
|
||||||
|
verify(callback, never()).onExpansionChanged(bouncerHideAmount);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user