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

Unified Diff: ui/events/gesture_detection/gesture_provider.h

Issue 128613003: [Tracking Patch] Unified gesture detection (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup Created 6 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: ui/events/gesture_detection/gesture_provider.h
diff --git a/ui/events/gesture_detection/gesture_provider.h b/ui/events/gesture_detection/gesture_provider.h
new file mode 100644
index 0000000000000000000000000000000000000000..eb4221a2465af8d330d9a86dae12ddea007e7fdb
--- /dev/null
+++ b/ui/events/gesture_detection/gesture_provider.h
@@ -0,0 +1,129 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_EVENTS_GESTURE_DETECTION_GESTURE_PROVIDER_H_
+#define UI_EVENTS_GESTURE_DETECTION_GESTURE_PROVIDER_H_
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+#include "ui/events/gesture_detection/gesture_detection_export.h"
+#include "ui/events/gesture_detection/gesture_detector.h"
+#include "ui/events/gesture_detection/scale_gesture_detector.h"
+#include "ui/events/gesture_detection/snap_scroll_controller.h"
+
+namespace ui {
+
+struct GestureEventParams;
+
+class GESTURE_DETECTION_EXPORT GestureProviderClient {
+ public:
+ virtual ~GestureProviderClient() {}
+ virtual void OnGestureEvent(const GestureEventParams& gesture) = 0;
+};
+
+// Given a stream of |MotionEvent|'s, provides gesture detection and gesture
+// event dispatch.
+class GESTURE_DETECTION_EXPORT GestureProvider {
+ public:
+ struct Config {
+ Config();
+ ~Config();
+ GestureDetector::Config gesture_detector_config;
+ ScaleGestureDetector::Config scale_gesture_detector_config;
+ SnapScrollController::Config snap_scroll_controller_config;
+ bool disable_click_delay;
+ };
+
+ GestureProvider(const Config& config, GestureProviderClient* client);
+ ~GestureProvider();
+
+ // Handle the incoming MotionEvent, returning false if the event could not
+ // be handled.
+ bool OnTouchEvent(const MotionEvent& event);
+
+ // Resets all gesture detectors; called on DidStartLoading().
+ void ResetGestureDetectors();
+
+ // Cancel the current touch event sequence by sending ACTION_CANCEL, and
+ // ignore all the subsequent events until the next ACTION_DOWN.
+ // One example usecase is to stop processing the touch events when showing
+ // a context popup menu.
+ void CancelActiveTouchSequence();
+
+ // Update whether multi-touch gestures are supported.
+ void UpdateMultiTouchSupport(bool support_multi_touch_zoom);
+
+ // Update whether double-tap gestures are supported. This allows
+ // double-tap gesture suppression independent of whether or not the page's
+ // viewport and scale would normally prevent double-tap.
+ // Note: This should not be called while a double-tap gesture is in progress.
+ void UpdateDoubleTapSupportForPlatform(bool support_double_tap);
+
+ // Update whether double-tap gesture detection should be suppressed due to
+ // the viewport or scale of the current page. Suppressing double-tap gesture
+ // detection allows for rapid and responsive single-tap gestures.
+ void UpdateDoubleTapSupportForPage(bool support_double_tap);
+
+ // Whether a scroll gesture is in-progress.
+ bool IsScrollInProgress() const;
+
+ // Whether a pinch gesture is in-progress (i.e. a pinch update has been
+ // forwarded and detection is still active).
+ bool IsPinchInProgress() const;
+
+ // Whether a double tap-gesture is in-progress.
+ bool IsDoubleTapInProgress() const;
+
+ private:
+ void InitGestureDetectors(const Config& config);
+
+ bool CanHandle(const MotionEvent& event) const;
+
+ void Fling(base::TimeTicks time,
+ float x,
+ float y,
+ float velocity_x,
+ float velocity_y);
+ void Send(const GestureEventParams& gesture);
+ void SendTapCancelIfNecessary(const MotionEvent& event);
+ bool SendLongTapIfNecessary(const MotionEvent& event);
+ void EndTouchScrollIfNecessary(base::TimeTicks time,
+ bool send_scroll_end_event);
+
+ GestureProviderClient* const client_;
+
+ class GestureListener;
+ friend class GestureListener;
+ scoped_ptr<GestureListener> gesture_listener_;
+
+ class ScaleGestureListener;
+ friend class ScaleGestureListener;
+ scoped_ptr<ScaleGestureListener> scale_gesture_listener_;
+
+ scoped_ptr<MotionEvent> current_down_event_;
+
+ // Whether a GESTURE_SHOW_PRESS was sent for the current touch sequence.
+ // Sending a GESTURE_SINGLE_TAP* event will forward a GESTURE_SHOW_PRESS if
+ // one has not yet been sent.
+ bool needs_show_press_event_;
+
+ // Whether a sent GESTURE_TAP_DOWN event has yet to be accompanied by a
+ // corresponding GESTURE_SINGLE_TAP_CONFIRMED, GESTURE_TAP_CANCEL or
+ // GESTURE_DOUBLE_TAP.
+ bool needs_tap_ending_event_;
+
+ // Whether the respective {SCROLL,PINCH}_BEGIN gestures have been terminated
+ // with a {SCROLL,PINCH}_END.
+ bool touch_scroll_in_progress_;
+ bool pinch_in_progress_;
+
+ // Keeps track of the current GESTURE_LONG_PRESS event. If a context menu is
+ // opened after a GESTURE_LONG_PRESS, this is used to insert a
+ // GESTURE_TAP_CANCEL for removing any ::active styling.
+ base::TimeTicks current_longpress_time_;
+};
+
+} // namespace ui
+
+#endif // UI_EVENTS_GESTURE_DETECTION_GESTURE_PROVIDER_H_

Powered by Google App Engine
This is Rietveld 408576698