Commit 1436a423 authored by Sinan Sahin's avatar Sinan Sahin Committed by Chromium LUCI CQ

Reland "[Messages] Fix clipping of message banner because of SurfaceView hole"

This is a reland of 6a340039

The SingleActionMessageTest was failing on an L bot because Mockito
couldn't mock WindowAndroid because it has a Display.Mode member, which
is only available on M+. This reland replaces the WindowAndroid with a
Callback<Animator> since we only need one method from that class.

Original change's description:
> [Messages] Fix clipping of message banner because of SurfaceView hole
>
> This CL delegates the Animator#start calls in MessageBannerMediator to
> WindowAndroid#startAnimationOverContent.
>
> Bug: 1159429
> Change-Id: I865e62718efa46eae8e1bf733271854475edaa00
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2628497
> Commit-Queue: Sinan Sahin <sinansahin@google.com>
> Reviewed-by: Theresa  <twellington@chromium.org>
> Reviewed-by: Pavel Yatsuk <pavely@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#843685}

Bug: 1159429
Change-Id: I325340cb845809e963c9df50b217aa9d6f70849e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2633526
Commit-Queue: Sinan Sahin <sinansahin@google.com>
Reviewed-by: default avatarPavel Yatsuk <pavely@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844831}
parent bbbc8589
...@@ -436,7 +436,8 @@ public class RootUiCoordinator ...@@ -436,7 +436,8 @@ public class RootUiCoordinator
new MessageContainerCoordinator(container, getBrowserControlsManager()); new MessageContainerCoordinator(container, getBrowserControlsManager());
mMessageDispatcher = MessagesFactory.createMessageDispatcher(container, mMessageDispatcher = MessagesFactory.createMessageDispatcher(container,
mMessageContainerCoordinator::getMessageMaxTranslation, mMessageContainerCoordinator::getMessageMaxTranslation,
ChromeAccessibilityUtil.get()); ChromeAccessibilityUtil.get(),
mActivity.getWindowAndroid()::startAnimationOverContent);
mMessageQueueMediator = new ChromeMessageQueueMediator( mMessageQueueMediator = new ChromeMessageQueueMediator(
mActivity.getBrowserControlsManager(), mMessageContainerCoordinator, mActivity.getBrowserControlsManager(), mMessageContainerCoordinator,
mActivity.getFullscreenManager(), mLayoutStateProviderOneShotSupplier, mActivity.getFullscreenManager(), mLayoutStateProviderOneShotSupplier,
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
package org.chromium.components.messages; package org.chromium.components.messages;
import android.animation.Animator;
import org.chromium.base.Callback;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.util.AccessibilityUtil; import org.chromium.ui.util.AccessibilityUtil;
...@@ -17,26 +20,31 @@ public class MessageDispatcherImpl implements ManagedMessageDispatcher { ...@@ -17,26 +20,31 @@ public class MessageDispatcherImpl implements ManagedMessageDispatcher {
private final MessageContainer mMessageContainer; private final MessageContainer mMessageContainer;
private final Supplier<Integer> mMessageMaxTranslationSupplier; private final Supplier<Integer> mMessageMaxTranslationSupplier;
private final AccessibilityUtil mAccessibilityUtil; private final AccessibilityUtil mAccessibilityUtil;
private final Callback<Animator> mAnimatorStartCallback;
/** /**
* Build a new message dispatcher * Build a new message dispatcher
* @param messageContainer A container view for displaying message banners. * @param messageContainer A container view for displaying message banners.
* @param messageMaxTranslationSupplier A {@link Supplier} that supplies the maximum translation * @param messageMaxTranslation A {@link Supplier} that supplies the maximum translation Y value
* Y value the message banner can have as a result of the animations or the gestures. * the message banner can have as a result of the animations or the gestures.
* @param accessibilityUtil A util to expose information related to system accessibility state. * @param accessibilityUtil A util to expose information related to system accessibility state.
* @param animatorStartCallback The {@link Callback} that will be used by the message to
* delegate starting the animations to the {@link WindowAndroid}.
*/ */
public MessageDispatcherImpl(MessageContainer messageContainer, public MessageDispatcherImpl(MessageContainer messageContainer,
Supplier<Integer> messageMaxTranslation, AccessibilityUtil accessibilityUtil) { Supplier<Integer> messageMaxTranslation, AccessibilityUtil accessibilityUtil,
Callback<Animator> animatorStartCallback) {
mMessageContainer = messageContainer; mMessageContainer = messageContainer;
mMessageMaxTranslationSupplier = messageMaxTranslation; mMessageMaxTranslationSupplier = messageMaxTranslation;
mAccessibilityUtil = accessibilityUtil; mAccessibilityUtil = accessibilityUtil;
mAnimatorStartCallback = animatorStartCallback;
} }
@Override @Override
public void enqueueMessage(PropertyModel messageProperties) { public void enqueueMessage(PropertyModel messageProperties) {
MessageStateHandler messageStateHandler = MessageStateHandler messageStateHandler =
new SingleActionMessage(mMessageContainer, messageProperties, this::dismissMessage, new SingleActionMessage(mMessageContainer, messageProperties, this::dismissMessage,
mMessageMaxTranslationSupplier, mAccessibilityUtil); mMessageMaxTranslationSupplier, mAccessibilityUtil, mAnimatorStartCallback);
mMessageQueueManager.enqueueMessage(messageStateHandler, messageProperties); mMessageQueueManager.enqueueMessage(messageStateHandler, messageProperties);
} }
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
package org.chromium.components.messages; package org.chromium.components.messages;
import android.animation.Animator;
import org.chromium.base.Callback;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.util.AccessibilityUtil; import org.chromium.ui.util.AccessibilityUtil;
...@@ -19,11 +22,15 @@ public class MessagesFactory { ...@@ -19,11 +22,15 @@ public class MessagesFactory {
* screen, starting at the negative |messageMaxTranslation| y translation to the resting * screen, starting at the negative |messageMaxTranslation| y translation to the resting
* position in the MessageContainer. * position in the MessageContainer.
* @param accessibilityUtil A util to expose information related to system accessibility state. * @param accessibilityUtil A util to expose information related to system accessibility state.
* @param animatorStartCallback The {@link Callback} that will be used by the message to
* delegate starting the animations to the {@link WindowAndroid}.
* @return The constructed ManagedMessageDispatcher. * @return The constructed ManagedMessageDispatcher.
*/ */
public static ManagedMessageDispatcher createMessageDispatcher(MessageContainer container, public static ManagedMessageDispatcher createMessageDispatcher(MessageContainer container,
Supplier<Integer> messageMaxTranslation, AccessibilityUtil accessibilityUtil) { Supplier<Integer> messageMaxTranslation, AccessibilityUtil accessibilityUtil,
return new MessageDispatcherImpl(container, messageMaxTranslation, accessibilityUtil); Callback<Animator> animatorStartCallback) {
return new MessageDispatcherImpl(
container, messageMaxTranslation, accessibilityUtil, animatorStartCallback);
} }
/** /**
......
...@@ -4,12 +4,14 @@ ...@@ -4,12 +4,14 @@
package org.chromium.components.messages; package org.chromium.components.messages;
import android.animation.Animator;
import android.content.res.Resources; import android.content.res.Resources;
import android.view.View; import android.view.View;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
import org.chromium.base.Callback;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor; import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
...@@ -32,15 +34,18 @@ class MessageBannerCoordinator { ...@@ -32,15 +34,18 @@ class MessageBannerCoordinator {
* @param resources The {@link Resources}. * @param resources The {@link Resources}.
* @param messageDismissed The {@link Runnable} that will run if and when the user dismisses the * @param messageDismissed The {@link Runnable} that will run if and when the user dismisses the
* message. * message.
* @param animatorStartCallback The {@link Callback} that will be used to delegate starting the
* animations to {@link WindowAndroid} so the message is not clipped as a result of some
* Android SurfaceView optimization.
*/ */
MessageBannerCoordinator(MessageBannerView view, PropertyModel model, MessageBannerCoordinator(MessageBannerView view, PropertyModel model,
Supplier<Integer> maxTranslationSupplier, Resources resources, Supplier<Integer> maxTranslationSupplier, Resources resources,
Runnable messageDismissed) { Runnable messageDismissed, Callback<Animator> animatorStartCallback) {
mView = view; mView = view;
mModel = model; mModel = model;
PropertyModelChangeProcessor.create(model, view, MessageBannerViewBinder::bind); PropertyModelChangeProcessor.create(model, view, MessageBannerViewBinder::bind);
mMediator = new MessageBannerMediator( mMediator = new MessageBannerMediator(
model, maxTranslationSupplier, resources, messageDismissed); model, maxTranslationSupplier, resources, messageDismissed, animatorStartCallback);
view.setSwipeHandler(mMediator); view.setSwipeHandler(mMediator);
ViewCompat.replaceAccessibilityAction( ViewCompat.replaceAccessibilityAction(
view, AccessibilityActionCompat.ACTION_DISMISS, null, (v, c) -> { view, AccessibilityActionCompat.ACTION_DISMISS, null, (v, c) -> {
......
...@@ -19,6 +19,7 @@ import android.view.MotionEvent; ...@@ -19,6 +19,7 @@ import android.view.MotionEvent;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import org.chromium.base.Callback;
import org.chromium.base.MathUtils; import org.chromium.base.MathUtils;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener; import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener;
...@@ -69,6 +70,7 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -69,6 +70,7 @@ class MessageBannerMediator implements SwipeHandler {
private final float mHorizontalHideThresholdPx; private final float mHorizontalHideThresholdPx;
private final Supplier<Float> mMaxHorizontalTranslationPx; private final Supplier<Float> mMaxHorizontalTranslationPx;
private final Runnable mMessageDismissed; private final Runnable mMessageDismissed;
private final Callback<Animator> mAnimatorStartCallback;
private Animator mAnimation; private Animator mAnimation;
@State @State
...@@ -82,7 +84,8 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -82,7 +84,8 @@ class MessageBannerMediator implements SwipeHandler {
* Constructs the message banner mediator. * Constructs the message banner mediator.
*/ */
MessageBannerMediator(PropertyModel model, Supplier<Integer> maxTranslationSupplier, MessageBannerMediator(PropertyModel model, Supplier<Integer> maxTranslationSupplier,
Resources resources, Runnable messageDismissed) { Resources resources, Runnable messageDismissed,
Callback<Animator> animatorStartCallback) {
mModel = model; mModel = model;
mMaxTranslationYSupplier = maxTranslationSupplier; mMaxTranslationYSupplier = maxTranslationSupplier;
mVerticalHideThresholdPx = mVerticalHideThresholdPx =
...@@ -96,6 +99,7 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -96,6 +99,7 @@ class MessageBannerMediator implements SwipeHandler {
screenWidth / 2); screenWidth / 2);
}; };
mMessageDismissed = messageDismissed; mMessageDismissed = messageDismissed;
mAnimatorStartCallback = animatorStartCallback;
} }
/** /**
...@@ -107,8 +111,7 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -107,8 +111,7 @@ class MessageBannerMediator implements SwipeHandler {
mModel.set(TRANSLATION_Y, -mMaxTranslationYSupplier.get()); mModel.set(TRANSLATION_Y, -mMaxTranslationYSupplier.get());
} }
cancelAnyAnimations(); cancelAnyAnimations();
mAnimation = createAnimation(true, 0, false, messageShown); startAnimation(true, 0, false, messageShown);
mAnimation.start();
} }
/** /**
...@@ -122,8 +125,7 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -122,8 +125,7 @@ class MessageBannerMediator implements SwipeHandler {
} }
cancelAnyAnimations(); cancelAnyAnimations();
mAnimation = createAnimation(true, -mMaxTranslationYSupplier.get(), false, messageHidden); startAnimation(true, -mMaxTranslationYSupplier.get(), false, messageHidden);
mAnimation.start();
} }
void setOnTouchRunnable(Runnable runnable) { void setOnTouchRunnable(Runnable runnable) {
...@@ -189,9 +191,8 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -189,9 +191,8 @@ class MessageBannerMediator implements SwipeHandler {
? 0 ? 0
: MathUtils.flipSignIf(mMaxHorizontalTranslationPx.get(), translationX < 0); : MathUtils.flipSignIf(mMaxHorizontalTranslationPx.get(), translationX < 0);
} }
mAnimation = createAnimation( startAnimation(
isVertical, translateTo, false, translateTo != 0 ? mMessageDismissed : () -> {}); isVertical, translateTo, false, translateTo != 0 ? mMessageDismissed : () -> {});
mAnimation.start();
} }
@Override @Override
...@@ -222,9 +223,8 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -222,9 +223,8 @@ class MessageBannerMediator implements SwipeHandler {
// TODO(crbug.com/1157213): See if we can use velocity to change the animation // TODO(crbug.com/1157213): See if we can use velocity to change the animation
// speed/duration. // speed/duration.
mAnimation = createAnimation(isVertical(mSwipeDirection), translateTo, velocity != 0, startAnimation(isVertical(mSwipeDirection), translateTo, velocity != 0,
translateTo != 0 ? mMessageDismissed : () -> {}); translateTo != 0 ? mMessageDismissed : () -> {});
mAnimation.start();
} }
@Override @Override
...@@ -236,14 +236,13 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -236,14 +236,13 @@ class MessageBannerMediator implements SwipeHandler {
// endregion // endregion
/** /**
* Create an animation. * Create and start an animation.
* @param vertical Whether the message is being animated vertically. * @param vertical Whether the message is being animated vertically.
* @param translateTo Target translation value for the animation. * @param translateTo Target translation value for the animation.
* @param didFling Whether the animation is the result of a fling gesture. * @param didFling Whether the animation is the result of a fling gesture.
* @param onEndCallback Callback that will be called after the animation. * @param onEndCallback Callback that will be called after the animation.
* @return The {@link Animator}
*/ */
private Animator createAnimation( private void startAnimation(
boolean vertical, float translateTo, boolean didFling, Runnable onEndCallback) { boolean vertical, float translateTo, boolean didFling, Runnable onEndCallback) {
final long duration = translateTo == 0 ? ENTER_DURATION_MS : EXIT_DURATION_MS; final long duration = translateTo == 0 ? ENTER_DURATION_MS : EXIT_DURATION_MS;
...@@ -286,7 +285,8 @@ class MessageBannerMediator implements SwipeHandler { ...@@ -286,7 +285,8 @@ class MessageBannerMediator implements SwipeHandler {
} }
}); });
return animatorSet; mAnimation = animatorSet;
mAnimatorStartCallback.onResult(mAnimation);
} }
private void cancelAnyAnimations() { private void cancelAnyAnimations() {
......
...@@ -7,12 +7,15 @@ package org.chromium.components.messages; ...@@ -7,12 +7,15 @@ package org.chromium.components.messages;
import static android.os.Looper.getMainLooper; import static android.os.Looper.getMainLooper;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf; import static org.robolectric.Shadows.shadowOf;
import static org.robolectric.annotation.LooperMode.Mode.PAUSED; import static org.robolectric.annotation.LooperMode.Mode.PAUSED;
import android.animation.Animator;
import android.content.res.Resources; import android.content.res.Resources;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.MotionEvent; import android.view.MotionEvent;
...@@ -28,6 +31,7 @@ import org.mockito.junit.MockitoJUnit; ...@@ -28,6 +31,7 @@ import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.robolectric.annotation.LooperMode; import org.robolectric.annotation.LooperMode;
import org.chromium.base.Callback;
import org.chromium.base.MathUtils; import org.chromium.base.MathUtils;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
...@@ -54,6 +58,8 @@ public class MessageBannerMediatorUnitTest { ...@@ -54,6 +58,8 @@ public class MessageBannerMediatorUnitTest {
private Runnable mShownRunnable; private Runnable mShownRunnable;
@Mock @Mock
private Runnable mHiddenRunnable; private Runnable mHiddenRunnable;
@Mock
private Callback<Animator> mAnimatorStartCallback;
private MessageBannerMediator mMediator; private MessageBannerMediator mMediator;
private PropertyModel mModel; private PropertyModel mModel;
...@@ -72,8 +78,14 @@ public class MessageBannerMediatorUnitTest { ...@@ -72,8 +78,14 @@ public class MessageBannerMediatorUnitTest {
.thenReturn(24); .thenReturn(24);
when(mResources.getDimensionPixelSize(R.dimen.message_max_horizontal_translation)) when(mResources.getDimensionPixelSize(R.dimen.message_max_horizontal_translation))
.thenReturn(120); .thenReturn(120);
mMediator = new MessageBannerMediator( doAnswer(invocation -> {
mModel, mMaxTranslationSupplier, mResources, mDismissedRunnable); ((Animator) invocation.getArguments()[0]).start();
return null;
})
.when(mAnimatorStartCallback)
.onResult(any(Animator.class));
mMediator = new MessageBannerMediator(mModel, mMaxTranslationSupplier, mResources,
mDismissedRunnable, mAnimatorStartCallback);
when(mMaxTranslationSupplier.get()).thenReturn(100); when(mMaxTranslationSupplier.get()).thenReturn(100);
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.components.messages; package org.chromium.components.messages;
import android.animation.Animator;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
...@@ -31,6 +32,7 @@ public class SingleActionMessage implements MessageStateHandler { ...@@ -31,6 +32,7 @@ public class SingleActionMessage implements MessageStateHandler {
private MessageAutoDismissTimer mAutoDismissTimer; private MessageAutoDismissTimer mAutoDismissTimer;
private final Supplier<Integer> mMaxTranslationSupplier; private final Supplier<Integer> mMaxTranslationSupplier;
private final AccessibilityUtil mAccessibilityUtil; private final AccessibilityUtil mAccessibilityUtil;
private final Callback<Animator> mAnimatorStartCallback;
/** /**
* @param container The container holding messages. * @param container The container holding messages.
...@@ -40,16 +42,19 @@ public class SingleActionMessage implements MessageStateHandler { ...@@ -40,16 +42,19 @@ public class SingleActionMessage implements MessageStateHandler {
* property model. * property model.
* @param maxTranslationSupplier A {@link Supplier} that supplies the maximum translation Y * @param maxTranslationSupplier A {@link Supplier} that supplies the maximum translation Y
* @param accessibilityUtil A util to expose information related to system accessibility state. * @param accessibilityUtil A util to expose information related to system accessibility state.
* @param animatorStartCallback The {@link Callback} that will be used by the message banner to
* delegate starting the animations to the {@link WindowAndroid}.
*/ */
public SingleActionMessage(MessageContainer container, PropertyModel model, public SingleActionMessage(MessageContainer container, PropertyModel model,
Callback<PropertyModel> dismissHandler, Supplier<Integer> maxTranslationSupplier, Callback<PropertyModel> dismissHandler, Supplier<Integer> maxTranslationSupplier,
AccessibilityUtil accessibilityUtil) { AccessibilityUtil accessibilityUtil, Callback<Animator> animatorStartCallback) {
mModel = model; mModel = model;
mContainer = container; mContainer = container;
mDismissHandler = dismissHandler; mDismissHandler = dismissHandler;
mAccessibilityUtil = accessibilityUtil; mAccessibilityUtil = accessibilityUtil;
mAutoDismissTimer = new MessageAutoDismissTimer(getAutoDismissDuration()); mAutoDismissTimer = new MessageAutoDismissTimer(getAutoDismissDuration());
mMaxTranslationSupplier = maxTranslationSupplier; mMaxTranslationSupplier = maxTranslationSupplier;
mAnimatorStartCallback = animatorStartCallback;
mModel.set( mModel.set(
MessageBannerProperties.PRIMARY_BUTTON_CLICK_LISTENER, this::handlePrimaryAction); MessageBannerProperties.PRIMARY_BUTTON_CLICK_LISTENER, this::handlePrimaryAction);
...@@ -65,7 +70,8 @@ public class SingleActionMessage implements MessageStateHandler { ...@@ -65,7 +70,8 @@ public class SingleActionMessage implements MessageStateHandler {
mView = (MessageBannerView) LayoutInflater.from(mContainer.getContext()) mView = (MessageBannerView) LayoutInflater.from(mContainer.getContext())
.inflate(R.layout.message_banner_view, mContainer, false); .inflate(R.layout.message_banner_view, mContainer, false);
mMessageBanner = new MessageBannerCoordinator(mView, mModel, mMaxTranslationSupplier, mMessageBanner = new MessageBannerCoordinator(mView, mModel, mMaxTranslationSupplier,
mContainer.getResources(), mDismissHandler.bind(mModel)); mContainer.getResources(), mDismissHandler.bind(mModel),
mAnimatorStartCallback);
} }
mContainer.addMessage(mView); mContainer.addMessage(mView);
......
...@@ -9,6 +9,7 @@ import static org.mockito.Mockito.doNothing; ...@@ -9,6 +9,7 @@ import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.animation.Animator;
import android.app.Activity; import android.app.Activity;
import androidx.test.filters.MediumTest; import androidx.test.filters.MediumTest;
...@@ -18,6 +19,7 @@ import org.junit.Rule; ...@@ -18,6 +19,7 @@ import org.junit.Rule;
import org.junit.Test; 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.Mockito; import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
...@@ -37,6 +39,8 @@ import org.chromium.ui.util.AccessibilityUtil; ...@@ -37,6 +39,8 @@ import org.chromium.ui.util.AccessibilityUtil;
public class SingleActionMessageTest extends DummyUiActivityTestCase { public class SingleActionMessageTest extends DummyUiActivityTestCase {
@Rule @Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule(); public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock
private Callback<Animator> mAnimatorStartCallback;
private CallbackHelper mDismissCallback; private CallbackHelper mDismissCallback;
private Callback<PropertyModel> mEmptyDismissCallback = (model) -> {}; private Callback<PropertyModel> mEmptyDismissCallback = (model) -> {};
...@@ -56,8 +60,8 @@ public class SingleActionMessageTest extends DummyUiActivityTestCase { ...@@ -56,8 +60,8 @@ public class SingleActionMessageTest extends DummyUiActivityTestCase {
public void testAddAndRemoveSingleActionMessage() throws Exception { public void testAddAndRemoveSingleActionMessage() throws Exception {
MessageContainer container = new MessageContainer(getActivity(), null); MessageContainer container = new MessageContainer(getActivity(), null);
PropertyModel model = createBasicSingleActionMessageModel(); PropertyModel model = createBasicSingleActionMessageModel();
SingleActionMessage message = new SingleActionMessage( SingleActionMessage message = new SingleActionMessage(container, model,
container, model, mEmptyDismissCallback, () -> 0, mAccessibilityUtil); mEmptyDismissCallback, () -> 0, mAccessibilityUtil, mAnimatorStartCallback);
final MessageBannerCoordinator messageBanner = Mockito.mock(MessageBannerCoordinator.class); final MessageBannerCoordinator messageBanner = Mockito.mock(MessageBannerCoordinator.class);
doNothing().when(messageBanner).show(any(Runnable.class)); doNothing().when(messageBanner).show(any(Runnable.class));
doNothing().when(messageBanner).setOnTouchRunnable(any(Runnable.class)); doNothing().when(messageBanner).setOnTouchRunnable(any(Runnable.class));
...@@ -87,8 +91,8 @@ public class SingleActionMessageTest extends DummyUiActivityTestCase { ...@@ -87,8 +91,8 @@ public class SingleActionMessageTest extends DummyUiActivityTestCase {
public void testAutoDismissDuration() { public void testAutoDismissDuration() {
MessageContainer container = new MessageContainer(getActivity(), null); MessageContainer container = new MessageContainer(getActivity(), null);
PropertyModel model = createBasicSingleActionMessageModel(); PropertyModel model = createBasicSingleActionMessageModel();
SingleActionMessage message = new SingleActionMessage( SingleActionMessage message = new SingleActionMessage(container, model,
container, model, mEmptyDismissCallback, () -> 0, mAccessibilityUtil); mEmptyDismissCallback, () -> 0, mAccessibilityUtil, mAnimatorStartCallback);
when(mAccessibilityUtil.isAccessibilityEnabled()).thenReturn(true); when(mAccessibilityUtil.isAccessibilityEnabled()).thenReturn(true);
long durationOnA11y = message.getAutoDismissDuration(); long durationOnA11y = message.getAutoDismissDuration();
when(mAccessibilityUtil.isAccessibilityEnabled()).thenReturn(false); when(mAccessibilityUtil.isAccessibilityEnabled()).thenReturn(false);
...@@ -103,8 +107,8 @@ public class SingleActionMessageTest extends DummyUiActivityTestCase { ...@@ -103,8 +107,8 @@ public class SingleActionMessageTest extends DummyUiActivityTestCase {
MessageContainer container = new MessageContainer(getActivity(), null); MessageContainer container = new MessageContainer(getActivity(), null);
PropertyModel m1 = createBasicSingleActionMessageModel(); PropertyModel m1 = createBasicSingleActionMessageModel();
PropertyModel m2 = createBasicSingleActionMessageModel(); PropertyModel m2 = createBasicSingleActionMessageModel();
SingleActionMessage message1 = new SingleActionMessage( SingleActionMessage message1 = new SingleActionMessage(container, m1, mEmptyDismissCallback,
container, m1, mEmptyDismissCallback, () -> 0, mAccessibilityUtil); () -> 0, mAccessibilityUtil, mAnimatorStartCallback);
final MessageBannerCoordinator messageBanner1 = final MessageBannerCoordinator messageBanner1 =
Mockito.mock(MessageBannerCoordinator.class); Mockito.mock(MessageBannerCoordinator.class);
doNothing().when(messageBanner1).show(any(Runnable.class)); doNothing().when(messageBanner1).show(any(Runnable.class));
...@@ -112,8 +116,8 @@ public class SingleActionMessageTest extends DummyUiActivityTestCase { ...@@ -112,8 +116,8 @@ public class SingleActionMessageTest extends DummyUiActivityTestCase {
view1.setId(R.id.message_banner); view1.setId(R.id.message_banner);
message1.setMessageBannerForTesting(messageBanner1); message1.setMessageBannerForTesting(messageBanner1);
message1.setViewForTesting(view1); message1.setViewForTesting(view1);
SingleActionMessage message2 = new SingleActionMessage( SingleActionMessage message2 = new SingleActionMessage(container, m2, mEmptyDismissCallback,
container, m2, mEmptyDismissCallback, () -> 0, mAccessibilityUtil); () -> 0, mAccessibilityUtil, mAnimatorStartCallback);
final MessageBannerCoordinator messageBanner2 = final MessageBannerCoordinator messageBanner2 =
Mockito.mock(MessageBannerCoordinator.class); Mockito.mock(MessageBannerCoordinator.class);
doNothing().when(messageBanner2).show(any(Runnable.class)); doNothing().when(messageBanner2).show(any(Runnable.class));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment