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

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

Issue 120513005: [Android] Perform eager gesture recognition on MotionEvents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code cleanup Created 6 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.content.browser; 5 package org.chromium.content.browser;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.os.Bundle; 8 import android.os.Bundle;
9 import android.os.SystemClock; 9 import android.os.SystemClock;
10 import android.test.InstrumentationTestCase; 10 import android.test.InstrumentationTestCase;
11 import android.test.suitebuilder.annotation.SmallTest; 11 import android.test.suitebuilder.annotation.SmallTest;
12 import android.util.Log; 12 import android.util.Log;
13 import android.view.MotionEvent; 13 import android.view.MotionEvent;
14 import android.view.MotionEvent.PointerCoords;
15 import android.view.MotionEvent.PointerProperties;
16 import android.view.ViewConfiguration; 14 import android.view.ViewConfiguration;
17 15
18 import org.chromium.base.test.util.Feature; 16 import org.chromium.base.test.util.Feature;
19 import org.chromium.base.test.util.ScalableTimeout;
20 import org.chromium.content.browser.ContentViewGestureHandler.MotionEventDelegat e; 17 import org.chromium.content.browser.ContentViewGestureHandler.MotionEventDelegat e;
21 import org.chromium.content.browser.third_party.GestureDetector; 18 import org.chromium.content.browser.third_party.GestureDetector;
22 19
23 import java.util.ArrayList; 20 import java.util.ArrayList;
24 import java.util.concurrent.CountDownLatch; 21 import java.util.concurrent.CountDownLatch;
25 import java.util.concurrent.TimeUnit;
26 22
27 /** 23 /**
28 * Test suite for ContentViewGestureHandler. 24 * Test suite for ContentViewGestureHandler.
29 */ 25 */
30 public class ContentViewGestureHandlerTest extends InstrumentationTestCase { 26 public class ContentViewGestureHandlerTest extends InstrumentationTestCase {
31 private static final int FAKE_COORD_X = 42; 27 private static final int FAKE_COORD_X = 42;
32 private static final int FAKE_COORD_Y = 24; 28 private static final int FAKE_COORD_Y = 24;
33 29
34 private static final String TAG = "ContentViewGestureHandler"; 30 private static final String TAG = "ContentViewGestureHandler";
35 private MockListener mMockListener; 31 private MockListener mMockListener;
36 private MockMotionEventDelegate mMockMotionEventDelegate; 32 private MockMotionEventDelegate mMockMotionEventDelegate;
37 private MockGestureDetector mMockGestureDetector; 33 private MockGestureDetector mMockGestureDetector;
38 private MockZoomManager mMockZoomManager; 34 private MockZoomManager mMockZoomManager;
39 private ContentViewGestureHandler mGestureHandler; 35 private ContentViewGestureHandler mGestureHandler;
40 private LongPressDetector mLongPressDetector;
41 36
42 static class MockListener extends GestureDetector.SimpleOnGestureListener { 37 static class MockListener extends GestureDetector.SimpleOnGestureListener {
43 MotionEvent mLastLongPress; 38 MotionEvent mLastLongPress;
44 MotionEvent mLastShowPress; 39 MotionEvent mLastShowPress;
45 MotionEvent mLastSingleTap; 40 MotionEvent mLastSingleTap;
46 MotionEvent mLastFling1; 41 MotionEvent mLastFling1;
47 CountDownLatch mLongPressCalled; 42 CountDownLatch mLongPressCalled;
48 CountDownLatch mShowPressCalled; 43 CountDownLatch mShowPressCalled;
49 44
50 public MockListener() { 45 public MockListener() {
51 mLongPressCalled = new CountDownLatch(1); 46 mLongPressCalled = new CountDownLatch(1);
52 mShowPressCalled = new CountDownLatch(1); 47 mShowPressCalled = new CountDownLatch(1);
53 } 48 }
54 49
55 @Override 50 @Override
56 public void onLongPress(MotionEvent e) { 51 public void onLongPress(MotionEvent e) {
57 mLastLongPress = MotionEvent.obtain(e); 52 mLastLongPress = MotionEvent.obtain(e);
58 mLongPressCalled.countDown(); 53 mLongPressCalled.countDown();
59 } 54 }
60 55
61 @Override 56 @Override
62 public void onShowPress(MotionEvent e) { 57 public void onShowPress(MotionEvent e) {
63 mLastShowPress = MotionEvent.obtain(e); 58 mLastShowPress = MotionEvent.obtain(e);
64 mShowPressCalled.countDown(); 59 mShowPressCalled.countDown();
65 Log.e("Overscroll", "OnShowPress");
66 } 60 }
67 61
68 @Override 62 @Override
69 public boolean onSingleTapConfirmed(MotionEvent e) { 63 public boolean onSingleTapConfirmed(MotionEvent e) {
70 mLastSingleTap = e; 64 mLastSingleTap = e;
71 return true; 65 return true;
72 } 66 }
73 67
74 @Override 68 @Override
75 public boolean onSingleTapUp(MotionEvent e) { 69 public boolean onSingleTapUp(MotionEvent e) {
(...skipping 20 matching lines...) Expand all
96 } 90 }
97 91
98 @Override 92 @Override
99 public boolean onTouchEvent(MotionEvent ev) { 93 public boolean onTouchEvent(MotionEvent ev) {
100 mLastEvent = MotionEvent.obtain(ev); 94 mLastEvent = MotionEvent.obtain(ev);
101 return super.onTouchEvent(ev); 95 return super.onTouchEvent(ev);
102 } 96 }
103 } 97 }
104 98
105 static class MockMotionEventDelegate implements MotionEventDelegate { 99 static class MockMotionEventDelegate implements MotionEventDelegate {
106 private ContentViewGestureHandler mSynchronousConfirmTarget;
107 private int mSynchronousConfirmAckResult;
108
109 public int mLastTouchAction; 100 public int mLastTouchAction;
110 public int mLastGestureType; 101 public int mLastGestureType;
111 public int mTotalSentGestureCount; 102 public int mTotalSentGestureCount;
112 103
113 @Override 104 @Override
114 public boolean sendTouchEvent(long timeMs, int action, TouchPoint[] pts) { 105 public void onTouchEventHandlingBegin(long timeMs, int action, TouchPoin t[] pts) {
115 mLastTouchAction = action; 106 mLastTouchAction = action;
116 if (mSynchronousConfirmTarget != null) {
117 mSynchronousConfirmTarget.confirmTouchEvent(mSynchronousConfirmA ckResult);
118 }
119 return true;
120 } 107 }
121 108
122 @Override 109 @Override
110 public void onTouchEventHandlingEnd() {
111 }
112
113 @Override
123 public boolean sendGesture(int type, long timeMs, int x, int y, Bundle e xtraParams) { 114 public boolean sendGesture(int type, long timeMs, int x, int y, Bundle e xtraParams) {
124 Log.i(TAG,"Gesture event received with type id " + type); 115 Log.i(TAG,"Gesture event received with type id " + type);
125 mLastGestureType = type; 116 mLastGestureType = type;
126 mTotalSentGestureCount++; 117 mTotalSentGestureCount++;
127 return true; 118 return true;
128 } 119 }
129
130 @Override
131 public void sendSingleTapUMA(int type) {
132 // Not implemented.
133 }
134
135 @Override
136 public void sendActionAfterDoubleTapUMA(int type,
137 boolean clickDelayEnabled) {
138 // Not implemented.
139 }
140
141 @Override
142 public void invokeZoomPicker() {
143 // Not implemented.
144 }
145
146 public void enableSynchronousConfirmTouchEvent(
147 ContentViewGestureHandler handler, int ackResult) {
148 mSynchronousConfirmTarget = handler;
149 mSynchronousConfirmAckResult = ackResult;
150 }
151
152 public void disableSynchronousConfirmTouchEvent() {
153 mSynchronousConfirmTarget = null;
154 }
155 } 120 }
156 121
157 static class MockZoomManager extends ZoomManager { 122 static class MockZoomManager extends ZoomManager {
158 private ContentViewGestureHandler mHandlerForMoveEvents; 123 private ContentViewGestureHandler mHandlerForMoveEvents;
159 124
160 MockZoomManager(Context context, ContentViewCore contentViewCore) { 125 MockZoomManager(Context context, ContentViewCore contentViewCore) {
161 super(context, contentViewCore); 126 super(context, contentViewCore);
162 } 127 }
163 128
164 public void pinchOnMoveEvents(ContentViewGestureHandler handler) { 129 public void pinchOnMoveEvents(ContentViewGestureHandler handler) {
(...skipping 18 matching lines...) Expand all
183 @Override 148 @Override
184 public void setUp() { 149 public void setUp() {
185 mMockListener = new MockListener(); 150 mMockListener = new MockListener();
186 mMockGestureDetector = new MockGestureDetector( 151 mMockGestureDetector = new MockGestureDetector(
187 getInstrumentation().getTargetContext(), mMockListener); 152 getInstrumentation().getTargetContext(), mMockListener);
188 mMockMotionEventDelegate = new MockMotionEventDelegate(); 153 mMockMotionEventDelegate = new MockMotionEventDelegate();
189 mMockZoomManager = new MockZoomManager(getInstrumentation().getTargetCon text(), null); 154 mMockZoomManager = new MockZoomManager(getInstrumentation().getTargetCon text(), null);
190 mGestureHandler = new ContentViewGestureHandler( 155 mGestureHandler = new ContentViewGestureHandler(
191 getInstrumentation().getTargetContext(), mMockMotionEventDelegat e, 156 getInstrumentation().getTargetContext(), mMockMotionEventDelegat e,
192 mMockZoomManager); 157 mMockZoomManager);
193 mLongPressDetector = new LongPressDetector( 158 mGestureHandler.setTestDependencies(mMockGestureDetector, mMockListener) ;
194 getInstrumentation().getTargetContext(), mGestureHandler);
195 mGestureHandler.setTestDependencies(
196 mLongPressDetector, mMockGestureDetector, mMockListener);
197 TouchPoint.initializeConstantsForTesting(); 159 TouchPoint.initializeConstantsForTesting();
198 } 160 }
199 161
200 /** 162 /**
201 * Verify that a DOWN followed shortly by an UP will trigger a single tap. 163 * Verify that a DOWN followed shortly by an UP will trigger a single tap.
202 * 164 *
203 * @throws Exception 165 * @throws Exception
204 */ 166 */
205 @SmallTest 167 @SmallTest
206 @Feature({"Gestures"}) 168 @Feature({"Gestures"})
207 public void testGestureSingleClick() throws Exception { 169 public void testGestureSingleClick() throws Exception {
208 final long downTime = SystemClock.uptimeMillis(); 170 final long downTime = SystemClock.uptimeMillis();
209 final long eventTime = SystemClock.uptimeMillis(); 171 final long eventTime = SystemClock.uptimeMillis();
210 172
211 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime); 173 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
212 174
213 assertFalse(mGestureHandler.onTouchEvent(event)); 175 assertFalse(mGestureHandler.onTouchEvent(event));
214 assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEv ent != null); 176 assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEv ent != null);
215 assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPen dingMessage());
216 177
217 event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10); 178 event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10);
218 mLongPressDetector.cancelLongPressIfNeeded(event);
219 assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.h asPendingMessage());
220 assertTrue(mGestureHandler.onTouchEvent(event)); 179 assertTrue(mGestureHandler.onTouchEvent(event));
221 // Synchronous, no need to wait. 180 // Synchronous, no need to wait.
222 assertTrue("Should have a single tap", mMockListener.mLastSingleTap != n ull); 181 assertTrue("Should have a single tap", mMockListener.mLastSingleTap != n ull);
223 } 182 }
224 183
225 /** 184 /**
226 * Verify that when a touch event handler is registered the touch events are queued
227 * and sent in order.
228 * @throws Exception
229 */
230 @SmallTest
231 @Feature({"Gestures"})
232 public void testFlingOnTouchHandler() throws Exception {
233 final long downTime = SystemClock.uptimeMillis();
234 final long eventTime = SystemClock.uptimeMillis();
235
236 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
237
238 mGestureHandler.hasTouchEventHandlers(true);
239
240 assertTrue(mGestureHandler.onTouchEvent(event));
241 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
242 assertTrue("Should not have a pending gesture", mMockGestureDetector.mLa stEvent == null);
243 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
244
245 event = MotionEvent.obtain(
246 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
247 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
248 assertTrue(mGestureHandler.onTouchEvent(event));
249 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
250
251 event = MotionEvent.obtain(
252 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
253 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
254 assertTrue(mGestureHandler.onTouchEvent(event));
255 assertEquals("We should have coalesced move events into one"
256 , 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()) ;
257
258 event = MotionEvent.obtain(
259 downTime, eventTime + 15, MotionEvent.ACTION_UP,
260 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
261 assertTrue(mGestureHandler.onTouchEvent(event));
262 assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
263
264 mGestureHandler.confirmTouchEvent(
265 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
266 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
267 assertEquals(MotionEvent.ACTION_MOVE,
268 mGestureHandler.peekFirstInPendingMotionEventsForTesting().getAc tionMasked());
269 assertFalse("Pending LONG_PRESS should have been canceled",
270 mLongPressDetector.hasPendingMessage());
271
272 mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ ACK_STATE_CONSUMED);
273 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
274 assertEquals(MotionEvent.ACTION_UP,
275 mGestureHandler.peekFirstInPendingMotionEventsForTesting().getAc tionMasked());
276
277 mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ ACK_STATE_CONSUMED);
278 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
279
280 // Synchronous, no need to wait.
281 assertTrue("Should not have a fling", mMockListener.mLastFling1 == null) ;
282 assertTrue("Should not have a long press", mMockListener.mLastLongPress == null);
283 }
284
285 /**
286 * Verify that after a touch event handlers starts handling a gesture, even though some event
287 * in the middle of the gesture returns with NOT_CONSUMED, we don't send tha t to the gesture
288 * detector to avoid falling to a faulty state.
289 * @throws Exception
290 */
291 @SmallTest
292 @Feature({"Gestures"})
293 public void testFlingOnTouchHandlerWithOneEventNotConsumed() throws Exceptio n {
294 final long downTime = SystemClock.uptimeMillis();
295 final long eventTime = SystemClock.uptimeMillis();
296
297 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
298
299 mGestureHandler.hasTouchEventHandlers(true);
300
301 assertTrue(mGestureHandler.onTouchEvent(event));
302 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
303 assertTrue("Should not have a pending gesture", mMockGestureDetector.mLa stEvent == null);
304 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
305
306 event = MotionEvent.obtain(
307 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
308 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
309 assertTrue(mGestureHandler.onTouchEvent(event));
310 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
311
312 event = MotionEvent.obtain(
313 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
314 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
315 assertTrue(mGestureHandler.onTouchEvent(event));
316 assertEquals("We should have coalesced move events into one"
317 , 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()) ;
318
319 event = MotionEvent.obtain(
320 downTime, eventTime + 15, MotionEvent.ACTION_UP,
321 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
322 assertTrue(mGestureHandler.onTouchEvent(event));
323 assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
324
325 mGestureHandler.confirmTouchEvent(
326 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED);
327 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
328 assertEquals(MotionEvent.ACTION_MOVE,
329 mGestureHandler.peekFirstInPendingMotionEventsForTesting().getAc tionMasked());
330
331 mGestureHandler.confirmTouchEvent(
332 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
333 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
334 assertEquals(MotionEvent.ACTION_UP,
335 mGestureHandler.peekFirstInPendingMotionEventsForTesting().getAc tionMasked());
336 assertTrue("Even though the last event was not consumed by JavaScript," +
337 "it shouldn't have been sent to the Gesture Detector",
338 mMockGestureDetector.mLastEvent == null);
339
340 mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ ACK_STATE_CONSUMED);
341 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
342
343 // Synchronous, no need to wait.
344 assertTrue("Should not have a fling", mMockListener.mLastFling1 == null) ;
345 assertTrue("Should not have a long press", mMockListener.mLastLongPress == null);
346 }
347
348 /**
349 * Verify that when a registered touch event handler return NO_CONSUMER_EXIS TS for down event
350 * all queue is drained until next down.
351 * @throws Exception
352 */
353 @SmallTest
354 @Feature({"Gestures"})
355 public void testDrainWithFlingAndClickOutofTouchHandler() throws Exception {
356 final long downTime = SystemClock.uptimeMillis();
357 final long eventTime = SystemClock.uptimeMillis();
358
359 mGestureHandler = new ContentViewGestureHandler(
360 getInstrumentation().getTargetContext(), new MockMotionEventDele gate(),
361 mMockZoomManager);
362 mLongPressDetector = new LongPressDetector(
363 getInstrumentation().getTargetContext(), mGestureHandler);
364
365 mGestureHandler.hasTouchEventHandlers(true);
366
367 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
368 assertTrue(mGestureHandler.onTouchEvent(event));
369 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
370 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
371
372 event = MotionEvent.obtain(
373 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
374 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
375 assertTrue(mGestureHandler.onTouchEvent(event));
376 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
377
378 event = MotionEvent.obtain(
379 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
380 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
381 assertTrue(mGestureHandler.onTouchEvent(event));
382 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
383
384 event = MotionEvent.obtain(
385 downTime, eventTime + 15, MotionEvent.ACTION_UP,
386 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
387 assertTrue(mGestureHandler.onTouchEvent(event));
388 assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
389
390 event = motionEvent(MotionEvent.ACTION_DOWN, eventTime + 20, eventTime + 20);
391 assertTrue(mGestureHandler.onTouchEvent(event));
392 assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
393
394 event = MotionEvent.obtain(
395 downTime, eventTime + 20, MotionEvent.ACTION_UP,
396 FAKE_COORD_X, FAKE_COORD_Y, 0);
397 assertTrue(mGestureHandler.onTouchEvent(event));
398 assertEquals(5, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
399
400 mGestureHandler.confirmTouchEvent(
401 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXIS TS);
402 assertEquals("The queue should have been drained until first down since no consumer exists",
403 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
404 assertEquals(MotionEvent.ACTION_DOWN,
405 mGestureHandler.peekFirstInPendingMotionEventsForTesting().getAc tionMasked());
406
407 mGestureHandler.confirmTouchEvent(
408 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXIS TS);
409 assertEquals("The queue should have been drained",
410 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
411 }
412
413 /**
414 * Verify that when a touch event handler is registered the touch events sto p getting queued
415 * after we received INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS.
416 * @throws Exception
417 */
418 @SmallTest
419 @Feature({"Gestures"})
420 public void testFlingOutOfTouchHandler() throws Exception {
421 final long downTime = SystemClock.uptimeMillis();
422 final long eventTime = SystemClock.uptimeMillis();
423
424 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
425
426 mGestureHandler.hasTouchEventHandlers(true);
427
428 assertTrue(mGestureHandler.onTouchEvent(event));
429 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
430 assertTrue("Should not have a pending gesture", mMockGestureDetector.mLa stEvent == null);
431 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
432
433 mGestureHandler.confirmTouchEvent(
434 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXIS TS);
435 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
436 assertEquals("The down touch event should have been sent to the Gesture Detector",
437 event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTi me());
438 assertEquals("The down touch event should have been sent to the Gesture Detector",
439 MotionEvent.ACTION_DOWN, mMockGestureDetector.mLastEvent.getActi onMasked());
440
441 event = MotionEvent.obtain(
442 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
443 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
444 assertTrue(mGestureHandler.onTouchEvent(event));
445 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
446 assertEquals("Motion events should be going to the Gesture Detector dire ctly",
447 event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTi me());
448 assertEquals("Motion events should be going to the Gesture Detector dire ctly",
449 MotionEvent.ACTION_MOVE, mMockGestureDetector.mLastEvent.getActi onMasked());
450
451 event = MotionEvent.obtain(
452 downTime, eventTime + 10, MotionEvent.ACTION_UP,
453 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
454 assertTrue(mGestureHandler.onTouchEvent(event));
455 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
456 assertEquals("Motion events should be going to the Gesture Detector dire ctly",
457 event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTi me());
458 assertEquals("Motion events should be going to the Gesture Detector dire ctly",
459 MotionEvent.ACTION_UP, mMockGestureDetector.mLastEvent.getAction Masked());
460
461 // Synchronous, no need to wait.
462 assertTrue("Should have a fling", mMockListener.mLastFling1 != null);
463 assertTrue("Should not have a long press", mMockListener.mLastLongPress == null);
464 }
465
466 /**
467 * Verifies that a single tap doesn't cause a long press event to be sent.
468 * @throws Exception
469 */
470 @SmallTest
471 @Feature({"Gestures"})
472 public void testNoLongPressIsSentForSingleTapOutOfTouchHandler() throws Exce ption {
473 final long downTime = SystemClock.uptimeMillis();
474 final long eventTime = SystemClock.uptimeMillis();
475
476 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
477
478 mGestureHandler.hasTouchEventHandlers(true);
479
480 assertTrue(mGestureHandler.onTouchEvent(event));
481 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
482 assertTrue("Should not have a pending gesture", mMockGestureDetector.mLa stEvent == null);
483 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
484
485 event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5);
486 assertTrue(mGestureHandler.onTouchEvent(event));
487 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
488
489 mGestureHandler.confirmTouchEvent(
490 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
491
492 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
493 assertEquals("The down touch event should have been sent to the Gesture Detector",
494 event.getDownTime(), mMockGestureDetector.mLastEvent.getEventTim e());
495 assertEquals("The next event should be ACTION_UP",
496 MotionEvent.ACTION_UP,
497 mGestureHandler.peekFirstInPendingMotionEventsForTesting().getAc tionMasked());
498
499 mGestureHandler.confirmTouchEvent(
500 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
501
502 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
503 assertEquals("The up touch event should have been sent to the Gesture De tector",
504 event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTi me());
505
506 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
507 }
508
509 /**
510 * Verify that a DOWN followed by a MOVE will trigger fling (but not LONG). 185 * Verify that a DOWN followed by a MOVE will trigger fling (but not LONG).
511 * @throws Exception 186 * @throws Exception
512 */ 187 */
513 @SmallTest 188 @SmallTest
514 @Feature({"Gestures"}) 189 @Feature({"Gestures"})
515 public void testGestureFlingAndCancelLongClick() throws Exception { 190 public void testGestureFlingAndCancelLongClick() throws Exception {
516 final long downTime = SystemClock.uptimeMillis(); 191 final long downTime = SystemClock.uptimeMillis();
517 final long eventTime = SystemClock.uptimeMillis(); 192 final long eventTime = SystemClock.uptimeMillis();
518 193
519 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime); 194 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
520 195
521 assertFalse(mGestureHandler.onTouchEvent(event)); 196 assertFalse(mGestureHandler.onTouchEvent(event));
522 assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEv ent != null); 197 assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEv ent != null);
523 assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPen dingMessage());
524 198
525 event = MotionEvent.obtain( 199 event = MotionEvent.obtain(
526 downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 200 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
527 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 201 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
528 mLongPressDetector.cancelLongPressIfNeeded(event);
529 assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.h asPendingMessage());
530 assertTrue(mGestureHandler.onTouchEvent(event)); 202 assertTrue(mGestureHandler.onTouchEvent(event));
531 203
532 event = MotionEvent.obtain( 204 event = MotionEvent.obtain(
533 downTime, eventTime + 10, MotionEvent.ACTION_UP, 205 downTime, eventTime + 10, MotionEvent.ACTION_UP,
534 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 206 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
535 assertTrue(mGestureHandler.onTouchEvent(event)); 207 assertTrue(mGestureHandler.onTouchEvent(event));
536 208
537 // Synchronous, no need to wait. 209 // Synchronous, no need to wait.
538 assertTrue("Should have a fling", mMockListener.mLastFling1 != null); 210 assertTrue("Should have a fling", mMockListener.mLastFling1 != null);
539 assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); 211 assertTrue("Should not have a long press", mMockListener.mLastLongPress == null);
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 * @throws Exception 415 * @throws Exception
744 */ 416 */
745 @SmallTest 417 @SmallTest
746 @Feature({"Gestures"}) 418 @Feature({"Gestures"})
747 public void testShowPressCancelOnWindowFocusLost() throws Exception { 419 public void testShowPressCancelOnWindowFocusLost() throws Exception {
748 final long time = SystemClock.uptimeMillis(); 420 final long time = SystemClock.uptimeMillis();
749 GestureRecordingMotionEventDelegate mockDelegate = 421 GestureRecordingMotionEventDelegate mockDelegate =
750 new GestureRecordingMotionEventDelegate(); 422 new GestureRecordingMotionEventDelegate();
751 mGestureHandler = new ContentViewGestureHandler( 423 mGestureHandler = new ContentViewGestureHandler(
752 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager); 424 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
753 mLongPressDetector = new LongPressDetector( 425 mGestureHandler.setTestDependencies(null, null);
754 getInstrumentation().getTargetContext(), mGestureHandler);
755 mGestureHandler.setTestDependencies(mLongPressDetector, null, null);
756 426
757 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, time, time); 427 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, time, time);
758 mGestureHandler.onTouchEvent(event); 428 mGestureHandler.onTouchEvent(event);
759 429
760 mGestureHandler.sendShowPressedStateGestureForTesting(); 430 mGestureHandler.sendShowPressedStateGestureForTesting();
761 assertEquals("A show pressed state event should have been sent", 431 assertEquals("A show pressed state event should have been sent",
762 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 432 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE,
763 mockDelegate.mMostRecentGestureEvent.mType); 433 mockDelegate.mMostRecentGestureEvent.mType);
764 assertEquals("Only showPressedState and tapDown should have been sent", 434 assertEquals("Only showPressedState and tapDown should have been sent",
765 2, mockDelegate.mGestureTypeList.size()); 435 2, mockDelegate.mGestureTypeList.size());
766 436
767 mLongPressDetector.startLongPressTimerIfNeeded(event);
768 mLongPressDetector.sendLongPressGestureForTest();
769
770 assertEquals("Only should have sent only LONG_PRESS event", 437 assertEquals("Only should have sent only LONG_PRESS event",
771 3, mockDelegate.mGestureTypeList.size()); 438 3, mockDelegate.mGestureTypeList.size());
772 assertEquals("Should have a long press event next", 439 assertEquals("Should have a long press event next",
773 ContentViewGestureHandler.GESTURE_LONG_PRESS, 440 ContentViewGestureHandler.GESTURE_LONG_PRESS,
774 mockDelegate.mGestureTypeList.get(2).intValue()); 441 mockDelegate.mGestureTypeList.get(2).intValue());
775 442
776 // The long press triggers window focus loss by opening a context menu 443 // The long press triggers window focus loss by opening a context menu
777 mGestureHandler.onWindowFocusLost(); 444 mGestureHandler.onWindowFocusLost();
778 445
779 assertEquals("Only should have sent only GESTURE_TAP_CANCEL event", 446 assertEquals("Only should have sent only GESTURE_TAP_CANCEL event",
(...skipping 10 matching lines...) Expand all
790 @SmallTest 457 @SmallTest
791 @Feature({"Gestures"}) 458 @Feature({"Gestures"})
792 public void testShowPressCancelWhenScrollBegins() throws Exception { 459 public void testShowPressCancelWhenScrollBegins() throws Exception {
793 final long downTime = SystemClock.uptimeMillis(); 460 final long downTime = SystemClock.uptimeMillis();
794 final long eventTime = SystemClock.uptimeMillis(); 461 final long eventTime = SystemClock.uptimeMillis();
795 462
796 GestureRecordingMotionEventDelegate mockDelegate = 463 GestureRecordingMotionEventDelegate mockDelegate =
797 new GestureRecordingMotionEventDelegate(); 464 new GestureRecordingMotionEventDelegate();
798 mGestureHandler = new ContentViewGestureHandler( 465 mGestureHandler = new ContentViewGestureHandler(
799 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager); 466 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
800 mLongPressDetector = new LongPressDetector(
801 getInstrumentation().getTargetContext(), mGestureHandler);
802 467
803 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime); 468 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
804 469
805 assertTrue(mGestureHandler.onTouchEvent(event)); 470 assertTrue(mGestureHandler.onTouchEvent(event));
806 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
807 471
808 mGestureHandler.sendShowPressedStateGestureForTesting(); 472 mGestureHandler.sendShowPressedStateGestureForTesting();
809 473
810 assertEquals("A show pressed state event should have been sent", 474 assertEquals("A show pressed state event should have been sent",
811 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 475 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE,
812 mockDelegate.mMostRecentGestureEvent.mType); 476 mockDelegate.mMostRecentGestureEvent.mType);
813 assertEquals("Only tapDown and showPressedState should have been sent", 477 assertEquals("Only tapDown and showPressedState should have been sent",
814 2, mockDelegate.mGestureTypeList.size()); 478 2, mockDelegate.mGestureTypeList.size());
815 479
816 event = MotionEvent.obtain( 480 event = MotionEvent.obtain(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 @SmallTest 514 @SmallTest
851 @Feature({"Gestures"}) 515 @Feature({"Gestures"})
852 public void testDoubleTap() throws Exception { 516 public void testDoubleTap() throws Exception {
853 final long downTime = SystemClock.uptimeMillis(); 517 final long downTime = SystemClock.uptimeMillis();
854 final long eventTime = SystemClock.uptimeMillis(); 518 final long eventTime = SystemClock.uptimeMillis();
855 519
856 GestureRecordingMotionEventDelegate mockDelegate = 520 GestureRecordingMotionEventDelegate mockDelegate =
857 new GestureRecordingMotionEventDelegate(); 521 new GestureRecordingMotionEventDelegate();
858 mGestureHandler = new ContentViewGestureHandler( 522 mGestureHandler = new ContentViewGestureHandler(
859 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager); 523 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
860 mLongPressDetector = new LongPressDetector(
861 getInstrumentation().getTargetContext(), mGestureHandler);
862 524
863 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime); 525 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
864 assertTrue(mGestureHandler.onTouchEvent(event)); 526 assertTrue(mGestureHandler.onTouchEvent(event));
865 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
866 527
867 mGestureHandler.sendShowPressedStateGestureForTesting(); 528 mGestureHandler.sendShowPressedStateGestureForTesting();
868 assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent", 529 assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent",
869 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 530 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE,
870 mockDelegate.mMostRecentGestureEvent.mType); 531 mockDelegate.mMostRecentGestureEvent.mType);
871 assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE shoul d have been sent", 532 assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE shoul d have been sent",
872 2, mockDelegate.mGestureTypeList.size()); 533 2, mockDelegate.mGestureTypeList.size());
873 534
874 event = MotionEvent.obtain( 535 event = MotionEvent.obtain(
875 downTime, eventTime + 5, MotionEvent.ACTION_UP, 536 downTime, eventTime + 5, MotionEvent.ACTION_UP,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 @SmallTest 593 @SmallTest
933 @Feature({"Gestures"}) 594 @Feature({"Gestures"})
934 public void testDoubleTapDragZoom() throws Exception { 595 public void testDoubleTapDragZoom() throws Exception {
935 final long downTime1 = SystemClock.uptimeMillis(); 596 final long downTime1 = SystemClock.uptimeMillis();
936 final long downTime2 = downTime1 + 100; 597 final long downTime2 = downTime1 + 100;
937 598
938 GestureRecordingMotionEventDelegate mockDelegate = 599 GestureRecordingMotionEventDelegate mockDelegate =
939 new GestureRecordingMotionEventDelegate(); 600 new GestureRecordingMotionEventDelegate();
940 mGestureHandler = new ContentViewGestureHandler( 601 mGestureHandler = new ContentViewGestureHandler(
941 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager); 602 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
942 mLongPressDetector = new LongPressDetector(
943 getInstrumentation().getTargetContext(), mGestureHandler);
944 603
945 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, down Time1); 604 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, down Time1);
946 assertTrue(mGestureHandler.onTouchEvent(event)); 605 assertTrue(mGestureHandler.onTouchEvent(event));
947 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
948 606
949 mGestureHandler.sendShowPressedStateGestureForTesting(); 607 mGestureHandler.sendShowPressedStateGestureForTesting();
950 assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent", 608 assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent",
951 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 609 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE,
952 mockDelegate.mMostRecentGestureEvent.mType); 610 mockDelegate.mMostRecentGestureEvent.mType);
953 assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE shoul d have been sent", 611 assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE shoul d have been sent",
954 2, mockDelegate.mGestureTypeList.size()); 612 2, mockDelegate.mGestureTypeList.size());
955 613
956 614
957 event = MotionEvent.obtain( 615 event = MotionEvent.obtain(
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1068 @SmallTest 726 @SmallTest
1069 @Feature({"Gestures"}) 727 @Feature({"Gestures"})
1070 public void testDoubleTapDragZoomCancelledOnSecondaryPointerDown() throws Ex ception { 728 public void testDoubleTapDragZoomCancelledOnSecondaryPointerDown() throws Ex ception {
1071 final long downTime1 = SystemClock.uptimeMillis(); 729 final long downTime1 = SystemClock.uptimeMillis();
1072 final long downTime2 = downTime1 + 100; 730 final long downTime2 = downTime1 + 100;
1073 731
1074 GestureRecordingMotionEventDelegate mockDelegate = 732 GestureRecordingMotionEventDelegate mockDelegate =
1075 new GestureRecordingMotionEventDelegate(); 733 new GestureRecordingMotionEventDelegate();
1076 mGestureHandler = new ContentViewGestureHandler( 734 mGestureHandler = new ContentViewGestureHandler(
1077 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager); 735 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
1078 mLongPressDetector = new LongPressDetector(
1079 getInstrumentation().getTargetContext(), mGestureHandler);
1080 736
1081 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, down Time1); 737 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, down Time1);
1082 assertTrue(mGestureHandler.onTouchEvent(event)); 738 assertTrue(mGestureHandler.onTouchEvent(event));
1083 739
1084 mGestureHandler.sendShowPressedStateGestureForTesting(); 740 mGestureHandler.sendShowPressedStateGestureForTesting();
1085 assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent", 741 assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent",
1086 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 742 ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE,
1087 mockDelegate.mMostRecentGestureEvent.mType); 743 mockDelegate.mMostRecentGestureEvent.mType);
1088 assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE shoul d have been sent", 744 assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE shoul d have been sent",
1089 2, mockDelegate.mGestureTypeList.size()); 745 2, mockDelegate.mGestureTypeList.size());
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 public Bundle getExtraParams() { 935 public Bundle getExtraParams() {
1280 return mExtraParams; 936 return mExtraParams;
1281 } 937 }
1282 } 938 }
1283 private GestureEvent mMostRecentGestureEvent; 939 private GestureEvent mMostRecentGestureEvent;
1284 private GestureEvent mActiveScrollStartEvent; 940 private GestureEvent mActiveScrollStartEvent;
1285 private final ArrayList<Integer> mGestureTypeList = new ArrayList<Intege r>(); 941 private final ArrayList<Integer> mGestureTypeList = new ArrayList<Intege r>();
1286 private final ArrayList<Long> mGestureTimeList = new ArrayList<Long>(); 942 private final ArrayList<Long> mGestureTimeList = new ArrayList<Long>();
1287 943
1288 @Override 944 @Override
1289 public boolean sendTouchEvent(long timeMs, int action, TouchPoint[] pts) { 945 public void onTouchEventHandlingBegin(long timeMs, int action, TouchPoin t[] pts) {
1290 return true;
1291 } 946 }
1292 947
1293 @Override 948 @Override
949 public void onTouchEventHandlingEnd() {
950 }
951
952 @Override
1294 public boolean sendGesture(int type, long timeMs, int x, int y, Bundle e xtraParams) { 953 public boolean sendGesture(int type, long timeMs, int x, int y, Bundle e xtraParams) {
1295 Log.i(TAG, "Gesture event received with type id " + type); 954 Log.i(TAG, "Gesture event received with type id " + type);
1296 mMostRecentGestureEvent = new GestureEvent(type, timeMs, x, y, extra Params); 955 mMostRecentGestureEvent = new GestureEvent(type, timeMs, x, y, extra Params);
1297 mGestureTypeList.add(mMostRecentGestureEvent.mType); 956 mGestureTypeList.add(mMostRecentGestureEvent.mType);
1298 mGestureTimeList.add(timeMs); 957 mGestureTimeList.add(timeMs);
1299 if (type == ContentViewGestureHandler.GESTURE_SCROLL_START) 958 if (type == ContentViewGestureHandler.GESTURE_SCROLL_START)
1300 mActiveScrollStartEvent = mMostRecentGestureEvent; 959 mActiveScrollStartEvent = mMostRecentGestureEvent;
1301 else if (type == ContentViewGestureHandler.GESTURE_SCROLL_END || 960 else if (type == ContentViewGestureHandler.GESTURE_SCROLL_END ||
1302 type == ContentViewGestureHandler.GESTURE_FLING_CANCEL) 961 type == ContentViewGestureHandler.GESTURE_FLING_CANCEL)
1303 mActiveScrollStartEvent = null; 962 mActiveScrollStartEvent = null;
1304 return true; 963 return true;
1305 } 964 }
1306 965
1307 @Override
1308 public void sendSingleTapUMA(int type) {
1309 // Not implemented.
1310 }
1311
1312 @Override
1313 public void sendActionAfterDoubleTapUMA(int type,
1314 boolean clickDelayEnabled) {
1315 // Not implemented.
1316 }
1317
1318 @Override
1319 public void invokeZoomPicker() {
1320 // Not implemented.
1321 }
1322
1323 public GestureEvent getMostRecentGestureEvent() { 966 public GestureEvent getMostRecentGestureEvent() {
1324 return mMostRecentGestureEvent; 967 return mMostRecentGestureEvent;
1325 } 968 }
1326 969
1327 public GestureEvent getActiveScrollStartEvent() { 970 public GestureEvent getActiveScrollStartEvent() {
1328 return mActiveScrollStartEvent; 971 return mActiveScrollStartEvent;
1329 } 972 }
1330 } 973 }
1331 974
1332 /** 975 /**
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1428 @SmallTest 1071 @SmallTest
1429 @Feature({"Gestures"}) 1072 @Feature({"Gestures"})
1430 public void testLongPressAndTapCancelWhenScrollBegins() throws Exception { 1073 public void testLongPressAndTapCancelWhenScrollBegins() throws Exception {
1431 final long downTime = SystemClock.uptimeMillis(); 1074 final long downTime = SystemClock.uptimeMillis();
1432 final long eventTime = SystemClock.uptimeMillis(); 1075 final long eventTime = SystemClock.uptimeMillis();
1433 1076
1434 GestureRecordingMotionEventDelegate mockDelegate = 1077 GestureRecordingMotionEventDelegate mockDelegate =
1435 new GestureRecordingMotionEventDelegate(); 1078 new GestureRecordingMotionEventDelegate();
1436 mGestureHandler = new ContentViewGestureHandler( 1079 mGestureHandler = new ContentViewGestureHandler(
1437 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager); 1080 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
1438 mLongPressDetector = mGestureHandler.getLongPressDetector();
1439 1081
1440 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime); 1082 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
1441 assertTrue(mGestureHandler.onTouchEvent(event)); 1083 assertTrue(mGestureHandler.onTouchEvent(event));
1442 assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPen dingMessage());
1443 event = MotionEvent.obtain( 1084 event = MotionEvent.obtain(
1444 downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 1085 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
1445 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 1086 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
1446 assertTrue(mGestureHandler.onTouchEvent(event)); 1087 assertTrue(mGestureHandler.onTouchEvent(event));
1447 event = MotionEvent.obtain( 1088 event = MotionEvent.obtain(
1448 downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 1089 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
1449 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 1090 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
1450 assertTrue(mGestureHandler.onTouchEvent(event)); 1091 assertTrue(mGestureHandler.onTouchEvent(event));
1451 assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.h asPendingMessage());
1452 1092
1453 // No LONG_TAP because LONG_PRESS timer is cancelled. 1093 // No LONG_TAP because LONG_PRESS timer is cancelled.
1454 assertFalse("No LONG_PRESS should be sent", 1094 assertFalse("No LONG_PRESS should be sent",
1455 mockDelegate.mGestureTypeList.contains( 1095 mockDelegate.mGestureTypeList.contains(
1456 ContentViewGestureHandler.GESTURE_LONG_PRESS)); 1096 ContentViewGestureHandler.GESTURE_LONG_PRESS));
1457 assertFalse("No LONG_TAP should be sent", 1097 assertFalse("No LONG_TAP should be sent",
1458 mockDelegate.mGestureTypeList.contains( 1098 mockDelegate.mGestureTypeList.contains(
1459 ContentViewGestureHandler.GESTURE_LONG_TAP)); 1099 ContentViewGestureHandler.GESTURE_LONG_TAP));
1460 } 1100 }
1461 1101
1462 /** 1102 /**
1463 * Verifies that when hasTouchEventHandlers changes while in a gesture, that the pending
1464 * queue does not grow continually.
1465 */
1466 @SmallTest
1467 @Feature({"Gestures"})
1468 public void testHasTouchEventHandlersChangesInGesture() {
1469 final long downTime = SystemClock.uptimeMillis();
1470 final long eventTime = SystemClock.uptimeMillis();
1471
1472 mGestureHandler = new ContentViewGestureHandler(
1473 getInstrumentation().getTargetContext(), new MockMotionEventDele gate(),
1474 mMockZoomManager);
1475 mLongPressDetector = new LongPressDetector(
1476 getInstrumentation().getTargetContext(), mGestureHandler);
1477
1478 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
1479 assertTrue(mGestureHandler.onTouchEvent(event));
1480 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1481 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
1482
1483 event = MotionEvent.obtain(
1484 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
1485 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
1486 assertTrue(mGestureHandler.onTouchEvent(event));
1487 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1488
1489 mGestureHandler.hasTouchEventHandlers(true);
1490
1491 event = MotionEvent.obtain(
1492 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
1493 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
1494 assertTrue(mGestureHandler.onTouchEvent(event));
1495 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1496
1497 event = MotionEvent.obtain(
1498 downTime, eventTime + 15, MotionEvent.ACTION_MOVE,
1499 FAKE_COORD_X * 15, FAKE_COORD_Y * 15, 0);
1500 assertTrue(mGestureHandler.onTouchEvent(event));
1501 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1502 }
1503
1504 /**
1505 * Verify that LONG_TAP is triggered after LongPress followed by an UP. 1103 * Verify that LONG_TAP is triggered after LongPress followed by an UP.
1506 * 1104 *
1507 * @throws Exception 1105 * @throws Exception
1508 */ 1106 */
1509 @SmallTest 1107 @SmallTest
1510 @Feature({"Gestures"}) 1108 @Feature({"Gestures"})
1511 public void testGestureLongTap() throws Exception { 1109 public void testGestureLongTap() throws Exception {
1512 final long downTime = SystemClock.uptimeMillis(); 1110 final long downTime = SystemClock.uptimeMillis();
1513 final long eventTime = SystemClock.uptimeMillis(); 1111 final long eventTime = SystemClock.uptimeMillis();
1514 1112
1515 GestureRecordingMotionEventDelegate mockDelegate = 1113 GestureRecordingMotionEventDelegate mockDelegate =
1516 new GestureRecordingMotionEventDelegate(); 1114 new GestureRecordingMotionEventDelegate();
1517 mGestureHandler = new ContentViewGestureHandler( 1115 mGestureHandler = new ContentViewGestureHandler(
1518 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager); 1116 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
1519 mLongPressDetector = mGestureHandler.getLongPressDetector();
1520 1117
1521 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime); 1118 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
1522 assertTrue(mGestureHandler.onTouchEvent(event)); 1119 assertTrue(mGestureHandler.onTouchEvent(event));
1523 assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPen dingMessage());
1524
1525 mLongPressDetector.sendLongPressGestureForTest();
1526 1120
1527 assertEquals("A LONG_PRESS gesture should have been sent", 1121 assertEquals("A LONG_PRESS gesture should have been sent",
1528 ContentViewGestureHandler.GESTURE_LONG_PRESS, 1122 ContentViewGestureHandler.GESTURE_LONG_PRESS,
1529 mockDelegate.mMostRecentGestureEvent.mType); 1123 mockDelegate.mMostRecentGestureEvent.mType);
1530 1124
1531 event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 1000); 1125 event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 1000);
1532 assertTrue(mGestureHandler.onTouchEvent(event)); 1126 assertTrue(mGestureHandler.onTouchEvent(event));
1533 assertEquals("A LONG_TAP gesture should have been sent", 1127 assertEquals("A LONG_TAP gesture should have been sent",
1534 ContentViewGestureHandler.GESTURE_LONG_TAP, 1128 ContentViewGestureHandler.GESTURE_LONG_TAP,
1535 mockDelegate.mMostRecentGestureEvent.mType); 1129 mockDelegate.mMostRecentGestureEvent.mType);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 mockDelegate.mMostRecentGestureEvent.mType); 1161 mockDelegate.mMostRecentGestureEvent.mType);
1568 1162
1569 GestureRecordingMotionEventDelegate.GestureEvent gestureEvent = 1163 GestureRecordingMotionEventDelegate.GestureEvent gestureEvent =
1570 mockDelegate.getMostRecentGestureEvent(); 1164 mockDelegate.getMostRecentGestureEvent();
1571 assertNotNull(gestureEvent); 1165 assertNotNull(gestureEvent);
1572 Bundle extraParams = gestureEvent.getExtraParams(); 1166 Bundle extraParams = gestureEvent.getExtraParams();
1573 assertEquals(0, extraParams.getInt(ContentViewGestureHandler.DISTANCE_X) ); 1167 assertEquals(0, extraParams.getInt(ContentViewGestureHandler.DISTANCE_X) );
1574 assertEquals(-scrollDelta, extraParams.getInt(ContentViewGestureHandler. DISTANCE_Y)); 1168 assertEquals(-scrollDelta, extraParams.getInt(ContentViewGestureHandler. DISTANCE_Y));
1575 } 1169 }
1576 1170
1577 /**
1578 * Verify that touch moves are deferred if they are within the touch slop re gion
1579 * and the touch sequence is not being consumed.
1580 * @throws Exception
1581 */
1582 @SmallTest
1583 @Feature({"Gestures"})
1584 public void testTouchMoveWithinTouchSlopDeferred() throws Exception {
1585 Context context = getInstrumentation().getTargetContext();
1586 final long downTime = SystemClock.uptimeMillis();
1587 final long eventTime = SystemClock.uptimeMillis();
1588 final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouc hSlop();
1589 final int lessThanSlopScrollDelta = scaledTouchSlop / 2;
1590 final int greaterThanSlopScrollDelta = scaledTouchSlop * 2;
1591
1592 mGestureHandler.hasTouchEventHandlers(true);
1593
1594 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
1595 assertTrue(mGestureHandler.onTouchEvent(event));
1596 assertEquals("The touch down should have been forwarded",
1597 TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLas tTouchAction);
1598 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1599
1600 event = MotionEvent.obtain(
1601 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
1602 FAKE_COORD_X, FAKE_COORD_Y + lessThanSlopScrollDelta, 0);
1603 assertTrue(mGestureHandler.onTouchEvent(event));
1604 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1605
1606 mGestureHandler.confirmTouchEvent(
1607 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1608 assertEquals("The less-than-slop touch move should not have been forward ed",
1609 TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLas tTouchAction);
1610 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1611
1612 event = MotionEvent.obtain(
1613 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
1614 FAKE_COORD_X, FAKE_COORD_Y + greaterThanSlopScrollDelta, 0);
1615 assertTrue(mGestureHandler.onTouchEvent(event));
1616 assertEquals("The touch move should have been forwarded",
1617 TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLast TouchAction);
1618 mGestureHandler.confirmTouchEvent(
1619 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1620 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1621 }
1622
1623 /**
1624 * Verify that touch moves are not deferred even if they are within the touc h slop region
1625 * when the touch sequence is being consumed.
1626 * @throws Exception
1627 */
1628 @SmallTest
1629 @Feature({"Gestures"})
1630 public void testTouchMoveWithinTouchSlopNotDeferredIfJavascriptConsumingGest ure()
1631 throws Exception {
1632 Context context = getInstrumentation().getTargetContext();
1633 final long downTime = SystemClock.uptimeMillis();
1634 final long eventTime = SystemClock.uptimeMillis();
1635 final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouc hSlop();
1636 final int lessThanSlopScrollDelta = scaledTouchSlop / 2;
1637
1638 mGestureHandler.hasTouchEventHandlers(true);
1639
1640 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
1641 assertTrue(mGestureHandler.onTouchEvent(event));
1642 assertEquals("The touch down should have been forwarded",
1643 TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLas tTouchAction);
1644 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1645
1646 event = MotionEvent.obtain(
1647 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
1648 FAKE_COORD_X, FAKE_COORD_Y + lessThanSlopScrollDelta, 0);
1649 assertTrue(mGestureHandler.onTouchEvent(event));
1650 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1651
1652 mGestureHandler.confirmTouchEvent(
1653 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED);
1654 assertEquals("The less-than-slop touch move should have been forwarded",
1655 TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLast TouchAction);
1656 }
1657
1658
1659 /**
1660 * Verify that touch moves are not deferred when the MotionEvent has multipl e active pointers.
1661 * @throws Exception
1662 */
1663 @SmallTest
1664 @Feature({"Gestures"})
1665 public void testTouchMoveNotDeferredWithMultiplePointers()
1666 throws Exception {
1667 Context context = getInstrumentation().getTargetContext();
1668 final long downTime = SystemClock.uptimeMillis();
1669 final long eventTime = SystemClock.uptimeMillis();
1670 final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouc hSlop();
1671 final int lessThanSlopScrollDelta = scaledTouchSlop / 2;
1672
1673 mGestureHandler.hasTouchEventHandlers(true);
1674
1675 final int secondaryCoordX = FAKE_COORD_X + 10 * scaledTouchSlop;
1676 final int secondaryCoordY = FAKE_COORD_Y + 10 * scaledTouchSlop;
1677
1678 PointerProperties pp0 = new PointerProperties();
1679 pp0.id = 0;
1680 pp0.toolType = MotionEvent.TOOL_TYPE_FINGER;
1681 PointerProperties pp1 = new PointerProperties();
1682 pp1.id = 1;
1683 pp1.toolType = MotionEvent.TOOL_TYPE_FINGER;
1684
1685 PointerCoords pc0 = new PointerCoords();
1686 pc0.x = FAKE_COORD_X;
1687 pc0.y = FAKE_COORD_Y;
1688 pc0.pressure = 1;
1689 pc0.size = 1;
1690 PointerCoords pc1 = new PointerCoords();
1691 pc1.x = secondaryCoordX;
1692 pc1.y = secondaryCoordY;
1693 pc1.pressure = 1;
1694 pc1.size = 1;
1695
1696 MotionEvent event = MotionEvent.obtain(
1697 eventTime, eventTime, MotionEvent.ACTION_DOWN,
1698 1, new PointerProperties[] { pp0 }, new PointerCoords[] { pc0 },
1699 0, 0, 1.0f, 1.0f, 0, 0, 0, 0);
1700 assertTrue(mGestureHandler.onTouchEvent(event));
1701 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1702 assertEquals("The touch down should have been forwarded",
1703 TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLas tTouchAction);
1704
1705 event = MotionEvent.obtain(
1706 eventTime, eventTime, MotionEvent.ACTION_POINTER_DOWN,
1707 2, new PointerProperties[] { pp0, pp1 }, new PointerCoords[] { p c0, pc1 },
1708 0, 0, 1.0f, 1.0f, 0, 0, 0, 0);
1709 assertTrue(mGestureHandler.onTouchEvent(event));
1710 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1711
1712 mGestureHandler.confirmTouchEvent(
1713 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1714 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1715 assertEquals("The secondary touch down should have been forwarded",
1716 TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLas tTouchAction);
1717
1718 pc1.x = secondaryCoordX + lessThanSlopScrollDelta;
1719 pc1.y = secondaryCoordY + lessThanSlopScrollDelta;
1720
1721 event = MotionEvent.obtain(
1722 eventTime, eventTime, MotionEvent.ACTION_MOVE,
1723 2, new PointerProperties[] { pp0, pp1 }, new PointerCoords[] { p c0, pc1 },
1724 0, 0, 1.0f, 1.0f, 0, 0, 0, 0);
1725 assertTrue(mGestureHandler.onTouchEvent(event));
1726 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1727
1728 mGestureHandler.confirmTouchEvent(
1729 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1730 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
1731 assertEquals("The secondary touch move should have been forwarded",
1732 TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLast TouchAction);
1733 }
1734
1735 private static void sendLastScrollByEvent(ContentViewGestureHandler handler) { 1171 private static void sendLastScrollByEvent(ContentViewGestureHandler handler) {
1736 final long downTime = SystemClock.uptimeMillis(); 1172 final long downTime = SystemClock.uptimeMillis();
1737 final long eventTime = SystemClock.uptimeMillis(); 1173 final long eventTime = SystemClock.uptimeMillis();
1738 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime); 1174 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
1739 assertTrue(handler.onTouchEvent(event)); 1175 assertTrue(handler.onTouchEvent(event));
1740 event = MotionEvent.obtain( 1176 event = MotionEvent.obtain(
1741 downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 1177 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
1742 FAKE_COORD_X, FAKE_COORD_Y + 30, 0); 1178 FAKE_COORD_X, FAKE_COORD_Y + 30, 0);
1743 assertTrue(handler.onTouchEvent(event)); 1179 assertTrue(handler.onTouchEvent(event));
1744 } 1180 }
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1920 assertTrue(mockDelegate.mGestureTypeList.contains( 1356 assertTrue(mockDelegate.mGestureTypeList.contains(
1921 ContentViewGestureHandler.GESTURE_SCROLL_START)); 1357 ContentViewGestureHandler.GESTURE_SCROLL_START));
1922 assertTrue(mockDelegate.mGestureTypeList.contains( 1358 assertTrue(mockDelegate.mGestureTypeList.contains(
1923 ContentViewGestureHandler.GESTURE_TAP_CANCEL)); 1359 ContentViewGestureHandler.GESTURE_TAP_CANCEL));
1924 assertFalse("A scroll should terminate the tap down.", 1360 assertFalse("A scroll should terminate the tap down.",
1925 mGestureHandler.needsTapEndingEventForTesting()); 1361 mGestureHandler.needsTapEndingEventForTesting());
1926 assertFalse(mGestureHandler.needsTapEndingEventForTesting()); 1362 assertFalse(mGestureHandler.needsTapEndingEventForTesting());
1927 } 1363 }
1928 1364
1929 /** 1365 /**
1930 * Verify that touch move events are properly coalesced.
1931 * @throws Exception
1932 */
1933 @SmallTest
1934 @Feature({"Gestures"})
1935 public void testTouchMoveCoalescing() throws Exception {
1936 final long downTime = SystemClock.uptimeMillis();
1937 final long eventTime = SystemClock.uptimeMillis();
1938
1939 mGestureHandler.hasTouchEventHandlers(true);
1940
1941 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
1942 assertTrue(mGestureHandler.onTouchEvent(event));
1943 mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ ACK_STATE_CONSUMED);
1944 assertEquals(TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate .mLastTouchAction);
1945
1946 event = MotionEvent.obtain(
1947 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
1948 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
1949 assertTrue(mGestureHandler.onTouchEvent(event));
1950 assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.h asPendingMessage());
1951 assertEquals("Initial move events should offered to javascript and added to the queue",
1952 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
1953 assertEquals(TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate. mLastTouchAction);
1954
1955 event = MotionEvent.obtain(
1956 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
1957 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
1958 assertTrue(mGestureHandler.onTouchEvent(event));
1959 assertEquals("Move events already sent to javascript should not be coale sced",
1960 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
1961
1962 event = MotionEvent.obtain(
1963 downTime, eventTime + 15, MotionEvent.ACTION_MOVE,
1964 FAKE_COORD_X * 15, FAKE_COORD_Y * 15, 0);
1965 assertTrue(mGestureHandler.onTouchEvent(event));
1966 assertEquals("Similar pending move events should be coalesced",
1967 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
1968
1969 PointerProperties pp1 = new PointerProperties();
1970 pp1.id = 0;
1971 pp1.toolType = MotionEvent.TOOL_TYPE_FINGER;
1972 PointerProperties pp2 = new PointerProperties();
1973 pp2.id = 1;
1974 pp2.toolType = MotionEvent.TOOL_TYPE_FINGER;
1975 PointerProperties[] properties = new PointerProperties[] { pp1, pp2 };
1976
1977 PointerCoords pc1 = new PointerCoords();
1978 pc1.x = FAKE_COORD_X * 10;
1979 pc1.y = FAKE_COORD_Y * 10;
1980 pc1.pressure = 1;
1981 pc1.size = 1;
1982 PointerCoords pc2 = new PointerCoords();
1983 pc2.x = FAKE_COORD_X * 15;
1984 pc2.y = FAKE_COORD_Y * 15;
1985 pc2.pressure = 1;
1986 pc2.size = 1;
1987 PointerCoords[] coords = new PointerCoords[] { pc1, pc2 };
1988
1989 event = MotionEvent.obtain(
1990 downTime, eventTime + 20, MotionEvent.ACTION_MOVE,
1991 2, properties, coords, 0, 0, 1.0f, 1.0f, 0, 0, 0, 0);
1992 assertTrue(mGestureHandler.onTouchEvent(event));
1993 assertEquals("Move events with different pointer counts should not be co alesced",
1994 3, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
1995
1996 event = MotionEvent.obtain(
1997 downTime, eventTime + 25, MotionEvent.ACTION_MOVE,
1998 2, properties, coords, 0, 0, 1.0f, 1.0f, 0, 0, 0, 0);
1999 assertTrue(mGestureHandler.onTouchEvent(event));
2000 assertEquals("Move events with similar pointer counts should be coalesce d",
2001 3, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2002
2003 event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
2004 assertTrue(mGestureHandler.onTouchEvent(event));
2005 assertEquals("Move events should not be coalesced with other events",
2006 4, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2007 }
2008
2009 /**
2010 * Verify that synchronous confirmTouchEvent() calls made from the MotionEve ntDelegate behave
2011 * properly.
2012 * @throws Exception
2013 */
2014 @SmallTest
2015 @Feature({"Gestures"})
2016 public void testSynchronousConfirmTouchEvent() throws Exception {
2017 final long downTime = SystemClock.uptimeMillis();
2018 final long eventTime = SystemClock.uptimeMillis();
2019
2020 mGestureHandler.hasTouchEventHandlers(true);
2021
2022 mMockMotionEventDelegate.disableSynchronousConfirmTouchEvent();
2023
2024 // Queue an asynchronously handled event.
2025 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
2026 assertTrue(mGestureHandler.onTouchEvent(event));
2027 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2028
2029 // Queue another event; this will remain in the queue until the first ev ent is confirmed.
2030 event = MotionEvent.obtain(
2031 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
2032 FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0);
2033 assertTrue(mGestureHandler.onTouchEvent(event));
2034 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2035
2036 // Enable synchronous event confirmation upon dispatch.
2037 mMockMotionEventDelegate.enableSynchronousConfirmTouchEvent(
2038 mGestureHandler, ContentViewGestureHandler.INPUT_EVENT_ACK_STATE _CONSUMED);
2039
2040 // Confirm the original event; this should dispatch the second event and confirm it
2041 // synchronously.
2042 mGestureHandler.confirmTouchEvent(
2043 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED);
2044 assertTrue(mGestureHandler.onTouchEvent(event));
2045 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2046 assertEquals(TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate. mLastTouchAction);
2047
2048 // Adding events to any empty queue will trigger synchronous dispatch an d confirmation.
2049 event = MotionEvent.obtain(
2050 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
2051 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
2052 assertTrue(mGestureHandler.onTouchEvent(event));
2053 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2054 }
2055
2056 /**
2057 * Verify that no double tap gestures are created if the gesture handler is 1366 * Verify that no double tap gestures are created if the gesture handler is
2058 * told to disable double tap gesture detection (according to the logic in 1367 * told to disable double tap gesture detection (according to the logic in
2059 * ContentViewCore.onRenderCoordinatesUpdated). 1368 * ContentViewCore.onRenderCoordinatesUpdated).
2060 * @throws Exception 1369 * @throws Exception
2061 */ 1370 */
2062 @SmallTest 1371 @SmallTest
2063 @Feature({"Gestures"}) 1372 @Feature({"Gestures"})
2064 public void testNoDoubleTapWhenDoubleTapDisabled() throws Exception { 1373 public void testNoDoubleTapWhenDoubleTapDisabled() throws Exception {
2065 final long downTime = SystemClock.uptimeMillis(); 1374 final long downTime = SystemClock.uptimeMillis();
2066 final long eventTime = SystemClock.uptimeMillis(); 1375 final long eventTime = SystemClock.uptimeMillis();
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 @SmallTest 1498 @SmallTest
2190 @Feature({"Gestures"}) 1499 @Feature({"Gestures"})
2191 public void testFixedPageScaleDuringDoubleTapDragZoom() throws Exception { 1500 public void testFixedPageScaleDuringDoubleTapDragZoom() throws Exception {
2192 long downTime1 = SystemClock.uptimeMillis(); 1501 long downTime1 = SystemClock.uptimeMillis();
2193 long downTime2 = downTime1 + 100; 1502 long downTime2 = downTime1 + 100;
2194 1503
2195 GestureRecordingMotionEventDelegate mockDelegate = 1504 GestureRecordingMotionEventDelegate mockDelegate =
2196 new GestureRecordingMotionEventDelegate(); 1505 new GestureRecordingMotionEventDelegate();
2197 mGestureHandler = new ContentViewGestureHandler( 1506 mGestureHandler = new ContentViewGestureHandler(
2198 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager); 1507 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
2199 mLongPressDetector = new LongPressDetector(
2200 getInstrumentation().getTargetContext(), mGestureHandler);
2201 1508
2202 // Start a double-tap drag gesture. 1509 // Start a double-tap drag gesture.
2203 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, down Time1); 1510 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, down Time1);
2204 assertTrue(mGestureHandler.onTouchEvent(event)); 1511 assertTrue(mGestureHandler.onTouchEvent(event));
2205 mGestureHandler.sendShowPressedStateGestureForTesting(); 1512 mGestureHandler.sendShowPressedStateGestureForTesting();
2206 event = MotionEvent.obtain( 1513 event = MotionEvent.obtain(
2207 downTime1, downTime1 + 5, MotionEvent.ACTION_UP, 1514 downTime1, downTime1 + 5, MotionEvent.ACTION_UP,
2208 FAKE_COORD_X, FAKE_COORD_Y, 0); 1515 FAKE_COORD_X, FAKE_COORD_Y, 0);
2209 mGestureHandler.onTouchEvent(event); 1516 mGestureHandler.onTouchEvent(event);
2210 event = MotionEvent.obtain( 1517 event = MotionEvent.obtain(
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2289 mockDelegate.mGestureTypeList.contains( 1596 mockDelegate.mGestureTypeList.contains(
2290 ContentViewGestureHandler.GESTURE_PINCH_BY)); 1597 ContentViewGestureHandler.GESTURE_PINCH_BY));
2291 event = MotionEvent.obtain( 1598 event = MotionEvent.obtain(
2292 downTime2, downTime2 + 15, MotionEvent.ACTION_UP, 1599 downTime2, downTime2 + 15, MotionEvent.ACTION_UP,
2293 FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 1600 FAKE_COORD_X, FAKE_COORD_Y + 200, 0);
2294 assertTrue(mGestureHandler.onTouchEvent(event)); 1601 assertTrue(mGestureHandler.onTouchEvent(event));
2295 assertFalse("GESTURE_PINCH_END should not have been sent", 1602 assertFalse("GESTURE_PINCH_END should not have been sent",
2296 mockDelegate.mGestureTypeList.contains( 1603 mockDelegate.mGestureTypeList.contains(
2297 ContentViewGestureHandler.GESTURE_PINCH_END)); 1604 ContentViewGestureHandler.GESTURE_PINCH_END));
2298 } 1605 }
2299
2300 /**
2301 * Verify that a secondary pointer press with no consumer does not interfere
2302 * with Javascript touch handling.
2303 *
2304 * @throws Exception
2305 */
2306 @SmallTest
2307 @Feature({"Gestures"})
2308 public void testSecondaryPointerWithNoConsumer() throws Exception {
2309 final long downTime = SystemClock.uptimeMillis();
2310 final long eventTime = SystemClock.uptimeMillis();
2311
2312 mGestureHandler.hasTouchEventHandlers(true);
2313
2314 // Queue a primary pointer press, a secondary pointer press and release,
2315 // and a primary pointer move.
2316 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
2317 assertTrue(mGestureHandler.onTouchEvent(event));
2318 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2319
2320 event = motionEvent(MotionEvent.ACTION_POINTER_DOWN, downTime, eventTime );
2321 assertTrue(mGestureHandler.onTouchEvent(event));
2322 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2323
2324 event = motionEvent(MotionEvent.ACTION_POINTER_UP, downTime, eventTime + 10);
2325 assertTrue(mGestureHandler.onTouchEvent(event));
2326 assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2327
2328 event = MotionEvent.obtain(
2329 downTime, eventTime + 15, MotionEvent.ACTION_MOVE,
2330 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
2331 assertTrue(mGestureHandler.onTouchEvent(event));
2332 assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2333
2334 // Simulate preventDefault from Javascript, forcing all touch events to Javascript
2335 // for the current sequence.
2336 mGestureHandler.confirmTouchEvent(
2337 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED);
2338 assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2339
2340 mGestureHandler.confirmTouchEvent(
2341 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXIS TS);
2342 assertEquals("Even if the secondary pointer has no consumer, continue se nding events",
2343 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2344
2345 mGestureHandler.confirmTouchEvent(
2346 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXIS TS);
2347 assertEquals("Even if the secondary pointer has no consumer, continue se nding events",
2348 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2349
2350 mGestureHandler.confirmTouchEvent(
2351 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2352 assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2353
2354 assertEquals("No gestures should result from the Javascript-consumed seq uence",
2355 0, mMockMotionEventDelegate.mTotalSentGestureCount);
2356 }
2357
2358 /**
2359 * Verify that multiple touch sequences in the queue are handled properly wh en
2360 * the Javascript response is different for each.
2361 *
2362 * @throws Exception
2363 */
2364 @SmallTest
2365 @Feature({"Gestures"})
2366 public void testMultiplyEnqueuedTouches() throws Exception {
2367 final long downTime = SystemClock.uptimeMillis();
2368 final long eventTime = SystemClock.uptimeMillis();
2369
2370 mGestureHandler.hasTouchEventHandlers(true);
2371 mGestureHandler.updateDoubleTapSupport(false);
2372
2373 // Queue a tap sequence.
2374 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
2375 assertTrue(mGestureHandler.onTouchEvent(event));
2376 assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2377
2378 event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5);
2379 assertTrue(mGestureHandler.onTouchEvent(event));
2380 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2381
2382 // Queue a scroll sequence.
2383 event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 10, downTime + 1 0);
2384 assertTrue(mGestureHandler.onTouchEvent(event));
2385 assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2386
2387 event = MotionEvent.obtain(
2388 downTime + 10, eventTime + 15, MotionEvent.ACTION_MOVE,
2389 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
2390 assertTrue(mGestureHandler.onTouchEvent(event));
2391 assertFalse(mGestureHandler.isNativeScrolling());
2392 assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2393
2394 event = motionEvent(MotionEvent.ACTION_UP, downTime + 10, downTime + 20) ;
2395 assertTrue(mGestureHandler.onTouchEvent(event));
2396 assertEquals(5, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2397
2398 // Consume the first gesture.
2399 mGestureHandler.confirmTouchEvent(
2400 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED);
2401 assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2402
2403 mGestureHandler.confirmTouchEvent(
2404 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED);
2405 assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2406
2407 // Don't consume the second gesture; it should be fed to the gesture det ector.
2408 mGestureHandler.confirmTouchEvent(
2409 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2410 assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting ());
2411 assertEquals("The down touch event should have been sent to the gesture detector",
2412 MotionEvent.ACTION_DOWN, mMockGestureDetector.mLastEvent.getActi onMasked());
2413 assertFalse(mGestureHandler.isNativeScrolling());
2414
2415 mGestureHandler.confirmTouchEvent(
2416 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2417 assertEquals("The move touch event should have been sent to the gesture detector",
2418 MotionEvent.ACTION_MOVE, mMockGestureDetector.mLastEvent.getActi onMasked());
2419 }
2420
2421 /**
2422 * Verify that only complete gestures are forwarded to Javascript if we rece ive
2423 * a touch handler notification.
2424 * @throws Exception
2425 */
2426 @SmallTest
2427 @Feature({"Gestures"})
2428 public void testOnlyCompleteGesturesForwardedToTouchHandler() throws Excepti on {
2429 final long downTime = SystemClock.uptimeMillis();
2430 final long eventTime = SystemClock.uptimeMillis();
2431
2432 mGestureHandler.hasTouchEventHandlers(false);
2433
2434 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
2435 mGestureHandler.onTouchEvent(event);
2436 assertEquals("Initial down events should not be sent to Javascript witho ut a touch handler",
2437 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2438 assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEv ent != null);
2439 mMockGestureDetector.mLastEvent = null;
2440
2441 mGestureHandler.hasTouchEventHandlers(true);
2442
2443 event = MotionEvent.obtain(
2444 downTime, eventTime + 5, MotionEvent.ACTION_MOVE,
2445 FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0);
2446 mGestureHandler.onTouchEvent(event);
2447 assertEquals("A move event should only be offered to javascript if the d own was offered",
2448 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2449 assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEv ent != null);
2450
2451 event = motionEvent(MotionEvent.ACTION_POINTER_DOWN, downTime, eventTime + 10);
2452 mGestureHandler.onTouchEvent(event);
2453 assertEquals("A pointer event should only be offered to Javascript if th e down was offered",
2454 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2455
2456 // Ensure that redundant notifications have no effect.
2457 mGestureHandler.hasTouchEventHandlers(true);
2458
2459 event = motionEvent(MotionEvent.ACTION_POINTER_UP, downTime, eventTime + 15);
2460 mGestureHandler.onTouchEvent(event);
2461 assertEquals("A pointer event should only be offered to Javascript if th e down was offered",
2462 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2463
2464 event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 20);
2465 mGestureHandler.onTouchEvent(event);
2466 assertEquals("A pointer event should only be offered to Javascript if th e down was offered",
2467 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2468
2469 event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 25, downTime + 2 5);
2470 mGestureHandler.onTouchEvent(event);
2471 assertEquals("A down event should be offered to Javascript with a regist ered touch handler",
2472 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting());
2473 }
2474
2475 /**
2476 * Verify that no timeout-based gestures are triggered after a touch event
2477 * is consumed. In particular, LONG_PRESS and SHOW_PRESS should not fire
2478 * if TouchStart went unconsumed, but subsequent TouchMoves are consumed.
2479 *
2480 * @throws Exception
2481 */
2482 @SmallTest
2483 @Feature({"Gestures"})
2484 public void testNoTimeoutGestureAfterTouchConsumed() throws Exception {
2485 getInstrumentation().runOnMainSync(new Runnable() {
2486 @Override
2487 public void run() {
2488 setUp();
2489
2490 final long downTime = SystemClock.uptimeMillis();
2491 final long eventTime = SystemClock.uptimeMillis();
2492
2493 mGestureHandler.hasTouchEventHandlers(true);
2494
2495 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTim e, eventTime);
2496 assertTrue(mGestureHandler.onTouchEvent(event));
2497 mGestureHandler.confirmTouchEvent(
2498 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONS UMED);
2499 assertTrue("Should have a pending LONG_PRESS",
2500 mLongPressDetector.hasPendingMessage());
2501
2502 event = MotionEvent.obtain(
2503 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
2504 FAKE_COORD_X, FAKE_COORD_Y + 200, 0);
2505 assertTrue(mGestureHandler.onTouchEvent(event));
2506 mGestureHandler.confirmTouchEvent(
2507 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED );
2508 assertFalse("Should not have a pending LONG_PRESS",
2509 mLongPressDetector.hasPendingMessage());
2510 }
2511 });
2512 assertFalse(mMockListener.mShowPressCalled.await(
2513 ScalableTimeout.ScaleTimeout(ViewConfiguration.getTapTimeout() + 10),
2514 TimeUnit.MILLISECONDS));
2515 assertFalse(mMockListener.mLongPressCalled.await(
2516 ScalableTimeout.ScaleTimeout(ViewConfiguration.getLongPressTimeo ut() + 10),
2517 TimeUnit.MILLISECONDS));
2518 }
2519
2520 /**
2521 * Verify that a TAP_DOWN will be followed by a TAP_CANCEL if the first
2522 * touch is unconsumed, but the subsequent touch is consumed.
2523 *
2524 * @throws Exception
2525 */
2526 @SmallTest
2527 @Feature({"Gestures"})
2528 public void testTapCancelledAfterTouchConsumed() throws Exception {
2529 final long downTime = SystemClock.uptimeMillis();
2530 final long eventTime = SystemClock.uptimeMillis();
2531
2532 GestureRecordingMotionEventDelegate mockDelegate =
2533 new GestureRecordingMotionEventDelegate();
2534 mGestureHandler = new ContentViewGestureHandler(
2535 getInstrumentation().getTargetContext(), mockDelegate, mMockZoom Manager);
2536 mGestureHandler.hasTouchEventHandlers(true);
2537
2538 MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downT ime);
2539 assertTrue(mGestureHandler.onTouchEvent(event));
2540 mGestureHandler.confirmTouchEvent(
2541 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2542 assertEquals("A TAP_DOWN gesture should have been sent",
2543 ContentViewGestureHandler.GESTURE_TAP_DOWN,
2544 mockDelegate.mMostRecentGestureEvent.mType);
2545
2546 event = MotionEvent.obtain(
2547 downTime, eventTime + 10, MotionEvent.ACTION_MOVE,
2548 FAKE_COORD_X, FAKE_COORD_Y + 200, 0);
2549 assertTrue(mGestureHandler.onTouchEvent(event));
2550 mGestureHandler.confirmTouchEvent(
2551 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED);
2552 assertEquals("A TAP_CANCEL gesture should have been sent",
2553 ContentViewGestureHandler.GESTURE_TAP_CANCEL,
2554 mockDelegate.mMostRecentGestureEvent.mType);
2555
2556 event = MotionEvent.obtain(
2557 downTime, eventTime + 15, MotionEvent.ACTION_MOVE,
2558 FAKE_COORD_X, FAKE_COORD_Y + 400, 0);
2559 assertTrue(mGestureHandler.onTouchEvent(event));
2560 mGestureHandler.confirmTouchEvent(
2561 ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2562 assertEquals("No further gestures should be sent",
2563 ContentViewGestureHandler.GESTURE_TAP_CANCEL,
2564 mockDelegate.mMostRecentGestureEvent.mType);
2565 }
2566 } 1606 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698