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