Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Unified Diff: content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java

Issue 181833003: [Android] Out with the Android GR, in with the new unified C++ GR (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
deleted file mode 100644
index 2c465736fe3c8a63544e3191336943e44c19f5b3..0000000000000000000000000000000000000000
--- a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java
+++ /dev/null
@@ -1,1731 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content.browser;
-
-import android.content.Context;
-import android.os.Bundle;
-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;
-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 java.util.ArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Test suite for ContentViewGestureHandler.
- */
-public class ContentViewGestureHandlerTest extends InstrumentationTestCase {
- private static final int FAKE_COORD_X = 42;
- private static final int FAKE_COORD_Y = 24;
-
- private static final String TAG = "ContentViewGestureHandler";
- private MockMotionEventDelegate mMockMotionEventDelegate;
- private ContentViewGestureHandler mGestureHandler;
-
- 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;
-
- 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;
- }
- }
- GestureEvent mMostRecentGestureEvent;
- GestureEvent mActiveScrollStartEvent;
- int mMostRecentMotionEventAction = -1;
- final ArrayList<Integer> mGestureTypeList = new ArrayList<Integer>();
- final ArrayList<Long> mGestureTimeList = new ArrayList<Long>();
-
- final CountDownLatch mLongPressCalled = new CountDownLatch(1);
- final CountDownLatch mShowPressCalled = new CountDownLatch(1);
-
- @Override
- public void onTouchEventHandlingBegin(MotionEvent event) {
- mMostRecentMotionEventAction = event.getActionMasked();
- }
-
- @Override
- public void onTouchEventHandlingEnd() {
- }
-
- @Override
- 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 == GestureEventType.SCROLL_START) {
- mActiveScrollStartEvent = mMostRecentGestureEvent;
- } else if (type == GestureEventType.SCROLL_END
- || type == GestureEventType.FLING_CANCEL) {
- mActiveScrollStartEvent = null;
- } else if (type == GestureEventType.LONG_PRESS) {
- mLongPressCalled.countDown();
- } else if (type == GestureEventType.SHOW_PRESS) {
- mShowPressCalled.countDown();
- }
-
- return true;
- }
- }
-
- private static MotionEvent motionEvent(int action, long downTime, long eventTime) {
- return MotionEvent.obtain(downTime, eventTime, action, FAKE_COORD_X, FAKE_COORD_Y, 0);
- }
-
- @Override
- public void setUp() {
- mMockMotionEventDelegate = new MockMotionEventDelegate();
- mGestureHandler = new ContentViewGestureHandler(
- getInstrumentation().getTargetContext(), mMockMotionEventDelegate);
- mGestureHandler.updateMultiTouchSupport(false);
- }
-
- /**
- * Verify that a DOWN followed shortly by an UP will trigger a single tap.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testGestureSingleClick() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- mGestureHandler.updateDoubleTapSupport(false);
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals(GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals(GestureEventType.SINGLE_TAP_CONFIRMED,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- }
-
- /**
- * Verify that a DOWN followed by a MOVE will trigger fling (but not LONG).
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testGestureFlingAndCancelLongClick() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
-
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals(GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- event = MotionEvent.obtain(
- downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
- 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));
- assertEquals(GestureEventType.FLING_START,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertFalse(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.LONG_PRESS));
- }
-
- /**
- * Verify that for a normal scroll the following events are sent:
- * - GESTURE_SCROLL_START
- * - GESTURE_SCROLL_BY
- * - GESTURE_SCROLL_END
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testScrollEventActionUpSequence() throws Exception {
- checkScrollEventSequenceForEndActionType(MotionEvent.ACTION_UP);
- }
-
- /**
- * Verify that for a cancelled scroll the following events are sent:
- * - GESTURE_SCROLL_START
- * - GESTURE_SCROLL_BY
- * - GESTURE_SCROLL_END
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testScrollEventActionCancelSequence() throws Exception {
- checkScrollEventSequenceForEndActionType(MotionEvent.ACTION_CANCEL);
- }
-
- private void checkScrollEventSequenceForEndActionType(int endActionType) throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
- final int scrollToX = FAKE_COORD_X + 100;
- final int scrollToY = FAKE_COORD_Y + 100;
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
-
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- event = MotionEvent.obtain(
- downTime, eventTime + 1000, MotionEvent.ACTION_MOVE, scrollToX, scrollToY, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.isNativeScrolling());
- assertTrue("A scrollStart event should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertEquals("We should have started scrolling",
- GestureEventType.SCROLL_BY,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only tapDown, tapCancel, scrollBegin and scrollBy should have been sent",
- 4, mMockMotionEventDelegate.mGestureTypeList.size());
- assertEquals("scrollBegin should be sent before scrollBy",
- GestureEventType.SCROLL_START,
- (int) mMockMotionEventDelegate.mGestureTypeList.get(2));
- assertEquals("scrollBegin should have the time of the ACTION_MOVE",
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_END));
- assertEquals("We should have stopped scrolling",
- GestureEventType.SCROLL_END,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only tapDown, scrollBegin and scrollBy and scrollEnd should have been sent",
- 5, mMockMotionEventDelegate.mGestureTypeList.size());
- }
-
- /**
- * Verify that for a normal fling (fling after scroll) the following events are sent:
- * - GESTURE_SCROLL_BEGIN
- * - GESTURE_FLING_START
- * and GESTURE_FLING_CANCEL is sent on the next touch.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testFlingEventSequence() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
-
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- event = MotionEvent.obtain(
- downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.isNativeScrolling());
- assertTrue("A scrollStart event should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertEquals("We should have started scrolling",
- GestureEventType.SCROLL_BY,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only tapDown, tapCancel, scrollBegin and scrollBy should have been sent",
- 4, mMockMotionEventDelegate.mGestureTypeList.size());
- assertEquals("scrollBegin should be sent before scrollBy",
- GestureEventType.SCROLL_START,
- (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());
- int hintX = startEvent.getExtraParams().getInt(ContentViewGestureHandler.DELTA_HINT_X);
- int hintY = startEvent.getExtraParams().getInt(ContentViewGestureHandler.DELTA_HINT_Y);
- // We don't want to take a dependency here on exactly how hints are calculated for a
- // fling (eg. may depend on velocity), so just validate the direction.
- assertTrue("scrollBegin hint should be in positive X axis",
- hintX > 0 && hintY > 0 && hintX > hintY);
-
- event = MotionEvent.obtain(
- downTime, eventTime + 15, MotionEvent.ACTION_UP,
- FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertFalse(mGestureHandler.isNativeScrolling());
- assertEquals("We should have started flinging",
- GestureEventType.FLING_START,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertTrue("A scroll end event should not have been sent",
- !mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_END));
- assertEquals("The last up should have caused flingStart to be sent",
- 5, mMockMotionEventDelegate.mGestureTypeList.size());
- assertEquals("flingStart should have the time of the ACTION_UP",
- eventTime + 15, (long) mMockMotionEventDelegate.mGestureTimeList.get(4));
- }
-
- /**
- * Verify that a zero-velocity fling is never forwarded, and cancels any
- * previous fling or scroll sequence.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testZeroVelocityFling() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- mGestureHandler.fling(eventTime, 5, 5, 0, 0);
- assertEquals("A zero-velocity fling should not be forwarded",
- GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- mGestureHandler.fling(eventTime, 5, 5, 5, 0);
- assertEquals("Subsequent flings should work properly",
- GestureEventType.FLING_START,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- event = MotionEvent.obtain(
- downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.isNativeScrolling());
- assertTrue("A scrollStart event should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertEquals("We should have started scrolling",
- GestureEventType.SCROLL_BY,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- mGestureHandler.fling(eventTime, 5, 5, 0, 0);
- assertEquals("A zero-velicty fling should end the current scroll sequence",
- GestureEventType.SCROLL_END,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- }
-
- /**
- * Verify that a show pressed state gesture followed by a long press followed by the focus
- * loss in the window due to context menu cancels show pressed.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testShowPressCancelOnWindowFocusLost() throws Exception {
- final long time = SystemClock.uptimeMillis();
-
- getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- setUp();
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, time, time);
- mGestureHandler.onTouchEvent(event);
- }
- });
-
- assertTrue(mMockMotionEventDelegate.mShowPressCalled.await(
- ScalableTimeout.scaleTimeout(ViewConfiguration.getTapTimeout() + 10),
- TimeUnit.MILLISECONDS));
-
- assertTrue(mMockMotionEventDelegate.mLongPressCalled.await(
- ScalableTimeout.scaleTimeout(ViewConfiguration.getLongPressTimeout()
- + ViewConfiguration.getTapTimeout() + 10),
- TimeUnit.MILLISECONDS));
-
- assertEquals("Should have sent SHOW_PRESS and LONG_PRESS events",
- 3, mMockMotionEventDelegate.mGestureTypeList.size());
- assertEquals("Should have a show press event",
- GestureEventType.SHOW_PRESS,
- mMockMotionEventDelegate.mGestureTypeList.get(1).intValue());
- assertEquals("Should have a long press event",
- GestureEventType.LONG_PRESS,
- 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, mMockMotionEventDelegate.mGestureTypeList.size());
- assertEquals("Should have a gesture show press cancel event next",
- GestureEventType.TAP_CANCEL,
- mMockMotionEventDelegate.mGestureTypeList.get(3).intValue());
- }
-
- /**
- * Verify that a recent show pressed state gesture is canceled when scrolling begins.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testShowPressCancelWhenScrollBegins() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
-
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- mGestureHandler.sendShowPressedStateGestureForTesting();
-
- assertEquals("A show pressed state event should have been sent",
- GestureEventType.SHOW_PRESS,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only tapDown and showPressedState should have been sent",
- 2, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- assertEquals("We should have started scrolling",
- GestureEventType.SCROLL_BY,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertTrue("A show press cancel event should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.TAP_CANCEL));
- assertEquals("Only tapDown, showPressedState, showPressCancel, scrollBegin and scrollBy" +
- " should have been sent",
- 5, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- downTime, eventTime + 15, MotionEvent.ACTION_UP,
- FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("We should have started flinging",
- GestureEventType.FLING_START,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertTrue("A scroll end event should not have been sent",
- !mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_END));
- assertEquals("The last up should have caused flingStart to be sent",
- 6, mMockMotionEventDelegate.mGestureTypeList.size());
- }
-
- /**
- * Verify that double tap is correctly handled including the recent show pressed state gesture
- * cancellation.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testDoubleTap() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- mGestureHandler.sendShowPressedStateGestureForTesting();
- assertEquals("GESTURE_SHOW_PRESS should have been sent",
- GestureEventType.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,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- mGestureHandler.onTouchEvent(event);
- assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent",
- GestureEventType.SINGLE_TAP_UNCONFIRMED,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS and " +
- "GESTURE_SINGLE_TAP_UNCONFIRMED should have been sent",
- 3, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("A GESTURE_TAP_DOWN event should have been sent ",
- GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS, " +
- "GESTURE_SINGLE_TAP_UNCONFIRMED," +
- "GESTURE_TAP_CANCEL and" +
- "GESTURE_TAP_DOWN should have been sent",
- 5, mMockMotionEventDelegate.mGestureTypeList.size());
-
- // Moving a very small amount of distance should not trigger the double tap drag zoom mode.
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 10, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X, FAKE_COORD_Y + 1, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS, " +
- "GESTURE_SINGLE_TAP_UNCONFIRMED and" +
- "GESTURE_TAP_CANCEL and " +
- "GESTURE_TAP_DOWN should have been sent",
- 5, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 15, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y + 1, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("A double tap should have occurred",
- GestureEventType.DOUBLE_TAP,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS, " +
- "GESTURE_SINGLE_TAP_UNCONFIRMED, " +
- "GESTURE_TAP_CANCEL, " +
- "GESTURE_TAP_DOWN, " +
- "GESTURE_DOUBLE_TAP should have been sent",
- 6, mMockMotionEventDelegate.mGestureTypeList.size());
- }
-
- /**
- * Verify that double tap drag zoom feature is correctly executed.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testDoubleTapDragZoom() throws Exception {
- final long downTime1 = SystemClock.uptimeMillis();
- final long downTime2 = downTime1 + 100;
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- mGestureHandler.sendShowPressedStateGestureForTesting();
- assertEquals("GESTURE_SHOW_PRESS should have been sent",
- GestureEventType.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,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- mGestureHandler.onTouchEvent(event);
- assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent",
- GestureEventType.SINGLE_TAP_UNCONFIRMED,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS and " +
- "GESTURE_TAP_UNCONFIRMED " +
- "should have been sent",
- 3, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- downTime2, downTime2, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("GESTURE_TAP_DOWN should have been sent",
- GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS, " +
- "GESTURE_TAP_UNCONFIRMED," +
- "GESTURE_TAP_CANCEL and" +
- "GESTURE_TAP_DOWN should have been sent",
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- MockMotionEventDelegate.GestureEvent startEvent =
- mMockMotionEventDelegate.mActiveScrollStartEvent;
- assertEquals(FAKE_COORD_X, startEvent.getX());
- assertEquals(FAKE_COORD_Y + 100, startEvent.getY());
- Bundle extraParams = startEvent.getExtraParams();
- assertNotNull(extraParams);
- assertEquals("GESTURE_SCROLL_START should have an X hint equal to the distance traveled",
- 0, extraParams.getInt(ContentViewGestureHandler.DELTA_HINT_X));
- assertEquals("GESTURE_SCROLL_START should have an X hint equal to the distance traveled",
- 100, extraParams.getInt(ContentViewGestureHandler.DELTA_HINT_Y));
-
- assertEquals("GESTURE_PINCH_BEGIN should have been sent",
- GestureEventType.PINCH_BEGIN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "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, 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_BY));
- assertEquals("GESTURE_PINCH_BY should have been sent",
- GestureEventType.PINCH_BY,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS, " +
- "GESTURE_TAP_UNCONFIRMED," +
- "GESTURE_TAP_CANCEL, " +
- "GESTURE_TAP_DOWN, " +
- "GESTURE_TAP_CANCEL, " +
- "GESTURE_SCROLL_START," +
- "GESTURE_PINCH_BEGIN, " +
- "GESTURE_SCROLL_BY, and " +
- "GESTURE_PINCH_BY should have been sent",
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_END));
- assertEquals("GESTURE_SCROLL_END should have been sent",
- GestureEventType.SCROLL_END,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS, " +
- "GESTURE_TAP_UNCONFIRMED," +
- "GESTURE_TAP_CANCEL, " +
- "GESTURE_TAP_DOWN, " +
- "GESTURE_TAP_CANCEL, " +
- "GESTURE_SCROLL_START," +
- "GESTURE_PINCH_BEGIN, " +
- "GESTURE_SCROLL_BY," +
- "GESTURE_PINCH_BY, " +
- "GESTURE_PINCH_END, and " +
- "GESTURE_SCROLL_END should have been sent",
- 12, mMockMotionEventDelegate.mGestureTypeList.size());
- }
-
-
- /**
- * Verify that double tap drag zoom is cancelled if the user presses a
- * secondary pointer.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testDoubleTapDragZoomCancelledOnSecondaryPointerDown() throws Exception {
- final long downTime1 = SystemClock.uptimeMillis();
- final long downTime2 = downTime1 + 100;
-
- 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;
-
- 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 = FAKE_COORD_X + 50;
- pc1.y = FAKE_COORD_Y + 50;
- pc1.pressure = 1;
- pc1.size = 1;
-
- MotionEvent event = MotionEvent.obtain(
- downTime1, downTime1, 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));
-
- mGestureHandler.sendShowPressedStateGestureForTesting();
- assertEquals("GESTURE_SHOW_PRESS should have been sent",
- GestureEventType.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,
- 1, new PointerProperties[] { pp0 }, new PointerCoords[] { pc0 },
- 0, 0, 1.0f, 1.0f, 0, 0, InputDevice.SOURCE_CLASS_POINTER, 0);
- mGestureHandler.onTouchEvent(event);
- assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent",
- GestureEventType.SINGLE_TAP_UNCONFIRMED,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS and " +
- "GESTURE_TAP_UNCONFIRMED " +
- "should have been sent",
- 3, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- downTime2, downTime2, 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("GESTURE_TAP_DOWN should have been sent",
- GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS, " +
- "GESTURE_TAP_UNCONFIRMED," +
- "GESTURE_TAP_CANCEL and" +
- "GESTURE_TAP_DOWN should have been sent",
- 5, mMockMotionEventDelegate.mGestureTypeList.size());
-
- pc0.y = pc0.y - 30;
-
- event = MotionEvent.obtain(
- downTime2, downTime2 + 50, MotionEvent.ACTION_MOVE,
- 1, new PointerProperties[] { pp0 }, new PointerCoords[] { pc0 },
- 0, 0, 1.0f, 1.0f, 0, 0, InputDevice.SOURCE_CLASS_POINTER, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue("GESTURE_SCROLL_START should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
-
- assertEquals("GESTURE_PINCH_BEGIN should have been sent",
- GestureEventType.PINCH_BEGIN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "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, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- downTime2, downTime2 + 100, 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);
- assertTrue("GESTURE_PINCH_END should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_END));
- assertEquals("GESTURE_SCROLL_END should have been sent",
- GestureEventType.SCROLL_END,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SHOW_PRESS, " +
- "GESTURE_TAP_UNCONFIRMED," +
- "GESTURE_TAP_CANCEL, " +
- "GESTURE_TAP_DOWN, " +
- "GESTURE_TAP_CANCEL, " +
- "GESTURE_SCROLL_START," +
- "GESTURE_PINCH_BEGIN, " +
- "GESTURE_PINCH_END, and " +
- "GESTURE_SCROLL_END should have been sent",
- 10, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- downTime2, downTime2 + 150, 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);
- mGestureHandler.onTouchEvent(event);
- assertEquals("No new gestures should have been sent",
- 10, mMockMotionEventDelegate.mGestureTypeList.size());
- }
-
- /**
- * Verify that double tap drag zoom feature is not invoked
- * when it is disabled..
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testDoubleTapDragZoomNothingWhenDisabled() throws Exception {
- final long downTime1 = SystemClock.uptimeMillis();
- final long downTime2 = downTime1 + 100;
-
- mGestureHandler.updateDoubleTapSupport(false);
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- event = MotionEvent.obtain(
- downTime1, downTime1 + 5, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- mGestureHandler.onTouchEvent(event);
-
- event = MotionEvent.obtain(
- downTime2, downTime2, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- event = MotionEvent.obtain(
- downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X, FAKE_COORD_Y + 100, 0);
-
- // The move should become a scroll, as double tap and drag to zoom is
- // disabled.
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue("GESTURE_SCROLL_START should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertFalse("No GESTURE_PINCH_BEGIN should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_BEGIN));
-
- event = MotionEvent.obtain(
- downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X, FAKE_COORD_Y + 200, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("GESTURE_SCROLL_BY should have been sent",
- GestureEventType.SCROLL_BY,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("GESTURE_SCROLL_BY should have been sent",
- event.getEventTime(),
- mMockMotionEventDelegate.mMostRecentGestureEvent.getTimeMs());
- assertTrue("No GESTURE_PINCH_BY should have been sent",
- GestureEventType.PINCH_BY !=
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_END));
- }
-
- /**
- * Generate a scroll gesture and verify that the resulting scroll motion event has both absolute
- * and relative position information.
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testScrollUpdateCoordinates() {
- final int deltaX = 16;
- final int deltaY = 84;
- final long downTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
- 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(mGestureHandler.onTouchEvent(event));
-
- event = MotionEvent.obtain(
- downTime, downTime + 10, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X - deltaX, FAKE_COORD_Y - deltaY, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- // Make sure the reported gesture event has all the expected data.
- MockMotionEventDelegate.GestureEvent gestureEvent =
- mMockMotionEventDelegate.mMostRecentGestureEvent;
- assertNotNull(gestureEvent);
- assertEquals(GestureEventType.SCROLL_BY, gestureEvent.getType());
- assertEquals(downTime + 10, gestureEvent.getTimeMs());
- assertEquals(FAKE_COORD_X - deltaX, gestureEvent.getX());
- assertEquals(FAKE_COORD_Y - deltaY, gestureEvent.getY());
-
- Bundle extraParams = gestureEvent.getExtraParams();
- assertNotNull(extraParams);
- // No horizontal delta because of snapping.
- assertEquals(0, extraParams.getInt(ContentViewGestureHandler.DISTANCE_X));
- assertEquals(deltaY / 2, extraParams.getInt(ContentViewGestureHandler.DISTANCE_Y));
- }
-
- /**
- * Generate a scroll gesture and verify that the resulting scroll start event
- * has the expected hint values.
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testScrollStartValues() {
- final int deltaX = 13;
- final int deltaY = 89;
- final long downTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
- 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);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertNull("Expect scrolling hasn't yet started",
- mMockMotionEventDelegate.mActiveScrollStartEvent);
-
- event = MotionEvent.obtain(
- downTime, downTime + 10, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X + deltaX, FAKE_COORD_Y + deltaY, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- MockMotionEventDelegate.GestureEvent startEvent =
- mMockMotionEventDelegate.mActiveScrollStartEvent;
- assertNotNull(startEvent);
- assertEquals(GestureEventType.SCROLL_START, startEvent.getType());
- assertEquals(downTime + 10, startEvent.getTimeMs());
- assertEquals(FAKE_COORD_X, startEvent.getX());
- assertEquals(FAKE_COORD_Y, startEvent.getY());
-
- Bundle extraParams = startEvent.getExtraParams();
- assertNotNull(extraParams);
- assertEquals(deltaX, extraParams.getInt(ContentViewGestureHandler.DELTA_HINT_X));
- assertEquals(deltaY, extraParams.getInt(ContentViewGestureHandler.DELTA_HINT_Y));
- }
-
- /**
- * Verify that the timer of LONG_PRESS will be cancelled when scrolling begins so
- * LONG_PRESS and LONG_TAP won't be triggered.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testLongPressAndTapCancelWhenScrollBegins() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- setUp();
-
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.LONG_PRESS));
- assertFalse("No LONG_TAP should be sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.LONG_TAP));
- }
-
- /**
- * Verify that LONG_TAP is triggered after LongPress followed by an UP.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testGestureLongTap() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- 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));
- }
- });
-
- assertTrue(mMockMotionEventDelegate.mLongPressCalled.await(
- ScalableTimeout.scaleTimeout(ViewConfiguration.getLongPressTimeout()
- + ViewConfiguration.getTapTimeout() + 10),
- TimeUnit.MILLISECONDS));
-
- assertEquals("A LONG_PRESS gesture should have been sent",
- GestureEventType.LONG_PRESS,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 1000);
- mGestureHandler.onTouchEvent(event);
- assertEquals("A LONG_TAP gesture should have been sent",
- GestureEventType.LONG_TAP,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- }
-
- /**
- * Verify that a LONG_PRESS gesture does not prevent further scrolling.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testGestureLongPressDoesNotPreventScrolling() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- 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));
- }
- });
-
- final long longPressTimeoutMs = ViewConfiguration.getLongPressTimeout()
- + ViewConfiguration.getTapTimeout() + 10;
- assertTrue(mMockMotionEventDelegate.mLongPressCalled.await(
- ScalableTimeout.scaleTimeout(longPressTimeoutMs), TimeUnit.MILLISECONDS));
-
- assertEquals("A LONG_PRESS gesture should have been sent",
- GestureEventType.LONG_PRESS,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- MotionEvent event = MotionEvent.obtain(
- downTime, eventTime + longPressTimeoutMs, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X + 100, FAKE_COORD_Y + 100, 0);
- mGestureHandler.onTouchEvent(event);
-
- assertEquals("Scrolling should have started",
- GestureEventType.SCROLL_BY,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.TAP_CANCEL));
-
- event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + longPressTimeoutMs);
- mGestureHandler.onTouchEvent(event);
- assertFalse("Scrolling should have prevented the LONG_TAP",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.LONG_TAP));
- }
-
- /**
- * Verify that LONG_PRESS is not fired during a double-tap sequence.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testNoGestureLongPressDuringDoubleTap() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- 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));
-
- 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",
- GestureEventType.SINGLE_TAP_UNCONFIRMED,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- 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 ",
- GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertTrue(mGestureHandler.isDoubleTapActive());
- }
- });
-
- final int longPressTimeoutMs = ViewConfiguration.getLongPressTimeout()
- + ViewConfiguration.getTapTimeout() + 10;
-
- assertFalse(mMockMotionEventDelegate.mLongPressCalled.await(
- longPressTimeoutMs, TimeUnit.MILLISECONDS));
-
- assertFalse("A LONG_PRESS gesture should not have been sent",
- GestureEventType.LONG_PRESS
- == mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- MotionEvent event = MotionEvent.obtain(
- downTime + 2, eventTime + longPressTimeoutMs, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X + 20, FAKE_COORD_Y + 20, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("A double tap drag should have started",
- GestureEventType.PINCH_BEGIN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertTrue(mGestureHandler.isDoubleTapActive());
-
- event = MotionEvent.obtain(
- downTime + 2, eventTime + longPressTimeoutMs, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y + 1, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("A double tap drag should have ended",
- GestureEventType.SCROLL_END,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertFalse(mGestureHandler.isDoubleTapActive());
- }
-
- /**
- * 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();
- final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
- final int scrollDelta = 5;
-
- 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",
- GestureEventType.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));
- }
-
- /**
- * Verify that a DOWN followed shortly by an UP will trigger
- * a GESTURE_SINGLE_TAP_UNCONFIRMED event immediately.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testGestureEventsSingleTapUnconfirmed() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("A TAP_DOWN gesture should have been sent",
- GestureEventType.TAP_DOWN,
- 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",
- GestureEventType.SINGLE_TAP_UNCONFIRMED,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertFalse(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SINGLE_TAP_CONFIRMED));
- }
-
- /**
- * Verify that a tap-ending event will follow a TAP_DOWN event.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testTapDownFollowedByTapEndingEvent() throws Exception {
- long downTime = SystemClock.uptimeMillis();
- long eventTime = SystemClock.uptimeMillis();
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals(GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertTrue(mGestureHandler.needsTapEndingEventForTesting());
- event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5);
- mGestureHandler.onTouchEvent(event);
- assertEquals(GestureEventType.SINGLE_TAP_UNCONFIRMED,
- 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;
- mMockMotionEventDelegate.mGestureTypeList.clear();
- mGestureHandler.updateShouldDisableDoubleTap(true);
- event = MotionEvent.obtain(
- downTime, downTime, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.needsTapEndingEventForTesting());
- event = MotionEvent.obtain(
- downTime, eventTime + 5, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals(GestureEventType.SINGLE_TAP_CONFIRMED,
- 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;
- mMockMotionEventDelegate.mGestureTypeList.clear();
- mGestureHandler.updateShouldDisableDoubleTap(false);
- event = MotionEvent.obtain(
- downTime, downTime, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.needsTapEndingEventForTesting());
- event = MotionEvent.obtain(
- downTime, eventTime + 5, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.needsTapEndingEventForTesting());
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 15, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals(GestureEventType.DOUBLE_TAP,
- 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;
- mMockMotionEventDelegate.mGestureTypeList.clear();
- mGestureHandler.updateShouldDisableDoubleTap(false);
- event = MotionEvent.obtain(
- downTime, downTime, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.needsTapEndingEventForTesting());
- event = MotionEvent.obtain(
- downTime, eventTime + 5, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.needsTapEndingEventForTesting());
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 15, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X, FAKE_COORD_Y + 100, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertFalse("A double tap drag should terminate the tap down.",
- mGestureHandler.needsTapEndingEventForTesting());
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.TAP_CANCEL));
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 20, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertFalse(mGestureHandler.needsTapEndingEventForTesting());
-
- // A scroll event will trigger a tap-ending (cancel) event.
- downTime += 25;
- eventTime += 25;
- mMockMotionEventDelegate.mGestureTypeList.clear();
- event = MotionEvent.obtain(
- downTime, downTime, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mGestureHandler.needsTapEndingEventForTesting());
- event = MotionEvent.obtain(
- downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X, FAKE_COORD_Y + 100, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.TAP_CANCEL));
- assertFalse("A scroll should terminate the tap down.",
- mGestureHandler.needsTapEndingEventForTesting());
- assertFalse(mGestureHandler.needsTapEndingEventForTesting());
- }
-
- /**
- * 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).
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testNoDoubleTapWhenDoubleTapDisabled() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- mGestureHandler.updateShouldDisableDoubleTap(true);
-
- MotionEvent event = MotionEvent.obtain(
- downTime, downTime, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("Only GESTURE_TAP_DOWN should have been sent",
- 1, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- downTime, eventTime + 5, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("A GESTURE_SINGLE_TAP_CONFIRMED event should have been sent",
- GestureEventType.SINGLE_TAP_CONFIRMED,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SINGLE_TAP_CONFIRMED " +
- "should have been sent",
- 2, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("Only GESTURE_TAP_DOWN, " +
- "GESTURE_SINGLE_TAP_CONFIRMED and " +
- "GESTURE_TAP_DOWN should have been sent",
- 3, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- eventTime + 10, eventTime + 15, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("A double tap should not have occurred",
- GestureEventType.SINGLE_TAP_CONFIRMED,
- 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, mMockMotionEventDelegate.mGestureTypeList.size());
- }
-
- /**
- * Verify that double tap drag zoom feature is not invoked when the gesture
- * handler is told to disable double tap gesture detection (according to the
- * logic in ContentViewCore.onRenderCoordinatesUpdated).
- * The second tap sequence should be treated just as the first would be.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testNoDoubleTapDragZoomWhenDoubleTapDisabled() throws Exception {
- final long downTime1 = SystemClock.uptimeMillis();
- final long downTime2 = downTime1 + 100;
-
- mGestureHandler.updateShouldDisableDoubleTap(true);
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- event = MotionEvent.obtain(
- downTime1, downTime1 + 5, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- mGestureHandler.onTouchEvent(event);
-
- event = MotionEvent.obtain(
- downTime2, downTime2, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
-
- event = MotionEvent.obtain(
- downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X, FAKE_COORD_Y + 100, 0);
-
- // The move should become a scroll, as double tap and drag to zoom is
- // disabled.
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertTrue("GESTURE_SCROLL_START should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertFalse("No GESTURE_PINCH_BEGIN should have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_BEGIN));
-
- event = MotionEvent.obtain(
- downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE,
- FAKE_COORD_X, FAKE_COORD_Y + 200, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals("GESTURE_SCROLL_BY should have been sent",
- GestureEventType.SCROLL_BY,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("GESTURE_SCROLL_BY should have been sent",
- event.getEventTime(),
- mMockMotionEventDelegate.mMostRecentGestureEvent.getTimeMs());
- assertTrue("No GESTURE_PINCH_BY should have been sent",
- GestureEventType.PINCH_BY !=
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_END));
- }
-
- /**
- * Verify that setting a fixed page scale (or a mobile viewport) during a double
- * tap drag zoom disables double tap detection after the gesture has ended.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testFixedPageScaleDuringDoubleTapDragZoom() throws Exception {
- long downTime1 = SystemClock.uptimeMillis();
- long downTime2 = downTime1 + 100;
-
- // Start a double-tap drag gesture.
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1);
- assertTrue(mGestureHandler.onTouchEvent(event));
- mGestureHandler.sendShowPressedStateGestureForTesting();
- event = MotionEvent.obtain(
- downTime1, downTime1 + 5, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- mGestureHandler.onTouchEvent(event);
- event = MotionEvent.obtain(
- downTime2, downTime2, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertEquals("GESTURE_PINCH_BEGIN should have been sent",
- GestureEventType.PINCH_BEGIN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- // Simulate setting a fixed page scale (or a mobile viewport);
- // this should not disrupt the current double-tap gesture.
- mGestureHandler.updateShouldDisableDoubleTap(true);
-
- // Double tap zoom updates should continue.
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_BY));
- assertEquals("GESTURE_PINCH_BY should have been sent",
- GestureEventType.PINCH_BY,
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_END));
- assertEquals("GESTURE_SCROLL_END should have been sent",
- GestureEventType.SCROLL_END,
- 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.
- mMockMotionEventDelegate.mGestureTypeList.clear();
- downTime1 += 200;
- downTime2 += 200;
-
- // Start a double-tap drag gesture.
- event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1);
- assertTrue(mGestureHandler.onTouchEvent(event));
- event = MotionEvent.obtain(
- downTime1, downTime1 + 5, MotionEvent.ACTION_UP,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- mGestureHandler.onTouchEvent(event);
- event = MotionEvent.obtain(
- downTime2, downTime2, MotionEvent.ACTION_DOWN,
- FAKE_COORD_X, FAKE_COORD_Y, 0);
- assertTrue(mGestureHandler.onTouchEvent(event));
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertFalse("GESTURE_PINCH_BEGIN should not have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_BEGIN));
-
- // Double tap zoom updates should not be sent.
- // Instead, the second tap drag becomes a scroll gesture sequence.
- 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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_BY));
- assertFalse("GESTURE_PINCH_BY should not have been sent",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.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",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_END));
- }
-
- /**
- * Verify that pinch zoom sends the proper event sequence.
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- 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.updateMultiTouchSupport(true);
-
- final int secondaryCoordX = FAKE_COORD_X + 20 * scaledTouchSlop;
- final int secondaryCoordY = FAKE_COORD_Y + 20 * scaledTouchSlop;
-
- 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;
-
- 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;
-
- 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(GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_TAP_DOWN should have been sent",
- 1, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- 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("No additional gestures should be triggered on a secondary pointer press",
- 1, mMockMotionEventDelegate.mGestureTypeList.size());
-
- pc1.x = secondaryCoordX + 5 * scaledTouchSlop;
- pc1.y = secondaryCoordY + 5 * scaledTouchSlop;
-
- event = MotionEvent.obtain(
- 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));
- 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(
- GestureEventType.PINCH_BEGIN));
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_START));
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.PINCH_BY));
- assertTrue(mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.SCROLL_BY));
-
- event = MotionEvent.obtain(
- 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));
- assertEquals(GestureEventType.PINCH_END,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_PINCH_END should have been sent",
- 7, mMockMotionEventDelegate.mGestureTypeList.size());
-
- event = MotionEvent.obtain(
- 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(GestureEventType.SCROLL_END,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("Only GESTURE_SCROLL_END should have been sent",
- 8, mMockMotionEventDelegate.mGestureTypeList.size());
- }
-
- /**
- * Verify that the timer of LONG_PRESS will be cancelled when scrolling begins so
- * LONG_PRESS and LONG_TAP won't be triggered.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testGesturesCancelledAfterLongPressCausesLostFocus() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- 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));
- }
- });
-
- final long longPressTimeoutMs = ViewConfiguration.getLongPressTimeout()
- + ViewConfiguration.getTapTimeout() + 10;
- assertTrue(mMockMotionEventDelegate.mLongPressCalled.await(
- ScalableTimeout.scaleTimeout(longPressTimeoutMs), TimeUnit.MILLISECONDS));
-
- assertEquals("A LONG_PRESS gesture should have been sent",
- GestureEventType.LONG_PRESS,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- mGestureHandler.onWindowFocusLost();
-
- assertEquals("The LONG_PRESS should have been cancelled by loss of focus",
- GestureEventType.TAP_CANCEL,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- MotionEvent event = motionEvent(
- MotionEvent.ACTION_UP, downTime, eventTime + longPressTimeoutMs);
- mGestureHandler.onTouchEvent(event);
- assertFalse("Tap cancellation should have prevented the LONG_TAP",
- mMockMotionEventDelegate.mGestureTypeList.contains(
- GestureEventType.LONG_TAP));
- }
-
- /**
- * Verify that ignoring the remaining touch sequence triggers proper touch and gesture
- * cancellation.
- *
- * @throws Exception
- */
- @SmallTest
- @Feature({"Gestures"})
- public void testSetIgnoreRemainingTouchEvents() throws Exception {
- final long downTime = SystemClock.uptimeMillis();
- final long eventTime = SystemClock.uptimeMillis();
-
- mGestureHandler.setIgnoreRemainingTouchEvents();
- assertTrue("If there was no active touch sequence, ignoring it should be a no-op",
- mMockMotionEventDelegate.mGestureTypeList.isEmpty());
- assertEquals("No MotionEvents should have been generated",
- -1, mMockMotionEventDelegate.mMostRecentMotionEventAction);
-
- MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals(GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
-
- mGestureHandler.setIgnoreRemainingTouchEvents();
- assertEquals("The TAP_DOWN should have been cancelled",
- GestureEventType.TAP_CANCEL,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- assertEquals("An ACTION_CANCEL MotionEvent should have been inserted",
- MotionEvent.ACTION_CANCEL, mMockMotionEventDelegate.mMostRecentMotionEventAction);
-
- // Subsequent MotionEvent's are dropped until ACTION_DOWN.
- event = motionEvent(MotionEvent.ACTION_MOVE, downTime, eventTime + 5);
- assertFalse(mGestureHandler.onTouchEvent(event));
-
- event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10);
- assertFalse(mGestureHandler.onTouchEvent(event));
-
- event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 15, downTime + 15);
- assertTrue(mGestureHandler.onTouchEvent(event));
- assertEquals(GestureEventType.TAP_DOWN,
- mMockMotionEventDelegate.mMostRecentGestureEvent.mType);
- }
-}

Powered by Google App Engine
This is Rietveld 408576698