Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/events/gesture_detection/gesture_provider.h" | 5 #include "ui/events/gesture_detection/gesture_provider.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 GestureEventDetails tap_details(type, 1, 0); | 65 GestureEventDetails tap_details(type, 1, 0); |
| 66 tap_details.set_bounding_box( | 66 tap_details.set_bounding_box( |
| 67 gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor())); | 67 gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor())); |
| 68 return tap_details; | 68 return tap_details; |
| 69 } | 69 } |
| 70 | 70 |
| 71 } // namespace | 71 } // namespace |
| 72 | 72 |
| 73 // GestureProvider:::Config | 73 // GestureProvider:::Config |
| 74 | 74 |
| 75 GestureProvider::Config::Config() : disable_click_delay(false) {} | 75 GestureProvider::Config::Config() |
| 76 : disable_click_delay(false), gesture_begin_end_types_enabled(false) {} | |
| 76 | 77 |
| 77 GestureProvider::Config::~Config() {} | 78 GestureProvider::Config::~Config() {} |
| 78 | 79 |
| 79 // GestureProvider::ScaleGestureListener | 80 // GestureProvider::ScaleGestureListener |
| 80 | 81 |
| 81 class GestureProvider::ScaleGestureListenerImpl | 82 class GestureProvider::ScaleGestureListenerImpl |
| 82 : public ScaleGestureDetector::ScaleGestureListener { | 83 : public ScaleGestureDetector::ScaleGestureListener { |
| 83 public: | 84 public: |
| 84 ScaleGestureListenerImpl(const ScaleGestureDetector::Config& config, | 85 ScaleGestureListenerImpl(const ScaleGestureDetector::Config& config, |
| 85 float device_scale_factor, | 86 float device_scale_factor, |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 513 // GestureProvider | 514 // GestureProvider |
| 514 | 515 |
| 515 GestureProvider::GestureProvider(const Config& config, | 516 GestureProvider::GestureProvider(const Config& config, |
| 516 GestureProviderClient* client) | 517 GestureProviderClient* client) |
| 517 : client_(client), | 518 : client_(client), |
| 518 needs_show_press_event_(false), | 519 needs_show_press_event_(false), |
| 519 needs_tap_ending_event_(false), | 520 needs_tap_ending_event_(false), |
| 520 touch_scroll_in_progress_(false), | 521 touch_scroll_in_progress_(false), |
| 521 pinch_in_progress_(false), | 522 pinch_in_progress_(false), |
| 522 double_tap_support_for_page_(true), | 523 double_tap_support_for_page_(true), |
| 523 double_tap_support_for_platform_(true) { | 524 double_tap_support_for_platform_(true), |
| 525 gesture_begin_end_types_enabled_(config.gesture_begin_end_types_enabled) { | |
| 524 DCHECK(client); | 526 DCHECK(client); |
| 525 InitGestureDetectors(config); | 527 InitGestureDetectors(config); |
| 526 } | 528 } |
| 527 | 529 |
| 528 GestureProvider::~GestureProvider() {} | 530 GestureProvider::~GestureProvider() {} |
| 529 | 531 |
| 530 bool GestureProvider::OnTouchEvent(const MotionEvent& event) { | 532 bool GestureProvider::OnTouchEvent(const MotionEvent& event) { |
| 531 TRACE_EVENT1("input", "GestureProvider::OnTouchEvent", | 533 TRACE_EVENT1("input", "GestureProvider::OnTouchEvent", |
| 532 "action", GetMotionEventActionName(event.GetAction())); | 534 "action", GetMotionEventActionName(event.GetAction())); |
| 533 if (!CanHandle(event)) | 535 if (!CanHandle(event)) |
| 534 return false; | 536 return false; |
| 535 | 537 |
| 536 const bool in_scale_gesture = | 538 const bool in_scale_gesture = |
| 537 scale_gesture_listener_->IsScaleGestureDetectionInProgress(); | 539 scale_gesture_listener_->IsScaleGestureDetectionInProgress(); |
| 538 | 540 |
| 539 if (event.GetAction() == MotionEvent::ACTION_DOWN) { | 541 OnTouchEventHandlingBegin(event); |
| 540 current_down_event_ = event.Clone(); | |
| 541 touch_scroll_in_progress_ = false; | |
| 542 needs_show_press_event_ = true; | |
| 543 current_longpress_time_ = base::TimeTicks(); | |
| 544 SendTapCancelIfNecessary(event); | |
| 545 } | |
| 546 | 542 |
| 547 bool handled = gesture_listener_->OnTouchEvent(event, in_scale_gesture); | 543 gesture_listener_->OnTouchEvent(event, in_scale_gesture); |
| 548 handled |= scale_gesture_listener_->OnTouchEvent(event); | 544 scale_gesture_listener_->OnTouchEvent(event); |
| 549 | 545 |
| 550 if (event.GetAction() == MotionEvent::ACTION_UP || | 546 OnTouchEventHandlingEnd(event); |
| 551 event.GetAction() == MotionEvent::ACTION_CANCEL) { | |
| 552 // Note: This call will have no effect if a fling was just generated, as | |
| 553 // |Fling()| will have already signalled an end to touch-scrolling. | |
| 554 EndTouchScrollIfNecessary(event.GetEventTime(), true); | |
| 555 | |
| 556 // We shouldn't necessarily cancel a tap on ACTION_UP, as the double-tap | |
| 557 // timeout may yet trigger a SINGLE_TAP. | |
| 558 if (event.GetAction() == MotionEvent::ACTION_CANCEL) | |
| 559 SendTapCancelIfNecessary(event); | |
| 560 | |
| 561 UpdateDoubleTapDetectionSupport(); | |
| 562 | |
| 563 current_down_event_.reset(); | |
| 564 } | |
| 565 | 547 |
| 566 return true; | 548 return true; |
| 567 } | 549 } |
| 568 | 550 |
| 569 void GestureProvider::ResetGestureDetectors() { | 551 void GestureProvider::ResetGestureDetectors() { |
| 570 if (!current_down_event_) | 552 if (!current_down_event_) |
| 571 return; | 553 return; |
| 572 scoped_ptr<MotionEvent> cancel_event = current_down_event_->Cancel(); | 554 scoped_ptr<MotionEvent> cancel_event = current_down_event_->Cancel(); |
| 573 gesture_listener_->OnTouchEvent(*cancel_event, false); | 555 gesture_listener_->OnTouchEvent(*cancel_event, false); |
| 574 scale_gesture_listener_->OnTouchEvent(*cancel_event); | 556 scale_gesture_listener_->OnTouchEvent(*cancel_event); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 659 DCHECK(!gesture.time.is_null()); | 641 DCHECK(!gesture.time.is_null()); |
| 660 // The only valid events that should be sent without an active touch sequence | 642 // The only valid events that should be sent without an active touch sequence |
| 661 // are SHOW_PRESS and TAP, potentially triggered by the double-tap | 643 // are SHOW_PRESS and TAP, potentially triggered by the double-tap |
| 662 // delay timing out. | 644 // delay timing out. |
| 663 DCHECK(current_down_event_ || gesture.type == ET_GESTURE_TAP || | 645 DCHECK(current_down_event_ || gesture.type == ET_GESTURE_TAP || |
| 664 gesture.type == ET_GESTURE_SHOW_PRESS); | 646 gesture.type == ET_GESTURE_SHOW_PRESS); |
| 665 | 647 |
| 666 switch (gesture.type) { | 648 switch (gesture.type) { |
| 667 case ET_GESTURE_TAP_DOWN: | 649 case ET_GESTURE_TAP_DOWN: |
| 668 needs_tap_ending_event_ = true; | 650 needs_tap_ending_event_ = true; |
| 651 needs_show_press_event_ = true; | |
| 669 break; | 652 break; |
| 670 case ET_GESTURE_TAP_UNCONFIRMED: | 653 case ET_GESTURE_TAP_UNCONFIRMED: |
| 671 needs_show_press_event_ = false; | 654 needs_show_press_event_ = false; |
| 672 break; | 655 break; |
| 673 case ET_GESTURE_TAP: | 656 case ET_GESTURE_TAP: |
| 674 if (needs_show_press_event_) | 657 if (needs_show_press_event_) |
| 675 Send(CreateGesture( | 658 Send(CreateGesture( |
| 676 ET_GESTURE_SHOW_PRESS, gesture.time, gesture.x, gesture.y)); | 659 ET_GESTURE_SHOW_PRESS, gesture.time, gesture.x, gesture.y)); |
| 677 needs_tap_ending_event_ = false; | 660 needs_tap_ending_event_ = false; |
| 678 break; | 661 break; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 750 | 733 |
| 751 void GestureProvider::UpdateDoubleTapDetectionSupport() { | 734 void GestureProvider::UpdateDoubleTapDetectionSupport() { |
| 752 if (IsDoubleTapInProgress()) | 735 if (IsDoubleTapInProgress()) |
| 753 return; | 736 return; |
| 754 | 737 |
| 755 const bool supports_double_tap = IsDoubleTapSupported(); | 738 const bool supports_double_tap = IsDoubleTapSupported(); |
| 756 gesture_listener_->SetDoubleTapEnabled(supports_double_tap); | 739 gesture_listener_->SetDoubleTapEnabled(supports_double_tap); |
| 757 scale_gesture_listener_->SetDoubleTapEnabled(supports_double_tap); | 740 scale_gesture_listener_->SetDoubleTapEnabled(supports_double_tap); |
| 758 } | 741 } |
| 759 | 742 |
| 743 void GestureProvider::OnTouchEventHandlingBegin(const MotionEvent& event) { | |
| 744 switch (event.GetAction()) { | |
| 745 case MotionEvent::ACTION_DOWN: | |
| 746 current_down_event_ = event.Clone(); | |
| 747 touch_scroll_in_progress_ = false; | |
| 748 needs_show_press_event_ = false; | |
| 749 current_longpress_time_ = base::TimeTicks(); | |
| 750 SendTapCancelIfNecessary(event); | |
| 751 if (gesture_begin_end_types_enabled_) | |
| 752 Send(CreateGesture(ET_GESTURE_BEGIN, event)); | |
| 753 break; | |
| 754 case MotionEvent::ACTION_POINTER_DOWN: | |
| 755 if (gesture_begin_end_types_enabled_) | |
| 756 Send(CreateGesture(ET_GESTURE_BEGIN, event)); | |
| 757 break; | |
| 758 case MotionEvent::ACTION_POINTER_UP: | |
| 759 case MotionEvent::ACTION_UP: | |
| 760 case MotionEvent::ACTION_CANCEL: | |
| 761 case MotionEvent::ACTION_MOVE: | |
| 762 break; | |
| 763 } | |
| 764 } | |
| 765 | |
| 766 void GestureProvider::OnTouchEventHandlingEnd(const MotionEvent& event) { | |
| 767 switch (event.GetAction()) { | |
| 768 case MotionEvent::ACTION_UP: | |
| 769 case MotionEvent::ACTION_CANCEL: | |
| 770 // Note: This call will have no effect if a fling was just generated, as | |
| 771 // |Fling()| will have already signalled an end to touch-scrolling. | |
| 772 EndTouchScrollIfNecessary(event.GetEventTime(), true); | |
| 773 // We shouldn't necessarily cancel a tap on ACTION_UP, as the double-tap | |
|
jdduke (slow)
2014/04/04 19:08:36
Let's add a line break before "// We shouldn't".
tdresser
2014/04/07 13:42:55
Done.
| |
| 774 // timeout may yet trigger a SINGLE_TAP. | |
| 775 if (event.GetAction() == MotionEvent::ACTION_CANCEL) | |
| 776 SendTapCancelIfNecessary(event); | |
| 777 UpdateDoubleTapDetectionSupport(); | |
|
jdduke (slow)
2014/04/04 19:08:36
Also line break before |UpdateDouble...|.
tdresser
2014/04/07 13:42:55
Done.
| |
| 778 | |
| 779 if (gesture_begin_end_types_enabled_) | |
| 780 Send(CreateGesture(ET_GESTURE_END, event)); | |
| 781 | |
| 782 current_down_event_.reset(); | |
| 783 break; | |
| 784 case MotionEvent::ACTION_POINTER_UP: | |
| 785 if (gesture_begin_end_types_enabled_) | |
| 786 Send(CreateGesture(ET_GESTURE_END, event)); | |
| 787 break; | |
| 788 case MotionEvent::ACTION_DOWN: | |
| 789 case MotionEvent::ACTION_POINTER_DOWN: | |
| 790 case MotionEvent::ACTION_MOVE: | |
| 791 break; | |
| 792 } | |
| 793 } | |
| 794 | |
| 760 } // namespace ui | 795 } // namespace ui |
| OLD | NEW |