Chromium Code Reviews| Index: ui/events/gesture_detection/gesture_provider.cc |
| diff --git a/ui/events/gesture_detection/gesture_provider.cc b/ui/events/gesture_detection/gesture_provider.cc |
| index 4deeba2580f3a7a72928cd3cec30f4a401aa2f18..19ebd59bb496cee29c5abd9638abf6a0fc14a395 100644 |
| --- a/ui/events/gesture_detection/gesture_provider.cc |
| +++ b/ui/events/gesture_detection/gesture_provider.cc |
| @@ -76,7 +76,8 @@ GestureEventDetails CreateTapGestureDetails(EventType type, |
| // GestureProvider:::Config |
| -GestureProvider::Config::Config() : disable_click_delay(false) {} |
| +GestureProvider::Config::Config() |
| + : disable_click_delay(false), gesture_begin_end_types_enabled(false) {} |
| GestureProvider::Config::~Config() {} |
| @@ -604,7 +605,8 @@ GestureProvider::GestureProvider(const Config& config, |
| needs_show_press_event_(false), |
| needs_tap_ending_event_(false), |
| touch_scroll_in_progress_(false), |
| - pinch_in_progress_(false) { |
| + pinch_in_progress_(false), |
| + gesture_begin_end_types_enabled_(false) { |
|
jdduke (slow)
2014/04/03 22:03:28
gesture_begin_end_types_enabled_(config.gesture_be
tdresser
2014/04/04 16:39:31
Done.
|
| DCHECK(client); |
| InitGestureDetectors(config); |
| } |
| @@ -617,35 +619,17 @@ bool GestureProvider::OnTouchEvent(const MotionEvent& event) { |
| if (!CanHandle(event)) |
| return false; |
| - const bool was_touch_scrolling_ = touch_scroll_in_progress_; |
| + OnTouchEventHandlingBegin(event); |
| + |
| + const bool was_touch_scrolling = touch_scroll_in_progress_; |
| const bool in_scale_gesture = |
| scale_gesture_listener_->IsScaleGestureDetectionInProgress(); |
| - if (event.GetAction() == MotionEvent::ACTION_DOWN) { |
| - current_down_event_ = event.Clone(); |
| - touch_scroll_in_progress_ = false; |
| - needs_show_press_event_ = true; |
| - current_longpress_time_ = base::TimeTicks(); |
| - SendTapCancelIfNecessary(event); |
| - } |
| bool handled = gesture_listener_->OnTouchEvent(event, in_scale_gesture); |
|
jdduke (slow)
2014/04/03 22:03:28
I guess we'll no longer need the |handled| variabl
tdresser
2014/04/04 16:39:31
Done.
|
| handled |= scale_gesture_listener_->OnTouchEvent(event); |
| - if (event.GetAction() == MotionEvent::ACTION_UP || |
| - event.GetAction() == MotionEvent::ACTION_CANCEL) { |
| - // "Last finger raised" could be an end to movement, but it should |
| - // only terminate scrolling if the event did not cause a fling. |
| - if (was_touch_scrolling_ && !handled) |
| - EndTouchScrollIfNecessary(event.GetEventTime(), true); |
| - |
| - // We shouldn't necessarily cancel a tap on ACTION_UP, as the double-tap |
| - // timeout may yet trigger a SINGLE_TAP. |
| - if (event.GetAction() == MotionEvent::ACTION_CANCEL) |
| - SendTapCancelIfNecessary(event); |
| - |
| - current_down_event_.reset(); |
| - } |
| + OnTouchEventHandlingEnd(event, handled, was_touch_scrolling); |
| return true; |
| } |
| @@ -670,6 +654,10 @@ void GestureProvider::SetDoubleTapSupportForPageEnabled(bool enabled) { |
| gesture_listener_->SetDoubleTapSupportForPageEnabled(enabled); |
| } |
| +void GestureProvider::SetBeginEndTypesEnabled(bool enabled) { |
| + gesture_begin_end_types_enabled_ = enabled; |
| +} |
| + |
| bool GestureProvider::IsScrollInProgress() const { |
| // TODO(wangxianzhu): Also return true when fling is active once the UI knows |
| // exactly when the fling ends. |
| @@ -696,6 +684,7 @@ void GestureProvider::InitGestureDetectors(const Config& config) { |
| scale_gesture_listener_.reset( |
| new ScaleGestureListenerImpl(config.scale_gesture_detector_config, this)); |
| + gesture_begin_end_types_enabled_ = config.gesture_begin_end_types_enabled; |
| } |
| bool GestureProvider::CanHandle(const MotionEvent& event) const { |
| @@ -734,7 +723,8 @@ void GestureProvider::Send(const GestureEventData& gesture) { |
| // are SHOW_PRESS and TAP, potentially triggered by the double-tap |
| // delay timing out. |
| DCHECK(current_down_event_ || gesture.type == ET_GESTURE_TAP || |
| - gesture.type == ET_GESTURE_SHOW_PRESS); |
| + gesture.type == ET_GESTURE_SHOW_PRESS || |
| + gesture.type == ET_GESTURE_BEGIN || gesture.type == ET_GESTURE_END); |
|
jdduke (slow)
2014/04/03 22:03:28
If we send GESTURE_END before resetting the down e
tdresser
2014/04/04 16:39:31
Done.
|
| switch (gesture.type) { |
| case ET_GESTURE_TAP_DOWN: |
| @@ -818,4 +808,57 @@ void GestureProvider::EndTouchScrollIfNecessary(base::TimeTicks time, |
| Send(CreateGesture(ET_GESTURE_SCROLL_END, time, 0, 0)); |
| } |
| +void GestureProvider::OnTouchEventHandlingBegin(const MotionEvent& event) { |
| + switch (event.GetAction()) { |
| + case MotionEvent::ACTION_DOWN: |
| + current_down_event_ = event.Clone(); |
| + touch_scroll_in_progress_ = false; |
| + needs_show_press_event_ = true; |
|
jdduke (slow)
2014/04/03 22:03:28
Hmm, this show press assignment looks funky (prett
tdresser
2014/04/04 16:39:31
Done.
|
| + current_longpress_time_ = base::TimeTicks(); |
| + SendTapCancelIfNecessary(event); |
| + if (gesture_begin_end_types_enabled_) |
| + Send(CreateGesture(ET_GESTURE_BEGIN, event)); |
| + break; |
| + case MotionEvent::ACTION_POINTER_DOWN: |
| + if (gesture_begin_end_types_enabled_) |
| + Send(CreateGesture(ET_GESTURE_BEGIN, event)); |
| + break; |
| + case MotionEvent::ACTION_POINTER_UP: |
| + case MotionEvent::ACTION_UP: |
| + case MotionEvent::ACTION_CANCEL: |
| + case MotionEvent::ACTION_MOVE: |
| + break; |
| + } |
| +} |
| + |
| +void GestureProvider::OnTouchEventHandlingEnd( |
| + const MotionEvent& event, bool handled, bool was_touch_scrolling) { |
| + switch (event.GetAction()) { |
| + case MotionEvent::ACTION_UP: |
| + case MotionEvent::ACTION_CANCEL: |
| + // "Last finger raised" could be an end to movement, but it should |
| + // only terminate scrolling if the event did not cause a fling. |
| + if (was_touch_scrolling && !handled) |
| + EndTouchScrollIfNecessary(event.GetEventTime(), true); |
|
jdduke (slow)
2014/04/03 22:03:28
This will probably fail during rebase after https:
tdresser
2014/04/04 16:39:31
Done.
|
| + |
| + // We shouldn't necessarily cancel a tap on ACTION_UP, as the double-tap |
| + // timeout may yet trigger a SINGLE_TAP. |
| + if (event.GetAction() == MotionEvent::ACTION_CANCEL) |
| + SendTapCancelIfNecessary(event); |
| + |
| + current_down_event_.reset(); |
| + if (gesture_begin_end_types_enabled_) |
|
jdduke (slow)
2014/04/03 22:03:28
This should come before resetting the down event (
tdresser
2014/04/04 16:39:31
Done.
|
| + Send(CreateGesture(ET_GESTURE_END, event)); |
| + break; |
| + case MotionEvent::ACTION_POINTER_UP: |
| + if (gesture_begin_end_types_enabled_) |
| + Send(CreateGesture(ET_GESTURE_END, event)); |
| + break; |
| + case MotionEvent::ACTION_DOWN: |
| + case MotionEvent::ACTION_POINTER_DOWN: |
| + case MotionEvent::ACTION_MOVE: |
| + break; |
| + } |
| +} |
| + |
| } // namespace ui |