am 5f68d6fa: Enable longpress and doubletap to WebKit as touch event if it is requested.

Merge commit '5f68d6fafc29bb14b4b407b4221395332409fc9c' into eclair-mr2-plus-aosp

* commit '5f68d6fafc29bb14b4b407b4221395332409fc9c':
  Enable longpress and doubletap to WebKit as touch
This commit is contained in:
Grace Kloba
2009-12-09 16:00:59 -08:00
committed by Android Git Automerger
2 changed files with 57 additions and 8 deletions

View File

@@ -365,6 +365,19 @@ public class WebView extends AbsoluteLayout
private static final int PREVENT_DRAG_YES = 2; private static final int PREVENT_DRAG_YES = 2;
private int mPreventDrag = PREVENT_DRAG_NO; private int mPreventDrag = PREVENT_DRAG_NO;
// by default mPreventLongPress is false. If it is true, long press event
// will be handled by WebKit instead of UI.
private boolean mPreventLongPress = false;
// by default mPreventDoubleTap is false. If it is true, double tap event
// will be handled by WebKit instead of UI.
private boolean mPreventDoubleTap = false;
// this needs to be in sync with the logic in WebKit's
// EventHandler::handleTouchEvent()
private static final int TOUCH_PREVENT_DRAG = 0x1;
private static final int TOUCH_PREVENT_LONGPRESS = 0x2;
private static final int TOUCH_PREVENT_DOUBLETAP = 0x4;
// To keep track of whether the current drag was initiated by a WebTextView, // To keep track of whether the current drag was initiated by a WebTextView,
// so that we know not to hide the cursor // so that we know not to hide the cursor
boolean mDragFromTextInput; boolean mDragFromTextInput;
@@ -3044,8 +3057,8 @@ public class WebView extends AbsoluteLayout
if (mTouchMode == TOUCH_SHORTPRESS_START_MODE) { if (mTouchMode == TOUCH_SHORTPRESS_START_MODE) {
mTouchMode = TOUCH_SHORTPRESS_MODE; mTouchMode = TOUCH_SHORTPRESS_MODE;
HitTestResult hitTest = getHitTestResult(); HitTestResult hitTest = getHitTestResult();
if (hitTest != null && if (mPreventLongPress || (hitTest != null &&
hitTest.mType != HitTestResult.UNKNOWN_TYPE) { hitTest.mType != HitTestResult.UNKNOWN_TYPE)) {
mPrivateHandler.sendMessageDelayed(mPrivateHandler mPrivateHandler.sendMessageDelayed(mPrivateHandler
.obtainMessage(SWITCH_TO_LONGPRESS), .obtainMessage(SWITCH_TO_LONGPRESS),
LONG_PRESS_TIMEOUT); LONG_PRESS_TIMEOUT);
@@ -3912,6 +3925,8 @@ public class WebView extends AbsoluteLayout
mTouchMode = TOUCH_INIT_MODE; mTouchMode = TOUCH_INIT_MODE;
mPreventDrag = mForwardTouchEvents ? PREVENT_DRAG_MAYBE_YES mPreventDrag = mForwardTouchEvents ? PREVENT_DRAG_MAYBE_YES
: PREVENT_DRAG_NO; : PREVENT_DRAG_NO;
mPreventLongPress = false;
mPreventDoubleTap = false;
mWebViewCore.sendMessage( mWebViewCore.sendMessage(
EventHub.UPDATE_FRAME_CACHE_IF_LOADING); EventHub.UPDATE_FRAME_CACHE_IF_LOADING);
if (mLogEvent && eventTime - mLastTouchUpTime < 1000) { if (mLogEvent && eventTime - mLastTouchUpTime < 1000) {
@@ -4115,7 +4130,16 @@ public class WebView extends AbsoluteLayout
case TOUCH_DOUBLE_TAP_MODE: // double tap case TOUCH_DOUBLE_TAP_MODE: // double tap
mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS); mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
mTouchMode = TOUCH_DONE_MODE; mTouchMode = TOUCH_DONE_MODE;
if (mPreventDoubleTap) {
WebViewCore.TouchEventData ted
= new WebViewCore.TouchEventData();
ted.mAction = WebViewCore.ACTION_DOUBLETAP;
ted.mX = viewToContentX((int) x + mScrollX);
ted.mY = viewToContentY((int) y + mScrollY);
mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
} else {
doDoubleTap(); doDoubleTap();
}
break; break;
case TOUCH_SELECT_MODE: case TOUCH_SELECT_MODE:
commitCopy(); commitCopy();
@@ -4143,6 +4167,8 @@ public class WebView extends AbsoluteLayout
// if mPreventDrag is not confirmed, treat it as // if mPreventDrag is not confirmed, treat it as
// no so that it won't block tap or double tap. // no so that it won't block tap or double tap.
mPreventDrag = PREVENT_DRAG_NO; mPreventDrag = PREVENT_DRAG_NO;
mPreventLongPress = false;
mPreventDoubleTap = false;
} }
if (mPreventDrag == PREVENT_DRAG_NO) { if (mPreventDrag == PREVENT_DRAG_NO) {
if (mTouchMode == TOUCH_INIT_MODE) { if (mTouchMode == TOUCH_INIT_MODE) {
@@ -5090,6 +5116,8 @@ public class WebView extends AbsoluteLayout
// it won't block panning the page. // it won't block panning the page.
if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) { if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
mPreventDrag = PREVENT_DRAG_NO; mPreventDrag = PREVENT_DRAG_NO;
mPreventLongPress = false;
mPreventDoubleTap = false;
} }
if (mTouchMode == TOUCH_INIT_MODE) { if (mTouchMode == TOUCH_INIT_MODE) {
mTouchMode = TOUCH_SHORTPRESS_START_MODE; mTouchMode = TOUCH_SHORTPRESS_START_MODE;
@@ -5100,7 +5128,15 @@ public class WebView extends AbsoluteLayout
break; break;
} }
case SWITCH_TO_LONGPRESS: { case SWITCH_TO_LONGPRESS: {
if (mPreventDrag == PREVENT_DRAG_NO) { if (mPreventLongPress) {
mTouchMode = TOUCH_DONE_MODE;
WebViewCore.TouchEventData ted
= new WebViewCore.TouchEventData();
ted.mAction = WebViewCore.ACTION_LONGPRESS;
ted.mX = viewToContentX((int) mLastTouchX + mScrollX);
ted.mY = viewToContentY((int) mLastTouchY + mScrollY);
mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
} else if (mPreventDrag == PREVENT_DRAG_NO) {
mTouchMode = TOUCH_DONE_MODE; mTouchMode = TOUCH_DONE_MODE;
performLongClick(); performLongClick();
rebuildWebTextView(); rebuildWebTextView();
@@ -5343,10 +5379,18 @@ public class WebView extends AbsoluteLayout
// dont override if mPreventDrag has been set to no due // dont override if mPreventDrag has been set to no due
// to time out // to time out
if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) { if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
mPreventDrag = msg.arg2 == 1 ? PREVENT_DRAG_YES mPreventDrag = (msg.arg2 & TOUCH_PREVENT_DRAG)
== TOUCH_PREVENT_DRAG ? PREVENT_DRAG_YES
: PREVENT_DRAG_NO; : PREVENT_DRAG_NO;
if (mPreventDrag == PREVENT_DRAG_YES) { if (mPreventDrag == PREVENT_DRAG_YES) {
mTouchMode = TOUCH_DONE_MODE; mTouchMode = TOUCH_DONE_MODE;
} else {
mPreventLongPress =
(msg.arg2 & TOUCH_PREVENT_LONGPRESS)
== TOUCH_PREVENT_LONGPRESS;
mPreventDoubleTap =
(msg.arg2 & TOUCH_PREVENT_DOUBLETAP)
== TOUCH_PREVENT_DOUBLETAP;
} }
} }
} }

View File

@@ -515,7 +515,7 @@ final class WebViewCore {
private native void nativeTouchUp(int touchGeneration, private native void nativeTouchUp(int touchGeneration,
int framePtr, int nodePtr, int x, int y); int framePtr, int nodePtr, int x, int y);
private native boolean nativeHandleTouchEvent(int action, int x, int y); private native int nativeHandleTouchEvent(int action, int x, int y);
private native void nativeUpdateFrameCache(); private native void nativeUpdateFrameCache();
@@ -712,8 +712,13 @@ final class WebViewCore {
int mY; int mY;
} }
// mAction of TouchEventData can be MotionEvent.getAction() which uses the
// last two bytes or one of the following values
static final int ACTION_LONGPRESS = 0x100;
static final int ACTION_DOUBLETAP = 0x200;
static class TouchEventData { static class TouchEventData {
int mAction; // MotionEvent.getAction() int mAction;
int mX; int mX;
int mY; int mY;
} }
@@ -1130,7 +1135,7 @@ final class WebViewCore {
mWebView.mPrivateHandler, mWebView.mPrivateHandler,
WebView.PREVENT_TOUCH_ID, ted.mAction, WebView.PREVENT_TOUCH_ID, ted.mAction,
nativeHandleTouchEvent(ted.mAction, ted.mX, nativeHandleTouchEvent(ted.mAction, ted.mX,
ted.mY) ? 1 : 0).sendToTarget(); ted.mY)).sendToTarget();
break; break;
} }