Index: ui/events/gesture_detection/gesture_detector.cc |
diff --git a/ui/events/gesture_detection/gesture_detector.cc b/ui/events/gesture_detection/gesture_detector.cc |
index 4180eb3338085423cc09ae1549493f58e06c26a6..bc9c7dfc6fbfd3bbe73df851bf50b2c968a625d6 100644 |
--- a/ui/events/gesture_detection/gesture_detector.cc |
+++ b/ui/events/gesture_detection/gesture_detector.cc |
@@ -55,8 +55,8 @@ GestureDetector::Config::Config() |
two_finger_tap_enabled(false), |
two_finger_tap_max_separation(300), |
two_finger_tap_timeout(base::TimeDelta::FromMilliseconds(700)), |
- velocity_tracker_strategy(VelocityTracker::Strategy::STRATEGY_DEFAULT) { |
-} |
+ single_tap_repeat_length(1), |
+ velocity_tracker_strategy(VelocityTracker::Strategy::STRATEGY_DEFAULT) {} |
GestureDetector::Config::~Config() {} |
@@ -129,6 +129,8 @@ GestureDetector::GestureDetector( |
always_in_bigger_tap_region_(false), |
two_finger_tap_allowed_for_gesture_(false), |
is_double_tapping_(false), |
+ single_tap_count_(1), |
+ single_tap_repeat_length_(1), |
last_focus_x_(0), |
last_focus_y_(0), |
down_focus_x_(0), |
@@ -234,14 +236,16 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) { |
two_finger_tap_allowed_for_gesture_ = false; |
} break; |
- case MotionEvent::ACTION_DOWN: |
+ case MotionEvent::ACTION_DOWN: { |
+ bool maybe_double_tapping = |
+ current_down_event_ && previous_up_event_ && |
+ IsConsideredDoubleTap(*current_down_event_, *previous_up_event_, ev); |
if (double_tap_listener_) { |
+ single_tap_count_ = 1; |
bool had_tap_message = timeout_handler_->HasTimeout(TAP); |
if (had_tap_message) |
timeout_handler_->StopTimeout(TAP); |
- if (current_down_event_ && previous_up_event_ && had_tap_message && |
- IsConsideredDoubleTap( |
- *current_down_event_, *previous_up_event_, ev)) { |
+ if (maybe_double_tapping && had_tap_message) { |
// This is a second tap. |
is_double_tapping_ = true; |
// Give a callback with the first tap of the double-tap. |
@@ -253,6 +257,8 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) { |
DCHECK(double_tap_timeout_ > base::TimeDelta()); |
timeout_handler_->StartTimeout(TAP); |
} |
+ } else if (maybe_double_tapping) { |
+ single_tap_count_ = 1 + (single_tap_count_ % single_tap_repeat_length_); |
} |
down_focus_x_ = last_focus_x_ = focus_x; |
@@ -273,7 +279,7 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) { |
if (longpress_enabled_) |
timeout_handler_->StartTimeout(LONG_PRESS); |
handled |= listener_->OnDown(ev); |
- break; |
+ } break; |
case MotionEvent::ACTION_MOVE: |
{ |
@@ -343,12 +349,12 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) { |
DCHECK(double_tap_listener_); |
handled |= double_tap_listener_->OnDoubleTapEvent(ev); |
} else if (always_in_tap_region_) { |
- handled = listener_->OnSingleTapUp(ev); |
+ handled = listener_->OnSingleTapUp(ev, single_tap_count_); |
if (defer_confirm_single_tap_ && double_tap_listener_ != NULL) { |
double_tap_listener_->OnSingleTapConfirmed(ev); |
} |
} else { |
- |
+ single_tap_count_ = 1; |
// A fling must travel the minimum tap distance. |
const int pointer_id = ev.GetPointerId(0); |
velocity_tracker_.ComputeCurrentVelocity(1000, max_fling_velocity_); |
@@ -428,6 +434,9 @@ void GestureDetector::Init(const Config& config) { |
two_finger_tap_distance_square_ = config.two_finger_tap_max_separation * |
config.two_finger_tap_max_separation; |
two_finger_tap_timeout_ = config.two_finger_tap_timeout; |
+ |
+ DCHECK_GE(config.single_tap_repeat_length, 1); |
+ single_tap_repeat_length_ = config.single_tap_repeat_length; |
} |
void GestureDetector::OnShowPressTimeout() { |
@@ -463,6 +472,7 @@ void GestureDetector::CancelTaps() { |
always_in_tap_region_ = false; |
always_in_bigger_tap_region_ = false; |
defer_confirm_single_tap_ = false; |
+ single_tap_count_ = 1; |
} |
bool GestureDetector::IsConsideredDoubleTap( |