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

Commit c1e80a36 authored by John Reck's avatar John Reck
Browse files

Support skipping a touch stream due to lack of handlers

 Bug: 6317798

Change-Id: Ia1652e9030e877e270326e9e8a8b040810b89f09
parent 7018a90c
Loading
Loading
Loading
Loading
+13 −3
Original line number Original line Diff line number Diff line
@@ -660,7 +660,7 @@ public final class WebViewCore {
            int x, int y);
            int x, int y);
    private native boolean nativeMouseClick(int nativeClass);
    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[] idArray, int[] xArray, int[] yArray, int count,
            int actionIndex, int metaState);
            int actionIndex, int metaState);


@@ -959,6 +959,9 @@ public final class WebViewCore {
    static final int ACTION_LONGPRESS = 0x100;
    static final int ACTION_LONGPRESS = 0x100;
    static final int ACTION_DOUBLETAP = 0x200;
    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 {
    static class TouchEventData {
        int mAction;
        int mAction;
        int[] mIds;  // Ids of the touch points
        int[] mIds;  // Ids of the touch points
@@ -1775,7 +1778,8 @@ public final class WebViewCore {
        }
        }


        @Override
        @Override
        public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags) {
        public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
                MotionEvent event, int eventType, int flags) {
            if (mNativeClass == 0) {
            if (mNativeClass == 0) {
                return false;
                return false;
            }
            }
@@ -1802,10 +1806,16 @@ public final class WebViewCore {
                        xArray[i] = (int) event.getX(i);
                        xArray[i] = (int) event.getX(i);
                        yArray[i] = (int) event.getY(i);
                        yArray[i] = (int) event.getY(i);
                    }
                    }
                    return nativeHandleTouchEvent(mNativeClass,
                    int touchFlags = nativeHandleTouchEvent(mNativeClass,
                            event.getActionMasked(),
                            event.getActionMasked(),
                            idArray, xArray, yArray, count,
                            idArray, xArray, yArray, count,
                            event.getActionIndex(), event.getMetaState());
                            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:
                default:
+10 −2
Original line number Original line Diff line number Diff line
@@ -686,7 +686,7 @@ final class WebViewInputDispatcher {
                    + ", eventType=" + eventType + ", flags=" + flags);
                    + ", eventType=" + eventType + ", flags=" + flags);
        }
        }
        boolean preventDefault = mWebKitCallbacks.dispatchWebKitEvent(
        boolean preventDefault = mWebKitCallbacks.dispatchWebKitEvent(
                event, eventType, flags);
                this, event, eventType, flags);
        if (DEBUG) {
        if (DEBUG) {
            Log.d(TAG, "dispatchWebKitEvent: preventDefault=" + preventDefault);
            Log.d(TAG, "dispatchWebKitEvent: preventDefault=" + preventDefault);
        }
        }
@@ -710,6 +710,12 @@ final class WebViewInputDispatcher {
        mWebKitDispatchEventQueue.mHead = d;
        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.
    // Runs on UI thread in response to the web kit thread appearing to be unresponsive.
    private void handleWebKitTimeout() {
    private void handleWebKitTimeout() {
        synchronized (mLock) {
        synchronized (mLock) {
@@ -1081,12 +1087,14 @@ final class WebViewInputDispatcher {


        /**
        /**
         * Dispatches an event to web kit.
         * Dispatches an event to web kit.
         * @param dispatcher The WebViewInputDispatcher sending the event
         * @param event The event.
         * @param event The event.
         * @param eventType The event type.
         * @param eventType The event type.
         * @param flags The event's dispatch flags.
         * @param flags The event's dispatch flags.
         * @return True if web kit wants to prevent default event handling.
         * @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.
    // Runs on UI thread.