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