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 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 default: | 188 default: |
189 break; | 189 break; |
190 }; | 190 }; |
191 | 191 |
192 client_->OnGestureEvent(gesture); | 192 client_->OnGestureEvent(gesture); |
193 GestureTouchUMAHistogram::RecordGestureEvent(gesture); | 193 GestureTouchUMAHistogram::RecordGestureEvent(gesture); |
194 } | 194 } |
195 | 195 |
196 // ScaleGestureListener implementation. | 196 // ScaleGestureListener implementation. |
197 virtual bool OnScaleBegin(const ScaleGestureDetector& detector, | 197 virtual bool OnScaleBegin(const ScaleGestureDetector& detector, |
198 const MotionEvent& e) OVERRIDE { | 198 const MotionEvent& e) override { |
199 if (ignore_multitouch_zoom_events_ && !detector.InDoubleTapMode()) | 199 if (ignore_multitouch_zoom_events_ && !detector.InDoubleTapMode()) |
200 return false; | 200 return false; |
201 return true; | 201 return true; |
202 } | 202 } |
203 | 203 |
204 virtual void OnScaleEnd(const ScaleGestureDetector& detector, | 204 virtual void OnScaleEnd(const ScaleGestureDetector& detector, |
205 const MotionEvent& e) OVERRIDE { | 205 const MotionEvent& e) override { |
206 if (!pinch_event_sent_) | 206 if (!pinch_event_sent_) |
207 return; | 207 return; |
208 Send(CreateGesture(ET_GESTURE_PINCH_END, e)); | 208 Send(CreateGesture(ET_GESTURE_PINCH_END, e)); |
209 } | 209 } |
210 | 210 |
211 virtual bool OnScale(const ScaleGestureDetector& detector, | 211 virtual bool OnScale(const ScaleGestureDetector& detector, |
212 const MotionEvent& e) OVERRIDE { | 212 const MotionEvent& e) override { |
213 if (ignore_multitouch_zoom_events_ && !detector.InDoubleTapMode()) | 213 if (ignore_multitouch_zoom_events_ && !detector.InDoubleTapMode()) |
214 return false; | 214 return false; |
215 if (!pinch_event_sent_) { | 215 if (!pinch_event_sent_) { |
216 Send(CreateGesture(ET_GESTURE_PINCH_BEGIN, | 216 Send(CreateGesture(ET_GESTURE_PINCH_BEGIN, |
217 e.GetId(), | 217 e.GetId(), |
218 e.GetToolType(), | 218 e.GetToolType(), |
219 detector.GetEventTime(), | 219 detector.GetEventTime(), |
220 detector.GetFocusX(), | 220 detector.GetFocusX(), |
221 detector.GetFocusY(), | 221 detector.GetFocusY(), |
222 detector.GetFocusX() + e.GetRawOffsetX(), | 222 detector.GetFocusX() + e.GetRawOffsetX(), |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 detector.GetFocusY(), | 257 detector.GetFocusY(), |
258 detector.GetFocusX() + e.GetRawOffsetX(), | 258 detector.GetFocusX() + e.GetRawOffsetX(), |
259 detector.GetFocusY() + e.GetRawOffsetY(), | 259 detector.GetFocusY() + e.GetRawOffsetY(), |
260 e.GetPointerCount(), | 260 e.GetPointerCount(), |
261 GetBoundingBox(e, pinch_details.type()), | 261 GetBoundingBox(e, pinch_details.type()), |
262 e.GetFlags())); | 262 e.GetFlags())); |
263 return true; | 263 return true; |
264 } | 264 } |
265 | 265 |
266 // GestureListener implementation. | 266 // GestureListener implementation. |
267 virtual bool OnDown(const MotionEvent& e) OVERRIDE { | 267 virtual bool OnDown(const MotionEvent& e) override { |
268 GestureEventDetails tap_details(ET_GESTURE_TAP_DOWN); | 268 GestureEventDetails tap_details(ET_GESTURE_TAP_DOWN); |
269 Send(CreateGesture(tap_details, e)); | 269 Send(CreateGesture(tap_details, e)); |
270 | 270 |
271 // Return true to indicate that we want to handle touch. | 271 // Return true to indicate that we want to handle touch. |
272 return true; | 272 return true; |
273 } | 273 } |
274 | 274 |
275 virtual bool OnScroll(const MotionEvent& e1, | 275 virtual bool OnScroll(const MotionEvent& e1, |
276 const MotionEvent& e2, | 276 const MotionEvent& e2, |
277 float raw_distance_x, | 277 float raw_distance_x, |
278 float raw_distance_y) OVERRIDE { | 278 float raw_distance_y) override { |
279 float distance_x = raw_distance_x; | 279 float distance_x = raw_distance_x; |
280 float distance_y = raw_distance_y; | 280 float distance_y = raw_distance_y; |
281 if (!scroll_event_sent_) { | 281 if (!scroll_event_sent_) { |
282 // Remove the touch slop region from the first scroll event to avoid a | 282 // Remove the touch slop region from the first scroll event to avoid a |
283 // jump. | 283 // jump. |
284 double distance = | 284 double distance = |
285 std::sqrt(distance_x * distance_x + distance_y * distance_y); | 285 std::sqrt(distance_x * distance_x + distance_y * distance_y); |
286 double epsilon = 1e-3; | 286 double epsilon = 1e-3; |
287 if (distance > epsilon) { | 287 if (distance > epsilon) { |
288 double ratio = | 288 double ratio = |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 bounding_box, | 341 bounding_box, |
342 e2.GetFlags())); | 342 e2.GetFlags())); |
343 } | 343 } |
344 | 344 |
345 return true; | 345 return true; |
346 } | 346 } |
347 | 347 |
348 virtual bool OnFling(const MotionEvent& e1, | 348 virtual bool OnFling(const MotionEvent& e1, |
349 const MotionEvent& e2, | 349 const MotionEvent& e2, |
350 float velocity_x, | 350 float velocity_x, |
351 float velocity_y) OVERRIDE { | 351 float velocity_y) override { |
352 if (snap_scroll_controller_.IsSnappingScrolls()) { | 352 if (snap_scroll_controller_.IsSnappingScrolls()) { |
353 if (snap_scroll_controller_.IsSnapHorizontal()) { | 353 if (snap_scroll_controller_.IsSnapHorizontal()) { |
354 velocity_y = 0; | 354 velocity_y = 0; |
355 } else { | 355 } else { |
356 velocity_x = 0; | 356 velocity_x = 0; |
357 } | 357 } |
358 } | 358 } |
359 | 359 |
360 if (!velocity_x && !velocity_y) | 360 if (!velocity_x && !velocity_y) |
361 return true; | 361 return true; |
362 | 362 |
363 if (!scroll_event_sent_) { | 363 if (!scroll_event_sent_) { |
364 // The native side needs a ET_GESTURE_SCROLL_BEGIN before | 364 // The native side needs a ET_GESTURE_SCROLL_BEGIN before |
365 // ET_SCROLL_FLING_START to send the fling to the correct target. | 365 // ET_SCROLL_FLING_START to send the fling to the correct target. |
366 // The distance traveled in one second is a reasonable scroll start hint. | 366 // The distance traveled in one second is a reasonable scroll start hint. |
367 GestureEventDetails scroll_details( | 367 GestureEventDetails scroll_details( |
368 ET_GESTURE_SCROLL_BEGIN, velocity_x, velocity_y); | 368 ET_GESTURE_SCROLL_BEGIN, velocity_x, velocity_y); |
369 Send(CreateGesture(scroll_details, e2)); | 369 Send(CreateGesture(scroll_details, e2)); |
370 } | 370 } |
371 | 371 |
372 GestureEventDetails fling_details( | 372 GestureEventDetails fling_details( |
373 ET_SCROLL_FLING_START, velocity_x, velocity_y); | 373 ET_SCROLL_FLING_START, velocity_x, velocity_y); |
374 Send(CreateGesture(fling_details, e2)); | 374 Send(CreateGesture(fling_details, e2)); |
375 return true; | 375 return true; |
376 } | 376 } |
377 | 377 |
378 virtual bool OnSwipe(const MotionEvent& e1, | 378 virtual bool OnSwipe(const MotionEvent& e1, |
379 const MotionEvent& e2, | 379 const MotionEvent& e2, |
380 float velocity_x, | 380 float velocity_x, |
381 float velocity_y) OVERRIDE { | 381 float velocity_y) override { |
382 GestureEventDetails swipe_details(ET_GESTURE_SWIPE, velocity_x, velocity_y); | 382 GestureEventDetails swipe_details(ET_GESTURE_SWIPE, velocity_x, velocity_y); |
383 Send(CreateGesture(swipe_details, e2)); | 383 Send(CreateGesture(swipe_details, e2)); |
384 return true; | 384 return true; |
385 } | 385 } |
386 | 386 |
387 virtual bool OnTwoFingerTap(const MotionEvent& e1, | 387 virtual bool OnTwoFingerTap(const MotionEvent& e1, |
388 const MotionEvent& e2) OVERRIDE { | 388 const MotionEvent& e2) override { |
389 // The location of the two finger tap event should be the location of the | 389 // The location of the two finger tap event should be the location of the |
390 // primary pointer. | 390 // primary pointer. |
391 GestureEventDetails two_finger_tap_details( | 391 GestureEventDetails two_finger_tap_details( |
392 ET_GESTURE_TWO_FINGER_TAP, e1.GetTouchMajor(), e1.GetTouchMajor()); | 392 ET_GESTURE_TWO_FINGER_TAP, e1.GetTouchMajor(), e1.GetTouchMajor()); |
393 Send(CreateGesture(two_finger_tap_details, | 393 Send(CreateGesture(two_finger_tap_details, |
394 e2.GetId(), | 394 e2.GetId(), |
395 e2.GetToolType(), | 395 e2.GetToolType(), |
396 e2.GetEventTime(), | 396 e2.GetEventTime(), |
397 e1.GetX(), | 397 e1.GetX(), |
398 e1.GetY(), | 398 e1.GetY(), |
399 e1.GetRawX(), | 399 e1.GetRawX(), |
400 e1.GetRawY(), | 400 e1.GetRawY(), |
401 e2.GetPointerCount(), | 401 e2.GetPointerCount(), |
402 GetBoundingBox(e2, two_finger_tap_details.type()), | 402 GetBoundingBox(e2, two_finger_tap_details.type()), |
403 e2.GetFlags())); | 403 e2.GetFlags())); |
404 return true; | 404 return true; |
405 } | 405 } |
406 | 406 |
407 virtual void OnShowPress(const MotionEvent& e) OVERRIDE { | 407 virtual void OnShowPress(const MotionEvent& e) override { |
408 GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS); | 408 GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS); |
409 show_press_event_sent_ = true; | 409 show_press_event_sent_ = true; |
410 Send(CreateGesture(show_press_details, e)); | 410 Send(CreateGesture(show_press_details, e)); |
411 } | 411 } |
412 | 412 |
413 virtual bool OnSingleTapUp(const MotionEvent& e) OVERRIDE { | 413 virtual bool OnSingleTapUp(const MotionEvent& e) override { |
414 // This is a hack to address the issue where user hovers | 414 // This is a hack to address the issue where user hovers |
415 // over a link for longer than double_tap_timeout_, then | 415 // over a link for longer than double_tap_timeout_, then |
416 // OnSingleTapConfirmed() is not triggered. But we still | 416 // OnSingleTapConfirmed() is not triggered. But we still |
417 // want to trigger the tap event at UP. So we override | 417 // want to trigger the tap event at UP. So we override |
418 // OnSingleTapUp() in this case. This assumes singleTapUp | 418 // OnSingleTapUp() in this case. This assumes singleTapUp |
419 // gets always called before singleTapConfirmed. | 419 // gets always called before singleTapConfirmed. |
420 if (!ignore_single_tap_) { | 420 if (!ignore_single_tap_) { |
421 if (e.GetEventTime() - current_down_time_ > | 421 if (e.GetEventTime() - current_down_time_ > |
422 config_.gesture_detector_config.double_tap_timeout) { | 422 config_.gesture_detector_config.double_tap_timeout) { |
423 return OnSingleTapConfirmed(e); | 423 return OnSingleTapConfirmed(e); |
(...skipping 13 matching lines...) Expand all Loading... |
437 !IsScaleGestureDetectionInProgress()) { | 437 !IsScaleGestureDetectionInProgress()) { |
438 GestureEventDetails long_tap_details(ET_GESTURE_LONG_TAP); | 438 GestureEventDetails long_tap_details(ET_GESTURE_LONG_TAP); |
439 Send(CreateGesture(long_tap_details, e)); | 439 Send(CreateGesture(long_tap_details, e)); |
440 return true; | 440 return true; |
441 } | 441 } |
442 | 442 |
443 return false; | 443 return false; |
444 } | 444 } |
445 | 445 |
446 // DoubleTapListener implementation. | 446 // DoubleTapListener implementation. |
447 virtual bool OnSingleTapConfirmed(const MotionEvent& e) OVERRIDE { | 447 virtual bool OnSingleTapConfirmed(const MotionEvent& e) override { |
448 // Long taps in the edges of the screen have their events delayed by | 448 // Long taps in the edges of the screen have their events delayed by |
449 // ContentViewHolder for tab swipe operations. As a consequence of the delay | 449 // ContentViewHolder for tab swipe operations. As a consequence of the delay |
450 // this method might be called after receiving the up event. | 450 // this method might be called after receiving the up event. |
451 // These corner cases should be ignored. | 451 // These corner cases should be ignored. |
452 if (ignore_single_tap_) | 452 if (ignore_single_tap_) |
453 return true; | 453 return true; |
454 | 454 |
455 ignore_single_tap_ = true; | 455 ignore_single_tap_ = true; |
456 | 456 |
457 Send(CreateTapGesture(ET_GESTURE_TAP, e)); | 457 Send(CreateTapGesture(ET_GESTURE_TAP, e)); |
458 return true; | 458 return true; |
459 } | 459 } |
460 | 460 |
461 virtual bool OnDoubleTap(const MotionEvent& e) OVERRIDE { | 461 virtual bool OnDoubleTap(const MotionEvent& e) override { |
462 return scale_gesture_detector_.OnDoubleTap(e); | 462 return scale_gesture_detector_.OnDoubleTap(e); |
463 } | 463 } |
464 | 464 |
465 virtual bool OnDoubleTapEvent(const MotionEvent& e) OVERRIDE { | 465 virtual bool OnDoubleTapEvent(const MotionEvent& e) override { |
466 switch (e.GetAction()) { | 466 switch (e.GetAction()) { |
467 case MotionEvent::ACTION_DOWN: | 467 case MotionEvent::ACTION_DOWN: |
468 gesture_detector_.set_longpress_enabled(false); | 468 gesture_detector_.set_longpress_enabled(false); |
469 break; | 469 break; |
470 | 470 |
471 case MotionEvent::ACTION_UP: | 471 case MotionEvent::ACTION_UP: |
472 if (!IsPinchInProgress() && !IsScrollInProgress()) { | 472 if (!IsPinchInProgress() && !IsScrollInProgress()) { |
473 Send(CreateTapGesture(ET_GESTURE_DOUBLE_TAP, e)); | 473 Send(CreateTapGesture(ET_GESTURE_DOUBLE_TAP, e)); |
474 return true; | 474 return true; |
475 } | 475 } |
476 break; | 476 break; |
477 | 477 |
478 default: | 478 default: |
479 break; | 479 break; |
480 } | 480 } |
481 return false; | 481 return false; |
482 } | 482 } |
483 | 483 |
484 virtual void OnLongPress(const MotionEvent& e) OVERRIDE { | 484 virtual void OnLongPress(const MotionEvent& e) override { |
485 DCHECK(!IsDoubleTapInProgress()); | 485 DCHECK(!IsDoubleTapInProgress()); |
486 SetIgnoreSingleTap(true); | 486 SetIgnoreSingleTap(true); |
487 GestureEventDetails long_press_details(ET_GESTURE_LONG_PRESS); | 487 GestureEventDetails long_press_details(ET_GESTURE_LONG_PRESS); |
488 Send(CreateGesture(long_press_details, e)); | 488 Send(CreateGesture(long_press_details, e)); |
489 } | 489 } |
490 | 490 |
491 GestureEventData CreateGesture(const GestureEventDetails& details, | 491 GestureEventData CreateGesture(const GestureEventDetails& details, |
492 int motion_event_id, | 492 int motion_event_id, |
493 MotionEvent::ToolType primary_tool_type, | 493 MotionEvent::ToolType primary_tool_type, |
494 base::TimeTicks time, | 494 base::TimeTicks time, |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
813 // null'ing of the listener until the sequence has ended. | 813 // null'ing of the listener until the sequence has ended. |
814 if (current_down_event_) | 814 if (current_down_event_) |
815 return; | 815 return; |
816 | 816 |
817 const bool double_tap_enabled = | 817 const bool double_tap_enabled = |
818 double_tap_support_for_page_ && double_tap_support_for_platform_; | 818 double_tap_support_for_page_ && double_tap_support_for_platform_; |
819 gesture_listener_->SetDoubleTapEnabled(double_tap_enabled); | 819 gesture_listener_->SetDoubleTapEnabled(double_tap_enabled); |
820 } | 820 } |
821 | 821 |
822 } // namespace ui | 822 } // namespace ui |
OLD | NEW |