Chromium Code Reviews| Index: content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java |
| diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java |
| index e18171b0ac5478c611c03b299824dcb5a00c5982..21cd2b3a81e65242b04c70109ce6e27ab6aea7d3 100644 |
| --- a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java |
| +++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java |
| @@ -10,6 +10,7 @@ import android.os.SystemClock; |
| import android.test.InstrumentationTestCase; |
| import android.test.suitebuilder.annotation.SmallTest; |
| import android.util.Log; |
| +import android.view.InputDevice; |
| import android.view.MotionEvent; |
| import android.view.MotionEvent.PointerCoords; |
| import android.view.MotionEvent.PointerProperties; |
| @@ -18,7 +19,6 @@ import android.view.ViewConfiguration; |
| import org.chromium.base.test.util.Feature; |
| import org.chromium.base.test.util.ScalableTimeout; |
| import org.chromium.content.browser.ContentViewGestureHandler.MotionEventDelegate; |
| -import org.chromium.content.browser.third_party.GestureDetector; |
| import java.util.ArrayList; |
| import java.util.concurrent.CountDownLatch; |
| @@ -32,147 +32,79 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| private static final int FAKE_COORD_Y = 24; |
| private static final String TAG = "ContentViewGestureHandler"; |
| - private MockListener mMockListener; |
| private MockMotionEventDelegate mMockMotionEventDelegate; |
| - private MockGestureDetector mMockGestureDetector; |
| - private MockZoomManager mMockZoomManager; |
| private ContentViewGestureHandler mGestureHandler; |
| - private LongPressDetector mLongPressDetector; |
| - |
| - static class MockListener extends GestureDetector.SimpleOnGestureListener { |
| - MotionEvent mLastLongPress; |
| - MotionEvent mLastShowPress; |
| - MotionEvent mLastSingleTap; |
| - MotionEvent mLastFling1; |
| - CountDownLatch mLongPressCalled; |
| - CountDownLatch mShowPressCalled; |
| - |
| - public MockListener() { |
| - mLongPressCalled = new CountDownLatch(1); |
| - mShowPressCalled = new CountDownLatch(1); |
| - } |
| - @Override |
| - public void onLongPress(MotionEvent e) { |
| - mLastLongPress = MotionEvent.obtain(e); |
| - mLongPressCalled.countDown(); |
| - } |
| - |
| - @Override |
| - public void onShowPress(MotionEvent e) { |
| - mLastShowPress = MotionEvent.obtain(e); |
| - mShowPressCalled.countDown(); |
| - Log.e("Overscroll", "OnShowPress"); |
| - } |
| - |
| - @Override |
| - public boolean onSingleTapConfirmed(MotionEvent e) { |
| - mLastSingleTap = e; |
| - return true; |
| - } |
| - |
| - @Override |
| - public boolean onSingleTapUp(MotionEvent e) { |
| - mLastSingleTap = e; |
| - return true; |
| - } |
| - |
| - @Override |
| - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { |
| - return true; |
| - } |
| + static class MockMotionEventDelegate implements MotionEventDelegate { |
| + static class GestureEvent { |
| + public final int mType; |
| + public final long mTimeMs; |
| + public final int mX; |
| + public final int mY; |
| + public final Bundle mExtraParams; |
| - @Override |
| - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { |
| - mLastFling1 = e1; |
| - return true; |
| - } |
| - } |
| + public GestureEvent(int type, long timeMs, int x, int y, Bundle extraParams) { |
| + mType = type; |
| + mTimeMs = timeMs; |
| + mX = x; |
| + mY = y; |
| + mExtraParams = extraParams; |
| + } |
| - static class MockGestureDetector extends GestureDetector { |
| - MotionEvent mLastEvent; |
| - public MockGestureDetector(Context context, OnGestureListener listener) { |
| - super(context, listener); |
| - } |
| + public int getType() { |
| + return mType; |
| + } |
| - @Override |
| - public boolean onTouchEvent(MotionEvent ev) { |
| - mLastEvent = MotionEvent.obtain(ev); |
| - return super.onTouchEvent(ev); |
| - } |
| - } |
| + public long getTimeMs() { |
| + return mTimeMs; |
| + } |
| - static class MockMotionEventDelegate implements MotionEventDelegate { |
| - private ContentViewGestureHandler mSynchronousConfirmTarget; |
| - private int mSynchronousConfirmAckResult; |
| + public int getX() { |
| + return mX; |
| + } |
| - public int mLastTouchAction; |
| - public int mLastGestureType; |
| - public int mTotalSentGestureCount; |
| + public int getY() { |
| + return mY; |
| + } |
| - @Override |
| - public boolean sendTouchEvent(long timeMs, int action, TouchPoint[] pts) { |
| - mLastTouchAction = action; |
| - if (mSynchronousConfirmTarget != null) { |
| - mSynchronousConfirmTarget.confirmTouchEvent(mSynchronousConfirmAckResult); |
| + public Bundle getExtraParams() { |
| + return mExtraParams; |
| } |
| - return true; |
| } |
| + GestureEvent mMostRecentGestureEvent; |
| + GestureEvent mActiveScrollStartEvent; |
| + final ArrayList<Integer> mGestureTypeList = new ArrayList<Integer>(); |
| + final ArrayList<Long> mGestureTimeList = new ArrayList<Long>(); |
| - @Override |
| - public boolean sendGesture(int type, long timeMs, int x, int y, Bundle extraParams) { |
| - Log.i(TAG,"Gesture event received with type id " + type); |
| - mLastGestureType = type; |
| - mTotalSentGestureCount++; |
| - return true; |
| - } |
| + final CountDownLatch mLongPressCalled = new CountDownLatch(1); |
| + final CountDownLatch mShowPressCalled = new CountDownLatch(1); |
| @Override |
| - public void sendSingleTapUMA(int type) { |
| - // Not implemented. |
| + public void onTouchEventHandlingBegin(long timeMs, int action, TouchPoint[] pts) { |
| } |
| @Override |
| - public void sendActionAfterDoubleTapUMA(int type, |
| - boolean clickDelayEnabled) { |
| - // Not implemented. |
| + public void onTouchEventHandlingEnd() { |
| } |
| @Override |
| - public void invokeZoomPicker() { |
| - // Not implemented. |
| - } |
| - |
| - public void enableSynchronousConfirmTouchEvent( |
| - ContentViewGestureHandler handler, int ackResult) { |
| - mSynchronousConfirmTarget = handler; |
| - mSynchronousConfirmAckResult = ackResult; |
| - } |
| - |
| - public void disableSynchronousConfirmTouchEvent() { |
| - mSynchronousConfirmTarget = null; |
| - } |
| - } |
| - |
| - static class MockZoomManager extends ZoomManager { |
| - private ContentViewGestureHandler mHandlerForMoveEvents; |
| - |
| - MockZoomManager(Context context, ContentViewCore contentViewCore) { |
| - super(context, contentViewCore); |
| - } |
| - |
| - public void pinchOnMoveEvents(ContentViewGestureHandler handler) { |
| - mHandlerForMoveEvents = handler; |
| - } |
| + public boolean onGestureEventCreated( |
| + int type, long timeMs, int x, int y, Bundle extraParams) { |
| + Log.i(TAG, "Gesture event received with type id " + type); |
| + mMostRecentGestureEvent = new GestureEvent(type, timeMs, x, y, extraParams); |
| + mGestureTypeList.add(mMostRecentGestureEvent.mType); |
| + mGestureTimeList.add(timeMs); |
| + if (type == ContentViewGestureHandler.GESTURE_SCROLL_START) |
|
Ted C
2014/01/30 02:29:48
since not all fit on one line, need to add braces
jdduke (slow)
2014/01/30 18:46:24
Done.
|
| + mActiveScrollStartEvent = mMostRecentGestureEvent; |
| + else if (type == ContentViewGestureHandler.GESTURE_SCROLL_END || |
| + type == ContentViewGestureHandler.GESTURE_FLING_CANCEL) |
| + mActiveScrollStartEvent = null; |
| + else if (type == ContentViewGestureHandler.GESTURE_LONG_PRESS) |
| + mLongPressCalled.countDown(); |
| + else if (type == ContentViewGestureHandler.GESTURE_SHOW_PRESS) |
| + mShowPressCalled.countDown(); |
| - @Override |
| - public boolean processTouchEvent(MotionEvent event) { |
| - if (event.getActionMasked() == MotionEvent.ACTION_MOVE |
| - && mHandlerForMoveEvents != null) { |
| - mHandlerForMoveEvents.pinchBy(event.getEventTime(), 1, 1, 1.1f); |
| - return true; |
| - } |
| - return false; |
| + return true; |
| } |
| } |
| @@ -182,18 +114,10 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| @Override |
| public void setUp() { |
| - mMockListener = new MockListener(); |
| - mMockGestureDetector = new MockGestureDetector( |
| - getInstrumentation().getTargetContext(), mMockListener); |
| mMockMotionEventDelegate = new MockMotionEventDelegate(); |
| - mMockZoomManager = new MockZoomManager(getInstrumentation().getTargetContext(), null); |
| mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mMockMotionEventDelegate, |
| - mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - mGestureHandler.setTestDependencies( |
| - mLongPressDetector, mMockGestureDetector, mMockListener); |
| + getInstrumentation().getTargetContext(), mMockMotionEventDelegate); |
| + mGestureHandler.updateMultiTouchSupport(false); |
| TouchPoint.initializeConstantsForTesting(); |
| } |
| @@ -208,302 +132,17 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - |
| - assertFalse(mGestureHandler.onTouchEvent(event)); |
| - assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEvent != null); |
| - assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| - |
| - event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10); |
| - mLongPressDetector.cancelLongPressIfNeeded(event); |
| - assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.hasPendingMessage()); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - // Synchronous, no need to wait. |
| - assertTrue("Should have a single tap", mMockListener.mLastSingleTap != null); |
| - } |
| - |
| - /** |
| - * Verify that when a touch event handler is registered the touch events are queued |
| - * and sent in order. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testFlingOnTouchHandler() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertTrue("Should not have a pending gesture", mMockGestureDetector.mLastEvent == null); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("We should have coalesced move events into one" |
| - , 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 15, MotionEvent.ACTION_UP, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals(MotionEvent.ACTION_MOVE, |
| - mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); |
| - assertFalse("Pending LONG_PRESS should have been canceled", |
| - mLongPressDetector.hasPendingMessage()); |
| - |
| - mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals(MotionEvent.ACTION_UP, |
| - mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); |
| - |
| - mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - // Synchronous, no need to wait. |
| - assertTrue("Should not have a fling", mMockListener.mLastFling1 == null); |
| - assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); |
| - } |
| - |
| - /** |
| - * Verify that after a touch event handlers starts handling a gesture, even though some event |
| - * in the middle of the gesture returns with NOT_CONSUMED, we don't send that to the gesture |
| - * detector to avoid falling to a faulty state. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testFlingOnTouchHandlerWithOneEventNotConsumed() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertTrue("Should not have a pending gesture", mMockGestureDetector.mLastEvent == null); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("We should have coalesced move events into one" |
| - , 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 15, MotionEvent.ACTION_UP, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals(MotionEvent.ACTION_MOVE, |
| - mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals(MotionEvent.ACTION_UP, |
| - mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); |
| - assertTrue("Even though the last event was not consumed by JavaScript," + |
| - "it shouldn't have been sent to the Gesture Detector", |
| - mMockGestureDetector.mLastEvent == null); |
| - |
| - mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - // Synchronous, no need to wait. |
| - assertTrue("Should not have a fling", mMockListener.mLastFling1 == null); |
| - assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); |
| - } |
| - |
| - /** |
| - * Verify that when a registered touch event handler return NO_CONSUMER_EXISTS for down event |
| - * all queue is drained until next down. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testDrainWithFlingAndClickOutofTouchHandler() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), new MockMotionEventDelegate(), |
| - mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 15, MotionEvent.ACTION_UP, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = motionEvent(MotionEvent.ACTION_DOWN, eventTime + 20, eventTime + 20); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 20, MotionEvent.ACTION_UP, |
| - FAKE_COORD_X, FAKE_COORD_Y, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(5, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| - assertEquals("The queue should have been drained until first down since no consumer exists", |
| - 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals(MotionEvent.ACTION_DOWN, |
| - mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| - assertEquals("The queue should have been drained", |
| - 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - } |
| - |
| - /** |
| - * Verify that when a touch event handler is registered the touch events stop getting queued |
| - * after we received INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testFlingOutOfTouchHandler() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertTrue("Should not have a pending gesture", mMockGestureDetector.mLastEvent == null); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("The down touch event should have been sent to the Gesture Detector", |
| - event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTime()); |
| - assertEquals("The down touch event should have been sent to the Gesture Detector", |
| - MotionEvent.ACTION_DOWN, mMockGestureDetector.mLastEvent.getActionMasked()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("Motion events should be going to the Gesture Detector directly", |
| - event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTime()); |
| - assertEquals("Motion events should be going to the Gesture Detector directly", |
| - MotionEvent.ACTION_MOVE, mMockGestureDetector.mLastEvent.getActionMasked()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_UP, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("Motion events should be going to the Gesture Detector directly", |
| - event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTime()); |
| - assertEquals("Motion events should be going to the Gesture Detector directly", |
| - MotionEvent.ACTION_UP, mMockGestureDetector.mLastEvent.getActionMasked()); |
| - |
| - // Synchronous, no need to wait. |
| - assertTrue("Should have a fling", mMockListener.mLastFling1 != null); |
| - assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); |
| - } |
| - |
| - /** |
| - * Verifies that a single tap doesn't cause a long press event to be sent. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testNoLongPressIsSentForSingleTapOutOfTouchHandler() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| + mGestureHandler.updateDoubleTapSupport(false); |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertTrue("Should not have a pending gesture", mMockGestureDetector.mLastEvent == null); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| + assertEquals(ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| - event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5); |
| + event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("The down touch event should have been sent to the Gesture Detector", |
| - event.getDownTime(), mMockGestureDetector.mLastEvent.getEventTime()); |
| - assertEquals("The next event should be ACTION_UP", |
| - MotionEvent.ACTION_UP, |
| - mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("The up touch event should have been sent to the Gesture Detector", |
| - event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTime()); |
| - |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| + assertEquals(ContentViewGestureHandler.GESTURE_SINGLE_TAP_CONFIRMED, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| } |
| /** |
| @@ -518,25 +157,23 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertFalse(mGestureHandler.onTouchEvent(event)); |
| - assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEvent != null); |
| - assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| + assertEquals(ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| event = MotionEvent.obtain( |
| downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - mLongPressDetector.cancelLongPressIfNeeded(event); |
| - assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.hasPendingMessage()); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| event = MotionEvent.obtain( |
| downTime, eventTime + 10, MotionEvent.ACTION_UP, |
| FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - |
| - // Synchronous, no need to wait. |
| - assertTrue("Should have a fling", mMockListener.mLastFling1 != null); |
| - assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); |
| + assertEquals(ContentViewGestureHandler.GESTURE_FLING_START, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertFalse(mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_LONG_PRESS)); |
| } |
| /** |
| @@ -571,11 +208,6 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final int scrollToX = FAKE_COORD_X + 100; |
| final int scrollToY = FAKE_COORD_Y + 100; |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| @@ -585,31 +217,31 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue(mGestureHandler.isNativeScrolling()); |
| assertTrue("A scrollStart event should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| assertEquals("We should have started scrolling", |
| ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only tapDown, tapCancel, scrollBegin and scrollBy should have been sent", |
| - 4, mockDelegate.mGestureTypeList.size()); |
| + 4, mMockMotionEventDelegate.mGestureTypeList.size()); |
| assertEquals("scrollBegin should be sent before scrollBy", |
| ContentViewGestureHandler.GESTURE_SCROLL_START, |
| - (int) mockDelegate.mGestureTypeList.get(2)); |
| + (int) mMockMotionEventDelegate.mGestureTypeList.get(2)); |
| assertEquals("scrollBegin should have the time of the ACTION_MOVE", |
| - eventTime + 1000, (long) mockDelegate.mGestureTimeList.get(2)); |
| + eventTime + 1000, (long) mMockMotionEventDelegate.mGestureTimeList.get(2)); |
| event = MotionEvent.obtain( |
| downTime, eventTime + 1000, endActionType, scrollToX, scrollToY, 0); |
| mGestureHandler.onTouchEvent(event); |
| assertFalse(mGestureHandler.isNativeScrolling()); |
| assertTrue("A scrollEnd event should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_END)); |
| assertEquals("We should have stopped scrolling", |
| ContentViewGestureHandler.GESTURE_SCROLL_END, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only tapDown, scrollBegin and scrollBy and scrollEnd should have been sent", |
| - 5, mockDelegate.mGestureTypeList.size()); |
| + 5, mMockMotionEventDelegate.mGestureTypeList.size()); |
| } |
| /** |
| @@ -625,11 +257,6 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| @@ -640,18 +267,18 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue(mGestureHandler.isNativeScrolling()); |
| assertTrue("A scrollStart event should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| assertEquals("We should have started scrolling", |
| ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only tapDown, tapCancel, scrollBegin and scrollBy should have been sent", |
| - 4, mockDelegate.mGestureTypeList.size()); |
| + 4, mMockMotionEventDelegate.mGestureTypeList.size()); |
| assertEquals("scrollBegin should be sent before scrollBy", |
| ContentViewGestureHandler.GESTURE_SCROLL_START, |
| - (int) mockDelegate.mGestureTypeList.get(2)); |
| - GestureRecordingMotionEventDelegate.GestureEvent startEvent = |
| - mockDelegate.getActiveScrollStartEvent(); |
| + (int) mMockMotionEventDelegate.mGestureTypeList.get(2)); |
| + MockMotionEventDelegate.GestureEvent startEvent = |
| + mMockMotionEventDelegate.mActiveScrollStartEvent; |
| assertNotNull(startEvent); |
| assertEquals("scrollBegin should have the time of the ACTION_MOVE", |
| eventTime + 10, (long) startEvent.getTimeMs()); |
| @@ -669,22 +296,14 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertFalse(mGestureHandler.isNativeScrolling()); |
| assertEquals("We should have started flinging", |
| ContentViewGestureHandler.GESTURE_FLING_START, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertTrue("A scroll end event should not have been sent", |
| - !mockDelegate.mGestureTypeList.contains( |
| + !mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_END)); |
| assertEquals("The last up should have caused flingStart to be sent", |
| - 5, mockDelegate.mGestureTypeList.size()); |
| + 5, mMockMotionEventDelegate.mGestureTypeList.size()); |
| assertEquals("flingStart should have the time of the ACTION_UP", |
| - eventTime + 15, (long) mockDelegate.mGestureTimeList.get(4)); |
| - |
| - event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 50, downTime + 50); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertTrue("A flingCancel should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| - ContentViewGestureHandler.GESTURE_FLING_CANCEL)); |
| - assertEquals("Only tapDown and flingCancel should have been sent", |
| - 7, mockDelegate.mGestureTypeList.size()); |
| + eventTime + 15, (long) mMockMotionEventDelegate.mGestureTimeList.get(4)); |
| } |
| /** |
| @@ -698,24 +317,14 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - |
| mGestureHandler.fling(eventTime, 5, 5, 0, 0); |
| - assertEquals("A zero-velocity fling should not be forwrded", |
| - null, mockDelegate.mMostRecentGestureEvent); |
| + assertEquals("A zero-velocity fling should not be forwarded", |
| + null, mMockMotionEventDelegate.mMostRecentGestureEvent); |
| mGestureHandler.fling(eventTime, 5, 5, 5, 0); |
| assertEquals("Subsequent flings should work properly", |
| ContentViewGestureHandler.GESTURE_FLING_START, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| - |
| - mGestureHandler.fling(eventTime, 5, 5, 0, 0); |
| - assertEquals("A zero-velocity fling should cancel any outstanding fling", |
| - ContentViewGestureHandler.GESTURE_FLING_CANCEL, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| @@ -725,16 +334,16 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue(mGestureHandler.isNativeScrolling()); |
| assertTrue("A scrollStart event should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| assertEquals("We should have started scrolling", |
| ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| mGestureHandler.fling(eventTime, 5, 5, 0, 0); |
| assertEquals("A zero-velicty fling should end the current scroll sequence", |
| ContentViewGestureHandler.GESTURE_SCROLL_END, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| } |
| /** |
| @@ -746,41 +355,42 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| @Feature({"Gestures"}) |
| public void testShowPressCancelOnWindowFocusLost() throws Exception { |
| final long time = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - mGestureHandler.setTestDependencies(mLongPressDetector, null, null); |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, time, time); |
| - mGestureHandler.onTouchEvent(event); |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + setUp(); |
| + MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, time, time); |
| + mGestureHandler.onTouchEvent(event); |
| + } |
| + }); |
| - mGestureHandler.sendShowPressedStateGestureForTesting(); |
| - assertEquals("A show pressed state event should have been sent", |
| - ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| - assertEquals("Only showPressedState and tapDown should have been sent", |
| - 2, mockDelegate.mGestureTypeList.size()); |
| + assertTrue(mMockMotionEventDelegate.mShowPressCalled.await( |
| + ScalableTimeout.ScaleTimeout(ViewConfiguration.getTapTimeout() + 10), |
| + TimeUnit.MILLISECONDS)); |
| - mLongPressDetector.startLongPressTimerIfNeeded(event); |
| - mLongPressDetector.sendLongPressGestureForTest(); |
| + assertTrue(mMockMotionEventDelegate.mLongPressCalled.await( |
| + ScalableTimeout.ScaleTimeout(ViewConfiguration.getLongPressTimeout() |
| + + ViewConfiguration.getTapTimeout() + 10), |
| + TimeUnit.MILLISECONDS)); |
| - assertEquals("Only should have sent only LONG_PRESS event", |
| - 3, mockDelegate.mGestureTypeList.size()); |
| - assertEquals("Should have a long press event next", |
| + assertEquals("Should have sent SHOW_PRESS and LONG_PRESS events", |
| + 3, mMockMotionEventDelegate.mGestureTypeList.size()); |
| + assertEquals("Should have a show press event", |
| + ContentViewGestureHandler.GESTURE_SHOW_PRESS, |
| + mMockMotionEventDelegate.mGestureTypeList.get(1).intValue()); |
| + assertEquals("Should have a long press event", |
| ContentViewGestureHandler.GESTURE_LONG_PRESS, |
| - mockDelegate.mGestureTypeList.get(2).intValue()); |
| + mMockMotionEventDelegate.mGestureTypeList.get(2).intValue()); |
| // The long press triggers window focus loss by opening a context menu |
| mGestureHandler.onWindowFocusLost(); |
| assertEquals("Only should have sent only GESTURE_TAP_CANCEL event", |
| - 4, mockDelegate.mGestureTypeList.size()); |
| + 4, mMockMotionEventDelegate.mGestureTypeList.size()); |
| assertEquals("Should have a gesture show press cancel event next", |
| ContentViewGestureHandler.GESTURE_TAP_CANCEL, |
| - mockDelegate.mGestureTypeList.get(3).intValue()); |
| + mMockMotionEventDelegate.mGestureTypeList.get(3).intValue()); |
| } |
| /** |
| @@ -793,25 +403,17 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| mGestureHandler.sendShowPressedStateGestureForTesting(); |
| assertEquals("A show pressed state event should have been sent", |
| - ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + ContentViewGestureHandler.GESTURE_SHOW_PRESS, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only tapDown and showPressedState should have been sent", |
| - 2, mockDelegate.mGestureTypeList.size()); |
| + 2, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| @@ -820,13 +422,13 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertEquals("We should have started scrolling", |
| ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertTrue("A show press cancel event should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_TAP_CANCEL)); |
| assertEquals("Only tapDown, showPressedState, showPressCancel, scrollBegin and scrollBy" + |
| " should have been sent", |
| - 5, mockDelegate.mGestureTypeList.size()); |
| + 5, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime, eventTime + 15, MotionEvent.ACTION_UP, |
| @@ -834,12 +436,12 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("We should have started flinging", |
| ContentViewGestureHandler.GESTURE_FLING_START, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertTrue("A scroll end event should not have been sent", |
| - !mockDelegate.mGestureTypeList.contains( |
| + !mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_END)); |
| assertEquals("The last up should have caused flingStart to be sent", |
| - 6, mockDelegate.mGestureTypeList.size()); |
| + 6, mMockMotionEventDelegate.mGestureTypeList.size()); |
| } |
| /** |
| @@ -853,23 +455,15 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| mGestureHandler.sendShowPressedStateGestureForTesting(); |
| - assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent", |
| - ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| - assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE should have been sent", |
| - 2, mockDelegate.mGestureTypeList.size()); |
| + assertEquals("GESTURE_SHOW_PRESS should have been sent", |
| + ContentViewGestureHandler.GESTURE_SHOW_PRESS, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESS should have been sent", |
| + 2, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime, eventTime + 5, MotionEvent.ACTION_UP, |
| @@ -877,11 +471,11 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| mGestureHandler.onTouchEvent(event); |
| assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent", |
| ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE and " + |
| + "GESTURE_SHOW_PRESS and " + |
| "GESTURE_SINGLE_TAP_UNCONFIRMED should have been sent", |
| - 3, mockDelegate.mGestureTypeList.size()); |
| + 3, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN, |
| @@ -889,13 +483,13 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("A GESTURE_TAP_DOWN event should have been sent ", |
| ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_SINGLE_TAP_UNCONFIRMED," + |
| "GESTURE_TAP_CANCEL and" + |
| "GESTURE_TAP_DOWN should have been sent", |
| - 5, mockDelegate.mGestureTypeList.size()); |
| + 5, mMockMotionEventDelegate.mGestureTypeList.size()); |
| // Moving a very small amount of distance should not trigger the double tap drag zoom mode. |
| event = MotionEvent.obtain( |
| @@ -903,11 +497,11 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| FAKE_COORD_X, FAKE_COORD_Y + 1, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_SINGLE_TAP_UNCONFIRMED and" + |
| - "GESTURE_TAP_CANCEL and" + |
| + "GESTURE_TAP_CANCEL and " + |
| "GESTURE_TAP_DOWN should have been sent", |
| - 5, mockDelegate.mGestureTypeList.size()); |
| + 5, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| eventTime + 10, eventTime + 15, MotionEvent.ACTION_UP, |
| @@ -915,14 +509,14 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("A double tap should have occurred", |
| ContentViewGestureHandler.GESTURE_DOUBLE_TAP, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_SINGLE_TAP_UNCONFIRMED, " + |
| "GESTURE_TAP_CANCEL, " + |
| "GESTURE_TAP_DOWN, " + |
| "GESTURE_DOUBLE_TAP should have been sent", |
| - 6, mockDelegate.mGestureTypeList.size()); |
| + 6, mMockMotionEventDelegate.mGestureTypeList.size()); |
| } |
| /** |
| @@ -935,23 +529,15 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime1 = SystemClock.uptimeMillis(); |
| final long downTime2 = downTime1 + 100; |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| mGestureHandler.sendShowPressedStateGestureForTesting(); |
| - assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent", |
| - ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| - assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE should have been sent", |
| - 2, mockDelegate.mGestureTypeList.size()); |
| + assertEquals("GESTURE_SHOW_PRESS should have been sent", |
| + ContentViewGestureHandler.GESTURE_SHOW_PRESS, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESS should have been sent", |
| + 2, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| @@ -960,12 +546,12 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| mGestureHandler.onTouchEvent(event); |
| assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent", |
| ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE and " + |
| + "GESTURE_SHOW_PRESS and " + |
| "GESTURE_TAP_UNCONFIRMED " + |
| "should have been sent", |
| - 3, mockDelegate.mGestureTypeList.size()); |
| + 3, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2, MotionEvent.ACTION_DOWN, |
| @@ -973,23 +559,23 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("GESTURE_TAP_DOWN should have been sent", |
| ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_TAP_UNCONFIRMED," + |
| "GESTURE_TAP_CANCEL and" + |
| "GESTURE_TAP_DOWN should have been sent", |
| - 5, mockDelegate.mGestureTypeList.size()); |
| + 5, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X, FAKE_COORD_Y + 100, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_START should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| - GestureRecordingMotionEventDelegate.GestureEvent startEvent = |
| - mockDelegate.getActiveScrollStartEvent(); |
| + MockMotionEventDelegate.GestureEvent startEvent = |
| + mMockMotionEventDelegate.mActiveScrollStartEvent; |
| assertEquals(FAKE_COORD_X, startEvent.getX()); |
| assertEquals(FAKE_COORD_Y + 100, startEvent.getY()); |
| Bundle extraParams = startEvent.getExtraParams(); |
| @@ -1001,29 +587,29 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertEquals("GESTURE_PINCH_BEGIN should have been sent", |
| ContentViewGestureHandler.GESTURE_PINCH_BEGIN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_TAP_UNCONFIRMED," + |
| "GESTURE_TAP_CANCEL, " + |
| "GESTURE_TAP_DOWN, " + |
| "GESTURE_TAP_CANCEL, " + |
| "GESTURE_SCROLL_START, and " + |
| "GESTURE_PINCH_BEGIN should have been sent", |
| - 8, mockDelegate.mGestureTypeList.size()); |
| + 8, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_BY should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_BY)); |
| assertEquals("GESTURE_PINCH_BY should have been sent", |
| ContentViewGestureHandler.GESTURE_PINCH_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_TAP_UNCONFIRMED," + |
| "GESTURE_TAP_CANCEL, " + |
| "GESTURE_TAP_DOWN, " + |
| @@ -1032,20 +618,20 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| "GESTURE_PINCH_BEGIN, " + |
| "GESTURE_SCROLL_BY, and " + |
| "GESTURE_PINCH_BY should have been sent", |
| - 10, mockDelegate.mGestureTypeList.size()); |
| + 10, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 15, MotionEvent.ACTION_UP, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_PINCH_END should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_END)); |
| assertEquals("GESTURE_SCROLL_END should have been sent", |
| ContentViewGestureHandler.GESTURE_SCROLL_END, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_TAP_UNCONFIRMED," + |
| "GESTURE_TAP_CANCEL, " + |
| "GESTURE_TAP_DOWN, " + |
| @@ -1056,7 +642,7 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| "GESTURE_PINCH_BY, " + |
| "GESTURE_PINCH_END, and " + |
| "GESTURE_SCROLL_END should have been sent", |
| - 12, mockDelegate.mGestureTypeList.size()); |
| + 12, mMockMotionEventDelegate.mGestureTypeList.size()); |
| } |
| @@ -1071,22 +657,15 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime1 = SystemClock.uptimeMillis(); |
| final long downTime2 = downTime1 + 100; |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| mGestureHandler.sendShowPressedStateGestureForTesting(); |
| - assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent", |
| - ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| - assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE should have been sent", |
| - 2, mockDelegate.mGestureTypeList.size()); |
| + assertEquals("GESTURE_SHOW_PRESS should have been sent", |
| + ContentViewGestureHandler.GESTURE_SHOW_PRESS, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESS should have been sent", |
| + 2, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime1, downTime1 + 5, MotionEvent.ACTION_UP, |
| @@ -1094,12 +673,12 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| mGestureHandler.onTouchEvent(event); |
| assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent", |
| ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE and " + |
| + "GESTURE_SHOW_PRESS and " + |
| "GESTURE_TAP_UNCONFIRMED " + |
| "should have been sent", |
| - 3, mockDelegate.mGestureTypeList.size()); |
| + 3, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2, MotionEvent.ACTION_DOWN, |
| @@ -1107,47 +686,47 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("GESTURE_TAP_DOWN should have been sent", |
| ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_TAP_UNCONFIRMED," + |
| "GESTURE_TAP_CANCEL and" + |
| "GESTURE_TAP_DOWN should have been sent", |
| - 5, mockDelegate.mGestureTypeList.size()); |
| + 5, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X, FAKE_COORD_Y + 100, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_START should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| assertEquals("GESTURE_PINCH_BEGIN should have been sent", |
| ContentViewGestureHandler.GESTURE_PINCH_BEGIN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_TAP_UNCONFIRMED," + |
| "GESTURE_TAP_CANCEL, " + |
| "GESTURE_TAP_DOWN, " + |
| "GESTURE_TAP_CANCEL, " + |
| "GESTURE_SCROLL_START, and " + |
| "GESTURE_PINCH_BEGIN should have been sent", |
| - 8, mockDelegate.mGestureTypeList.size()); |
| + 8, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 10, MotionEvent.ACTION_POINTER_DOWN, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| mGestureHandler.onTouchEvent(event); |
| assertTrue("GESTURE_PINCH_END should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_END)); |
| assertEquals("GESTURE_SCROLL_END should have been sent", |
| ContentViewGestureHandler.GESTURE_SCROLL_END, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| - "GESTURE_SHOW_PRESSED_STATE, " + |
| + "GESTURE_SHOW_PRESS, " + |
| "GESTURE_TAP_UNCONFIRMED," + |
| "GESTURE_TAP_CANCEL, " + |
| "GESTURE_TAP_DOWN, " + |
| @@ -1156,21 +735,21 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| "GESTURE_PINCH_BEGIN, " + |
| "GESTURE_PINCH_END, and " + |
| "GESTURE_SCROLL_END should have been sent", |
| - 10, mockDelegate.mGestureTypeList.size()); |
| + 10, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 15, MotionEvent.ACTION_POINTER_UP, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| mGestureHandler.onTouchEvent(event); |
| assertEquals("No new gestures should have been sent", |
| - 10, mockDelegate.mGestureTypeList.size()); |
| + 10, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 20, MotionEvent.ACTION_UP, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| mGestureHandler.onTouchEvent(event); |
| assertEquals("No new gestures should have been sent", |
| - 10, mockDelegate.mGestureTypeList.size()); |
| + 10, mMockMotionEventDelegate.mGestureTypeList.size()); |
| } |
| /** |
| @@ -1184,10 +763,6 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime1 = SystemClock.uptimeMillis(); |
| final long downTime2 = downTime1 + 100; |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| mGestureHandler.updateDoubleTapSupport(false); |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); |
| @@ -1211,10 +786,10 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| // disabled. |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_START should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| assertFalse("No GESTURE_PINCH_BEGIN should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_BEGIN)); |
| event = MotionEvent.obtain( |
| @@ -1223,113 +798,24 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("GESTURE_SCROLL_BY should have been sent", |
| ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("GESTURE_SCROLL_BY should have been sent", |
| event.getEventTime(), |
| - mockDelegate.mMostRecentGestureEvent.getTimeMs()); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.getTimeMs()); |
| assertTrue("No GESTURE_PINCH_BY should have been sent", |
| ContentViewGestureHandler.GESTURE_PINCH_BY != |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 15, MotionEvent.ACTION_UP, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertFalse("No GESTURE_PINCH_END should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_END)); |
| } |
| /** |
| - * Mock MotionEventDelegate that remembers the most recent gesture event and any |
| - * currently active scroll start event. |
| - */ |
| - static class GestureRecordingMotionEventDelegate implements MotionEventDelegate { |
| - static class GestureEvent { |
| - private final int mType; |
| - private final long mTimeMs; |
| - private final int mX; |
| - private final int mY; |
| - private final Bundle mExtraParams; |
| - |
| - public GestureEvent(int type, long timeMs, int x, int y, Bundle extraParams) { |
| - mType = type; |
| - mTimeMs = timeMs; |
| - mX = x; |
| - mY = y; |
| - mExtraParams = extraParams; |
| - } |
| - |
| - public int getType() { |
| - return mType; |
| - } |
| - |
| - public long getTimeMs() { |
| - return mTimeMs; |
| - } |
| - |
| - public int getX() { |
| - return mX; |
| - } |
| - |
| - public int getY() { |
| - return mY; |
| - } |
| - |
| - public Bundle getExtraParams() { |
| - return mExtraParams; |
| - } |
| - } |
| - private GestureEvent mMostRecentGestureEvent; |
| - private GestureEvent mActiveScrollStartEvent; |
| - private final ArrayList<Integer> mGestureTypeList = new ArrayList<Integer>(); |
| - private final ArrayList<Long> mGestureTimeList = new ArrayList<Long>(); |
| - |
| - @Override |
| - public boolean sendTouchEvent(long timeMs, int action, TouchPoint[] pts) { |
| - return true; |
| - } |
| - |
| - @Override |
| - public boolean sendGesture(int type, long timeMs, int x, int y, Bundle extraParams) { |
| - Log.i(TAG, "Gesture event received with type id " + type); |
| - mMostRecentGestureEvent = new GestureEvent(type, timeMs, x, y, extraParams); |
| - mGestureTypeList.add(mMostRecentGestureEvent.mType); |
| - mGestureTimeList.add(timeMs); |
| - if (type == ContentViewGestureHandler.GESTURE_SCROLL_START) |
| - mActiveScrollStartEvent = mMostRecentGestureEvent; |
| - else if (type == ContentViewGestureHandler.GESTURE_SCROLL_END || |
| - type == ContentViewGestureHandler.GESTURE_FLING_CANCEL) |
| - mActiveScrollStartEvent = null; |
| - return true; |
| - } |
| - |
| - @Override |
| - public void sendSingleTapUMA(int type) { |
| - // Not implemented. |
| - } |
| - |
| - @Override |
| - public void sendActionAfterDoubleTapUMA(int type, |
| - boolean clickDelayEnabled) { |
| - // Not implemented. |
| - } |
| - |
| - @Override |
| - public void invokeZoomPicker() { |
| - // Not implemented. |
| - } |
| - |
| - public GestureEvent getMostRecentGestureEvent() { |
| - return mMostRecentGestureEvent; |
| - } |
| - |
| - public GestureEvent getActiveScrollStartEvent() { |
| - return mActiveScrollStartEvent; |
| - } |
| - } |
| - |
| - /** |
| * Generate a scroll gesture and verify that the resulting scroll motion event has both absolute |
| * and relative position information. |
| */ |
| @@ -1340,27 +826,24 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final int deltaY = 84; |
| final long downTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate delegate = new GestureRecordingMotionEventDelegate(); |
| - ContentViewGestureHandler gestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), delegate, mMockZoomManager); |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(gestureHandler.onTouchEvent(event)); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| // Move twice so that we get two GESTURE_SCROLL_BY events and can compare |
| // the relative and absolute coordinates. |
| event = MotionEvent.obtain( |
| downTime, downTime + 5, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X - deltaX / 2, FAKE_COORD_Y - deltaY / 2, 0); |
| - assertTrue(gestureHandler.onTouchEvent(event)); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| event = MotionEvent.obtain( |
| downTime, downTime + 10, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X - deltaX, FAKE_COORD_Y - deltaY, 0); |
| - assertTrue(gestureHandler.onTouchEvent(event)); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| // Make sure the reported gesture event has all the expected data. |
| - GestureRecordingMotionEventDelegate.GestureEvent gestureEvent = |
| - delegate.getMostRecentGestureEvent(); |
| + MockMotionEventDelegate.GestureEvent gestureEvent = |
| + mMockMotionEventDelegate.mMostRecentGestureEvent; |
| assertNotNull(gestureEvent); |
| assertEquals(ContentViewGestureHandler.GESTURE_SCROLL_BY, gestureEvent.getType()); |
| assertEquals(downTime + 10, gestureEvent.getTimeMs()); |
| @@ -1385,28 +868,25 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final int deltaY = 89; |
| final long downTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate delegate = new GestureRecordingMotionEventDelegate(); |
| - ContentViewGestureHandler gestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), delegate, mMockZoomManager); |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(gestureHandler.onTouchEvent(event)); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| // Move twice such that the first event isn't sufficient to start |
| // scrolling on it's own. |
| event = MotionEvent.obtain( |
| downTime, downTime + 5, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X + 2, FAKE_COORD_Y + 1, 0); |
| - assertFalse(gestureHandler.onTouchEvent(event)); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertNull("Expect scrolling hasn't yet started", |
| - delegate.getActiveScrollStartEvent()); |
| + mMockMotionEventDelegate.mActiveScrollStartEvent); |
| event = MotionEvent.obtain( |
| downTime, downTime + 10, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X + deltaX, FAKE_COORD_Y + deltaY, 0); |
| - assertTrue(gestureHandler.onTouchEvent(event)); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| - GestureRecordingMotionEventDelegate.GestureEvent startEvent = |
| - delegate.getActiveScrollStartEvent(); |
| + MockMotionEventDelegate.GestureEvent startEvent = |
| + mMockMotionEventDelegate.mActiveScrollStartEvent; |
| assertNotNull(startEvent); |
| assertEquals(ContentViewGestureHandler.GESTURE_SCROLL_START, startEvent.getType()); |
| assertEquals(downTime + 10, startEvent.getTimeMs()); |
| @@ -1431,77 +911,39 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mLongPressDetector = mGestureHandler.getLongPressDetector(); |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + setUp(); |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.hasPendingMessage()); |
| + MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| + event = MotionEvent.obtain( |
| + downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| + FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| + event = MotionEvent.obtain( |
| + downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| + FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| + } |
| + }); |
| + |
| + assertFalse(mMockMotionEventDelegate.mLongPressCalled.await( |
| + ScalableTimeout.ScaleTimeout(ViewConfiguration.getLongPressTimeout() |
| + + ViewConfiguration.getTapTimeout() + 10), |
| + TimeUnit.MILLISECONDS)); |
| // No LONG_TAP because LONG_PRESS timer is cancelled. |
| assertFalse("No LONG_PRESS should be sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_LONG_PRESS)); |
| assertFalse("No LONG_TAP should be sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_LONG_TAP)); |
| } |
| /** |
| - * Verifies that when hasTouchEventHandlers changes while in a gesture, that the pending |
| - * queue does not grow continually. |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testHasTouchEventHandlersChangesInGesture() { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), new MockMotionEventDelegate(), |
| - mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 15, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 15, FAKE_COORD_Y * 15, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - } |
| - |
| - /** |
| * Verify that LONG_TAP is triggered after LongPress followed by an UP. |
| * |
| * @throws Exception |
| @@ -1512,255 +954,186 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mLongPressDetector = mGestureHandler.getLongPressDetector(); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + setUp(); |
| + mGestureHandler = new ContentViewGestureHandler( |
| + getInstrumentation().getTargetContext(), mMockMotionEventDelegate); |
| + MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| + } |
| + }); |
| - mLongPressDetector.sendLongPressGestureForTest(); |
| + assertTrue(mMockMotionEventDelegate.mLongPressCalled.await( |
| + ScalableTimeout.ScaleTimeout(ViewConfiguration.getLongPressTimeout() |
| + + ViewConfiguration.getTapTimeout() + 10), |
| + TimeUnit.MILLISECONDS)); |
| assertEquals("A LONG_PRESS gesture should have been sent", |
| ContentViewGestureHandler.GESTURE_LONG_PRESS, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| - event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 1000); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| + MotionEvent event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 1000); |
| + mGestureHandler.onTouchEvent(event); |
| assertEquals("A LONG_TAP gesture should have been sent", |
| ContentViewGestureHandler.GESTURE_LONG_TAP, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| } |
| /** |
| - * Verify that the touch slop region is removed from the first scroll delta to avoid a jump when |
| - * starting to scroll. |
| + * Verify that a LONG_PRESS gesture does not prevent further scrolling. |
| + * |
| * @throws Exception |
| */ |
| @SmallTest |
| @Feature({"Gestures"}) |
| - public void testTouchSlopRemovedFromScroll() throws Exception { |
| - Context context = getInstrumentation().getTargetContext(); |
| + public void testGestureLongPressDoesNotPreventScrolling() throws Exception { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); |
| - final int scrollDelta = 5; |
| - |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - context, mockDelegate, mMockZoomManager); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + scaledTouchSlop + scrollDelta, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - |
| - assertEquals("We should have started scrolling", |
| - ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| - |
| - GestureRecordingMotionEventDelegate.GestureEvent gestureEvent = |
| - mockDelegate.getMostRecentGestureEvent(); |
| - assertNotNull(gestureEvent); |
| - Bundle extraParams = gestureEvent.getExtraParams(); |
| - assertEquals(0, extraParams.getInt(ContentViewGestureHandler.DISTANCE_X)); |
| - assertEquals(-scrollDelta, extraParams.getInt(ContentViewGestureHandler.DISTANCE_Y)); |
| - } |
| - /** |
| - * Verify that touch moves are deferred if they are within the touch slop region |
| - * and the touch sequence is not being consumed. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testTouchMoveWithinTouchSlopDeferred() throws Exception { |
| - Context context = getInstrumentation().getTargetContext(); |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); |
| - final int lessThanSlopScrollDelta = scaledTouchSlop / 2; |
| - final int greaterThanSlopScrollDelta = scaledTouchSlop * 2; |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + setUp(); |
| + mGestureHandler = new ContentViewGestureHandler( |
| + getInstrumentation().getTargetContext(), mMockMotionEventDelegate); |
| + MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| + } |
| + }); |
| - mGestureHandler.hasTouchEventHandlers(true); |
| + final long longPressTimeoutMs = ViewConfiguration.getLongPressTimeout() |
| + + ViewConfiguration.getTapTimeout() + 10; |
| + assertTrue(mMockMotionEventDelegate.mLongPressCalled.await( |
| + ScalableTimeout.ScaleTimeout(longPressTimeoutMs), TimeUnit.MILLISECONDS)); |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("The touch down should have been forwarded", |
| - TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| + assertEquals("A LONG_PRESS gesture should have been sent", |
| + ContentViewGestureHandler.GESTURE_LONG_PRESS, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + lessThanSlopScrollDelta, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| + MotionEvent event = MotionEvent.obtain( |
| + downTime, eventTime + longPressTimeoutMs, MotionEvent.ACTION_MOVE, |
| + FAKE_COORD_X + 100, FAKE_COORD_Y + 100, 0); |
| + mGestureHandler.onTouchEvent(event); |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals("The less-than-slop touch move should not have been forwarded", |
| - TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| + assertEquals("Scrolling should have started", |
| + ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_TAP_CANCEL)); |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + greaterThanSlopScrollDelta, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("The touch move should have been forwarded", |
| - TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| + event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + longPressTimeoutMs); |
| + mGestureHandler.onTouchEvent(event); |
| + assertFalse("Scrolling should have prevented the LONG_TAP", |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_LONG_TAP)); |
| } |
| /** |
| - * Verify that touch moves are not deferred even if they are within the touch slop region |
| - * when the touch sequence is being consumed. |
| + * Verify that LONG_PRESS is not fired during a double-tap sequence. |
| + * |
| * @throws Exception |
| */ |
| @SmallTest |
| @Feature({"Gestures"}) |
| - public void testTouchMoveWithinTouchSlopNotDeferredIfJavascriptConsumingGesture() |
| - throws Exception { |
| - Context context = getInstrumentation().getTargetContext(); |
| + public void testNoGestureLongPressDuringDoubleTap() throws Exception { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); |
| - final int lessThanSlopScrollDelta = scaledTouchSlop / 2; |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("The touch down should have been forwarded", |
| - TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + lessThanSlopScrollDelta, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals("The less-than-slop touch move should have been forwarded", |
| - TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); |
| - } |
| + getInstrumentation().runOnMainSync(new Runnable() { |
| + @Override |
| + public void run() { |
| + setUp(); |
| + mGestureHandler.updateDoubleTapSupport(true); |
| + MotionEvent event = MotionEvent.obtain( |
| + downTime, eventTime, MotionEvent.ACTION_DOWN, |
| + FAKE_COORD_X, FAKE_COORD_Y, 0); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| - /** |
| - * Verify that touch moves are not deferred when the MotionEvent has multiple active pointers. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testTouchMoveNotDeferredWithMultiplePointers() |
| - throws Exception { |
| - Context context = getInstrumentation().getTargetContext(); |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); |
| - final int lessThanSlopScrollDelta = scaledTouchSlop / 2; |
| + event = MotionEvent.obtain( |
| + downTime, eventTime + 1, MotionEvent.ACTION_UP, |
| + FAKE_COORD_X, FAKE_COORD_Y, 0); |
| + mGestureHandler.onTouchEvent(event); |
| + assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent", |
| + ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| - mGestureHandler.hasTouchEventHandlers(true); |
| + event = MotionEvent.obtain( |
| + downTime + 2, eventTime + 2, MotionEvent.ACTION_DOWN, |
| + FAKE_COORD_X, FAKE_COORD_Y, 0); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| + assertEquals("A GESTURE_TAP_DOWN event should have been sent ", |
| + ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertTrue(mGestureHandler.isDoubleTapActive()); |
| + } |
| + }); |
| - final int secondaryCoordX = FAKE_COORD_X + 10 * scaledTouchSlop; |
| - final int secondaryCoordY = FAKE_COORD_Y + 10 * scaledTouchSlop; |
| + final int longPressTimeoutMs = ViewConfiguration.getLongPressTimeout() |
| + + ViewConfiguration.getTapTimeout() + 10; |
| - PointerProperties pp0 = new PointerProperties(); |
| - pp0.id = 0; |
| - pp0.toolType = MotionEvent.TOOL_TYPE_FINGER; |
| - PointerProperties pp1 = new PointerProperties(); |
| - pp1.id = 1; |
| - pp1.toolType = MotionEvent.TOOL_TYPE_FINGER; |
| + assertFalse(mMockMotionEventDelegate.mLongPressCalled.await( |
| + longPressTimeoutMs, TimeUnit.MILLISECONDS)); |
| - PointerCoords pc0 = new PointerCoords(); |
| - pc0.x = FAKE_COORD_X; |
| - pc0.y = FAKE_COORD_Y; |
| - pc0.pressure = 1; |
| - pc0.size = 1; |
| - PointerCoords pc1 = new PointerCoords(); |
| - pc1.x = secondaryCoordX; |
| - pc1.y = secondaryCoordY; |
| - pc1.pressure = 1; |
| - pc1.size = 1; |
| + assertFalse("A LONG_PRESS gesture should not have been sent", |
| + ContentViewGestureHandler.GESTURE_LONG_PRESS |
| + == mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| MotionEvent event = MotionEvent.obtain( |
| - eventTime, eventTime, MotionEvent.ACTION_DOWN, |
| - 1, new PointerProperties[] { pp0 }, new PointerCoords[] { pc0 }, |
| - 0, 0, 1.0f, 1.0f, 0, 0, 0, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("The touch down should have been forwarded", |
| - TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); |
| - |
| - event = MotionEvent.obtain( |
| - eventTime, eventTime, MotionEvent.ACTION_POINTER_DOWN, |
| - 2, new PointerProperties[] { pp0, pp1 }, new PointerCoords[] { pc0, pc1 }, |
| - 0, 0, 1.0f, 1.0f, 0, 0, 0, 0); |
| + downTime + 2, eventTime + longPressTimeoutMs, MotionEvent.ACTION_MOVE, |
| + FAKE_COORD_X + 20, FAKE_COORD_Y + 20, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("The secondary touch down should have been forwarded", |
| - TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); |
| - |
| - pc1.x = secondaryCoordX + lessThanSlopScrollDelta; |
| - pc1.y = secondaryCoordY + lessThanSlopScrollDelta; |
| + assertEquals("A double tap drag should have started", |
| + ContentViewGestureHandler.GESTURE_PINCH_BEGIN, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertTrue(mGestureHandler.isDoubleTapActive()); |
| event = MotionEvent.obtain( |
| - eventTime, eventTime, MotionEvent.ACTION_MOVE, |
| - 2, new PointerProperties[] { pp0, pp1 }, new PointerCoords[] { pc0, pc1 }, |
| - 0, 0, 1.0f, 1.0f, 0, 0, 0, 0); |
| + downTime + 2, eventTime + longPressTimeoutMs, MotionEvent.ACTION_UP, |
| + FAKE_COORD_X, FAKE_COORD_Y + 1, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("The secondary touch move should have been forwarded", |
| - TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); |
| + assertEquals("A double tap drag should have ended", |
| + ContentViewGestureHandler.GESTURE_SCROLL_END, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertFalse(mGestureHandler.isDoubleTapActive()); |
| } |
| - private static void sendLastScrollByEvent(ContentViewGestureHandler handler) { |
| + /** |
| + * Verify that the touch slop region is removed from the first scroll delta to avoid a jump when |
| + * starting to scroll. |
| + * @throws Exception |
| + */ |
| + @SmallTest |
| + @Feature({"Gestures"}) |
| + public void testTouchSlopRemovedFromScroll() throws Exception { |
| + Context context = getInstrumentation().getTargetContext(); |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(handler.onTouchEvent(event)); |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + 30, 0); |
| - assertTrue(handler.onTouchEvent(event)); |
| - } |
| + final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); |
| + final int scrollDelta = 5; |
| - private static void sendLastZoomEvent( |
| - ContentViewGestureHandler handler, MockZoomManager zoomManager) { |
| - zoomManager.pinchOnMoveEvents(handler); |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(handler.onTouchEvent(event)); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| + |
| event = MotionEvent.obtain( |
| downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + 30, 0); |
| - assertTrue(handler.onTouchEvent(event)); |
| - } |
| + FAKE_COORD_X, FAKE_COORD_Y + scaledTouchSlop + scrollDelta, 0); |
| + assertTrue(mGestureHandler.onTouchEvent(event)); |
| - private static void sendLastPinchEvent(ContentViewGestureHandler handler) { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - handler.pinchBegin(downTime, FAKE_COORD_X, FAKE_COORD_Y); |
| - handler.pinchBy(eventTime + 10, FAKE_COORD_X, FAKE_COORD_Y, 2); |
| + assertEquals("We should have started scrolling", |
| + ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + |
| + MockMotionEventDelegate.GestureEvent gestureEvent = |
| + mMockMotionEventDelegate.mMostRecentGestureEvent; |
| + assertNotNull(gestureEvent); |
| + Bundle extraParams = gestureEvent.getExtraParams(); |
| + assertEquals(0, extraParams.getInt(ContentViewGestureHandler.DISTANCE_X)); |
| + assertEquals(-scrollDelta, extraParams.getInt(ContentViewGestureHandler.DISTANCE_Y)); |
| } |
| /** |
| @@ -1775,25 +1148,19 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("A TAP_DOWN gesture should have been sent", |
| ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10); |
| assertFalse(mGestureHandler.onTouchEvent(event)); |
| assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED gesture should have been sent", |
| ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| - |
| - assertTrue("Should not have confirmed a single tap yet", |
| - mMockListener.mLastSingleTap == null); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertFalse(mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_SINGLE_TAP_CONFIRMED)); |
| } |
| /** |
| @@ -1807,27 +1174,22 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| long downTime = SystemClock.uptimeMillis(); |
| long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals(ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertTrue(mGestureHandler.needsTapEndingEventForTesting()); |
| event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5); |
| - assertFalse(mGestureHandler.onTouchEvent(event)); |
| + mGestureHandler.onTouchEvent(event); |
| assertEquals(ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertTrue("An unconfirmed tap does not terminate the tap down.", |
| mGestureHandler.needsTapEndingEventForTesting()); |
| // A confirmed tap is a tap-ending event. |
| downTime += 20; |
| eventTime += 20; |
| - mockDelegate.mGestureTypeList.clear(); |
| + mMockMotionEventDelegate.mGestureTypeList.clear(); |
| mGestureHandler.updateShouldDisableDoubleTap(true); |
| event = MotionEvent.obtain( |
| downTime, downTime, MotionEvent.ACTION_DOWN, |
| @@ -1839,14 +1201,14 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| FAKE_COORD_X, FAKE_COORD_Y, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals(ContentViewGestureHandler.GESTURE_SINGLE_TAP_CONFIRMED, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertFalse("A confirmed single tap should terminate the tap down.", |
| mGestureHandler.needsTapEndingEventForTesting()); |
| // A double tap gesture is a tap-ending event. |
| downTime += 20; |
| eventTime += 20; |
| - mockDelegate.mGestureTypeList.clear(); |
| + mMockMotionEventDelegate.mGestureTypeList.clear(); |
| mGestureHandler.updateShouldDisableDoubleTap(false); |
| event = MotionEvent.obtain( |
| downTime, downTime, MotionEvent.ACTION_DOWN, |
| @@ -1866,14 +1228,14 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| FAKE_COORD_X, FAKE_COORD_Y, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals(ContentViewGestureHandler.GESTURE_DOUBLE_TAP, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertFalse("A double tap should terminate the tap down.", |
| mGestureHandler.needsTapEndingEventForTesting()); |
| // A double tap drag gesture will trigger a tap-ending event. |
| downTime += 20; |
| eventTime += 20; |
| - mockDelegate.mGestureTypeList.clear(); |
| + mMockMotionEventDelegate.mGestureTypeList.clear(); |
| mGestureHandler.updateShouldDisableDoubleTap(false); |
| event = MotionEvent.obtain( |
| downTime, downTime, MotionEvent.ACTION_DOWN, |
| @@ -1894,9 +1256,9 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertFalse("A double tap drag should terminate the tap down.", |
| mGestureHandler.needsTapEndingEventForTesting()); |
| - assertTrue(mockDelegate.mGestureTypeList.contains( |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| - assertTrue(mockDelegate.mGestureTypeList.contains( |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_TAP_CANCEL)); |
| event = MotionEvent.obtain( |
| eventTime + 10, eventTime + 20, MotionEvent.ACTION_UP, |
| @@ -1907,7 +1269,7 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| // A scroll event will trigger a tap-ending (cancel) event. |
| downTime += 25; |
| eventTime += 25; |
| - mockDelegate.mGestureTypeList.clear(); |
| + mMockMotionEventDelegate.mGestureTypeList.clear(); |
| event = MotionEvent.obtain( |
| downTime, downTime, MotionEvent.ACTION_DOWN, |
| FAKE_COORD_X, FAKE_COORD_Y, 0); |
| @@ -1917,9 +1279,9 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| FAKE_COORD_X, FAKE_COORD_Y + 100, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertTrue(mockDelegate.mGestureTypeList.contains( |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| - assertTrue(mockDelegate.mGestureTypeList.contains( |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_TAP_CANCEL)); |
| assertFalse("A scroll should terminate the tap down.", |
| mGestureHandler.needsTapEndingEventForTesting()); |
| @@ -1927,133 +1289,6 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| } |
| /** |
| - * Verify that touch move events are properly coalesced. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testTouchMoveCoalescing() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals(TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); |
| - assertEquals("Initial move events should offered to javascript and added to the queue", |
| - 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals(TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("Move events already sent to javascript should not be coalesced", |
| - 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 15, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 15, FAKE_COORD_Y * 15, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("Similar pending move events should be coalesced", |
| - 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - PointerProperties pp1 = new PointerProperties(); |
| - pp1.id = 0; |
| - pp1.toolType = MotionEvent.TOOL_TYPE_FINGER; |
| - PointerProperties pp2 = new PointerProperties(); |
| - pp2.id = 1; |
| - pp2.toolType = MotionEvent.TOOL_TYPE_FINGER; |
| - PointerProperties[] properties = new PointerProperties[] { pp1, pp2 }; |
| - |
| - PointerCoords pc1 = new PointerCoords(); |
| - pc1.x = FAKE_COORD_X * 10; |
| - pc1.y = FAKE_COORD_Y * 10; |
| - pc1.pressure = 1; |
| - pc1.size = 1; |
| - PointerCoords pc2 = new PointerCoords(); |
| - pc2.x = FAKE_COORD_X * 15; |
| - pc2.y = FAKE_COORD_Y * 15; |
| - pc2.pressure = 1; |
| - pc2.size = 1; |
| - PointerCoords[] coords = new PointerCoords[] { pc1, pc2 }; |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 20, MotionEvent.ACTION_MOVE, |
| - 2, properties, coords, 0, 0, 1.0f, 1.0f, 0, 0, 0, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("Move events with different pointer counts should not be coalesced", |
| - 3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 25, MotionEvent.ACTION_MOVE, |
| - 2, properties, coords, 0, 0, 1.0f, 1.0f, 0, 0, 0, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("Move events with similar pointer counts should be coalesced", |
| - 3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals("Move events should not be coalesced with other events", |
| - 4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - } |
| - |
| - /** |
| - * Verify that synchronous confirmTouchEvent() calls made from the MotionEventDelegate behave |
| - * properly. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testSynchronousConfirmTouchEvent() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - mMockMotionEventDelegate.disableSynchronousConfirmTouchEvent(); |
| - |
| - // Queue an asynchronously handled event. |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - // Queue another event; this will remain in the queue until the first event is confirmed. |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - // Enable synchronous event confirmation upon dispatch. |
| - mMockMotionEventDelegate.enableSynchronousConfirmTouchEvent( |
| - mGestureHandler, ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - |
| - // Confirm the original event; this should dispatch the second event and confirm it |
| - // synchronously. |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals(TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); |
| - |
| - // Adding events to any empty queue will trigger synchronous dispatch and confirmation. |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - } |
| - |
| - /** |
| * Verify that no double tap gestures are created if the gesture handler is |
| * told to disable double tap gesture detection (according to the logic in |
| * ContentViewCore.onRenderCoordinatesUpdated). |
| @@ -2065,10 +1300,6 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| mGestureHandler.updateShouldDisableDoubleTap(true); |
| MotionEvent event = MotionEvent.obtain( |
| @@ -2076,7 +1307,7 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| FAKE_COORD_X, FAKE_COORD_Y, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("Only GESTURE_TAP_DOWN should have been sent", |
| - 1, mockDelegate.mGestureTypeList.size()); |
| + 1, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| downTime, eventTime + 5, MotionEvent.ACTION_UP, |
| @@ -2084,10 +1315,10 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("A GESTURE_SINGLE_TAP_CONFIRMED event should have been sent", |
| ContentViewGestureHandler.GESTURE_SINGLE_TAP_CONFIRMED, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SINGLE_TAP_CONFIRMED " + |
| "should have been sent", |
| - 2, mockDelegate.mGestureTypeList.size()); |
| + 2, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN, |
| @@ -2096,7 +1327,7 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| "GESTURE_SINGLE_TAP_CONFIRMED and " + |
| "GESTURE_TAP_DOWN should have been sent", |
| - 3, mockDelegate.mGestureTypeList.size()); |
| + 3, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| eventTime + 10, eventTime + 15, MotionEvent.ACTION_UP, |
| @@ -2104,12 +1335,12 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("A double tap should not have occurred", |
| ContentViewGestureHandler.GESTURE_SINGLE_TAP_CONFIRMED, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("Only GESTURE_TAP_DOWN, " + |
| "GESTURE_SINGLE_TAP_CONFIRMED, " + |
| "GESTURE_TAP_DOWN and " + |
| "GESTURE_SINGLE_TAP_CONFIRMED should have been sent", |
| - 4, mockDelegate.mGestureTypeList.size()); |
| + 4, mMockMotionEventDelegate.mGestureTypeList.size()); |
| } |
| /** |
| @@ -2125,10 +1356,6 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| final long downTime1 = SystemClock.uptimeMillis(); |
| final long downTime2 = downTime1 + 100; |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| mGestureHandler.updateShouldDisableDoubleTap(true); |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); |
| @@ -2152,10 +1379,10 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| // disabled. |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_START should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| assertFalse("No GESTURE_PINCH_BEGIN should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_BEGIN)); |
| event = MotionEvent.obtain( |
| @@ -2164,20 +1391,20 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertEquals("GESTURE_SCROLL_BY should have been sent", |
| ContentViewGestureHandler.GESTURE_SCROLL_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| assertEquals("GESTURE_SCROLL_BY should have been sent", |
| event.getEventTime(), |
| - mockDelegate.mMostRecentGestureEvent.getTimeMs()); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.getTimeMs()); |
| assertTrue("No GESTURE_PINCH_BY should have been sent", |
| ContentViewGestureHandler.GESTURE_PINCH_BY != |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 15, MotionEvent.ACTION_UP, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertFalse("No GESTURE_PINCH_END should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_END)); |
| } |
| @@ -2192,13 +1419,6 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| long downTime1 = SystemClock.uptimeMillis(); |
| long downTime2 = downTime1 + 100; |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mLongPressDetector = new LongPressDetector( |
| - getInstrumentation().getTargetContext(), mGestureHandler); |
| - |
| // Start a double-tap drag gesture. |
| MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| @@ -2216,11 +1436,11 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| FAKE_COORD_X, FAKE_COORD_Y + 100, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_START should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| assertEquals("GESTURE_PINCH_BEGIN should have been sent", |
| ContentViewGestureHandler.GESTURE_PINCH_BEGIN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| // Simulate setting a fixed page scale (or a mobile viewport); |
| // this should not disrupt the current double-tap gesture. |
| @@ -2232,25 +1452,25 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_BY should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_BY)); |
| assertEquals("GESTURE_PINCH_BY should have been sent", |
| ContentViewGestureHandler.GESTURE_PINCH_BY, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 15, MotionEvent.ACTION_UP, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_PINCH_END should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_END)); |
| assertEquals("GESTURE_SCROLL_END should have been sent", |
| ContentViewGestureHandler.GESTURE_SCROLL_END, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| // The double-tap gesture has finished, but the page scale is fixed. |
| // The same event sequence should not generate any double tap getsures. |
| - mockDelegate.mGestureTypeList.clear(); |
| + mMockMotionEventDelegate.mGestureTypeList.clear(); |
| downTime1 += 200; |
| downTime2 += 200; |
| @@ -2270,10 +1490,10 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| FAKE_COORD_X, FAKE_COORD_Y + 100, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_START should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| assertFalse("GESTURE_PINCH_BEGIN should not have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_BEGIN)); |
| // Double tap zoom updates should not be sent. |
| @@ -2283,284 +1503,115 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase { |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertTrue("GESTURE_SCROLL_BY should have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_SCROLL_BY)); |
| assertFalse("GESTURE_PINCH_BY should not have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_BY)); |
| event = MotionEvent.obtain( |
| downTime2, downTime2 + 15, MotionEvent.ACTION_UP, |
| FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| assertFalse("GESTURE_PINCH_END should not have been sent", |
| - mockDelegate.mGestureTypeList.contains( |
| + mMockMotionEventDelegate.mGestureTypeList.contains( |
| ContentViewGestureHandler.GESTURE_PINCH_END)); |
| } |
| /** |
| - * Verify that a secondary pointer press with no consumer does not interfere |
| - * with Javascript touch handling. |
| - * |
| + * Verify that pinch zoom sends the proper event sequence. |
| * @throws Exception |
| */ |
| @SmallTest |
| @Feature({"Gestures"}) |
| - public void testSecondaryPointerWithNoConsumer() throws Exception { |
| + public void testPinchZoom() throws Exception { |
| final long downTime = SystemClock.uptimeMillis(); |
| final long eventTime = SystemClock.uptimeMillis(); |
| + final Context context = getInstrumentation().getTargetContext(); |
| + final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - // Queue a primary pointer press, a secondary pointer press and release, |
| - // and a primary pointer move. |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = motionEvent(MotionEvent.ACTION_POINTER_DOWN, downTime, eventTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = motionEvent(MotionEvent.ACTION_POINTER_UP, downTime, eventTime + 10); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 15, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - // Simulate preventDefault from Javascript, forcing all touch events to Javascript |
| - // for the current sequence. |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| - assertEquals("Even if the secondary pointer has no consumer, continue sending events", |
| - 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| - assertEquals("Even if the secondary pointer has no consumer, continue sending events", |
| - 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - assertEquals("No gestures should result from the Javascript-consumed sequence", |
| - 0, mMockMotionEventDelegate.mTotalSentGestureCount); |
| - } |
| - |
| - /** |
| - * Verify that multiple touch sequences in the queue are handled properly when |
| - * the Javascript response is different for each. |
| - * |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testMultiplyEnqueuedTouches() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| + mGestureHandler.updateMultiTouchSupport(true); |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - mGestureHandler.updateDoubleTapSupport(false); |
| + final int secondaryCoordX = FAKE_COORD_X + 20 * scaledTouchSlop; |
| + final int secondaryCoordY = FAKE_COORD_Y + 20 * scaledTouchSlop; |
| - // Queue a tap sequence. |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| + PointerProperties pp0 = new PointerProperties(); |
| + pp0.id = 0; |
| + pp0.toolType = MotionEvent.TOOL_TYPE_FINGER; |
| + PointerProperties pp1 = new PointerProperties(); |
| + pp1.id = 1; |
| + pp1.toolType = MotionEvent.TOOL_TYPE_FINGER; |
| - event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| + PointerCoords pc0 = new PointerCoords(); |
| + pc0.x = FAKE_COORD_X; |
| + pc0.y = FAKE_COORD_Y; |
| + pc0.pressure = 1; |
| + pc0.size = 1; |
| + PointerCoords pc1 = new PointerCoords(); |
| + pc1.x = secondaryCoordX; |
| + pc1.y = secondaryCoordY; |
| + pc1.pressure = 1; |
| + pc1.size = 1; |
| - // Queue a scroll sequence. |
| - event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 10, downTime + 10); |
| + MotionEvent event = MotionEvent.obtain( |
| + eventTime, eventTime, MotionEvent.ACTION_DOWN, |
| + 1, new PointerProperties[] { pp0 }, new PointerCoords[] { pc0 }, |
| + 0, 0, 1.0f, 1.0f, 0, 0, InputDevice.SOURCE_CLASS_POINTER, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| + assertEquals(ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertEquals("Only GESTURE_TAP_DOWN should have been sent", |
| + 1, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| - downTime + 10, eventTime + 15, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertFalse(mGestureHandler.isNativeScrolling()); |
| - assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = motionEvent(MotionEvent.ACTION_UP, downTime + 10, downTime + 20); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - assertEquals(5, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - // Consume the first gesture. |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - // Don't consume the second gesture; it should be fed to the gesture detector. |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertEquals("The down touch event should have been sent to the gesture detector", |
| - MotionEvent.ACTION_DOWN, mMockGestureDetector.mLastEvent.getActionMasked()); |
| - assertFalse(mGestureHandler.isNativeScrolling()); |
| - |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals("The move touch event should have been sent to the gesture detector", |
| - MotionEvent.ACTION_MOVE, mMockGestureDetector.mLastEvent.getActionMasked()); |
| - } |
| - |
| - /** |
| - * Verify that only complete gestures are forwarded to Javascript if we receive |
| - * a touch handler notification. |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testOnlyCompleteGesturesForwardedToTouchHandler() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - mGestureHandler.hasTouchEventHandlers(false); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| + eventTime, eventTime, MotionEvent.ACTION_POINTER_DOWN, |
| + 2, new PointerProperties[] { pp1, pp0 }, new PointerCoords[] { pc1, pc0 }, |
| + 0, 0, 1.0f, 1.0f, 0, 0, InputDevice.SOURCE_CLASS_POINTER, 0); |
| mGestureHandler.onTouchEvent(event); |
| - assertEquals("Initial down events should not be sent to Javascript without a touch handler", |
| - 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEvent != null); |
| - mMockGestureDetector.mLastEvent = null; |
| + assertEquals("No additional gestures should be triggered on a secondary pointer press", |
| + 1, mMockMotionEventDelegate.mGestureTypeList.size()); |
| - mGestureHandler.hasTouchEventHandlers(true); |
| + pc1.x = secondaryCoordX + 5 * scaledTouchSlop; |
| + pc1.y = secondaryCoordY + 5 * scaledTouchSlop; |
| event = MotionEvent.obtain( |
| - downTime, eventTime + 5, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); |
| - mGestureHandler.onTouchEvent(event); |
| - assertEquals("A move event should only be offered to javascript if the down was offered", |
| - 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEvent != null); |
| - |
| - event = motionEvent(MotionEvent.ACTION_POINTER_DOWN, downTime, eventTime + 10); |
| - mGestureHandler.onTouchEvent(event); |
| - assertEquals("A pointer event should only be offered to Javascript if the down was offered", |
| - 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - // Ensure that redundant notifications have no effect. |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - event = motionEvent(MotionEvent.ACTION_POINTER_UP, downTime, eventTime + 15); |
| - mGestureHandler.onTouchEvent(event); |
| - assertEquals("A pointer event should only be offered to Javascript if the down was offered", |
| - 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 20); |
| - mGestureHandler.onTouchEvent(event); |
| - assertEquals("A pointer event should only be offered to Javascript if the down was offered", |
| - 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - |
| - event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 25, downTime + 25); |
| - mGestureHandler.onTouchEvent(event); |
| - assertEquals("A down event should be offered to Javascript with a registered touch handler", |
| - 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); |
| - } |
| - |
| - /** |
| - * Verify that no timeout-based gestures are triggered after a touch event |
| - * is consumed. In particular, LONG_PRESS and SHOW_PRESS should not fire |
| - * if TouchStart went unconsumed, but subsequent TouchMoves are consumed. |
| - * |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testNoTimeoutGestureAfterTouchConsumed() throws Exception { |
| - getInstrumentation().runOnMainSync(new Runnable() { |
| - @Override |
| - public void run() { |
| - setUp(); |
| - |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, eventTime); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertTrue("Should have a pending LONG_PRESS", |
| - mLongPressDetector.hasPendingMessage()); |
| - |
| - event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertFalse("Should not have a pending LONG_PRESS", |
| - mLongPressDetector.hasPendingMessage()); |
| - } |
| - }); |
| - assertFalse(mMockListener.mShowPressCalled.await( |
| - ScalableTimeout.ScaleTimeout(ViewConfiguration.getTapTimeout() + 10), |
| - TimeUnit.MILLISECONDS)); |
| - assertFalse(mMockListener.mLongPressCalled.await( |
| - ScalableTimeout.ScaleTimeout(ViewConfiguration.getLongPressTimeout() + 10), |
| - TimeUnit.MILLISECONDS)); |
| - } |
| - |
| - /** |
| - * Verify that a TAP_DOWN will be followed by a TAP_CANCEL if the first |
| - * touch is unconsumed, but the subsequent touch is consumed. |
| - * |
| - * @throws Exception |
| - */ |
| - @SmallTest |
| - @Feature({"Gestures"}) |
| - public void testTapCancelledAfterTouchConsumed() throws Exception { |
| - final long downTime = SystemClock.uptimeMillis(); |
| - final long eventTime = SystemClock.uptimeMillis(); |
| - |
| - GestureRecordingMotionEventDelegate mockDelegate = |
| - new GestureRecordingMotionEventDelegate(); |
| - mGestureHandler = new ContentViewGestureHandler( |
| - getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); |
| - mGestureHandler.hasTouchEventHandlers(true); |
| - |
| - MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); |
| + eventTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| + 2, new PointerProperties[] { pp1, pp0 }, new PointerCoords[] { pc1, pc0 }, |
| + 0, 0, 1.0f, 1.0f, 0, 0, InputDevice.SOURCE_CLASS_POINTER, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals("A TAP_DOWN gesture should have been sent", |
| - ContentViewGestureHandler.GESTURE_TAP_DOWN, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + assertEquals("Only GESTURE_TAP_DOWN, " + |
| + "GESTURE_TAP_CANCEL, " + |
| + "GESTURE_SCROLL_BEGIN, " + |
| + "GESTURE_PINCH_BEGIN, " + |
| + "GESTURE_SCROLL_BY, and " + |
| + "GESTURE_PINCH_BY should have been sent", |
| + 6, mMockMotionEventDelegate.mGestureTypeList.size()); |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_PINCH_BEGIN)); |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_SCROLL_START)); |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_PINCH_BY)); |
| + assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains( |
| + ContentViewGestureHandler.GESTURE_SCROLL_BY)); |
| event = MotionEvent.obtain( |
| - downTime, eventTime + 10, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + 200, 0); |
| + eventTime, eventTime + 10, MotionEvent.ACTION_POINTER_UP, |
| + 2, new PointerProperties[] { pp1, pp0 }, new PointerCoords[] { pc1, pc0 }, |
| + 0, 0, 1.0f, 1.0f, 0, 0, InputDevice.SOURCE_CLASS_POINTER, 0); |
| assertTrue(mGestureHandler.onTouchEvent(event)); |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); |
| - assertEquals("A TAP_CANCEL gesture should have been sent", |
| - ContentViewGestureHandler.GESTURE_TAP_CANCEL, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + assertEquals(ContentViewGestureHandler.GESTURE_PINCH_END, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertEquals("Only GESTURE_PINCH_END should have been sent", |
| + 7, mMockMotionEventDelegate.mGestureTypeList.size()); |
| event = MotionEvent.obtain( |
| - downTime, eventTime + 15, MotionEvent.ACTION_MOVE, |
| - FAKE_COORD_X, FAKE_COORD_Y + 400, 0); |
| - assertTrue(mGestureHandler.onTouchEvent(event)); |
| - mGestureHandler.confirmTouchEvent( |
| - ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - assertEquals("No further gestures should be sent", |
| - ContentViewGestureHandler.GESTURE_TAP_CANCEL, |
| - mockDelegate.mMostRecentGestureEvent.mType); |
| + eventTime, eventTime, MotionEvent.ACTION_UP, |
| + 1, new PointerProperties[] { pp0 }, new PointerCoords[] { pc0 }, |
| + 0, 0, 1.0f, 1.0f, 0, 0, InputDevice.SOURCE_CLASS_POINTER, 0); |
| + mGestureHandler.onTouchEvent(event); |
| + assertEquals(ContentViewGestureHandler.GESTURE_SCROLL_END, |
| + mMockMotionEventDelegate.mMostRecentGestureEvent.mType); |
| + assertEquals("Only GESTURE_SCROLL_END should have been sent", |
| + 8, mMockMotionEventDelegate.mGestureTypeList.size()); |
| } |
| } |