scale_gesture_detector.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Copyright 2014 The Chromium Authors. All rights reserved.
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// found in the LICENSE file.
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/memory/scoped_ptr.h"
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "base/time/time.h"
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "ui/events/gesture_detection/gesture_detection_export.h"
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "ui/events/gesture_detection/gesture_detector.h"
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectnamespace ui {
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass MotionEvent;
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Port of ScaleGestureDetector.java from Android
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// * platform/frameworks/base/core/java/android/view/ScaleGestureDetector.java
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// * Change-Id: I3e7926a4f6f9ab4951f380bd004499c78b3bda69
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// * Please update the Change-Id as upstream Android changes are pulled.
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass ScaleGestureDetector : public GestureDetector::SimpleGestureListener {
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public:
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  struct GESTURE_DETECTION_EXPORT Config {
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    Config();
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ~Config();
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GestureDetector::Config gesture_detector_config;
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bool quick_scale_enabled;
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int min_scaling_touch_major;
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int min_scaling_span;
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  };
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  class ScaleGestureListener {
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   public:
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    virtual ~ScaleGestureListener() {}
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    virtual bool OnScale(const ScaleGestureDetector& detector) = 0;
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    virtual bool OnScaleBegin(const ScaleGestureDetector& detector) = 0;
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    virtual void OnScaleEnd(const ScaleGestureDetector& detector) = 0;
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  };
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // A convenience class to extend when you only want to listen for a subset of
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // scaling-related events. This implements all methods in
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // |ScaleGestureListener| but does nothing.
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // |OnScale()| returns false so that a subclass can retrieve the accumulated
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // scale factor in an overridden |OnScaleEnd()|.
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // |OnScaleBegin() returns true.
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  class SimpleScaleGestureListener : public ScaleGestureListener {
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   public:
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    // ScaleGestureListener implementation.
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    virtual bool OnScale(const ScaleGestureDetector&) OVERRIDE;
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    virtual bool OnScaleBegin(const ScaleGestureDetector&) OVERRIDE;
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    virtual void OnScaleEnd(const ScaleGestureDetector&) OVERRIDE;
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  };
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  ScaleGestureDetector(const Config& config, ScaleGestureListener* listener);
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  virtual ~ScaleGestureDetector();
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // Accepts MotionEvents and dispatches events to a |ScaleGestureListener|
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // when appropriate.
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  //
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // Note: Applications should pass a complete and consistent event stream to
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // this method. A complete and consistent event stream involves all
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // MotionEvents from the initial ACTION_DOWN to the final ACTION_UP or
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // ACTION_CANCEL.
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  //
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // Returns true if the event was processed and the detector wants to receive
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // the rest of the MotionEvents in this event stream.
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  bool OnTouchEvent(const MotionEvent& event);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // Set whether the associated |ScaleGestureListener| should receive
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // OnScale callbacks when the user performs a doubletap followed by a swipe.
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  void SetQuickScaleEnabled(bool scales);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  bool IsQuickScaleEnabled() const;
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  bool IsInProgress() const;
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetFocusX() const;
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetFocusY() const;
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetCurrentSpan() const;
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetCurrentSpanX() const;
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetCurrentSpanY() const;
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetPreviousSpan() const;
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetPreviousSpanX() const;
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetPreviousSpanY() const;
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float GetScaleFactor() const;
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  base::TimeDelta GetTimeDelta() const;
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  base::TimeTicks GetEventTime() const;
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project private:
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  enum DoubleTapMode { DOUBLE_TAP_MODE_NONE, DOUBLE_TAP_MODE_IN_PROGRESS };
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // DoubleTapListener implementation.
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  virtual bool OnDoubleTap(const MotionEvent& ev) OVERRIDE;
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // The TouchMajor/TouchMinor elements of a MotionEvent can flutter/jitter on
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // some hardware/driver combos. Smooth out to get kinder, gentler behavior.
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  void AddTouchHistory(const MotionEvent& ev);
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  void ClearTouchHistory();
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  bool InDoubleTapMode() const;
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  ScaleGestureListener* const listener_;
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  Config config_;
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float focus_x_;
103e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati  float focus_y_;
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  bool quick_scale_enabled_;
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float curr_span_;
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float prev_span_;
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float initial_span_;
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float curr_span_x_;
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float curr_span_y_;
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float prev_span_x_;
113e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati  float prev_span_y_;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  base::TimeTicks curr_time_;
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  base::TimeTicks prev_time_;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  bool in_progress_;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  int span_slop_;
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  int min_span_;
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  // Bounds for recently seen values.
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float touch_upper_;
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float touch_lower_;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float touch_history_last_accepted_;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  int touch_history_direction_;
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  base::TimeTicks touch_history_last_accepted_time_;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  int touch_min_major_;
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  float double_tap_focus_x_;
128e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati  float double_tap_focus_y_;
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  DoubleTapMode double_tap_mode_;
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  bool event_before_or_above_starting_gesture_event_;
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  scoped_ptr<GestureDetector> gesture_detector_;
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  DISALLOW_COPY_AND_ASSIGN(ScaleGestureDetector);
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}  // namespace ui
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  // UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project