Skip to content

Commit e4395d5

Browse files
lunaleapsmeta-codesync[bot]
authored andcommitted
Remove clipping check on scrollview
Summary: Changelog: [Internal] - Ignore whether ScrollView enables subview clipping and just use the drawing rect for forwarding a clippingRect for VirtualView Reviewed By: yungsters Differential Revision: D85817030
1 parent 6d68cdf commit e4395d5

22 files changed

+203
-64
lines changed

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<3ea1ee77358d99334a7c40bed44f2d90>>
7+
* @generated SignedSource<<6269c2ed9d8adb25769d64459ea6023f>>
88
*/
99

1010
/**
@@ -312,6 +312,12 @@ public object ReactNativeFeatureFlags {
312312
@JvmStatic
313313
public fun enableViewRecyclingForView(): Boolean = accessor.enableViewRecyclingForView()
314314

315+
/**
316+
* Set clipping to drawingRect of ScrollView.
317+
*/
318+
@JvmStatic
319+
public fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean = accessor.enableVirtualViewClippingWithoutScrollViewClipping()
320+
315321
/**
316322
* Enables the experimental version of `VirtualViewContainerState`.
317323
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<007a5a1235a999716b382ffd4ca23158>>
7+
* @generated SignedSource<<9ec80593834a88c06770c4a0c47a5fee>>
88
*/
99

1010
/**
@@ -67,6 +67,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
6767
private var enableViewRecyclingForScrollViewCache: Boolean? = null
6868
private var enableViewRecyclingForTextCache: Boolean? = null
6969
private var enableViewRecyclingForViewCache: Boolean? = null
70+
private var enableVirtualViewClippingWithoutScrollViewClippingCache: Boolean? = null
7071
private var enableVirtualViewContainerStateExperimentalCache: Boolean? = null
7172
private var enableVirtualViewDebugFeaturesCache: Boolean? = null
7273
private var enableVirtualViewRenderStateCache: Boolean? = null
@@ -525,6 +526,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
525526
return cached
526527
}
527528

529+
override fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean {
530+
var cached = enableVirtualViewClippingWithoutScrollViewClippingCache
531+
if (cached == null) {
532+
cached = ReactNativeFeatureFlagsCxxInterop.enableVirtualViewClippingWithoutScrollViewClipping()
533+
enableVirtualViewClippingWithoutScrollViewClippingCache = cached
534+
}
535+
return cached
536+
}
537+
528538
override fun enableVirtualViewContainerStateExperimental(): Boolean {
529539
var cached = enableVirtualViewContainerStateExperimentalCache
530540
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<8a775646d455cdb6d017fd08aee3e807>>
7+
* @generated SignedSource<<993de10e054ed768e01067412060d12f>>
88
*/
99

1010
/**
@@ -122,6 +122,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
122122

123123
@DoNotStrip @JvmStatic public external fun enableViewRecyclingForView(): Boolean
124124

125+
@DoNotStrip @JvmStatic public external fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean
126+
125127
@DoNotStrip @JvmStatic public external fun enableVirtualViewContainerStateExperimental(): Boolean
126128

127129
@DoNotStrip @JvmStatic public external fun enableVirtualViewDebugFeatures(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<afccaed3066598724041c48bfb524234>>
7+
* @generated SignedSource<<3a87dc3d79c5a33fe75ac7fef2f90cbf>>
88
*/
99

1010
/**
@@ -117,6 +117,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
117117

118118
override fun enableViewRecyclingForView(): Boolean = true
119119

120+
override fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean = true
121+
120122
override fun enableVirtualViewContainerStateExperimental(): Boolean = false
121123

122124
override fun enableVirtualViewDebugFeatures(): Boolean = false

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<ebeb9b37b8d3d0e31f4d4966cbf42b3f>>
7+
* @generated SignedSource<<138526734a4e33f332a6ef4f7c61ae16>>
88
*/
99

1010
/**
@@ -71,6 +71,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
7171
private var enableViewRecyclingForScrollViewCache: Boolean? = null
7272
private var enableViewRecyclingForTextCache: Boolean? = null
7373
private var enableViewRecyclingForViewCache: Boolean? = null
74+
private var enableVirtualViewClippingWithoutScrollViewClippingCache: Boolean? = null
7475
private var enableVirtualViewContainerStateExperimentalCache: Boolean? = null
7576
private var enableVirtualViewDebugFeaturesCache: Boolean? = null
7677
private var enableVirtualViewRenderStateCache: Boolean? = null
@@ -576,6 +577,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
576577
return cached
577578
}
578579

580+
override fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean {
581+
var cached = enableVirtualViewClippingWithoutScrollViewClippingCache
582+
if (cached == null) {
583+
cached = currentProvider.enableVirtualViewClippingWithoutScrollViewClipping()
584+
accessedFeatureFlags.add("enableVirtualViewClippingWithoutScrollViewClipping")
585+
enableVirtualViewClippingWithoutScrollViewClippingCache = cached
586+
}
587+
return cached
588+
}
589+
579590
override fun enableVirtualViewContainerStateExperimental(): Boolean {
580591
var cached = enableVirtualViewContainerStateExperimentalCache
581592
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<1c4ea60d119996f37742542976fedcc8>>
7+
* @generated SignedSource<<5b695e4d7a64281f5a069e8050765ff5>>
88
*/
99

