From 98cd85533dad48f4c0dc2c990eaf3fd411a43e4e Mon Sep 17 00:00:00 2001 From: gcole Date: Fri, 24 Mar 2017 16:55:10 -0700 Subject: [PATCH] Fix pinch crash in touch-responsive views. --- .../scroll/ReactHorizontalScrollView.java | 22 ++++++++++++++----- .../react/views/scroll/ReactScrollView.java | 19 +++++++++++----- .../react/views/viewpager/ReactViewPager.java | 16 +++++++++++--- 3 files changed, 42 insertions(+), 15 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 b64415bfadbce6..f46e656d3b304b 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 @@ -16,10 +16,13 @@ import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.HorizontalScrollView; import com.facebook.infer.annotation.Assertions; +import com.facebook.react.common.ReactConstants; import com.facebook.react.uimanager.MeasureSpecAssertions; import com.facebook.react.uimanager.ReactClippingViewGroup; import com.facebook.react.uimanager.ReactClippingViewGroupHelper; @@ -133,12 +136,19 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } - if (super.onInterceptTouchEvent(ev)) { - NativeGestureUtil.notifyNativeGestureStarted(this, ev); - ReactScrollViewHelper.emitScrollBeginDragEvent(this); - mDragging = true; - enableFpsListener(); - return true; + try { + if (super.onInterceptTouchEvent(ev)) { + NativeGestureUtil.notifyNativeGestureStarted(this, ev); + ReactScrollViewHelper.emitScrollBeginDragEvent(this); + mDragging = true; + enableFpsListener(); + return true; + } + } catch (IllegalArgumentException e) { + // Log and ignore the error. This seems to be a bug in the android SDK and + // this is the commonly accepted workaround. + // https://tinyurl.com/mw6qkod (Stack Overflow) + Log.w(ReactConstants.TAG, "Error intercepting touch event.", e); } return false; 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 cafa7bff0e93bd..de156aeea4ca9d 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 @@ -179,12 +179,19 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } - if (super.onInterceptTouchEvent(ev)) { - NativeGestureUtil.notifyNativeGestureStarted(this, ev); - ReactScrollViewHelper.emitScrollBeginDragEvent(this); - mDragging = true; - enableFpsListener(); - return true; + try { + if (super.onInterceptTouchEvent(ev)) { + NativeGestureUtil.notifyNativeGestureStarted(this, ev); + ReactScrollViewHelper.emitScrollBeginDragEvent(this); + mDragging = true; + enableFpsListener(); + return true; + } + } catch (IllegalArgumentException e) { + // Log and ignore the error. This seems to be a bug in the android SDK and + // this is the commonly accepted workaround. + // https://tinyurl.com/mw6qkod (Stack Overflow) + Log.w(ReactConstants.TAG, "Error intercepting touch event.", e); } return false; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPager.java b/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPager.java index 7ed36557135dd0..44adcfd913ce7e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/viewpager/ReactViewPager.java @@ -14,11 +14,13 @@ import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; +import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import com.facebook.react.bridge.ReactContext; +import com.facebook.react.common.ReactConstants; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.uimanager.events.NativeGestureUtil; @@ -178,10 +180,18 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } - if (super.onInterceptTouchEvent(ev)) { - NativeGestureUtil.notifyNativeGestureStarted(this, ev); - return true; + try { + if (super.onInterceptTouchEvent(ev)) { + NativeGestureUtil.notifyNativeGestureStarted(this, ev); + return true; + } + } catch (IllegalArgumentException e) { + // Log and ignore the error. This seems to be a bug in the android SDK and + // this is the commonly accepted workaround. + // https://tinyurl.com/mw6qkod (Stack Overflow) + Log.w(ReactConstants.TAG, "Error intercepting touch event.", e); } + return false; }