Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: ui/events/gesture_detection/gesture_provider.cc

Issue 223673006: Support GestureBegin and GestureEnd in ui::GestureProvider (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address jdduke's comments. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698