1010
/**
@@ -117,6 +117,8 @@ public interface ReactNativeFeatureFlagsProvider {
117117

118118
@DoNotStrip public fun enableViewRecyclingForView(): Boolean
119119

120+
@DoNotStrip public fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean
121+
120122
@DoNotStrip public fun enableVirtualViewContainerStateExperimental(): Boolean
121123

122124
@DoNotStrip public fun enableVirtualViewDebugFeatures(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/virtual/view/ReactVirtualView.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,28 @@ public class ReactVirtualView(context: Context) :
187187
}
188188

189189
// If no ScrollView, or ScrollView has disabled removeClippedSubviews, use default behavior
190-
if (
191-
parentScrollView == null ||
192-
!((parentScrollView as ReactClippingViewGroup).removeClippedSubviews ?: false)
193-
) {
190+
if (parentScrollView == null) {
194191
super.updateClippingRect(excludedViews)
195192
return
196193
}
197194

198195
val clippingRect = checkNotNull(clippingRect)
196+
val parentScrollView = checkNotNull(parentScrollView) as ReactClippingViewGroup
197+
198+
if (ReactNativeFeatureFlags.enableVirtualViewClippingWithoutScrollViewClipping()) {
199+
if (parentScrollView.removeClippedSubviews) {
200+
parentScrollView.getClippingRect(clippingRect)
201+
} else {
202+
(parentScrollView as View).getDrawingRect(clippingRect)
203+
}
204+
} else {
205+
if (!(parentScrollView.removeClippedSubviews ?: false)) {
206+
super.updateClippingRect(excludedViews)
207+
return
208+
}
209+
parentScrollView.getClippingRect(clippingRect)
210+
}
199211

200-
(parentScrollView as ReactClippingViewGroup).getClippingRect(clippingRect)
201212
clippingRect.intersect(targetRect)
202213
clippingRect.offset(-targetRect.left, -targetRect.top)
203214

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/virtual/viewexperimental/ReactVirtualViewExperimental.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,29 @@ public class ReactVirtualViewExperimental(context: Context) :
208208
}
209209

210210
// If no ScrollView, or ScrollView has disabled removeClippedSubviews, use default behavior
211-
if (
212-
scrollView == null ||
213-
!((scrollView as ReactClippingViewGroup).removeClippedSubviews ?: false)
214-
) {
211+
if (scrollView == null) {
215212
super.updateClippingRect(excludedViews)
216213
return
217214
}
218215

219216
val clippingRect = checkNotNull(clippingRect)
217+
val scrollView = checkNotNull(scrollView) as ReactClippingViewGroup
218+
219+
if (ReactNativeFeatureFlags.enableVirtualViewClippingWithoutScrollViewClipping()) {
220+
if (scrollView.removeClippedSubviews) {
221+
scrollView.getClippingRect(clippingRect)
222+
} else {
223+
(scrollView as View).getDrawingRect(clippingRect)
224+
}
225+
} else {
226+
if (!(scrollView.removeClippedSubviews ?: false)) {
227+
super.updateClippingRect(excludedViews)
228+
return
229+
}
230+
231+
scrollView.getClippingRect(clippingRect)
232+
}
220233

221-
(scrollView as ReactClippingViewGroup).getClippingRect(clippingRect)
222234
clippingRect.intersect(containerRelativeRect)
223235
clippingRect.offset(-containerRelativeRect.left, -containerRelativeRect.top)
224236

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<d04720bbbd42eaf338be612a0f3e36a6>>
7+
* @generated SignedSource<<713e8cc0f50c6361aefb49bda87d8727>>
88
*/
99

1010
/**
@@ -321,6 +321,12 @@ class ReactNativeFeatureFlagsJavaProvider
321321
return method(javaProvider_);
322322
}
323323

324+
bool enableVirtualViewClippingWithoutScrollViewClipping() override {
325+
static const auto method =
326+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableVirtualViewClippingWithoutScrollViewClipping");
327+
return method(javaProvider_);
328+
}
329+
324330
bool enableVirtualViewContainerStateExperimental() override {
325331
static const auto method =
326332
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableVirtualViewContainerStateExperimental");
@@ -764,6 +770,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableViewRecyclingForView(
764770
return ReactNativeFeatureFlags::enableViewRecyclingForView();
765771
}
766772

773+
bool JReactNativeFeatureFlagsCxxInterop::enableVirtualViewClippingWithoutScrollViewClipping(
774+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
775+
return ReactNativeFeatureFlags::enableVirtualViewClippingWithoutScrollViewClipping();
776+
}
777+
767778
bool JReactNativeFeatureFlagsCxxInterop::enableVirtualViewContainerStateExperimental(
768779
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
769780
return ReactNativeFeatureFlags::enableVirtualViewContainerStateExperimental();
@@ -1106,6 +1117,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
11061117
makeNativeMethod(
11071118
"enableViewRecyclingForView",
11081119
JReactNativeFeatureFlagsCxxInterop::enableViewRecyclingForView),
1120+
makeNativeMethod(
1121+
"enableVirtualViewClippingWithoutScrollViewClipping",
1122+
JReactNativeFeatureFlagsCxxInterop::enableVirtualViewClippingWithoutScrollViewClipping),
11091123
makeNativeMethod(
11101124
"enableVirtualViewContainerStateExperimental",
11111125
JReactNativeFeatureFlagsCxxInterop::enableVirtualViewContainerStateExperimental),

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<7679a91daba1f8941b78a4be4baea6ef>>
7+
* @generated SignedSource<<62a3dd6bac840fb863cbeac24bf5c6de>>
88
*/
99

1010
/**
@@ -171,6 +171,9 @@ class JReactNativeFeatureFlagsCxxInterop
171171
static bool enableViewRecyclingForView(
172172
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
173173

174+
static bool enableVirtualViewClippingWithoutScrollViewClipping(
175+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
176+
174177
static bool enableVirtualViewContainerStateExperimental(
175178
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
176179

0 commit comments

Comments
 (0)