From 9c61693c9e4fbd2d0ac9ec56eb3aff71c49372e8 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Thu, 21 Nov 2019 00:07:28 -0800 Subject: [PATCH] Create ReactFeatureFlag to enable / disable custom implementation of getChildVisibleRect Summary: This diff introduces a new ReactFeatureFlag that will be used to enable / disable a custom implementation of getChildVisibleRect in the classes ReactViewGroup, ReactHorizontalScrollView and ReactScrollView. The new ReactFeatureFlag is disabled by default bevause of T57363204 This is disabling the code landed as part of D17782658 / https://github.com/facebook/react-native/pull/26334 Changelog: Introduce ReactFeatureFlag to disable custom implementation of getChildVisibleRect (disabled by default) This will disable the custom algorithm created on https://github.com/facebook/react-native/pull/26334 Reviewed By: yungsters Differential Revision: D18621042 fbshipit-source-id: 35ca3417b596117b47edab29515a824c1726c2ce --- .../com/facebook/react/config/ReactFeatureFlags.java | 12 ++++++++++++ .../main/java/com/facebook/react/views/scroll/BUCK | 1 + .../views/scroll/ReactHorizontalScrollView.java | 6 ++++-- .../facebook/react/views/scroll/ReactScrollView.java | 6 ++++-- .../src/main/java/com/facebook/react/views/view/BUCK | 1 + .../facebook/react/views/view/ReactViewGroup.java | 6 ++++-- 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index 03665bd10cb..b746fcdc1cc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -78,4 +78,16 @@ public class ReactFeatureFlags { * TODO T54997838: remove as followup */ public static boolean allowDisablingImmediateExecutionOfScheduleMountItems = false; + + /** + * This react flag enables a custom algorithm for the getChildVisibleRect() method in the classes + * ReactViewGroup, ReactHorizontalScrollView and ReactScrollView. + * + *

This new algorithm clip child rects if overflow is set to ViewProps.HIDDEN. More details in + * https://github.com/facebook/react-native/issues/23870 and + * https://github.com/facebook/react-native/pull/26334 + * + *

The react flag is disabled by default because this is increasing ANRs (T57363204) + */ + public static boolean clipChildRectsIfOverflowIsHidden = false; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/BUCK index 61a0be8a95f..9f623cdab97 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/BUCK @@ -20,6 +20,7 @@ rn_android_library( react_native_dep("third-party/java/jsr-305:jsr-305"), react_native_target("java/com/facebook/react/bridge:bridge"), react_native_target("java/com/facebook/react/common:common"), + react_native_target("java/com/facebook/react/config:config"), react_native_target("java/com/facebook/react/module/annotations:annotations"), react_native_target("java/com/facebook/react/modules/i18nmanager:i18nmanager"), react_native_target("java/com/facebook/react/touch:touch"), 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 ff2e0faf53b..e41ae5caa2d 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 @@ -25,6 +25,7 @@ import androidx.core.text.TextUtilsCompat; import androidx.core.view.ViewCompat; import com.facebook.infer.annotation.Assertions; import com.facebook.react.common.ReactConstants; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.uimanager.MeasureSpecAssertions; import com.facebook.react.uimanager.ReactClippingViewGroup; import com.facebook.react.uimanager.ReactClippingViewGroupHelper; @@ -494,8 +495,9 @@ public class ReactHorizontalScrollView extends HorizontalScrollView @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - return ReactClippingViewGroupHelper.getChildVisibleRectHelper( - child, r, offset, this, mOverflow); + return ReactFeatureFlags.clipChildRectsIfOverflowIsHidden + ? ReactClippingViewGroupHelper.getChildVisibleRectHelper(child, r, offset, this, mOverflow) + : super.getChildVisibleRect(child, r, offset); } private int getSnapInterval() { 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 dbf5b50e939..8108106a271 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 @@ -24,6 +24,7 @@ import androidx.core.view.ViewCompat; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReactContext; import com.facebook.react.common.ReactConstants; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.uimanager.MeasureSpecAssertions; import com.facebook.react.uimanager.ReactClippingViewGroup; import com.facebook.react.uimanager.ReactClippingViewGroupHelper; @@ -345,8 +346,9 @@ public class ReactScrollView extends ScrollView @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - return ReactClippingViewGroupHelper.getChildVisibleRectHelper( - child, r, offset, this, mOverflow); + return ReactFeatureFlags.clipChildRectsIfOverflowIsHidden + ? ReactClippingViewGroupHelper.getChildVisibleRectHelper(child, r, offset, this, mOverflow) + : super.getChildVisibleRect(child, r, offset); } @Override diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/view/BUCK index 3eec5c6bf13..186cf548b42 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/BUCK @@ -21,6 +21,7 @@ rn_android_library( react_native_dep("third-party/java/jsr-305:jsr-305"), react_native_target("java/com/facebook/react/bridge:bridge"), react_native_target("java/com/facebook/react/common:common"), + react_native_target("java/com/facebook/react/config:config"), react_native_target("java/com/facebook/react/module/annotations:annotations"), react_native_target("java/com/facebook/react/touch:touch"), react_native_target("java/com/facebook/react/views/common:common"), 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 bba7db72de3..a191dd2cb19 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 @@ -31,6 +31,7 @@ import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.common.annotations.VisibleForTesting; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.modules.i18nmanager.I18nUtil; import com.facebook.react.touch.OnInterceptTouchEventListener; import com.facebook.react.touch.ReactHitSlopView; @@ -433,8 +434,9 @@ public class ReactViewGroup extends ViewGroup @Override public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - return ReactClippingViewGroupHelper.getChildVisibleRectHelper( - child, r, offset, this, mOverflow); + return ReactFeatureFlags.clipChildRectsIfOverflowIsHidden + ? ReactClippingViewGroupHelper.getChildVisibleRectHelper(child, r, offset, this, mOverflow) + : super.getChildVisibleRect(child, r, offset); } @Override