- 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();