Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf0b4da2 authored by Grace Kloba's avatar Grace Kloba Committed by Android Git Automerger
Browse files

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

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

* commit '5f68d6fa':
  Enable longpress and doubletap to WebKit as touch
parents aa02bae8 5f68d6fa
Loading
Loading
Loading
Loading
+49 −5
Original line number Diff line number Diff line
@@ -365,6 +365,19 @@ public class WebView extends AbsoluteLayout
    private static final int PREVENT_DRAG_YES = 2;
    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,
    // so that we know not to hide the cursor
    boolean mDragFromTextInput;
@@ -3044,8 +3057,8 @@ public class WebView extends AbsoluteLayout
            if (mTouchMode == TOUCH_SHORTPRESS_START_MODE) {
                mTouchMode = TOUCH_SHORTPRESS_MODE;
                HitTestResult hitTest = getHitTestResult();
                if (hitTest != null &&
                        hitTest.mType != HitTestResult.UNKNOWN_TYPE) {
                if (mPreventLongPress || (hitTest != null &&
                        hitTest.mType != HitTestResult.UNKNOWN_TYPE)) {
                    mPrivateHandler.sendMessageDelayed(mPrivateHandler
                            .obtainMessage(SWITCH_TO_LONGPRESS),
                            LONG_PRESS_TIMEOUT);
@@ -3912,6 +3925,8 @@ public class WebView extends AbsoluteLayout
                    mTouchMode = TOUCH_INIT_MODE;
                    mPreventDrag = mForwardTouchEvents ? PREVENT_DRAG_MAYBE_YES
                            : PREVENT_DRAG_NO;
                    mPreventLongPress = false;
                    mPreventDoubleTap = false;
                    mWebViewCore.sendMessage(
                            EventHub.UPDATE_FRAME_CACHE_IF_LOADING);
                    if (mLogEvent && eventTime - mLastTouchUpTime < 1000) {
@@ -4115,7 +4130,16 @@ public class WebView extends AbsoluteLayout
                    case TOUCH_DOUBLE_TAP_MODE: // double tap
                        mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
                        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();
                        }
                        break;
                    case TOUCH_SELECT_MODE:
                        commitCopy();
@@ -4143,6 +4167,8 @@ public class WebView extends AbsoluteLayout
                                // if mPreventDrag is not confirmed, treat it as
                                // no so that it won't block tap or double tap.
                                mPreventDrag = PREVENT_DRAG_NO;
                                mPreventLongPress = false;
                                mPreventDoubleTap = false;
                            }
                            if (mPreventDrag == PREVENT_DRAG_NO) {
                                if (mTouchMode == TOUCH_INIT_MODE) {
@@ -5090,6 +5116,8 @@ public class WebView extends AbsoluteLayout
                    // it won't block panning the page.
                    if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
                        mPreventDrag = PREVENT_DRAG_NO;
                        mPreventLongPress = false;
                        mPreventDoubleTap = false;
                    }
                    if (mTouchMode == TOUCH_INIT_MODE) {
                        mTouchMode = TOUCH_SHORTPRESS_START_MODE;
@@ -5100,7 +5128,15 @@ public class WebView extends AbsoluteLayout
                    break;
                }
                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;
                        performLongClick();
                        rebuildWebTextView();
@@ -5343,10 +5379,18 @@ public class WebView extends AbsoluteLayout
                        // dont override if mPreventDrag has been set to no due
                        // to time out
                        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;
                            if (mPreventDrag == PREVENT_DRAG_YES) {
                                mTouchMode = TOUCH_DONE_MODE;
                            } else {
                                mPreventLongPress =
                                        (msg.arg2 & TOUCH_PREVENT_LONGPRESS)
                                        == TOUCH_PREVENT_LONGPRESS;
                                mPreventDoubleTap =
                                        (msg.arg2 & TOUCH_PREVENT_DOUBLETAP)
                                        == TOUCH_PREVENT_DOUBLETAP;
                            }
                        }
                    }
+8 −3
Original line number Diff line number Diff line
@@ -515,7 +515,7 @@ final class WebViewCore {
    private native void nativeTouchUp(int touchGeneration,
            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();

@@ -712,8 +712,13 @@ final class WebViewCore {
        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 {
        int mAction;    // MotionEvent.getAction()
        int mAction;
        int mX;
        int mY;
    }
@@ -1130,7 +1135,7 @@ final class WebViewCore {
                                    mWebView.mPrivateHandler,
                                    WebView.PREVENT_TOUCH_ID, ted.mAction,
                                    nativeHandleTouchEvent(ted.mAction, ted.mX,
                                            ted.mY) ? 1 : 0).sendToTarget();
                                            ted.mY)).sendToTarget();
                            break;
                        }