Skip to content

Commit c861804

Browse files
yungstersfacebook-github-bot
authored andcommitted
VirtualView: Simplify Window Focus Detection
Summary: Refactors the window focus detection feature flag logic in `VirtualView` (Android) to eliminate one instance property and instead utilize the existence of the focus listener to determine whether window focus detection is enabled. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D79743782 fbshipit-source-id: d12e70d8e52b72d546ff097c3b1bcfbd29fb9129
1 parent 2768c84 commit c861804

2 files changed

Lines changed: 20 additions & 13 deletions

File tree

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainer.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,28 +50,32 @@ private fun rectsOverlap(rect1: Rect, rect2: Rect): Boolean {
5050
internal class VirtualViewContainerState {
5151

5252
private val prerenderRatio: Double = ReactNativeFeatureFlags.virtualViewPrerenderRatio()
53-
private val detectWindowFocus = ReactNativeFeatureFlags.enableVirtualViewWindowFocusDetection()
5453

5554
private val virtualViews: MutableSet<VirtualView> = mutableSetOf()
5655
private val emptyRect: Rect = Rect()
5756
private val visibleRect: Rect = Rect()
5857
private val prerenderRect: Rect = Rect()
5958
private val onWindowFocusChangeListener =
60-
ViewTreeObserver.OnWindowFocusChangeListener {
61-
debugLog("onWindowFocusChanged")
62-
updateModes()
59+
if (ReactNativeFeatureFlags.enableVirtualViewWindowFocusDetection()) {
60+
ViewTreeObserver.OnWindowFocusChangeListener {
61+
debugLog("onWindowFocusChanged")
62+
updateModes()
63+
}
64+
} else {
65+
null
6366
}
67+
6468
private val scrollView: ViewGroup
6569

6670
constructor(scrollView: ViewGroup) {
6771
this.scrollView = scrollView
68-
if (detectWindowFocus) {
72+
if (onWindowFocusChangeListener != null) {
6973
scrollView.viewTreeObserver.addOnWindowFocusChangeListener(onWindowFocusChangeListener)
7074
}
7175
}
7276

7377
public fun cleanup() {
74-
if (detectWindowFocus) {
78+
if (onWindowFocusChangeListener != null) {
7579
scrollView.viewTreeObserver.removeOnWindowFocusChangeListener(onWindowFocusChangeListener)
7680
}
7781
}
@@ -115,7 +119,7 @@ internal class VirtualViewContainerState {
115119
rect.isEmpty -> {}
116120
rectsOverlap(rect, visibleRect) -> {
117121
thresholdRect = visibleRect
118-
if (detectWindowFocus) {
122+
if (onWindowFocusChangeListener != null) {
119123
if (scrollView.hasWindowFocus()) {
120124
mode = VirtualViewMode.Visible
121125
} else {

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,14 @@ public class ReactVirtualView(context: Context) :
4040
internal var modeChangeEmitter: VirtualViewModeChangeEmitter? = null
4141
internal var prerenderRatio: Double = ReactNativeFeatureFlags.virtualViewPrerenderRatio()
4242
internal val debugLogEnabled: Boolean = ReactNativeFeatureFlags.enableVirtualViewDebugFeatures()
43-
internal val detectWindowFocus = ReactNativeFeatureFlags.enableVirtualViewWindowFocusDetection()
4443

4544
private val onWindowFocusChangeListener =
46-
ViewTreeObserver.OnWindowFocusChangeListener {
47-
dispatchOnModeChangeIfNeeded(checkRectChange = false)
45+
if (ReactNativeFeatureFlags.enableVirtualViewWindowFocusDetection()) {
46+
ViewTreeObserver.OnWindowFocusChangeListener {
47+
dispatchOnModeChangeIfNeeded(checkRectChange = false)
48+
}
49+
} else {
50+
null
4851
}
4952

5053
private var parentScrollView: View? = null
@@ -90,7 +93,7 @@ public class ReactVirtualView(context: Context) :
9093
ReactScrollViewHelper.addLayoutChangeListener(this)
9194
}
9295
debugLog("onAttachedToWindow")
93-
if (detectWindowFocus) {
96+
if (onWindowFocusChangeListener != null) {
9497
viewTreeObserver.addOnWindowFocusChangeListener(onWindowFocusChangeListener)
9598
}
9699
dispatchOnModeChangeIfNeeded(checkRectChange = false)
@@ -100,7 +103,7 @@ public class ReactVirtualView(context: Context) :
100103
super.onDetachedFromWindow()
101104
ReactScrollViewHelper.removeScrollListener(this)
102105
ReactScrollViewHelper.removeLayoutChangeListener(this)
103-
if (detectWindowFocus) {
106+
if (onWindowFocusChangeListener != null) {
104107
viewTreeObserver.removeOnWindowFocusChangeListener(onWindowFocusChangeListener)
105108
}
106109
cleanupLayoutListeners()
@@ -202,7 +205,7 @@ public class ReactVirtualView(context: Context) :
202205

203206
val newMode: VirtualViewMode
204207
if (rectsOverlap(targetRect, thresholdRect)) {
205-
if (detectWindowFocus) {
208+
if (onWindowFocusChangeListener != null) {
206209
if (hasWindowFocus()) {
207210
newMode = VirtualViewMode.Visible
208211
} else {

0 commit comments

Comments
 (0)