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