| 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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 // Whether input events are delivered right before vsync. | 148 // Whether input events are delivered right before vsync. |
| 149 private final boolean mInputEventsDeliveredAtVSync; | 149 private final boolean mInputEventsDeliveredAtVSync; |
| 150 | 150 |
| 151 // Certain touch-event generated gestures (PINCH_BY, SCROLL_BY) may trigger
an expedited vsync | 151 // Certain touch-event generated gestures (PINCH_BY, SCROLL_BY) may trigger
an expedited vsync |
| 152 // signal. Rather than sending the vsync immediately after such a gesture is
sent, we | 152 // signal. Rather than sending the vsync immediately after such a gesture is
sent, we |
| 153 // set this flag and defer the "last event for vsync" signal until the touch
event is fully | 153 // set this flag and defer the "last event for vsync" signal until the touch
event is fully |
| 154 // processed. This allows multiple such gestures to be sent in a given frame
. | 154 // processed. This allows multiple such gestures to be sent in a given frame
. |
| 155 private boolean mSentGestureNeedsVSync; | 155 private boolean mSentGestureNeedsVSync; |
| 156 private long mLastVSyncGestureTimeMs; | 156 private long mLastVSyncGestureTimeMs; |
| 157 | 157 |
| 158 // If the page scale is fixed, double tap gesture detection can be disabled. | 158 // The page's viewport and scale sometimes allow us to disable double tap ge
sture detection, |
| 159 private boolean mHasFixedPageScale; | 159 // according to the logic in ContentViewCore.onRenderCoordinatesUpdated(). |
| 160 private boolean mShouldDisableDoubleTap; |
| 160 | 161 |
| 161 // Incremented and decremented when the methods onTouchEvent() and confirmTo
uchEvent() start | 162 // Incremented and decremented when the methods onTouchEvent() and confirmTo
uchEvent() start |
| 162 // and finish execution, respectively. This provides accounting for synchron
ous calls to | 163 // and finish execution, respectively. This provides accounting for synchron
ous calls to |
| 163 // confirmTouchEvent(), from either itself or onTouchEvent(). | 164 // confirmTouchEvent(), from either itself or onTouchEvent(). |
| 164 private int mTouchEventHandlingStackDepth; | 165 private int mTouchEventHandlingStackDepth; |
| 165 | 166 |
| 166 // Keeps track of the last long press event, if we end up opening a context
menu, we would need | 167 // Keeps track of the last long press event, if we end up opening a context
menu, we would need |
| 167 // to potentially use the event to send GESUTRE_SHOW_PRESS_CANCEL to remove
::active styling | 168 // to potentially use the event to send GESUTRE_SHOW_PRESS_CANCEL to remove
::active styling |
| 168 private MotionEvent mLastLongPressEvent; | 169 private MotionEvent mLastLongPressEvent; |
| 169 | 170 |
| (...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 int type = TouchPoint.createTouchPoints(event, pts); | 974 int type = TouchPoint.createTouchPoints(event, pts); |
| 974 | 975 |
| 975 if (type == TouchPoint.CONVERSION_ERROR) return EVENT_NOT_FORWARDED; | 976 if (type == TouchPoint.CONVERSION_ERROR) return EVENT_NOT_FORWARDED; |
| 976 | 977 |
| 977 if (!mTouchScrolling && !mPinchInProgress) { | 978 if (!mTouchScrolling && !mPinchInProgress) { |
| 978 if (mMotionEventDelegate.sendTouchEvent(event.getEventTime(), type,
pts)) { | 979 if (mMotionEventDelegate.sendTouchEvent(event.getEventTime(), type,
pts)) { |
| 979 // If confirmTouchEvent() is called synchronously with respect t
o sendTouchEvent(), | 980 // If confirmTouchEvent() is called synchronously with respect t
o sendTouchEvent(), |
| 980 // then |event| will have been recycled. Only start the timer if
the sent event has | 981 // then |event| will have been recycled. Only start the timer if
the sent event has |
| 981 // not yet been confirmed. | 982 // not yet been confirmed. |
| 982 if (!mJavaScriptIsConsumingGesture | 983 if (!mJavaScriptIsConsumingGesture |
| 983 && !mHasFixedPageScale | 984 && !mShouldDisableDoubleTap |
| 984 && event == mPendingMotionEvents.peekFirst() | 985 && event == mPendingMotionEvents.peekFirst() |
| 985 && event.getAction() != MotionEvent.ACTION_UP | 986 && event.getAction() != MotionEvent.ACTION_UP |
| 986 && event.getAction() != MotionEvent.ACTION_CANCEL) { | 987 && event.getAction() != MotionEvent.ACTION_CANCEL) { |
| 987 TraceEvent.instant("TouchEventTimeout:StartTimeoutHandler"); | 988 TraceEvent.instant("TouchEventTimeout:StartTimeoutHandler"); |
| 988 mTouchEventTimeoutHandler.start(event.getEventTime(), pts); | 989 mTouchEventTimeoutHandler.start(event.getEventTime(), pts); |
| 989 } | 990 } |
| 990 return EVENT_FORWARDED_TO_NATIVE; | 991 return EVENT_FORWARDED_TO_NATIVE; |
| 991 } | 992 } |
| 992 } | 993 } |
| 993 return EVENT_NOT_FORWARDED; | 994 return EVENT_NOT_FORWARDED; |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1214 /** | 1215 /** |
| 1215 * This is for testing only. | 1216 * This is for testing only. |
| 1216 * @return Whether a touch timeout event has been scheduled. | 1217 * @return Whether a touch timeout event has been scheduled. |
| 1217 */ | 1218 */ |
| 1218 boolean hasScheduledTouchTimeoutEventForTesting() { | 1219 boolean hasScheduledTouchTimeoutEventForTesting() { |
| 1219 return mTouchEventTimeoutHandler.hasScheduledTimeoutEventForTesting(); | 1220 return mTouchEventTimeoutHandler.hasScheduledTimeoutEventForTesting(); |
| 1220 } | 1221 } |
| 1221 | 1222 |
| 1222 /** | 1223 /** |
| 1223 * Update whether double-tap gestures are supported. This allows | 1224 * Update whether double-tap gestures are supported. This allows |
| 1224 * double-tap gesture suppression independent of whether or not the page | 1225 * double-tap gesture suppression independent of whether or not the page's |
| 1225 * scale is fixed. | 1226 * viewport and scale would normally prevent double-tap. |
| 1226 * Note: This should never be called while a double-tap gesture is in progre
ss. | 1227 * Note: This should never be called while a double-tap gesture is in progre
ss. |
| 1227 * @param supportDoubleTap Whether double-tap gestures are supported. | 1228 * @param supportDoubleTap Whether double-tap gestures are supported. |
| 1228 */ | 1229 */ |
| 1229 public void updateDoubleTapSupport(boolean supportDoubleTap) { | 1230 public void updateDoubleTapSupport(boolean supportDoubleTap) { |
| 1230 assert !isDoubleTapActive(); | 1231 assert !isDoubleTapActive(); |
| 1231 int doubleTapMode = supportDoubleTap ? | 1232 int doubleTapMode = supportDoubleTap ? |
| 1232 DOUBLE_TAP_MODE_NONE : DOUBLE_TAP_MODE_DISABLED; | 1233 DOUBLE_TAP_MODE_NONE : DOUBLE_TAP_MODE_DISABLED; |
| 1233 if (mDoubleTapMode == doubleTapMode) return; | 1234 if (mDoubleTapMode == doubleTapMode) return; |
| 1234 mDoubleTapMode = doubleTapMode; | 1235 mDoubleTapMode = doubleTapMode; |
| 1235 updateDoubleTapListener(); | 1236 updateDoubleTapListener(); |
| 1236 } | 1237 } |
| 1237 | 1238 |
| 1238 /** | 1239 /** |
| 1239 * Update whether the current page has a fixed page scale. | 1240 * Update whether double-tap gesture detection should be suppressed due to |
| 1240 * A fixed page scale will suppress double-tap gesture detection, allowing | 1241 * the viewport or scale of the current page. Suppressing double-tap gesture |
| 1241 * for rapid and responsive single-tap gestures. | 1242 * detection allows for rapid and responsive single-tap gestures. |
| 1242 * @param hasFixedPageScale Whether the page scale is fixed. | 1243 * @param shouldDisableDoubleTap Whether double-tap should be suppressed. |
| 1243 */ | 1244 */ |
| 1244 public void updateHasFixedPageScale(boolean hasFixedPageScale) { | 1245 public void updateShouldDisableDoubleTap(boolean shouldDisableDoubleTap) { |
| 1245 if (mHasFixedPageScale == hasFixedPageScale) return; | 1246 if (mShouldDisableDoubleTap == shouldDisableDoubleTap) return; |
| 1246 mHasFixedPageScale = hasFixedPageScale; | 1247 mShouldDisableDoubleTap = shouldDisableDoubleTap; |
| 1247 updateDoubleTapListener(); | 1248 updateDoubleTapListener(); |
| 1248 } | 1249 } |
| 1249 | 1250 |
| 1250 private boolean isDoubleTapDisabled() { | 1251 private boolean isDoubleTapDisabled() { |
| 1251 return mDoubleTapMode == DOUBLE_TAP_MODE_DISABLED || | 1252 return mDoubleTapMode == DOUBLE_TAP_MODE_DISABLED || mShouldDisableDoubl
eTap; |
| 1252 mHasFixedPageScale; | |
| 1253 } | 1253 } |
| 1254 | 1254 |
| 1255 private boolean isDoubleTapActive() { | 1255 private boolean isDoubleTapActive() { |
| 1256 return mDoubleTapMode != DOUBLE_TAP_MODE_DISABLED && | 1256 return mDoubleTapMode != DOUBLE_TAP_MODE_DISABLED && |
| 1257 mDoubleTapMode != DOUBLE_TAP_MODE_NONE; | 1257 mDoubleTapMode != DOUBLE_TAP_MODE_NONE; |
| 1258 } | 1258 } |
| 1259 | 1259 |
| 1260 private void updateDoubleTapListener() { | 1260 private void updateDoubleTapListener() { |
| 1261 if (isDoubleTapDisabled()) { | 1261 if (isDoubleTapDisabled()) { |
| 1262 // Defer nulling the DoubleTapListener until the double tap gesture
is complete. | 1262 // Defer nulling the DoubleTapListener until the double tap gesture
is complete. |
| 1263 if (isDoubleTapActive()) return; | 1263 if (isDoubleTapActive()) return; |
| 1264 mGestureDetector.setOnDoubleTapListener(null); | 1264 mGestureDetector.setOnDoubleTapListener(null); |
| 1265 } else { | 1265 } else { |
| 1266 mGestureDetector.setOnDoubleTapListener(mDoubleTapListener); | 1266 mGestureDetector.setOnDoubleTapListener(mDoubleTapListener); |
| 1267 } | 1267 } |
| 1268 | 1268 |
| 1269 } | 1269 } |
| 1270 } | 1270 } |
| OLD | NEW |