1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef UI_EVENTS_GESTURE_DETECTION_GESTURE_DETECTOR_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define UI_EVENTS_GESTURE_DETECTION_GESTURE_DETECTOR_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/logging.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/gesture_detection_export.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/velocity_tracker_state.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ui { 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MotionEvent; 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Port of GestureDetector.java from Android 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// * platform/frameworks/base/core/java/android/view/GestureDetector.java 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// * Change-Id: Ib470735ec929b0b358fca4597e92dc81084e675f 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// * Please update the Change-Id as upstream Android changes are pulled. 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GestureDetector { 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) struct GESTURE_DETECTION_EXPORT Config { 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Config(); 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~Config(); 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta longpress_timeout; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta showpress_timeout; 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta double_tap_timeout; 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The minimum duration between the first tap's up event and the second 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // tap's down event for an interaction to be considered a double-tap. 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta double_tap_min_time; 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Distance a touch can wander before a scroll will occur (in dips). 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float touch_slop; 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Distance the first touch can wander before it is no longer considered a 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // double tap (in dips). 40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float double_tap_slop; 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Minimum velocity to initiate a fling (in dips/second). 43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float minimum_fling_velocity; 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Maximum velocity of an initiated fling (in dips/second). 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float maximum_fling_velocity; 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Whether |OnSwipe| should be called after a secondary touch is released 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // while a logical swipe gesture is active. Defaults to false. 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool swipe_enabled; 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Minimum velocity to initiate a swipe (in dips/second). 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float minimum_swipe_velocity; 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Maximum angle of the swipe from its dominant component axis, between 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // (0, 45] degrees. The closer this is to 0, the closer the dominant 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // direction of the swipe must be to up, down left or right. 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float maximum_swipe_deviation_angle; 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Whether |OnTwoFingerTap| should be called for two finger tap 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // gestures. Defaults to false. 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool two_finger_tap_enabled; 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Maximum distance between pointers for a two finger tap. 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float two_finger_tap_max_separation; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Maximum time the second pointer can be active for a two finger tap. 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta two_finger_tap_timeout; 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class GestureListener { 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~GestureListener() {} 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnDown(const MotionEvent& e) = 0; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnShowPress(const MotionEvent& e) = 0; 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnSingleTapUp(const MotionEvent& e) = 0; 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnLongPress(const MotionEvent& e) = 0; 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool OnScroll(const MotionEvent& e1, 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const MotionEvent& e2, 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float distance_x, 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float distance_y) = 0; 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool OnFling(const MotionEvent& e1, 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const MotionEvent& e2, 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float velocity_x, 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float velocity_y) = 0; 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Added for Chromium (Aura). 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool OnSwipe(const MotionEvent& e1, 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const MotionEvent& e2, 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float velocity_x, 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float velocity_y) = 0; 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnTwoFingerTap(const MotionEvent& e1, 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const MotionEvent& e2) = 0; 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class DoubleTapListener { 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~DoubleTapListener() {} 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnSingleTapConfirmed(const MotionEvent& e) = 0; 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnDoubleTap(const MotionEvent& e) = 0; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnDoubleTapEvent(const MotionEvent& e) = 0; 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A convenience class to extend when you only want to listen for a subset 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // of all the gestures. This implements all methods in the 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |GestureListener| and |DoubleTapListener| but does 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // nothing and returns false for all applicable methods. 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class SimpleGestureListener : public GestureListener, 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public DoubleTapListener { 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // GestureListener implementation. 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnDown(const MotionEvent& e) OVERRIDE; 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnShowPress(const MotionEvent& e) OVERRIDE; 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnSingleTapUp(const MotionEvent& e) OVERRIDE; 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnLongPress(const MotionEvent& e) OVERRIDE; 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool OnScroll(const MotionEvent& e1, 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const MotionEvent& e2, 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float distance_x, 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float distance_y) OVERRIDE; 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool OnFling(const MotionEvent& e1, 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const MotionEvent& e2, 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float velocity_x, 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float velocity_y) OVERRIDE; 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool OnSwipe(const MotionEvent& e1, 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const MotionEvent& e2, 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float velocity_x, 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float velocity_y) OVERRIDE; 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnTwoFingerTap(const MotionEvent& e1, 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const MotionEvent& e2) OVERRIDE; 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // DoubleTapListener implementation. 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnSingleTapConfirmed(const MotionEvent& e) OVERRIDE; 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnDoubleTap(const MotionEvent& e) OVERRIDE; 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool OnDoubleTapEvent(const MotionEvent& e) OVERRIDE; 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GestureDetector(const Config& config, 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GestureListener* listener, 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DoubleTapListener* optional_double_tap_listener); 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~GestureDetector(); 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool OnTouchEvent(const MotionEvent& ev); 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Setting a valid |double_tap_listener| will enable double-tap detection, 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // wherein calls to |OnSimpleTapConfirmed| are delayed by the tap timeout. 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Note: The listener must never be changed while |is_double_tapping| is true. 1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void SetDoubleTapListener(DoubleTapListener* double_tap_listener); 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool has_doubletap_listener() const { return double_tap_listener_ != NULL; } 149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_double_tapping() const { return is_double_tapping_; } 151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void set_longpress_enabled(bool enabled) { longpress_enabled_ = enabled; } 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void Init(const Config& config); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnShowPressTimeout(); 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnLongPressTimeout(); 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnTapTimeout(); 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void Cancel(); 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void CancelTaps(); 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsConsideredDoubleTap(const MotionEvent& first_down, 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const MotionEvent& first_up, 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const MotionEvent& second_down) const; 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool HandleSwipeIfNeeded(const MotionEvent& up, float vx, float vy); 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class TimeoutGestureHandler; 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TimeoutGestureHandler> timeout_handler_; 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GestureListener* const listener_; 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DoubleTapListener* double_tap_listener_; 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float touch_slop_square_; 172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float double_tap_touch_slop_square_; 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float double_tap_slop_square_; 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float two_finger_tap_distance_square_; 175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float min_fling_velocity_; 176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch float max_fling_velocity_; 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float min_swipe_velocity_; 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu float min_swipe_direction_component_ratio_; 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta double_tap_timeout_; 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta two_finger_tap_timeout_; 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta double_tap_min_time_; 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool still_down_; 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool defer_confirm_single_tap_; 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool always_in_tap_region_; 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool always_in_bigger_tap_region_; 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool two_finger_tap_allowed_for_gesture_; 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MotionEvent> current_down_event_; 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MotionEvent> previous_up_event_; 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<MotionEvent> secondary_pointer_down_event_; 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // True when the user is still touching for the second tap (down, move, and 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // up events). Can only be true if there is a double tap listener attached. 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_double_tapping_; 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) float last_focus_x_; 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) float last_focus_y_; 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) float down_focus_x_; 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) float down_focus_y_; 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool longpress_enabled_; 2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool swipe_enabled_; 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool two_finger_tap_enabled_; 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Determines speed during touch scrolling. 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VelocityTrackerState velocity_tracker_; 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GestureDetector); 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ui 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // UI_EVENTS_GESTURE_DETECTION_GESTURE_DETECTOR_H_ 215