diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.java deleted file mode 100644 index ff88e2471da764..00000000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.react.uimanager; - -import android.graphics.Rect; -import android.view.View; -import android.view.ViewParent; -import com.facebook.infer.annotation.Nullsafe; -import javax.annotation.concurrent.NotThreadSafe; - -/** - * Provides implementation of common tasks for view and it's view manager supporting property {@code - * removeClippedSubviews}. - */ -@Nullsafe(Nullsafe.Mode.LOCAL) -@NotThreadSafe -public class ReactClippingViewGroupHelper { - - public static final String PROP_REMOVE_CLIPPED_SUBVIEWS = "removeClippedSubviews"; - - private static final Rect sHelperRect = new Rect(); - - /** - * Can be used by view that support {@code removeClippedSubviews} property to calculate area that - * given {@param view} should be clipped to based on the clipping rectangle of it's parent in case - * when parent is also set to clip it's children. - * - * @param view view that we want to calculate clipping rect for - * @param outputRect where the calculated rectangle will be written - */ - public static void calculateClippingRect(View view, Rect outputRect) { - ViewParent parent = view.getParent(); - if (parent == null) { - outputRect.setEmpty(); - return; - } else if (parent instanceof ReactClippingViewGroup) { - ReactClippingViewGroup clippingViewGroup = (ReactClippingViewGroup) parent; - if (clippingViewGroup.getRemoveClippedSubviews()) { - clippingViewGroup.getClippingRect(sHelperRect); - // Intersect the view with the parent's rectangle - // This will result in the overlap with coordinates in the parent space - if (!sHelperRect.intersect( - view.getLeft(), - view.getTop() + (int) view.getTranslationY(), - view.getRight(), - view.getBottom() + (int) view.getTranslationY())) { - outputRect.setEmpty(); - return; - } - // Now we move the coordinates to the View's coordinate space - sHelperRect.offset(-view.getLeft(), -view.getTop()); - sHelperRect.offset(-(int) view.getTranslationX(), -(int) view.getTranslationY()); - sHelperRect.offset(view.getScrollX(), view.getScrollY()); - outputRect.set(sHelperRect); - return; - } - } - view.getDrawingRect(outputRect); - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.kt new file mode 100644 index 00000000000000..b0ea87837bd7fd --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.kt @@ -0,0 +1,67 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + package com.facebook.react.uimanager + + import android.graphics.Rect + import android.view.View + import javax.annotation.concurrent.NotThreadSafe + + /** + * Provides implementation of common tasks for view and it's view manager supporting property + * [removeClippedSubviews]. + */ + @NotThreadSafe + public object ReactClippingViewGroupHelper { + + public const val PROP_REMOVE_CLIPPED_SUBVIEWS: String = "removeClippedSubviews" + + private val helperRect: Rect = Rect() + + /** + * Can be used by view that support [removeClippedSubviews] property to calculate area that + * given [view] should be clipped to based on the clipping rectangle of it's parent in case when + * parent is also set to clip it's children. + * + * @param view view that we want to calculate clipping rect for + * @param outputRect where the calculated rectangle will be written + */ + @JvmStatic + public fun calculateClippingRect(view: View, outputRect: Rect): Unit { + when (val parent = view.parent) { + null -> { + outputRect.setEmpty() + return + } + is ReactClippingViewGroup -> { + if (parent.removeClippedSubviews) { + parent.getClippingRect(helperRect) + // Intersect the view with the parent's rectangle + if ( + !helperRect.intersect( + view.left, + view.top + view.translationY.toInt(), + view.right, + view.bottom + view.translationY.toInt() + ) + ) { + outputRect.setEmpty() + return + } + // Move coordinates to View's coordinate space + helperRect.offset(-view.left, -view.top) + helperRect.offset(-view.translationX.toInt(), -view.translationY.toInt()) + helperRect.offset(view.scrollX, view.scrollY) + outputRect.set(helperRect) + return + } + } + } + view.getDrawingRect(outputRect) + } + } + \ No newline at end of file