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

Commit f7388102 authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Support skipping a touch stream due to lack of handlers" into jb-dev

parents 73bde11e c1e80a36
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -669,7 +669,7 @@ public final class WebViewCore {
            int x, int y);
    private native boolean nativeMouseClick(int nativeClass);

    private native boolean nativeHandleTouchEvent(int nativeClass, int action,
    private native int nativeHandleTouchEvent(int nativeClass, int action,
            int[] idArray, int[] xArray, int[] yArray, int count,
            int actionIndex, int metaState);

@@ -968,6 +968,9 @@ public final class WebViewCore {
    static final int ACTION_LONGPRESS = 0x100;
    static final int ACTION_DOUBLETAP = 0x200;

    private static final int TOUCH_FLAG_HIT_HANDLER = 0x1;
    private static final int TOUCH_FLAG_PREVENT_DEFAULT = 0x2;

    static class TouchEventData {
        int mAction;
        int[] mIds;  // Ids of the touch points
@@ -1784,7 +1787,8 @@ public final class WebViewCore {
        }

        @Override
        public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags) {
        public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
                MotionEvent event, int eventType, int flags) {
            if (mNativeClass == 0) {
                return false;
            }
@@ -1811,10 +1815,16 @@ public final class WebViewCore {
                        xArray[i] = (int) event.getX(i);
                        yArray[i] = (int) event.getY(i);
                    }
                    return nativeHandleTouchEvent(mNativeClass,
                    int touchFlags = nativeHandleTouchEvent(mNativeClass,
                            event.getActionMasked(),
                            idArray, xArray, yArray, count,
                            event.getActionIndex(), event.getMetaState());
                    if (touchFlags == 0
                            && event.getActionMasked() != MotionEvent.ACTION_CANCEL
                            && (flags & WebViewInputDispatcher.FLAG_PRIVATE) == 0) {
                        dispatcher.skipWebkitForRemainingTouchStream();
                    }
                    return (touchFlags & TOUCH_FLAG_PREVENT_DEFAULT) > 0;
                }

                default:
+10 −2
Original line number Diff line number Diff line
@@ -686,7 +686,7 @@ final class WebViewInputDispatcher {
                    + ", eventType=" + eventType + ", flags=" + flags);
        }
        boolean preventDefault = mWebKitCallbacks.dispatchWebKitEvent(
                event, eventType, flags);
                this, event, eventType, flags);
        if (DEBUG) {
            Log.d(TAG, "dispatchWebKitEvent: preventDefault=" + preventDefault);
        }
@@ -710,6 +710,12 @@ final class WebViewInputDispatcher {
        mWebKitDispatchEventQueue.mHead = d;
    }

    // Called by WebKit when it doesn't care about the rest of the touch stream
    public void skipWebkitForRemainingTouchStream() {
        // Just treat this like a timeout
        handleWebKitTimeout();
    }

    // Runs on UI thread in response to the web kit thread appearing to be unresponsive.
    private void handleWebKitTimeout() {
        synchronized (mLock) {
@@ -1081,12 +1087,14 @@ final class WebViewInputDispatcher {

        /**
         * Dispatches an event to web kit.
         * @param dispatcher The WebViewInputDispatcher sending the event
         * @param event The event.
         * @param eventType The event type.
         * @param flags The event's dispatch flags.
         * @return True if web kit wants to prevent default event handling.
         */
        public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags);
        public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
                MotionEvent event, int eventType, int flags);
    }

    // Runs on UI thread.