Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 package org.chromium.content.browser; | 5 package org.chromium.content.browser; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.os.Bundle; | 8 import android.os.Bundle; |
| 9 import android.os.Handler; | 9 import android.os.Handler; |
| 10 import android.os.SystemClock; | 10 import android.os.SystemClock; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 79 | 79 |
| 80 // Remember whether onShowPress() is called. If it is not, in onSingleTapCon firmed() | 80 // Remember whether onShowPress() is called. If it is not, in onSingleTapCon firmed() |
| 81 // we will first show the press state, then trigger the click. | 81 // we will first show the press state, then trigger the click. |
| 82 private boolean mShowPressIsCalled; | 82 private boolean mShowPressIsCalled; |
| 83 | 83 |
| 84 // TODO(klobag): this is to avoid a bug in GestureDetector. With multi-touch , | 84 // TODO(klobag): this is to avoid a bug in GestureDetector. With multi-touch , |
| 85 // mAlwaysInTapRegion is not reset. So when the last finger is up, onSingleT apUp() | 85 // mAlwaysInTapRegion is not reset. So when the last finger is up, onSingleT apUp() |
| 86 // will be mistakenly fired. | 86 // will be mistakenly fired. |
| 87 private boolean mIgnoreSingleTap; | 87 private boolean mIgnoreSingleTap; |
| 88 | 88 |
| 89 private boolean mDoubleTapZoomEnabled = true; | |
|
klobag.chromium
2013/07/10 18:26:21
This should be set by "mListener instanceof Gestur
johnme
2013/07/10 19:19:16
Done (though that should always be true, as mListe
| |
| 90 | |
| 89 // Does native think we are scrolling? True from right before we | 91 // Does native think we are scrolling? True from right before we |
| 90 // send the first scroll event until the last finger is raised. | 92 // send the first scroll event until the last finger is raised. |
| 91 // Call nativeScrollBegin() when setting this to true, and use | 93 // Call nativeScrollBegin() when setting this to true, and use |
| 92 // tellNativeScrollingHasEnded() to set it to false. | 94 // tellNativeScrollingHasEnded() to set it to false. |
| 93 private boolean mNativeScrolling; | 95 private boolean mNativeScrolling; |
| 94 | 96 |
| 95 private boolean mFlingMayBeActive; | 97 private boolean mFlingMayBeActive; |
| 96 | 98 |
| 97 private boolean mSeenFirstScrollEvent; | 99 private boolean mSeenFirstScrollEvent; |
| 98 | 100 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 * @param x The amount scrolled in the X direction. | 270 * @param x The amount scrolled in the X direction. |
| 269 * @param y The amount scrolled in the Y direction. | 271 * @param y The amount scrolled in the Y direction. |
| 270 * @return Whether or not the UI consumed and handled this event. | 272 * @return Whether or not the UI consumed and handled this event. |
| 271 */ | 273 */ |
| 272 boolean didUIStealScroll(float x, float y); | 274 boolean didUIStealScroll(float x, float y); |
| 273 | 275 |
| 274 /** | 276 /** |
| 275 * Show the zoom picker UI. | 277 * Show the zoom picker UI. |
| 276 */ | 278 */ |
| 277 public void invokeZoomPicker(); | 279 public void invokeZoomPicker(); |
| 278 | |
| 279 /** | |
| 280 * @return Whether changing the page scale is not possible on the curren t page. | |
| 281 */ | |
| 282 public boolean hasFixedPageScale(); | |
| 283 } | 280 } |
| 284 | 281 |
| 285 ContentViewGestureHandler( | 282 ContentViewGestureHandler( |
| 286 Context context, MotionEventDelegate delegate, ZoomManager zoomManag er, | 283 Context context, MotionEventDelegate delegate, ZoomManager zoomManag er, |
| 287 int inputEventDeliveryMode) { | 284 int inputEventDeliveryMode) { |
| 288 mExtraParamBundle = new Bundle(); | 285 mExtraParamBundle = new Bundle(); |
| 289 mLongPressDetector = new LongPressDetector(context, this); | 286 mLongPressDetector = new LongPressDetector(context, this); |
| 290 mMotionEventDelegate = delegate; | 287 mMotionEventDelegate = delegate; |
| 291 mZoomManager = zoomManager; | 288 mZoomManager = zoomManager; |
| 292 mSnapScrollController = new SnapScrollController(context, mZoomManager); | 289 mSnapScrollController = new SnapScrollController(context, mZoomManager); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 416 mShowPressIsCalled = true; | 413 mShowPressIsCalled = true; |
| 417 sendMotionEventAsGesture(GESTURE_SHOW_PRESSED_STATE, e, null); | 414 sendMotionEventAsGesture(GESTURE_SHOW_PRESSED_STATE, e, null); |
| 418 } | 415 } |
| 419 | 416 |
| 420 @Override | 417 @Override |
| 421 public boolean onSingleTapUp(MotionEvent e) { | 418 public boolean onSingleTapUp(MotionEvent e) { |
| 422 if (isDistanceBetweenDownAndUpTooLong(e.getRawX(), e.get RawY())) { | 419 if (isDistanceBetweenDownAndUpTooLong(e.getRawX(), e.get RawY())) { |
| 423 mIgnoreSingleTap = true; | 420 mIgnoreSingleTap = true; |
| 424 return true; | 421 return true; |
| 425 } | 422 } |
| 423 | |
| 424 if (!mDoubleTapZoomEnabled && !mLongPressDetector.isInLo ngPress()) { | |
| 425 return onSingleTapConfirmed(e); | |
| 426 } | |
| 427 | |
| 426 // This is a hack to address the issue where user hovers | 428 // This is a hack to address the issue where user hovers |
| 427 // over a link for longer than DOUBLE_TAP_TIMEOUT, then | 429 // over a link for longer than DOUBLE_TAP_TIMEOUT, then |
| 428 // onSingleTapConfirmed() is not triggered. But we still | 430 // onSingleTapConfirmed() is not triggered. But we still |
| 429 // want to trigger the tap event at UP. So we override | 431 // want to trigger the tap event at UP. So we override |
| 430 // onSingleTapUp() in this case. This assumes singleTapU p | 432 // onSingleTapUp() in this case. This assumes singleTapU p |
| 431 // gets always called before singleTapConfirmed. | 433 // gets always called before singleTapConfirmed. |
| 432 if (!mIgnoreSingleTap && !mLongPressDetector.isInLongPre ss()) { | 434 if (!mIgnoreSingleTap && !mLongPressDetector.isInLongPre ss()) { |
| 433 if (e.getEventTime() - e.getDownTime() > DOUBLE_TAP_ TIMEOUT) { | 435 if (e.getEventTime() - e.getDownTime() > DOUBLE_TAP_ TIMEOUT) { |
| 434 float x = e.getX(); | 436 float x = e.getX(); |
| 435 float y = e.getY(); | 437 float y = e.getY(); |
| 436 if (sendMotionEventAsGesture(GESTURE_SINGLE_TAP_ UP, e, null)) { | 438 if (sendMotionEventAsGesture(GESTURE_SINGLE_TAP_ UP, e, null)) { |
| 437 mIgnoreSingleTap = true; | 439 mIgnoreSingleTap = true; |
| 438 } | 440 } |
| 439 setClickXAndY((int) x, (int) y); | 441 setClickXAndY((int) x, (int) y); |
| 440 return true; | 442 return true; |
| 441 } else if (mMotionEventDelegate.hasFixedPageScale()) { | |
| 442 // If page is not user scalable, we don't need t o wait | |
| 443 // for double tap timeout. | |
| 444 float x = e.getX(); | |
| 445 float y = e.getY(); | |
| 446 mExtraParamBundle.clear(); | |
| 447 mExtraParamBundle.putBoolean(SHOW_PRESS, mShowPr essIsCalled); | |
| 448 if (sendMotionEventAsGesture(GESTURE_SINGLE_TAP_ CONFIRMED, e, | |
| 449 mExtraParamBundle)) { | |
| 450 mIgnoreSingleTap = true; | |
| 451 } | |
| 452 setClickXAndY((int) x, (int) y); | |
| 453 } else { | 443 } else { |
| 454 // Notify Blink about this tapUp event anyway, | 444 // Notify Blink about this tapUp event anyway, |
| 455 // when none of the above conditions applied. | 445 // when none of the above conditions applied. |
| 456 sendMotionEventAsGesture(GESTURE_SINGLE_TAP_UNCO NFIRMED, e, null); | 446 sendMotionEventAsGesture(GESTURE_SINGLE_TAP_UNCO NFIRMED, e, null); |
| 457 } | 447 } |
| 458 } | 448 } |
| 459 | 449 |
| 460 return triggerLongTapIfNeeded(e); | 450 return triggerLongTapIfNeeded(e); |
| 461 } | 451 } |
| 462 | 452 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 513 } | 503 } |
| 514 }; | 504 }; |
| 515 mListener = listener; | 505 mListener = listener; |
| 516 mGestureDetector = new GestureDetector(context, listener); | 506 mGestureDetector = new GestureDetector(context, listener); |
| 517 mGestureDetector.setIsLongpressEnabled(false); | 507 mGestureDetector.setIsLongpressEnabled(false); |
| 518 } finally { | 508 } finally { |
| 519 TraceEvent.end(); | 509 TraceEvent.end(); |
| 520 } | 510 } |
| 521 } | 511 } |
| 522 | 512 |
| 513 public void setDoubleTapZoomEnabled(boolean enable) { | |
| 514 if (enable == mDoubleTapZoomEnabled) { | |
| 515 return; | |
| 516 } | |
| 517 | |
| 518 GestureDetector.OnDoubleTapListener listener = null; | |
| 519 if (enable && mListener instanceof GestureDetector.OnDoubleTapListener) { | |
| 520 listener = (GestureDetector.OnDoubleTapListener)mListener; | |
| 521 } | |
| 522 mGestureDetector.setOnDoubleTapListener(listener); | |
| 523 mDoubleTapZoomEnabled = enable; | |
| 524 | |
| 525 // Clean up state, in particular, prevent GestureDetector from getting | |
| 526 // left with mIsDoubleTapping == true but mDoubleTapListener == null. | |
| 527 resetGestureHandlers(); | |
| 528 } | |
| 529 | |
| 523 /** | 530 /** |
| 524 * @return LongPressDetector handling setting up timers for and canceling Lo ngPress gestures. | 531 * @return LongPressDetector handling setting up timers for and canceling Lo ngPress gestures. |
| 525 */ | 532 */ |
| 526 LongPressDetector getLongPressDetector() { | 533 LongPressDetector getLongPressDetector() { |
| 527 return mLongPressDetector; | 534 return mLongPressDetector; |
| 528 } | 535 } |
| 529 | 536 |
| 530 /** | 537 /** |
| 531 * @param event Start a LongPress gesture event from the listener. | 538 * @param event Start a LongPress gesture event from the listener. |
| 532 */ | 539 */ |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1016 /** | 1023 /** |
| 1017 * This is for testing only. | 1024 * This is for testing only. |
| 1018 * Sends a show pressed state gesture through mListener. This should always be called after | 1025 * Sends a show pressed state gesture through mListener. This should always be called after |
| 1019 * a down event; | 1026 * a down event; |
| 1020 */ | 1027 */ |
| 1021 void sendShowPressedStateGestureForTesting() { | 1028 void sendShowPressedStateGestureForTesting() { |
| 1022 if (mCurrentDownEvent == null) return; | 1029 if (mCurrentDownEvent == null) return; |
| 1023 mListener.onShowPress(mCurrentDownEvent); | 1030 mListener.onShowPress(mCurrentDownEvent); |
| 1024 } | 1031 } |
| 1025 } | 1032 } |
| OLD | NEW |