| 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/scale_gesture_detector.h" | 5 #include "ui/events/gesture_detection/scale_gesture_detector.h" |
| 6 | 6 |
| 7 #include <limits.h> | 7 #include <limits.h> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/float_util.h" | 10 #include "base/float_util.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 // Note: These constants were taken directly from the default (unscaled) | 26 // Note: These constants were taken directly from the default (unscaled) |
| 27 // versions found in Android's ViewConfiguration. | 27 // versions found in Android's ViewConfiguration. |
| 28 ScaleGestureDetector::Config::Config() | 28 ScaleGestureDetector::Config::Config() |
| 29 : quick_scale_enabled(false), | 29 : quick_scale_enabled(false), |
| 30 min_scaling_touch_major(48), | 30 min_scaling_touch_major(48), |
| 31 min_scaling_span(200) {} | 31 min_scaling_span(200) {} |
| 32 | 32 |
| 33 ScaleGestureDetector::Config::~Config() {} | 33 ScaleGestureDetector::Config::~Config() {} |
| 34 | 34 |
| 35 bool ScaleGestureDetector::SimpleScaleGestureListener::OnScale( | 35 bool ScaleGestureDetector::SimpleScaleGestureListener::OnScale( |
| 36 const ScaleGestureDetector&) { | 36 const ScaleGestureDetector&, const MotionEvent&) { |
| 37 return false; | 37 return false; |
| 38 } | 38 } |
| 39 | 39 |
| 40 bool ScaleGestureDetector::SimpleScaleGestureListener::OnScaleBegin( | 40 bool ScaleGestureDetector::SimpleScaleGestureListener::OnScaleBegin( |
| 41 const ScaleGestureDetector&) { | 41 const ScaleGestureDetector&, const MotionEvent&) { |
| 42 return true; | 42 return true; |
| 43 } | 43 } |
| 44 | 44 |
| 45 void ScaleGestureDetector::SimpleScaleGestureListener::OnScaleEnd( | 45 void ScaleGestureDetector::SimpleScaleGestureListener::OnScaleEnd( |
| 46 const ScaleGestureDetector&) {} | 46 const ScaleGestureDetector&, const MotionEvent&) {} |
| 47 | 47 |
| 48 ScaleGestureDetector::ScaleGestureDetector(const Config& config, | 48 ScaleGestureDetector::ScaleGestureDetector(const Config& config, |
| 49 ScaleGestureListener* listener) | 49 ScaleGestureListener* listener) |
| 50 : listener_(listener), | 50 : listener_(listener), |
| 51 config_(config), | 51 config_(config), |
| 52 focus_x_(0), | 52 focus_x_(0), |
| 53 focus_y_(0), | 53 focus_y_(0), |
| 54 quick_scale_enabled_(false), | 54 quick_scale_enabled_(false), |
| 55 curr_span_(0), | 55 curr_span_(0), |
| 56 prev_span_(0), | 56 prev_span_(0), |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 } | 92 } |
| 93 | 93 |
| 94 const bool stream_complete = | 94 const bool stream_complete = |
| 95 action == MotionEvent::ACTION_UP || action == MotionEvent::ACTION_CANCEL; | 95 action == MotionEvent::ACTION_UP || action == MotionEvent::ACTION_CANCEL; |
| 96 | 96 |
| 97 if (action == MotionEvent::ACTION_DOWN || stream_complete) { | 97 if (action == MotionEvent::ACTION_DOWN || stream_complete) { |
| 98 // Reset any scale in progress with the listener. | 98 // Reset any scale in progress with the listener. |
| 99 // If it's an ACTION_DOWN we're beginning a new event stream. | 99 // If it's an ACTION_DOWN we're beginning a new event stream. |
| 100 // This means the app probably didn't give us all the events. Shame on it. | 100 // This means the app probably didn't give us all the events. Shame on it. |
| 101 if (in_progress_) { | 101 if (in_progress_) { |
| 102 listener_->OnScaleEnd(*this); | 102 listener_->OnScaleEnd(*this, event); |
| 103 in_progress_ = false; | 103 in_progress_ = false; |
| 104 initial_span_ = 0; | 104 initial_span_ = 0; |
| 105 double_tap_mode_ = DOUBLE_TAP_MODE_NONE; | 105 double_tap_mode_ = DOUBLE_TAP_MODE_NONE; |
| 106 } else if (double_tap_mode_ == DOUBLE_TAP_MODE_IN_PROGRESS && | 106 } else if (double_tap_mode_ == DOUBLE_TAP_MODE_IN_PROGRESS && |
| 107 stream_complete) { | 107 stream_complete) { |
| 108 in_progress_ = false; | 108 in_progress_ = false; |
| 109 initial_span_ = 0; | 109 initial_span_ = 0; |
| 110 double_tap_mode_ = DOUBLE_TAP_MODE_NONE; | 110 double_tap_mode_ = DOUBLE_TAP_MODE_NONE; |
| 111 } | 111 } |
| 112 | 112 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 } | 180 } |
| 181 | 181 |
| 182 // Dispatch begin/end events as needed. | 182 // Dispatch begin/end events as needed. |
| 183 // If the configuration changes, notify the app to reset its current state by | 183 // If the configuration changes, notify the app to reset its current state by |
| 184 // beginning a fresh scale event stream. | 184 // beginning a fresh scale event stream. |
| 185 const bool was_in_progress = in_progress_; | 185 const bool was_in_progress = in_progress_; |
| 186 focus_x_ = focus_x; | 186 focus_x_ = focus_x; |
| 187 focus_y_ = focus_y; | 187 focus_y_ = focus_y; |
| 188 if (!InDoubleTapMode() && in_progress_ && | 188 if (!InDoubleTapMode() && in_progress_ && |
| 189 (span < min_span_ || config_changed)) { | 189 (span < min_span_ || config_changed)) { |
| 190 listener_->OnScaleEnd(*this); | 190 listener_->OnScaleEnd(*this, event); |
| 191 in_progress_ = false; | 191 in_progress_ = false; |
| 192 initial_span_ = span; | 192 initial_span_ = span; |
| 193 double_tap_mode_ = DOUBLE_TAP_MODE_NONE; | 193 double_tap_mode_ = DOUBLE_TAP_MODE_NONE; |
| 194 } | 194 } |
| 195 if (config_changed) { | 195 if (config_changed) { |
| 196 prev_span_x_ = curr_span_x_ = span_x; | 196 prev_span_x_ = curr_span_x_ = span_x; |
| 197 prev_span_y_ = curr_span_y_ = span_y; | 197 prev_span_y_ = curr_span_y_ = span_y; |
| 198 initial_span_ = prev_span_ = curr_span_ = span; | 198 initial_span_ = prev_span_ = curr_span_ = span; |
| 199 } | 199 } |
| 200 | 200 |
| 201 const int min_span = InDoubleTapMode() ? span_slop_ : min_span_; | 201 const int min_span = InDoubleTapMode() ? span_slop_ : min_span_; |
| 202 if (!in_progress_ && span >= min_span && | 202 if (!in_progress_ && span >= min_span && |
| 203 (was_in_progress || std::abs(span - initial_span_) > span_slop_)) { | 203 (was_in_progress || std::abs(span - initial_span_) > span_slop_)) { |
| 204 prev_span_x_ = curr_span_x_ = span_x; | 204 prev_span_x_ = curr_span_x_ = span_x; |
| 205 prev_span_y_ = curr_span_y_ = span_y; | 205 prev_span_y_ = curr_span_y_ = span_y; |
| 206 prev_span_ = curr_span_ = span; | 206 prev_span_ = curr_span_ = span; |
| 207 prev_time_ = curr_time_; | 207 prev_time_ = curr_time_; |
| 208 in_progress_ = listener_->OnScaleBegin(*this); | 208 in_progress_ = listener_->OnScaleBegin(*this, event); |
| 209 } | 209 } |
| 210 | 210 |
| 211 // Handle motion; focal point and span/scale factor are changing. | 211 // Handle motion; focal point and span/scale factor are changing. |
| 212 if (action == MotionEvent::ACTION_MOVE) { | 212 if (action == MotionEvent::ACTION_MOVE) { |
| 213 curr_span_x_ = span_x; | 213 curr_span_x_ = span_x; |
| 214 curr_span_y_ = span_y; | 214 curr_span_y_ = span_y; |
| 215 curr_span_ = span; | 215 curr_span_ = span; |
| 216 | 216 |
| 217 bool update_prev = true; | 217 bool update_prev = true; |
| 218 | 218 |
| 219 if (in_progress_) { | 219 if (in_progress_) { |
| 220 update_prev = listener_->OnScale(*this); | 220 update_prev = listener_->OnScale(*this, event); |
| 221 } | 221 } |
| 222 | 222 |
| 223 if (update_prev) { | 223 if (update_prev) { |
| 224 prev_span_x_ = curr_span_x_; | 224 prev_span_x_ = curr_span_x_; |
| 225 prev_span_y_ = curr_span_y_; | 225 prev_span_y_ = curr_span_y_; |
| 226 prev_span_ = curr_span_; | 226 prev_span_ = curr_span_; |
| 227 prev_time_ = curr_time_; | 227 prev_time_ = curr_time_; |
| 228 } | 228 } |
| 229 } | 229 } |
| 230 | 230 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 touch_history_last_accepted_ = std::numeric_limits<float>::quiet_NaN(); | 358 touch_history_last_accepted_ = std::numeric_limits<float>::quiet_NaN(); |
| 359 touch_history_direction_ = 0; | 359 touch_history_direction_ = 0; |
| 360 touch_history_last_accepted_time_ = base::TimeTicks(); | 360 touch_history_last_accepted_time_ = base::TimeTicks(); |
| 361 } | 361 } |
| 362 | 362 |
| 363 bool ScaleGestureDetector::InDoubleTapMode() const { | 363 bool ScaleGestureDetector::InDoubleTapMode() const { |
| 364 return double_tap_mode_ == DOUBLE_TAP_MODE_IN_PROGRESS; | 364 return double_tap_mode_ == DOUBLE_TAP_MODE_IN_PROGRESS; |
| 365 } | 365 } |
| 366 | 366 |
| 367 } // namespace ui | 367 } // namespace ui |
| OLD | NEW |