From fced96bf5202e8b89b804ccc1004abacc9f91660 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Wed, 18 May 2022 08:35:16 -0700 Subject: [PATCH] Fix non-touch event dispatching not being blocked by pointer-events Summary: Changelog: [Android][Fixed] Scroll views would still receive scroll events when nested in a view with `pointer-events: "none"` Differential Revision: D36423921 fbshipit-source-id: 87b8a236e15dda7b648b6fc649187e95a9a2cc42 --- .../views/scroll/ReactHorizontalScrollView.java | 10 ++++++++++ .../react/views/scroll/ReactScrollView.java | 10 ++++++++++ .../facebook/react/views/view/ReactViewGroup.java | 14 ++++++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index a0efd3b000ef98..9319708a91b8b1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -559,6 +559,16 @@ public boolean onTouchEvent(MotionEvent ev) { return super.onTouchEvent(ev); } + @Override + public boolean dispatchGenericPointerEvent(MotionEvent ev) { + // We do not dispatch the pointer event if its children are not supposed to receive it + if (!PointerEvents.canChildrenBeTouchTarget(mPointerEvents)) { + return false; + } + + return super.dispatchGenericPointerEvent(ev); + } + @Override public boolean executeKeyEvent(KeyEvent event) { int eventKeyCode = event.getKeyCode(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 5a343067ca67c6..022498179907a0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -397,6 +397,16 @@ public boolean onTouchEvent(MotionEvent ev) { return super.onTouchEvent(ev); } + @Override + public boolean dispatchGenericPointerEvent(MotionEvent ev) { + // We do not dispatch the pointer event if its children are not supposed to receive it + if (!PointerEvents.canChildrenBeTouchTarget(mPointerEvents)) { + return false; + } + + return super.dispatchGenericPointerEvent(ev); + } + @Override public boolean executeKeyEvent(KeyEvent event) { int eventKeyCode = event.getKeyCode(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java index 79ac5dadcc5c96..a87815b2d8d027 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java @@ -224,7 +224,7 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { return true; } // We intercept the touch event if the children are not supposed to receive it. - if (mPointerEvents == PointerEvents.NONE || mPointerEvents == PointerEvents.BOX_ONLY) { + if (!PointerEvents.canChildrenBeTouchTarget(mPointerEvents)) { return true; } return super.onInterceptTouchEvent(ev); @@ -233,7 +233,7 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { @Override public boolean onTouchEvent(MotionEvent ev) { // We do not accept the touch event if this view is not supposed to receive it. - if (mPointerEvents == PointerEvents.NONE || mPointerEvents == PointerEvents.BOX_NONE) { + if (!PointerEvents.canBeTouchTarget(mPointerEvents)) { return false; } // The root view always assumes any view that was tapped wants the touch @@ -244,6 +244,16 @@ public boolean onTouchEvent(MotionEvent ev) { return true; } + @Override + public boolean dispatchGenericPointerEvent(MotionEvent ev) { + // We do not dispatch the pointer event if its children are not supposed to receive it + if (!PointerEvents.canChildrenBeTouchTarget(mPointerEvents)) { + return false; + } + + return super.dispatchGenericPointerEvent(ev); + } + /** * We override this to allow developers to determine whether they need offscreen alpha compositing * or not. See the documentation of needsOffscreenAlphaCompositing in View.js.