1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.content.browser; 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Bundle; 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.SystemClock; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.InstrumentationTestCase; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.Log; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.MotionEvent; 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport android.view.MotionEvent.PointerCoords; 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport android.view.MotionEvent.PointerProperties; 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.view.ViewConfiguration; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.Feature; 1981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdochimport org.chromium.base.test.util.ScalableTimeout; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.ContentViewGestureHandler.MotionEventDelegate; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.third_party.GestureDetector; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.ArrayList; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.CountDownLatch; 2581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdochimport java.util.concurrent.TimeUnit; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Test suite for ContentViewGestureHandler. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public class ContentViewGestureHandlerTest extends InstrumentationTestCase { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final int FAKE_COORD_X = 42; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final int FAKE_COORD_Y = 24; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 349ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch private static final String TAG = "ContentViewGestureHandler"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private MockListener mMockListener; 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private MockMotionEventDelegate mMockMotionEventDelegate; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private MockGestureDetector mMockGestureDetector; 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private MockZoomManager mMockZoomManager; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private ContentViewGestureHandler mGestureHandler; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private LongPressDetector mLongPressDetector; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static class MockListener extends GestureDetector.SimpleOnGestureListener { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MotionEvent mLastLongPress; 4481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch MotionEvent mLastShowPress; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MotionEvent mLastSingleTap; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MotionEvent mLastFling1; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CountDownLatch mLongPressCalled; 4881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch CountDownLatch mShowPressCalled; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public MockListener() { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLongPressCalled = new CountDownLatch(1); 5281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mShowPressCalled = new CountDownLatch(1); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onLongPress(MotionEvent e) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLastLongPress = MotionEvent.obtain(e); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLongPressCalled.countDown(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 6281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch public void onShowPress(MotionEvent e) { 6381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mLastShowPress = MotionEvent.obtain(e); 6481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mShowPressCalled.countDown(); 6581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch Log.e("Overscroll", "OnShowPress"); 6681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch } 6781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 6881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch @Override 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onSingleTapConfirmed(MotionEvent e) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLastSingleTap = e; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onSingleTapUp(MotionEvent e) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLastSingleTap = e; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLastFling1 = e1; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static class MockGestureDetector extends GestureDetector { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MotionEvent mLastEvent; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public MockGestureDetector(Context context, OnGestureListener listener) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(context, listener); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onTouchEvent(MotionEvent ev) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLastEvent = MotionEvent.obtain(ev); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return super.onTouchEvent(ev); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static class MockMotionEventDelegate implements MotionEventDelegate { 1069ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch private ContentViewGestureHandler mSynchronousConfirmTarget; 1079ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch private int mSynchronousConfirmAckResult; 1089ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public int mLastTouchAction; 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public int mLastGestureType; 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public int mTotalSentGestureCount; 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean sendTouchEvent(long timeMs, int action, TouchPoint[] pts) { 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mLastTouchAction = action; 1169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch if (mSynchronousConfirmTarget != null) { 1179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mSynchronousConfirmTarget.confirmTouchEvent(mSynchronousConfirmAckResult); 1189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch } 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public boolean sendGesture(int type, long timeMs, int x, int y, Bundle extraParams) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Log.i(TAG,"Gesture event received with type id " + type); 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mLastGestureType = type; 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mTotalSentGestureCount++; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void sendSingleTapUMA(int type) { 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Not implemented. 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @Override 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void sendActionAfterDoubleTapUMA(int type, 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) boolean clickDelayEnabled) { 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Not implemented. 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) @Override 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void invokeZoomPicker() { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not implemented. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch public void enableSynchronousConfirmTouchEvent( 1479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch ContentViewGestureHandler handler, int ackResult) { 1489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mSynchronousConfirmTarget = handler; 1499ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mSynchronousConfirmAckResult = ackResult; 1509ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch } 1519ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 1529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch public void disableSynchronousConfirmTouchEvent() { 1539ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mSynchronousConfirmTarget = null; 1549ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static class MockZoomManager extends ZoomManager { 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private ContentViewGestureHandler mHandlerForMoveEvents; 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockZoomManager(Context context, ContentViewCore contentViewCore) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(context, contentViewCore); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public void pinchOnMoveEvents(ContentViewGestureHandler handler) { 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mHandlerForMoveEvents = handler; 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean processTouchEvent(MotionEvent event) { 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (event.getActionMasked() == MotionEvent.ACTION_MOVE 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) && mHandlerForMoveEvents != null) { 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mHandlerForMoveEvents.pinchBy(event.getEventTime(), 1, 1, 1.1f); 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private static MotionEvent motionEvent(int action, long downTime, long eventTime) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MotionEvent.obtain(downTime, eventTime, action, FAKE_COORD_X, FAKE_COORD_Y, 0); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void setUp() { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mMockListener = new MockListener(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mMockGestureDetector = new MockGestureDetector( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getInstrumentation().getTargetContext(), mMockListener); 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mMockMotionEventDelegate = new MockMotionEventDelegate(); 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mMockZoomManager = new MockZoomManager(getInstrumentation().getTargetContext(), null); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mMockMotionEventDelegate, 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mMockZoomManager); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLongPressDetector = new LongPressDetector( 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getInstrumentation().getTargetContext(), mGestureHandler); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mGestureHandler.setTestDependencies( 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLongPressDetector, mMockGestureDetector, mMockListener); 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TouchPoint.initializeConstantsForTesting(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Verify that a DOWN followed shortly by an UP will trigger a single tap. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @throws Exception 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testGestureSingleClick() throws Exception { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(mGestureHandler.onTouchEvent(event)); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEvent != null); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLongPressDetector.cancelLongPressIfNeeded(event); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.hasPendingMessage()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronous, no need to wait. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should have a single tap", mMockListener.mLastSingleTap != null); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Verify that when a touch event handler is registered the touch events are queued 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * and sent in order. 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testFlingOnTouchHandler() throws Exception { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a pending gesture", mMockGestureDetector.mLastEvent == null); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("We should have coalesced move events into one" 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) , 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 15, MotionEvent.ACTION_UP, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals(MotionEvent.ACTION_MOVE, 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Pending LONG_PRESS should have been canceled", 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mLongPressDetector.hasPendingMessage()); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals(MotionEvent.ACTION_UP, 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Synchronous, no need to wait. 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a fling", mMockListener.mLastFling1 == null); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Verify that after a touch event handlers starts handling a gesture, even though some event 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * in the middle of the gesture returns with NOT_CONSUMED, we don't send that to the gesture 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * detector to avoid falling to a faulty state. 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testFlingOnTouchHandlerWithOneEventNotConsumed() throws Exception { 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a pending gesture", mMockGestureDetector.mLastEvent == null); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("We should have coalesced move events into one" 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) , 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 15, MotionEvent.ACTION_UP, 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals(MotionEvent.ACTION_MOVE, 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals(MotionEvent.ACTION_UP, 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Even though the last event was not consumed by JavaScript," + 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "it shouldn't have been sent to the Gesture Detector", 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mMockGestureDetector.mLastEvent == null); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Synchronous, no need to wait. 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a fling", mMockListener.mLastFling1 == null); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Verify that when a registered touch event handler return NO_CONSUMER_EXISTS for down event 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * all queue is drained until next down. 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testDrainWithFlingAndClickOutofTouchHandler() throws Exception { 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getInstrumentation().getTargetContext(), new MockMotionEventDelegate(), 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mMockZoomManager); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mLongPressDetector = new LongPressDetector( 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getInstrumentation().getTargetContext(), mGestureHandler); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 15, MotionEvent.ACTION_UP, 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = motionEvent(MotionEvent.ACTION_DOWN, eventTime + 20, eventTime + 20); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 20, MotionEvent.ACTION_UP, 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(5, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("The queue should have been drained until first down since no consumer exists", 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals(MotionEvent.ACTION_DOWN, 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("The queue should have been drained", 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Verify that when a touch event handler is registered the touch events stop getting queued 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * after we received INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS. 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testFlingOutOfTouchHandler() throws Exception { 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a pending gesture", mMockGestureDetector.mLastEvent == null); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("The down touch event should have been sent to the Gesture Detector", 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTime()); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("The down touch event should have been sent to the Gesture Detector", 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent.ACTION_DOWN, mMockGestureDetector.mLastEvent.getActionMasked()); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("Motion events should be going to the Gesture Detector directly", 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTime()); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("Motion events should be going to the Gesture Detector directly", 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent.ACTION_MOVE, mMockGestureDetector.mLastEvent.getActionMasked()); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_UP, 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("Motion events should be going to the Gesture Detector directly", 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTime()); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("Motion events should be going to the Gesture Detector directly", 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent.ACTION_UP, mMockGestureDetector.mLastEvent.getActionMasked()); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Synchronous, no need to wait. 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should have a fling", mMockListener.mLastFling1 != null); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Verifies that a single tap doesn't cause a long press event to be sent. 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testNoLongPressIsSentForSingleTapOutOfTouchHandler() throws Exception { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a pending gesture", mMockGestureDetector.mLastEvent == null); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("The down touch event should have been sent to the Gesture Detector", 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.getDownTime(), mMockGestureDetector.mLastEvent.getEventTime()); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("The next event should be ACTION_UP", 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent.ACTION_UP, 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler.peekFirstInPendingMotionEventsForTesting().getActionMasked()); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("The up touch event should have been sent to the Gesture Detector", 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.getEventTime(), mMockGestureDetector.mLastEvent.getEventTime()); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Verify that a DOWN followed by a MOVE will trigger fling (but not LONG). 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @throws Exception 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testGestureFlingAndCancelLongClick() throws Exception { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(mGestureHandler.onTouchEvent(event)); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEvent != null); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event = MotionEvent.obtain( 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLongPressDetector.cancelLongPressIfNeeded(event); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.hasPendingMessage()); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event = MotionEvent.obtain( 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_UP, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronous, no need to wait. 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should have a fling", mMockListener.mLastFling1 != null); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should not have a long press", mMockListener.mLastLongPress == null); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Verify that for a normal scroll the following events are sent: 5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * - GESTURE_SCROLL_START 5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * - GESTURE_SCROLL_BY 5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * - GESTURE_SCROLL_END 5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @throws Exception 5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @SmallTest 5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Feature({"Gestures"}) 5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void testScrollEventActionUpSequence() throws Exception { 5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) checkScrollEventSequenceForEndActionType(MotionEvent.ACTION_UP); 5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Verify that for a cancelled scroll the following events are sent: 5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * - GESTURE_SCROLL_START 5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * - GESTURE_SCROLL_BY 5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * - GESTURE_SCROLL_END 5604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @throws Exception 5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @SmallTest 5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Feature({"Gestures"}) 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void testScrollEventActionCancelSequence() throws Exception { 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) checkScrollEventSequenceForEndActionType(MotionEvent.ACTION_CANCEL); 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private void checkScrollEventSequenceForEndActionType(int endActionType) throws Exception { 5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final int scrollToX = FAKE_COORD_X + 100; 5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final int scrollToY = FAKE_COORD_Y + 100; 5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime, eventTime + 1000, MotionEvent.ACTION_MOVE, scrollToX, scrollToY, 0); 5854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.isNativeScrolling()); 5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue("A scrollStart event should have been sent", 5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertEquals("We should have started scrolling", 5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY, 5924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals("Only tapDown, tapCancel, scrollBegin and scrollBy should have been sent", 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4, mockDelegate.mGestureTypeList.size()); 5951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("scrollBegin should be sent before scrollBy", 5961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START, 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (int) mockDelegate.mGestureTypeList.get(2)); 5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("scrollBegin should have the time of the ACTION_MOVE", 599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime + 1000, (long) mockDelegate.mGestureTimeList.get(2)); 6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime, eventTime + 1000, endActionType, scrollToX, scrollToY, 0); 6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mGestureHandler.onTouchEvent(event); 6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertFalse(mGestureHandler.isNativeScrolling()); 6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue("A scrollEnd event should have been sent", 6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_END)); 6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertEquals("We should have stopped scrolling", 6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_END, 610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 6111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only tapDown, scrollBegin and scrollBy and scrollEnd should have been sent", 612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5, mockDelegate.mGestureTypeList.size()); 6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Verify that for a normal fling (fling after scroll) the following events are sent: 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * - GESTURE_SCROLL_BEGIN 618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * - GESTURE_FLING_START 619b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * and GESTURE_FLING_CANCEL is sent on the next touch. 620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @throws Exception 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @SmallTest 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Feature({"Gestures"}) 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void testFlingEventSequence() throws Exception { 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event = MotionEvent.obtain( 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 641bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch assertTrue(mGestureHandler.isNativeScrolling()); 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertTrue("A scrollStart event should have been sent", 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals("We should have started scrolling", 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY, 647b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals("Only tapDown, tapCancel, scrollBegin and scrollBy should have been sent", 649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4, mockDelegate.mGestureTypeList.size()); 6501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("scrollBegin should be sent before scrollBy", 6511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START, 652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (int) mockDelegate.mGestureTypeList.get(2)); 6531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("scrollBegin should have the time of the ACTION_MOVE", 654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime + 10, (long) mockDelegate.mGestureTimeList.get(2)); 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event = MotionEvent.obtain( 657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) downTime, eventTime + 15, MotionEvent.ACTION_UP, 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 660bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch assertFalse(mGestureHandler.isNativeScrolling()); 661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals("We should have started flinging", 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentViewGestureHandler.GESTURE_FLING_START, 663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertTrue("A scroll end event should not have been sent", 665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !mockDelegate.mGestureTypeList.contains( 666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_END)); 667b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertEquals("The last up should have caused flingStart to be sent", 668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5, mockDelegate.mGestureTypeList.size()); 6691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("flingStart should have the time of the ACTION_UP", 670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime + 15, (long) mockDelegate.mGestureTimeList.get(4)); 671b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 672b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 50, downTime + 50); 673b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 674b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue("A flingCancel should have been sent", 675b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 676b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ContentViewGestureHandler.GESTURE_FLING_CANCEL)); 6771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only tapDown and flingCancel should have been sent", 678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7, mockDelegate.mGestureTypeList.size()); 679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** 68268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Verify that a zero-velocity fling is never forwarded, and cancels any 68368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * previous fling or scroll sequence. 68468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @throws Exception 68568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 68668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) @SmallTest 68768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) @Feature({"Gestures"}) 68868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public void testZeroVelocityFling() throws Exception { 68968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 69068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 69168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 69268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 69368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new GestureRecordingMotionEventDelegate(); 69468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 69668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 69768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mGestureHandler.fling(eventTime, 5, 5, 0, 0); 69868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertEquals("A zero-velocity fling should not be forwrded", 69968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) null, mockDelegate.mMostRecentGestureEvent); 70068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 70168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mGestureHandler.fling(eventTime, 5, 5, 5, 0); 70268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertEquals("Subsequent flings should work properly", 70368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ContentViewGestureHandler.GESTURE_FLING_START, 70468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 70568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 70668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mGestureHandler.fling(eventTime, 5, 5, 0, 0); 70768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertEquals("A zero-velocity fling should cancel any outstanding fling", 70868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ContentViewGestureHandler.GESTURE_FLING_CANCEL, 70968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 71068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 71168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 71268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 71368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) event = MotionEvent.obtain( 71468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 71568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 71668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 71768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertTrue(mGestureHandler.isNativeScrolling()); 71868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertTrue("A scrollStart event should have been sent", 71968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 72068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 72168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertEquals("We should have started scrolling", 72268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY, 72368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 72468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 72568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mGestureHandler.fling(eventTime, 5, 5, 0, 0); 72668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertEquals("A zero-velicty fling should end the current scroll sequence", 72768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_END, 72868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 72968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 73068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 73168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /** 732d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * Verify that a show pressed state gesture followed by a long press followed by the focus 733d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * loss in the window due to context menu cancels show pressed. 734d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * @throws Exception 735d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) */ 736d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) @SmallTest 737d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) @Feature({"Gestures"}) 738d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public void testShowPressCancelOnWindowFocusLost() throws Exception { 739d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) final long time = SystemClock.uptimeMillis(); 740d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 741d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 742d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 744d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mLongPressDetector = new LongPressDetector( 745d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) getInstrumentation().getTargetContext(), mGestureHandler); 746d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mGestureHandler.setTestDependencies(mLongPressDetector, null, null); 747d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 748d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, time, time); 749d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mGestureHandler.onTouchEvent(event); 750d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 751d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mGestureHandler.sendShowPressedStateGestureForTesting(); 752d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) assertEquals("A show pressed state event should have been sent", 753d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 754d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 7551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only showPressedState and tapDown should have been sent", 7561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2, mockDelegate.mGestureTypeList.size()); 757d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 758d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mLongPressDetector.startLongPressTimerIfNeeded(event); 759d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mLongPressDetector.sendLongPressGestureForTest(); 760d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 761d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) assertEquals("Only should have sent only LONG_PRESS event", 7621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3, mockDelegate.mGestureTypeList.size()); 763d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) assertEquals("Should have a long press event next", 764d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ContentViewGestureHandler.GESTURE_LONG_PRESS, 7651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.get(2).intValue()); 766d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 767d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The long press triggers window focus loss by opening a context menu 768d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mGestureHandler.onWindowFocusLost(); 769d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals("Only should have sent only GESTURE_TAP_CANCEL event", 7711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4, mockDelegate.mGestureTypeList.size()); 7721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Should have a gesture show press cancel event next", 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.GESTURE_TAP_CANCEL, 7741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.get(3).intValue()); 775d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 776d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 777d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) /** 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Verify that a recent show pressed state gesture is canceled when scrolling begins. 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testShowPressCancelWhenScrollBegins() throws Exception { 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mLongPressDetector = new LongPressDetector( 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getInstrumentation().getTargetContext(), mGestureHandler); 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler.sendShowPressedStateGestureForTesting(); 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("A show pressed state event should have been sent", 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 8041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only tapDown and showPressedState should have been sent", 8051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2, mockDelegate.mGestureTypeList.size()); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("We should have started scrolling", 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY, 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("A show press cancel event should have been sent", 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.GESTURE_TAP_CANCEL)); 8181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only tapDown, showPressedState, showPressCancel, scrollBegin and scrollBy" + 819b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) " should have been sent", 8201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5, mockDelegate.mGestureTypeList.size()); 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 15, MotionEvent.ACTION_UP, 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("We should have started flinging", 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_FLING_START, 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertTrue("A scroll end event should not have been sent", 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !mockDelegate.mGestureTypeList.contains( 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_END)); 832b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertEquals("The last up should have caused flingStart to be sent", 8331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6, mockDelegate.mGestureTypeList.size()); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 8377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Verify that double tap is correctly handled including the recent show pressed state gesture 8387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * cancellation. 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 8437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public void testDoubleTap() throws Exception { 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mLongPressDetector = new LongPressDetector( 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getInstrumentation().getTargetContext(), mGestureHandler); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mGestureHandler.sendShowPressedStateGestureForTesting(); 8597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent", 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 8617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 8621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE should have been sent", 8631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2, mockDelegate.mGestureTypeList.size()); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_UP, 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler.onTouchEvent(event); 869b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent", 870b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, 871b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 8721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 8731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE and " + 8747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_SINGLE_TAP_UNCONFIRMED should have been sent", 8751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3, mockDelegate.mGestureTypeList.size()); 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN, 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 8811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("A GESTURE_TAP_DOWN event should have been sent ", 8821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_TAP_DOWN, 8837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 8841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 8851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE, " + 886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_SINGLE_TAP_UNCONFIRMED," + 887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL and" + 8881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_TAP_DOWN should have been sent", 8891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5, mockDelegate.mGestureTypeList.size()); 8907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Moving a very small amount of distance should not trigger the double tap drag zoom mode. 8927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 8937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch eventTime + 10, eventTime + 10, MotionEvent.ACTION_MOVE, 8947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y + 1, 0); 8957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 8961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 8971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE, " + 898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_SINGLE_TAP_UNCONFIRMED and" + 899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL and" + 9001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_TAP_DOWN should have been sent", 9011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5, mockDelegate.mGestureTypeList.size()); 9027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 9047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch eventTime + 10, eventTime + 15, MotionEvent.ACTION_UP, 9057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y + 1, 0); 9067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("A double tap should have occurred", 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_DOUBLE_TAP, 9097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 9101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 9111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE, " + 9127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_SINGLE_TAP_UNCONFIRMED, " + 913f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL, " + 914f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_DOWN, " + 9157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_DOUBLE_TAP should have been sent", 9161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6, mockDelegate.mGestureTypeList.size()); 9177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 9187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /** 9207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Verify that double tap drag zoom feature is correctly executed. 9217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @throws Exception 9227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 9237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch @SmallTest 9247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch @Feature({"Gestures"}) 9257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public void testDoubleTapDragZoom() throws Exception { 9267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch final long downTime1 = SystemClock.uptimeMillis(); 9277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch final long downTime2 = downTime1 + 100; 9287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GestureRecordingMotionEventDelegate mockDelegate = 9307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new GestureRecordingMotionEventDelegate(); 9317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mGestureHandler = new ContentViewGestureHandler( 932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 9337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mLongPressDetector = new LongPressDetector( 9347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch getInstrumentation().getTargetContext(), mGestureHandler); 9357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); 9377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 9387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 9397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mGestureHandler.sendShowPressedStateGestureForTesting(); 9417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("GESTURE_SHOW_PRESSED_STATE should have been sent", 9427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE, 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 9441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SHOW_PRESSED_STATE should have been sent", 9451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2, mockDelegate.mGestureTypeList.size()); 9461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 9497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime1, downTime1 + 5, MotionEvent.ACTION_UP, 9507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y, 0); 9517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mGestureHandler.onTouchEvent(event); 9527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED event should have been sent", 9537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, 9547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 9551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 9561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE and " + 957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_UNCONFIRMED " + 9587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "should have been sent", 9591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3, mockDelegate.mGestureTypeList.size()); 9607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 9627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime2, downTime2, MotionEvent.ACTION_DOWN, 9637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y, 0); 9647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 9651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("GESTURE_TAP_DOWN should have been sent", 9661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_TAP_DOWN, 9677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 9681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 9691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE, " + 970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_UNCONFIRMED," + 971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL and" + 9721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_TAP_DOWN should have been sent", 9731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5, mockDelegate.mGestureTypeList.size()); 9747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 9767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE, 9777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y + 100, 0); 9787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 9797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue("GESTURE_SCROLL_START should have been sent", 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 9817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentViewGestureHandler.GESTURE_SCROLL_START)); 9827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("GESTURE_PINCH_BEGIN should have been sent", 9837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentViewGestureHandler.GESTURE_PINCH_BEGIN, 9847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 9851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 9861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE, " + 987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_UNCONFIRMED," + 988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL, " + 9891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_TAP_DOWN, " + 990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL, " + 9917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_SCROLL_START, and " + 9927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_PINCH_BEGIN should have been sent", 993f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8, mockDelegate.mGestureTypeList.size()); 9947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 9967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE, 9977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 9987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 9997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue("GESTURE_SCROLL_BY should have been sent", 10007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mGestureTypeList.contains( 10017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentViewGestureHandler.GESTURE_SCROLL_BY)); 10027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("GESTURE_PINCH_BY should have been sent", 10037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentViewGestureHandler.GESTURE_PINCH_BY, 10047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 10051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 10061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE, " + 1007f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_UNCONFIRMED," + 1008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL, " + 10091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_TAP_DOWN, " + 1010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL, " + 10117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_SCROLL_START," + 10127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_PINCH_BEGIN, " + 10137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_SCROLL_BY, and " + 10147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_PINCH_BY should have been sent", 1015f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10, mockDelegate.mGestureTypeList.size()); 10167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 10187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime2, downTime2 + 15, MotionEvent.ACTION_UP, 10197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 10207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 10217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue("GESTURE_PINCH_END should have been sent", 10227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mGestureTypeList.contains( 10237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentViewGestureHandler.GESTURE_PINCH_END)); 10247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("GESTURE_SCROLL_END should have been sent", 10257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ContentViewGestureHandler.GESTURE_SCROLL_END, 10267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 10271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 10281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SHOW_PRESSED_STATE, " + 1029f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_UNCONFIRMED," + 1030f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL, " + 10311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_TAP_DOWN, " + 1032f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "GESTURE_TAP_CANCEL, " + 10337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_SCROLL_START," + 10347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_PINCH_BEGIN, " + 10357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_SCROLL_BY," + 10367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_PINCH_BY, " + 10377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_PINCH_END, and " + 10387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GESTURE_SCROLL_END should have been sent", 1039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12, mockDelegate.mGestureTypeList.size()); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 10433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * Verify that double tap drag zoom feature is not invoked 10443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * when it is disabled.. 10453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * @throws Exception 10463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) */ 10473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @SmallTest 10483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @Feature({"Gestures"}) 10493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public void testDoubleTapDragZoomNothingWhenDisabled() throws Exception { 10503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) final long downTime1 = SystemClock.uptimeMillis(); 10513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) final long downTime2 = downTime1 + 100; 10523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 10533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 10543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new GestureRecordingMotionEventDelegate(); 10553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 10574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mGestureHandler.updateDoubleTapSupport(false); 10583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 10593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); 10603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 10613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 10623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event = MotionEvent.obtain( 10633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) downTime1, downTime1 + 5, MotionEvent.ACTION_UP, 10643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 10653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 10663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 10673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event = MotionEvent.obtain( 10683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) downTime2, downTime2, MotionEvent.ACTION_DOWN, 10693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 10703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 10713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 10723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event = MotionEvent.obtain( 10733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE, 10743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 100, 0); 10753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 10764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The move should become a scroll, as double tap and drag to zoom is 10774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // disabled. 10784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 10794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue("GESTURE_SCROLL_START should have been sent", 10803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 10813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 10824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertFalse("No GESTURE_PINCH_BEGIN should have been sent", 10834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 10844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_BEGIN)); 10853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 10863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event = MotionEvent.obtain( 10873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE, 10883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 10894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 10904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertEquals("GESTURE_SCROLL_BY should have been sent", 10914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY, 10924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 10934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertEquals("GESTURE_SCROLL_BY should have been sent", 10944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.getEventTime(), 10954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.getTimeMs()); 10963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue("No GESTURE_PINCH_BY should have been sent", 10973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_BY != 10983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 10993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 11003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event = MotionEvent.obtain( 11013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) downTime2, downTime2 + 15, MotionEvent.ACTION_UP, 11023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 11034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 11043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertFalse("No GESTURE_PINCH_END should have been sent", 11053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 11063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_END)); 11073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 11083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 11093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /** 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Mock MotionEventDelegate that remembers the most recent gesture event. 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static class GestureRecordingMotionEventDelegate implements MotionEventDelegate { 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static class GestureEvent { 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final int mType; 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final long mTimeMs; 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final int mX; 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final int mY; 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final Bundle mExtraParams; 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public GestureEvent(int type, long timeMs, int x, int y, Bundle extraParams) { 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mType = type; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mTimeMs = timeMs; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mX = x; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mY = y; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mExtraParams = extraParams; 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int getType() { 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mType; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public long getTimeMs() { 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mTimeMs; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int getX() { 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mX; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int getY() { 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mY; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public Bundle getExtraParams() { 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mExtraParams; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private GestureEvent mMostRecentGestureEvent; 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final ArrayList<Integer> mGestureTypeList = new ArrayList<Integer>(); 11501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private final ArrayList<Long> mGestureTimeList = new ArrayList<Long>(); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean sendTouchEvent(long timeMs, int action, TouchPoint[] pts) { 115481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch return true; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 115858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public boolean sendGesture(int type, long timeMs, int x, int y, Bundle extraParams) { 1159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Log.i(TAG, "Gesture event received with type id " + type); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mMostRecentGestureEvent = new GestureEvent(type, timeMs, x, y, extraParams); 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureTypeList.add(mMostRecentGestureEvent.mType); 11621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mGestureTimeList.add(timeMs); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void sendSingleTapUMA(int type) { 1168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Not implemented. 1169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @Override 1172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void sendActionAfterDoubleTapUMA(int type, 1173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) boolean clickDelayEnabled) { 1174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Not implemented. 117558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 117658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 117758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) @Override 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void invokeZoomPicker() { 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not implemented. 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public GestureEvent getMostRecentGestureEvent() { 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mMostRecentGestureEvent; 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Generate a scroll gesture and verify that the resulting scroll motion event has both absolute 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and relative position information. 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testScrollUpdateCoordinates() { 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final int deltaX = 16; 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final int deltaY = 84; 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureRecordingMotionEventDelegate delegate = new GestureRecordingMotionEventDelegate(); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentViewGestureHandler gestureHandler = new ContentViewGestureHandler( 1200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), delegate, mMockZoomManager); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(gestureHandler.onTouchEvent(event)); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move twice, because the first move gesture is discarded. 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event = MotionEvent.obtain( 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downTime, downTime + 5, MotionEvent.ACTION_MOVE, 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAKE_COORD_X - deltaX / 2, FAKE_COORD_Y - deltaY / 2, 0); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(gestureHandler.onTouchEvent(event)); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event = MotionEvent.obtain( 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downTime, downTime + 10, MotionEvent.ACTION_MOVE, 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAKE_COORD_X - deltaX, FAKE_COORD_Y - deltaY, 0); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(gestureHandler.onTouchEvent(event)); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the reported gesture event has all the expected data. 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureRecordingMotionEventDelegate.GestureEvent gestureEvent = 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate.getMostRecentGestureEvent(); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNotNull(gestureEvent); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(ContentViewGestureHandler.GESTURE_SCROLL_BY, gestureEvent.getType()); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(downTime + 10, gestureEvent.getTimeMs()); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(FAKE_COORD_X - deltaX, gestureEvent.getX()); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(FAKE_COORD_Y - deltaY, gestureEvent.getY()); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bundle extraParams = gestureEvent.getExtraParams(); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNotNull(extraParams); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No horizontal delta because of snapping. 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(0, extraParams.getInt(ContentViewGestureHandler.DISTANCE_X)); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(deltaY / 2, extraParams.getInt(ContentViewGestureHandler.DISTANCE_Y)); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Verify that the timer of LONG_PRESS will be cancelled when scrolling begins so 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * LONG_PRESS and LONG_TAP won't be triggered. 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testLongPressAndTapCancelWhenScrollBegins() throws Exception { 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mLongPressDetector = mGestureHandler.getLongPressDetector(); 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should not have a pending LONG_PRESS", !mLongPressDetector.hasPendingMessage()); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No LONG_TAP because LONG_PRESS timer is cancelled. 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("No LONG_PRESS should be sent", 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_LONG_PRESS)); 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("No LONG_TAP should be sent", 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_LONG_TAP)); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 1272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * Verifies that when hasTouchEventHandlers changes while in a gesture, that the pending 1273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * queue does not grow continually. 1274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) */ 1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) @SmallTest 1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) @Feature({"Gestures"}) 1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public void testHasTouchEventHandlersChangesInGesture() { 1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 1280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 12824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) getInstrumentation().getTargetContext(), new MockMotionEventDelegate(), 1283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mMockZoomManager); 1284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mLongPressDetector = new LongPressDetector( 1285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) getInstrumentation().getTargetContext(), mGestureHandler); 1286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 1288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 1291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) event = MotionEvent.obtain( 1293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 1294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 1295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 1299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) event = MotionEvent.obtain( 1301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 1302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 1303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) event = MotionEvent.obtain( 1307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) downTime, eventTime + 15, MotionEvent.ACTION_MOVE, 1308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FAKE_COORD_X * 15, FAKE_COORD_Y * 15, 0); 1309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) /** 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Verify that LONG_TAP is triggered after LongPress followed by an UP. 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testGestureLongTap() throws Exception { 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mLongPressDetector = mGestureHandler.getLongPressDetector(); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Should have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mLongPressDetector.sendLongPressGestureForTest(); 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("A LONG_PRESS gesture should have been sent", 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_LONG_PRESS, 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 1000); 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertEquals("A LONG_TAP gesture should have been sent", 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewGestureHandler.GESTURE_LONG_TAP, 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Verify that the touch slop region is removed from the first scroll delta to avoid a jump when 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * starting to scroll. 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @throws Exception 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Gestures"}) 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void testTouchSlopRemovedFromScroll() throws Exception { 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Context context = getInstrumentation().getTargetContext(); 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); 1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final int scrollDelta = 5; 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) context, mockDelegate, mMockZoomManager); 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event = MotionEvent.obtain( 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + scaledTouchSlop + scrollDelta, 0); 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals("We should have started scrolling", 1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY, 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GestureRecordingMotionEventDelegate.GestureEvent gestureEvent = 1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mockDelegate.getMostRecentGestureEvent(); 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertNotNull(gestureEvent); 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Bundle extraParams = gestureEvent.getExtraParams(); 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(0, extraParams.getInt(ContentViewGestureHandler.DISTANCE_X)); 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(-scrollDelta, extraParams.getInt(ContentViewGestureHandler.DISTANCE_Y)); 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 1387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Verify that touch moves are deferred if they are within the touch slop region 1388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * and the touch sequence is not being consumed. 1389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @throws Exception 1390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 1391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @SmallTest 1392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @Feature({"Gestures"}) 1393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void testTouchMoveWithinTouchSlopDeferred() throws Exception { 1394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Context context = getInstrumentation().getTargetContext(); 1395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 1397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); 1398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final int lessThanSlopScrollDelta = scaledTouchSlop / 2; 1399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final int greaterThanSlopScrollDelta = scaledTouchSlop * 2; 1400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 1402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 1404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals("The touch down should have been forwarded", 1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); 1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 1411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + lessThanSlopScrollDelta, 0); 1412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 1416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals("The less-than-slop touch move should not have been forwarded", 1418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); 1419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 1423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + greaterThanSlopScrollDelta, 0); 1424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals("The touch move should have been forwarded", 1426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); 1427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 1428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 1433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Verify that touch moves are not deferred even if they are within the touch slop region 1434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * when the touch sequence is being consumed. 1435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @throws Exception 1436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 1437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @SmallTest 1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @Feature({"Gestures"}) 1439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public void testTouchMoveWithinTouchSlopNotDeferredIfJavascriptConsumingGesture() 1440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throws Exception { 1441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Context context = getInstrumentation().getTargetContext(); 1442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 1443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 1444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final int scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); 1445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) final int lessThanSlopScrollDelta = scaledTouchSlop / 2; 1446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 1448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 1450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals("The touch down should have been forwarded", 1452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); 1453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 1457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + lessThanSlopScrollDelta, 0); 1458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.confirmTouchEvent( 1462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 1463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals("The less-than-slop touch move should have been forwarded", 1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); 1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 146758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private static void sendLastScrollByEvent(ContentViewGestureHandler handler) { 1468b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 1469b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 1470b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 1471b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue(handler.onTouchEvent(event)); 1472b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) event = MotionEvent.obtain( 1473b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 1474b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 30, 0); 1475b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue(handler.onTouchEvent(event)); 1476b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1477b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 147858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private static void sendLastZoomEvent( 147958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ContentViewGestureHandler handler, MockZoomManager zoomManager) { 148058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) zoomManager.pinchOnMoveEvents(handler); 148158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 148258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 148358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 148458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) assertTrue(handler.onTouchEvent(event)); 148558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) event = MotionEvent.obtain( 148658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 148758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 30, 0); 148858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) assertTrue(handler.onTouchEvent(event)); 148958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 149058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 149158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private static void sendLastPinchEvent(ContentViewGestureHandler handler) { 1492b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 1493b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 1494b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) handler.pinchBegin(downTime, FAKE_COORD_X, FAKE_COORD_Y); 1495b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) handler.pinchBy(eventTime + 10, FAKE_COORD_X, FAKE_COORD_Y, 2); 1496b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1497b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** 1499b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Verify that a DOWN followed shortly by an UP will trigger 1500b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * a GESTURE_SINGLE_TAP_UNCONFIRMED event immediately. 1501b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * 1502b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * @throws Exception 1503b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 1504b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) @SmallTest 1505b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) @Feature({"Gestures"}) 1506b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public void testGestureEventsSingleTapUnconfirmed() throws Exception { 1507b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 1508b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 1509b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1510b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 1511b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 1512b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 1514b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1515b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 1516b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 15171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("A TAP_DOWN gesture should have been sent", 15181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_TAP_DOWN, 15191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 1520b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1521b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 10); 1522b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertFalse(mGestureHandler.onTouchEvent(event)); 1523b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertEquals("A GESTURE_SINGLE_TAP_UNCONFIRMED gesture should have been sent", 1524b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, 1525b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 1526b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1527b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue("Should not have confirmed a single tap yet", 1528b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mMockListener.mLastSingleTap == null); 1529b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 15307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /** 1532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Verify that a tap-ending event will follow a TAP_DOWN event. 1533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 1534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @throws Exception 1535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 1536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @SmallTest 1537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @Feature({"Gestures"}) 1538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void testTapDownFollowedByTapEndingEvent() throws Exception { 1539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long downTime = SystemClock.uptimeMillis(); 1540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long eventTime = SystemClock.uptimeMillis(); 1541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 1543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 1544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 1546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 1548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(ContentViewGestureHandler.GESTURE_TAP_DOWN, 1550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.needsTapEndingEventForTesting()); 1552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5); 1553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertFalse(mGestureHandler.onTouchEvent(event)); 1554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(ContentViewGestureHandler.GESTURE_SINGLE_TAP_UNCONFIRMED, 1555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 1556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue("An unconfirmed tap does not terminate the tap down.", 1557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.needsTapEndingEventForTesting()); 1558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A confirmed tap is a tap-ending event. 1560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime += 20; 1561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime += 20; 1562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mockDelegate.mGestureTypeList.clear(); 1563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.updateShouldDisableDoubleTap(true); 1564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, downTime, MotionEvent.ACTION_DOWN, 1566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.needsTapEndingEventForTesting()); 1569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_UP, 1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(ContentViewGestureHandler.GESTURE_SINGLE_TAP_CONFIRMED, 1574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 1575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertFalse("A confirmed single tap should terminate the tap down.", 1576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.needsTapEndingEventForTesting()); 1577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A double tap gesture is a tap-ending event. 1579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime += 20; 1580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime += 20; 1581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mockDelegate.mGestureTypeList.clear(); 1582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.updateShouldDisableDoubleTap(false); 1583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, downTime, MotionEvent.ACTION_DOWN, 1585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.needsTapEndingEventForTesting()); 1588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_UP, 1590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN, 1593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.needsTapEndingEventForTesting()); 1596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime + 10, eventTime + 15, MotionEvent.ACTION_UP, 1598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertEquals(ContentViewGestureHandler.GESTURE_DOUBLE_TAP, 1601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 1602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertFalse("A double tap should terminate the tap down.", 1603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.needsTapEndingEventForTesting()); 1604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A double tap drag gesture will trigger a tap-ending event. 1606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime += 20; 1607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime += 20; 1608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mockDelegate.mGestureTypeList.clear(); 1609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.updateShouldDisableDoubleTap(false); 1610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, downTime, MotionEvent.ACTION_DOWN, 1612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.needsTapEndingEventForTesting()); 1615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_UP, 1617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN, 1620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.needsTapEndingEventForTesting()); 1623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime + 10, eventTime + 15, MotionEvent.ACTION_MOVE, 1625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 100, 0); 1626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertFalse("A double tap drag should terminate the tap down.", 1628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.needsTapEndingEventForTesting()); 1629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mockDelegate.mGestureTypeList.contains( 1630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 1631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mockDelegate.mGestureTypeList.contains( 1632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.GESTURE_TAP_CANCEL)); 1633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime + 10, eventTime + 20, MotionEvent.ACTION_UP, 1635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertFalse(mGestureHandler.needsTapEndingEventForTesting()); 1638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A scroll event will trigger a tap-ending (cancel) event. 1640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime += 25; 1641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) eventTime += 25; 1642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mockDelegate.mGestureTypeList.clear(); 1643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, downTime, MotionEvent.ACTION_DOWN, 1645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 1646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.needsTapEndingEventForTesting()); 1648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event = MotionEvent.obtain( 1649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 1650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 100, 0); 1651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mockDelegate.mGestureTypeList.contains( 1653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 1654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(mockDelegate.mGestureTypeList.contains( 1655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewGestureHandler.GESTURE_TAP_CANCEL)); 1656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertFalse("A scroll should terminate the tap down.", 1657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mGestureHandler.needsTapEndingEventForTesting()); 1658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertFalse(mGestureHandler.needsTapEndingEventForTesting()); 1659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 16627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Verify that touch move events are properly coalesced. 16637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @throws Exception 16647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 16657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch @SmallTest 16667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch @Feature({"Gestures"}) 16677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public void testTouchMoveCoalescing() throws Exception { 16687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch final long downTime = SystemClock.uptimeMillis(); 16697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch final long eventTime = SystemClock.uptimeMillis(); 16707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 16717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mGestureHandler.hasTouchEventHandlers(true); 16727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 1674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 1675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 1676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(TouchPoint.TOUCH_EVENT_TYPE_START, mMockMotionEventDelegate.mLastTouchAction); 1677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = MotionEvent.obtain( 16797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 16807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 16817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 16827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertFalse("Should not have a pending LONG_PRESS", mLongPressDetector.hasPendingMessage()); 16837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("Initial move events should offered to javascript and added to the queue", 16847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 16857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals(TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); 16867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 16877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 16887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 16897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 16907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 16917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("Move events already sent to javascript should not be coalesced", 16927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 16937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 16947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 16957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime, eventTime + 15, MotionEvent.ACTION_MOVE, 16967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAKE_COORD_X * 15, FAKE_COORD_Y * 15, 0); 16977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 16987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("Similar pending move events should be coalesced", 16997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 17007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PointerProperties pp1 = new PointerProperties(); 17027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pp1.id = 0; 17037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pp1.toolType = MotionEvent.TOOL_TYPE_FINGER; 17047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PointerProperties pp2 = new PointerProperties(); 17057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pp2.id = 1; 17067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pp2.toolType = MotionEvent.TOOL_TYPE_FINGER; 17077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PointerProperties[] properties = new PointerProperties[] { pp1, pp2 }; 17087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PointerCoords pc1 = new PointerCoords(); 17107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pc1.x = FAKE_COORD_X * 10; 17117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pc1.y = FAKE_COORD_Y * 10; 17127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pc1.pressure = 1; 17137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pc1.size = 1; 17147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PointerCoords pc2 = new PointerCoords(); 17157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pc2.x = FAKE_COORD_X * 15; 17167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pc2.y = FAKE_COORD_Y * 15; 17177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pc2.pressure = 1; 17187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pc2.size = 1; 17197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PointerCoords[] coords = new PointerCoords[] { pc1, pc2 }; 17207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 17227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime, eventTime + 20, MotionEvent.ACTION_MOVE, 17237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2, properties, coords, 0, 0, 1.0f, 1.0f, 0, 0, 0, 0); 17247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 17257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("Move events with different pointer counts should not be coalesced", 17267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 17277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = MotionEvent.obtain( 17297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch downTime, eventTime + 25, MotionEvent.ACTION_MOVE, 17307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2, properties, coords, 0, 0, 1.0f, 1.0f, 0, 0, 0, 0); 17317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 17327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("Move events with similar pointer counts should be coalesced", 17337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 17347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 17367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 17377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assertEquals("Move events should not be coalesced with other events", 17387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 17399ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch } 17409ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 17419ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch /** 17429ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch * Verify that synchronous confirmTouchEvent() calls made from the MotionEventDelegate behave 17439ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch * properly. 17449ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch * @throws Exception 17459ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch */ 17469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch @SmallTest 17479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch @Feature({"Gestures"}) 17489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch public void testSynchronousConfirmTouchEvent() throws Exception { 17499ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch final long downTime = SystemClock.uptimeMillis(); 17509ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch final long eventTime = SystemClock.uptimeMillis(); 17519ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 17529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mGestureHandler.hasTouchEventHandlers(true); 17539ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 17549ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mMockMotionEventDelegate.disableSynchronousConfirmTouchEvent(); 17559ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 1756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Queue an asynchronously handled event. 17579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 17589ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 17599ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 17609ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 17619ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Queue another event; this will remain in the queue until the first event is confirmed. 17629ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch event = MotionEvent.obtain( 17639ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 17649ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch FAKE_COORD_X * 10, FAKE_COORD_Y * 10, 0); 17659ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 17669ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 17679ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 17689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Enable synchronous event confirmation upon dispatch. 17699ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mMockMotionEventDelegate.enableSynchronousConfirmTouchEvent( 17709ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mGestureHandler, ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 17719ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 17729ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Confirm the original event; this should dispatch the second event and confirm it 1773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // synchronously. 17749ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch mGestureHandler.confirmTouchEvent( 17759ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 17769ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 17779ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 17789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertEquals(TouchPoint.TOUCH_EVENT_TYPE_MOVE, mMockMotionEventDelegate.mLastTouchAction); 17799ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 17809ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Adding events to any empty queue will trigger synchronous dispatch and confirmation. 17819ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch event = MotionEvent.obtain( 17829ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 17839ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 17849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 17859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 1786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 178758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 178858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /** 17890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * Verify that no double tap gestures are created if the gesture handler is 17900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * told to disable double tap gesture detection (according to the logic in 17910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * ContentViewCore.onRenderCoordinatesUpdated). 17924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @throws Exception 17934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 17944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @SmallTest 17954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Feature({"Gestures"}) 17960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public void testNoDoubleTapWhenDoubleTapDisabled() throws Exception { 17974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 17984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 17994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 18014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 18024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 18040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) mGestureHandler.updateShouldDisableDoubleTap(true); 18054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MotionEvent event = MotionEvent.obtain( 18074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime, downTime, MotionEvent.ACTION_DOWN, 18084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 18094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 18101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN should have been sent", 18111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1, mockDelegate.mGestureTypeList.size()); 18124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 18144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_UP, 18154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 18164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 18174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertEquals("A GESTURE_SINGLE_TAP_CONFIRMED event should have been sent", 18184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SINGLE_TAP_CONFIRMED, 18194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 18201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN and GESTURE_SINGLE_TAP_CONFIRMED " + 18211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "should have been sent", 18221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2, mockDelegate.mGestureTypeList.size()); 18234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 18254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) eventTime + 10, eventTime + 10, MotionEvent.ACTION_DOWN, 18264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 18274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 18281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 18291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SINGLE_TAP_CONFIRMED and " + 18301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_TAP_DOWN should have been sent", 18311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3, mockDelegate.mGestureTypeList.size()); 18324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 18344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) eventTime + 10, eventTime + 15, MotionEvent.ACTION_UP, 18354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 18374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertEquals("A double tap should not have occurred", 18384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SINGLE_TAP_CONFIRMED, 18394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 18401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("Only GESTURE_TAP_DOWN, " + 18411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_SINGLE_TAP_CONFIRMED, " + 18421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "GESTURE_TAP_DOWN and " + 18434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "GESTURE_SINGLE_TAP_CONFIRMED should have been sent", 18441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4, mockDelegate.mGestureTypeList.size()); 18454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 18480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * Verify that double tap drag zoom feature is not invoked when the gesture 18490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * handler is told to disable double tap gesture detection (according to the 18500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * logic in ContentViewCore.onRenderCoordinatesUpdated). 18510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * The second tap sequence should be treated just as the first would be. 18524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @throws Exception 18534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 18544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @SmallTest 18554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Feature({"Gestures"}) 18560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public void testNoDoubleTapDragZoomWhenDoubleTapDisabled() throws Exception { 18574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final long downTime1 = SystemClock.uptimeMillis(); 18584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) final long downTime2 = downTime1 + 100; 18594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 18614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new GestureRecordingMotionEventDelegate(); 18624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 18640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) mGestureHandler.updateShouldDisableDoubleTap(true); 18654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); 18674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 18684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 18704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime1, downTime1 + 5, MotionEvent.ACTION_UP, 18714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 18724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mGestureHandler.onTouchEvent(event); 18734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 18754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime2, downTime2, MotionEvent.ACTION_DOWN, 18764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 18774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 18784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 18804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE, 18814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 100, 0); 18824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The move should become a scroll, as double tap and drag to zoom is 18844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // disabled. 18854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 18864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue("GESTURE_SCROLL_START should have been sent", 18874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 18884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 18894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertFalse("No GESTURE_PINCH_BEGIN should have been sent", 18904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 18914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_BEGIN)); 18924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 18944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE, 18954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 18964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 18974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertEquals("GESTURE_SCROLL_BY should have been sent", 18984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY, 18994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 19004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertEquals("GESTURE_SCROLL_BY should have been sent", 19014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.getEventTime(), 19024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.getTimeMs()); 19034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue("No GESTURE_PINCH_BY should have been sent", 19044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_BY != 19054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 19064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event = MotionEvent.obtain( 19084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) downTime2, downTime2 + 15, MotionEvent.ACTION_UP, 19094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 19104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 19114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertFalse("No GESTURE_PINCH_END should have been sent", 19124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mockDelegate.mGestureTypeList.contains( 19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_END)); 19144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 19151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) /** 19170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * Verify that setting a fixed page scale (or a mobile viewport) during a double 19180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * tap drag zoom disables double tap detection after the gesture has ended. 19191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @throws Exception 19201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */ 19211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) @SmallTest 19221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) @Feature({"Gestures"}) 19231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public void testFixedPageScaleDuringDoubleTapDragZoom() throws Exception { 19241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) long downTime1 = SystemClock.uptimeMillis(); 19251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) long downTime2 = downTime1 + 100; 19261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GestureRecordingMotionEventDelegate mockDelegate = 19281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new GestureRecordingMotionEventDelegate(); 19291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mGestureHandler = new ContentViewGestureHandler( 1930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 19311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mLongPressDetector = new LongPressDetector( 19321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) getInstrumentation().getTargetContext(), mGestureHandler); 19331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Start a double-tap drag gesture. 19351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); 19361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 19371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mGestureHandler.sendShowPressedStateGestureForTesting(); 19381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 19391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime1, downTime1 + 5, MotionEvent.ACTION_UP, 19401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 19411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 19421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 19431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2, downTime2, MotionEvent.ACTION_DOWN, 19441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 19451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 19461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 19471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE, 19481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 100, 0); 19491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 19501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue("GESTURE_SCROLL_START should have been sent", 19511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 19521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 19531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("GESTURE_PINCH_BEGIN should have been sent", 19541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_BEGIN, 19551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 19561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Simulate setting a fixed page scale (or a mobile viewport); 19580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // this should not disrupt the current double-tap gesture. 19590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) mGestureHandler.updateShouldDisableDoubleTap(true); 19601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Double tap zoom updates should continue. 19621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 19631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE, 19641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 19651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 19661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue("GESTURE_SCROLL_BY should have been sent", 19671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 19681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY)); 19691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("GESTURE_PINCH_BY should have been sent", 19701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_BY, 19711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 19721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 19731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2, downTime2 + 15, MotionEvent.ACTION_UP, 19741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 19751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 19761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue("GESTURE_PINCH_END should have been sent", 19771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 19781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_END)); 19791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertEquals("GESTURE_SCROLL_END should have been sent", 19801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_END, 19811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mMostRecentGestureEvent.mType); 19821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The double-tap gesture has finished, but the page scale is fixed. 19841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The same event sequence should not generate any double tap getsures. 19851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.clear(); 19861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime1 += 200; 19871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2 += 200; 19881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Start a double-tap drag gesture. 19901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1); 19911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 19921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 19931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime1, downTime1 + 5, MotionEvent.ACTION_UP, 19941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 19951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 19961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 19971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2, downTime2, MotionEvent.ACTION_DOWN, 19981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y, 0); 19991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 20001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 20011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE, 20021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 100, 0); 20031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 20041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue("GESTURE_SCROLL_START should have been sent", 20051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 20061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_START)); 20071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertFalse("GESTURE_PINCH_BEGIN should not have been sent", 20081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 20091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_BEGIN)); 20101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 20111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Double tap zoom updates should not be sent. 20121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Instead, the second tap drag becomes a scroll gesture sequence. 20131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 20141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE, 20151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 20161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 20171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue("GESTURE_SCROLL_BY should have been sent", 20181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 20191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_SCROLL_BY)); 20201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertFalse("GESTURE_PINCH_BY should not have been sent", 20211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 20221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_BY)); 20231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = MotionEvent.obtain( 20241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) downTime2, downTime2 + 15, MotionEvent.ACTION_UP, 20251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 20261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 20271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) assertFalse("GESTURE_PINCH_END should not have been sent", 20281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mockDelegate.mGestureTypeList.contains( 20291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewGestureHandler.GESTURE_PINCH_END)); 20301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 20311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2032a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 2033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Verify that a secondary pointer press with no consumer does not interfere 2034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * with Javascript touch handling. 2035a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 2036a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @throws Exception 2037a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 2038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @SmallTest 2039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @Feature({"Gestures"}) 2040a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public void testSecondaryPointerWithNoConsumer() throws Exception { 2041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 2042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 2043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 2045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Queue a primary pointer press, a secondary pointer press and release, 2047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and a primary pointer move. 2048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 2049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2051a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_POINTER_DOWN, downTime, eventTime); 2053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_POINTER_UP, downTime, eventTime + 10); 2057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = MotionEvent.obtain( 2061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) downTime, eventTime + 15, MotionEvent.ACTION_MOVE, 2062a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 2063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2064a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2065a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2066a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Simulate preventDefault from Javascript, forcing all touch events to Javascript 2067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // for the current sequence. 2068a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent( 2069a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 2070a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2071a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2072a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent( 2073a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 2074a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("Even if the secondary pointer has no consumer, continue sending events", 2075a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2076a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent( 2078a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 2079a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("Even if the secondary pointer has no consumer, continue sending events", 2080a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2081a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2082a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent( 2083a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2084a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2085a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2086a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("No gestures should result from the Javascript-consumed sequence", 2087a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0, mMockMotionEventDelegate.mTotalSentGestureCount); 2088a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2089a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2090a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 2091a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Verify that multiple touch sequences in the queue are handled properly when 2092a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the Javascript response is different for each. 2093a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 2094a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @throws Exception 2095a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 2096a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @SmallTest 2097a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @Feature({"Gestures"}) 2098a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public void testMultiplyEnqueuedTouches() throws Exception { 2099a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 2100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 2101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 2103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.updateDoubleTapSupport(false); 2104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Queue a tap sequence. 2106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 2107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 5); 2111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Queue a scroll sequence. 2115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 10, downTime + 10); 2116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = MotionEvent.obtain( 2120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) downTime + 10, eventTime + 15, MotionEvent.ACTION_MOVE, 2121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 2122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertFalse(mGestureHandler.isNativeScrolling()); 2124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_UP, downTime + 10, downTime + 20); 2127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue(mGestureHandler.onTouchEvent(event)); 2128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(5, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Consume the first gesture. 2131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent( 2132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 2133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(4, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent( 2136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 2137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(3, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Don't consume the second gesture; it should be fed to the gesture detector. 2140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent( 2141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals(2, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("The down touch event should have been sent to the gesture detector", 2144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MotionEvent.ACTION_DOWN, mMockGestureDetector.mLastEvent.getActionMasked()); 2145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertFalse(mGestureHandler.isNativeScrolling()); 2146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.confirmTouchEvent( 2148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("The move touch event should have been sent to the gesture detector", 2150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MotionEvent.ACTION_MOVE, mMockGestureDetector.mLastEvent.getActionMasked()); 2151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 2154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Verify that only complete gestures are forwarded to Javascript if we receive 2155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * a touch handler notification. 2156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @throws Exception 2157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 2158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @SmallTest 2159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) @Feature({"Gestures"}) 2160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public void testOnlyCompleteGesturesForwardedToTouchHandler() throws Exception { 2161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) final long downTime = SystemClock.uptimeMillis(); 2162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) final long eventTime = SystemClock.uptimeMillis(); 2163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.hasTouchEventHandlers(false); 2165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 2167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 2168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("Initial down events should not be sent to Javascript without a touch handler", 2169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEvent != null); 2171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mMockGestureDetector.mLastEvent = null; 2172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 2174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = MotionEvent.obtain( 2176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 2177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FAKE_COORD_X * 5, FAKE_COORD_Y * 5, 0); 2178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 2179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("A move event should only be offered to javascript if the down was offered", 2180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertTrue("Should have a pending gesture", mMockGestureDetector.mLastEvent != null); 2182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_POINTER_DOWN, downTime, eventTime + 10); 2184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 2185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("A pointer event should only be offered to Javascript if the down was offered", 2186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ensure that redundant notifications have no effect. 2189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.hasTouchEventHandlers(true); 2190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_POINTER_UP, downTime, eventTime + 15); 2192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 2193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("A pointer event should only be offered to Javascript if the down was offered", 2194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_UP, downTime, eventTime + 20); 2197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 2198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("A pointer event should only be offered to Javascript if the down was offered", 2199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event = motionEvent(MotionEvent.ACTION_DOWN, downTime + 25, downTime + 25); 2202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mGestureHandler.onTouchEvent(event); 2203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assertEquals("A down event should be offered to Javascript with a registered touch handler", 2204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1, mGestureHandler.getNumberOfPendingMotionEventsForTesting()); 2205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 220681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 220781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch /** 220881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * Verify that no timeout-based gestures are triggered after a touch event 220981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * is consumed. In particular, LONG_PRESS and SHOW_PRESS should not fire 221081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * if TouchStart went unconsumed, but subsequent TouchMoves are consumed. 221181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * 221281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * @throws Exception 221381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch */ 221481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch @SmallTest 221581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch @Feature({"Gestures"}) 221681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch public void testNoTimeoutGestureAfterTouchConsumed() throws Exception { 221781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch getInstrumentation().runOnMainSync(new Runnable() { 221881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch @Override 221981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch public void run() { 222081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch setUp(); 222181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 222281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch final long downTime = SystemClock.uptimeMillis(); 222381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch final long eventTime = SystemClock.uptimeMillis(); 222481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 222581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mGestureHandler.hasTouchEventHandlers(true); 222681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 222781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, eventTime); 222881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 222981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mGestureHandler.confirmTouchEvent( 223081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 223181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertTrue("Should have a pending LONG_PRESS", 223281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mLongPressDetector.hasPendingMessage()); 223381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 223481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch event = MotionEvent.obtain( 223581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 223681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 223781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 223881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mGestureHandler.confirmTouchEvent( 223981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 224081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertFalse("Should not have a pending LONG_PRESS", 224181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mLongPressDetector.hasPendingMessage()); 224281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch } 224381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch }); 224481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertFalse(mMockListener.mShowPressCalled.await( 224581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ScalableTimeout.ScaleTimeout(ViewConfiguration.getTapTimeout() + 10), 224681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch TimeUnit.MILLISECONDS)); 224781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertFalse(mMockListener.mLongPressCalled.await( 224881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ScalableTimeout.ScaleTimeout(ViewConfiguration.getLongPressTimeout() + 10), 224981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch TimeUnit.MILLISECONDS)); 225081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch } 225181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 225281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch /** 225381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * Verify that a TAP_DOWN will be followed by a TAP_CANCEL if the first 225481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * touch is unconsumed, but the subsequent touch is consumed. 225581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * 225681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch * @throws Exception 225781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch */ 225881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch @SmallTest 225981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch @Feature({"Gestures"}) 226081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch public void testTapCancelledAfterTouchConsumed() throws Exception { 226181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch final long downTime = SystemClock.uptimeMillis(); 226281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch final long eventTime = SystemClock.uptimeMillis(); 226381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 226481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch GestureRecordingMotionEventDelegate mockDelegate = 226581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch new GestureRecordingMotionEventDelegate(); 226681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mGestureHandler = new ContentViewGestureHandler( 226781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch getInstrumentation().getTargetContext(), mockDelegate, mMockZoomManager); 226881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mGestureHandler.hasTouchEventHandlers(true); 226981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 227081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime); 227181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 227281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mGestureHandler.confirmTouchEvent( 227381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 227481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertEquals("A TAP_DOWN gesture should have been sent", 227581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ContentViewGestureHandler.GESTURE_TAP_DOWN, 227681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 227781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 227881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch event = MotionEvent.obtain( 227981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch downTime, eventTime + 10, MotionEvent.ACTION_MOVE, 228081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y + 200, 0); 228181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 228281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mGestureHandler.confirmTouchEvent( 228381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_CONSUMED); 228481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertEquals("A TAP_CANCEL gesture should have been sent", 228581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ContentViewGestureHandler.GESTURE_TAP_CANCEL, 228681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 228781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 228881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch event = MotionEvent.obtain( 228981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch downTime, eventTime + 15, MotionEvent.ACTION_MOVE, 229081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch FAKE_COORD_X, FAKE_COORD_Y + 400, 0); 229181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertTrue(mGestureHandler.onTouchEvent(event)); 229281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mGestureHandler.confirmTouchEvent( 229381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 229481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch assertEquals("No further gestures should be sent", 229581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch ContentViewGestureHandler.GESTURE_TAP_CANCEL, 229681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch mockDelegate.mMostRecentGestureEvent.mType); 229781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch } 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2299