Index: chrome/android/javatests/src/org/chromium/chrome/browser/widget/BottomSheetObserverTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/BottomSheetObserverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/BottomSheetObserverTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5ac72125bde6926dd57b7a85c7b84b633e1bc78c |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/BottomSheetObserverTest.java |
@@ -0,0 +1,200 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.widget; |
+ |
+import android.support.test.filters.MediumTest; |
+ |
+import org.chromium.base.test.util.CallbackHelper; |
+import org.chromium.chrome.browser.util.MathUtils; |
+import org.chromium.chrome.test.BottomSheetTestCaseBase; |
+ |
+import java.util.concurrent.TimeoutException; |
+ |
+/** This class tests the functionality of the {@link BottomSheetObserver}. */ |
+public class BottomSheetObserverTest extends BottomSheetTestCaseBase { |
+ /** A handle to the sheet's observer. */ |
+ private TestBottomSheetObserver mObserver; |
+ |
+ /** An observer used to record events that occur with respect to the bottom sheet. */ |
+ private static class TestBottomSheetObserver implements BottomSheetObserver { |
+ /** A {@link CallbackHelper} that can wait for the bottom sheet to be closed. */ |
+ private final CallbackHelper mClosedCallbackHelper = new CallbackHelper(); |
+ |
+ /** A {@link CallbackHelper} that can wait for the bottom sheet to be opened. */ |
+ private final CallbackHelper mOpenedCallbackHelper = new CallbackHelper(); |
+ |
+ /** A {@link CallbackHelper} that can wait for the onTransitionPeekToHalf event. */ |
+ private final CallbackHelper mPeekToHalfCallbackHelper = new CallbackHelper(); |
+ |
+ /** The last value that the onTransitionPeekToHalf event sent. */ |
+ private float mLastPeekToHalfValue; |
+ |
+ @Override |
+ public void onTransitionPeekToHalf(float fraction) { |
+ mLastPeekToHalfValue = fraction; |
+ mPeekToHalfCallbackHelper.notifyCalled(); |
+ } |
+ |
+ @Override |
+ public void onSheetOpened() { |
+ mOpenedCallbackHelper.notifyCalled(); |
+ } |
+ |
+ @Override |
+ public void onSheetClosed() { |
+ mClosedCallbackHelper.notifyCalled(); |
+ } |
+ |
+ @Override |
+ public void onLoadUrl(String url) {} |
+ |
+ public CallbackHelper getClosedCallbackHelper() { |
+ return mClosedCallbackHelper; |
+ } |
+ |
+ public CallbackHelper getOpenedCallbackHelper() { |
+ return mOpenedCallbackHelper; |
+ } |
+ |
+ public CallbackHelper getPeekToHalfCallbackHelper() { |
+ return mPeekToHalfCallbackHelper; |
+ } |
+ |
+ public float getLastPeekToHalfValue() { |
+ return mLastPeekToHalfValue; |
+ } |
+ } |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ |
+ mObserver = new TestBottomSheetObserver(); |
+ mBottomSheet.addObserver(mObserver); |
+ } |
+ |
+ /** |
+ * Test that the onSheetClosed event is triggered if the sheet is closed without animation. |
+ */ |
+ @MediumTest |
+ public void testCloseEventCalledNoAnimation() throws InterruptedException, TimeoutException { |
+ setSheetState(BottomSheet.SHEET_STATE_FULL, false); |
+ |
+ CallbackHelper closedCallbackHelper = mObserver.getClosedCallbackHelper(); |
+ |
+ int initialOpenedCount = mObserver.getOpenedCallbackHelper().getCallCount(); |
+ |
+ int closedCallbackCount = closedCallbackHelper.getCallCount(); |
+ setSheetState(BottomSheet.SHEET_STATE_PEEK, false); |
+ closedCallbackHelper.waitForCallback(closedCallbackCount, 1); |
+ |
+ assertEquals(initialOpenedCount, mObserver.getOpenedCallbackHelper().getCallCount()); |
+ } |
+ |
+ /** |
+ * Test that the onSheetClosed event is triggered if the sheet is closed with animation. |
+ */ |
+ @MediumTest |
+ public void testCloseEventCalledWithAnimation() throws InterruptedException, TimeoutException { |
+ setSheetState(BottomSheet.SHEET_STATE_FULL, false); |
+ |
+ CallbackHelper closedCallbackHelper = mObserver.getClosedCallbackHelper(); |
+ |
+ int initialOpenedCount = mObserver.getOpenedCallbackHelper().getCallCount(); |
+ |
+ int closedCallbackCount = closedCallbackHelper.getCallCount(); |
+ setSheetState(BottomSheet.SHEET_STATE_PEEK, true); |
+ closedCallbackHelper.waitForCallback(closedCallbackCount, 1); |
+ |
+ assertEquals(initialOpenedCount, mObserver.getOpenedCallbackHelper().getCallCount()); |
+ } |
+ |
+ /** |
+ * Test that the onSheetOpened event is triggered if the sheet is opened without animation. |
+ */ |
+ @MediumTest |
+ public void testOpenedEventCalledNoAnimation() throws InterruptedException, TimeoutException { |
+ setSheetState(BottomSheet.SHEET_STATE_PEEK, false); |
+ |
+ CallbackHelper openedCallbackHelper = mObserver.getOpenedCallbackHelper(); |
+ |
+ int initialClosedCount = mObserver.getClosedCallbackHelper().getCallCount(); |
+ |
+ int openedCallbackCount = openedCallbackHelper.getCallCount(); |
+ setSheetState(BottomSheet.SHEET_STATE_FULL, false); |
+ openedCallbackHelper.waitForCallback(openedCallbackCount, 1); |
+ |
+ assertEquals(initialClosedCount, mObserver.getClosedCallbackHelper().getCallCount()); |
+ } |
+ |
+ /** |
+ * Test that the onSheetOpened event is triggered if the sheet is opened with animation. |
+ */ |
+ @MediumTest |
+ public void testOpenedEventCalledWithAnimation() throws InterruptedException, TimeoutException { |
+ setSheetState(BottomSheet.SHEET_STATE_PEEK, false); |
+ |
+ CallbackHelper openedCallbackHelper = mObserver.getOpenedCallbackHelper(); |
+ |
+ int initialClosedCount = mObserver.getClosedCallbackHelper().getCallCount(); |
+ |
+ int openedCallbackCount = openedCallbackHelper.getCallCount(); |
+ setSheetState(BottomSheet.SHEET_STATE_FULL, true); |
+ openedCallbackHelper.waitForCallback(openedCallbackCount, 1); |
+ |
+ assertEquals(initialClosedCount, mObserver.getClosedCallbackHelper().getCallCount()); |
+ } |
+ |
+ /** |
+ * Test the onTransitionPeekToHalf event. |
+ */ |
+ @MediumTest |
+ public void testPeekToHalfTransition() throws InterruptedException, TimeoutException { |
+ CallbackHelper callbackHelper = mObserver.getPeekToHalfCallbackHelper(); |
+ |
+ float peekHeight = mBottomSheet.getPeekRatio() * mBottomSheet.getSheetContainerHeight(); |
+ float halfHeight = mBottomSheet.getHalfRatio() * mBottomSheet.getSheetContainerHeight(); |
+ float fullHeight = mBottomSheet.getFullRatio() * mBottomSheet.getSheetContainerHeight(); |
+ |
+ float midPeekHalf = (peekHeight + halfHeight) / 2f; |
+ float midHalfFull = (halfHeight + fullHeight) / 2f; |
+ |
+ // When in the peeking state, the transition value should be 0. |
+ int callbackCount = callbackHelper.getCallCount(); |
+ setSheetOffsetFromBottom(peekHeight); |
+ callbackHelper.waitForCallback(callbackCount, 1); |
+ assertEquals(0f, mObserver.getLastPeekToHalfValue(), MathUtils.EPSILON); |
+ |
+ // When in between peek and half states, the transition value should be 0.5. |
+ callbackCount = callbackHelper.getCallCount(); |
+ setSheetOffsetFromBottom(midPeekHalf); |
+ callbackHelper.waitForCallback(callbackCount, 1); |
+ assertEquals(0.5f, mObserver.getLastPeekToHalfValue(), MathUtils.EPSILON); |
+ |
+ // After jumping to the full state (skipping the half state), the event should have |
+ // triggered once more with a max value of 1. |
+ callbackCount = callbackHelper.getCallCount(); |
+ setSheetOffsetFromBottom(fullHeight); |
+ callbackHelper.waitForCallback(callbackCount, 1); |
+ assertEquals(1f, mObserver.getLastPeekToHalfValue(), MathUtils.EPSILON); |
+ |
+ // Moving from full to somewhere between half and full should not trigger the event. |
+ callbackCount = callbackHelper.getCallCount(); |
+ setSheetOffsetFromBottom(midHalfFull); |
+ assertEquals(callbackCount, callbackHelper.getCallCount()); |
+ |
+ // Reset the sheet to be between peek and half states. |
+ callbackCount = callbackHelper.getCallCount(); |
+ setSheetOffsetFromBottom(midPeekHalf); |
+ callbackHelper.waitForCallback(callbackCount, 1); |
+ assertEquals(0.5f, mObserver.getLastPeekToHalfValue(), MathUtils.EPSILON); |
+ |
+ // At the half state the event should send 1. |
+ callbackCount = callbackHelper.getCallCount(); |
+ setSheetOffsetFromBottom(halfHeight); |
+ callbackHelper.waitForCallback(callbackCount, 1); |
+ assertEquals(1f, mObserver.getLastPeekToHalfValue(), MathUtils.EPSILON); |
+ } |
+} |