Skip to content

Commit be7ec70

Browse files
committed
Fix measureInWindow on Android
1 parent 4a6c933 commit be7ec70

2 files changed

Lines changed: 35 additions & 7 deletions

File tree

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactSurfaceView.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import android.graphics.Rect
1515
import android.view.KeyEvent
1616
import android.view.MotionEvent
1717
import android.view.View
18+
import androidx.core.view.ViewCompat
19+
import androidx.core.view.WindowInsetsCompat
1820
import com.facebook.common.logging.FLog
1921
import com.facebook.react.ReactRootView
2022
import com.facebook.react.bridge.ReactContext
@@ -27,6 +29,7 @@ import com.facebook.react.uimanager.JSKeyDispatcher
2729
import com.facebook.react.uimanager.JSPointerDispatcher
2830
import com.facebook.react.uimanager.JSTouchDispatcher
2931
import com.facebook.react.uimanager.common.UIManagerType
32+
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
3033
import com.facebook.systrace.Systrace
3134
import java.util.Objects
3235
import kotlin.math.max
@@ -56,6 +59,21 @@ public class ReactSurfaceView(context: Context?, internal val surface: ReactSurf
5659
getWindowVisibleDisplayFrame(visibleWindowFrame)
5760
locationOnScreen[0] -= visibleWindowFrame.left
5861
locationOnScreen[1] -= visibleWindowFrame.top
62+
63+
if (isEdgeToEdgeFeatureFlagOn) {
64+
// In edge-to-edge mode the viewport spans the full window, so add the top system bar
65+
// insets back to convert the content-area offset above into a window-relative offset.
66+
ViewCompat.getRootWindowInsets(this)?.apply {
67+
val insets =
68+
getInsets(
69+
WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.displayCutout()
70+
)
71+
72+
locationOnScreen[0] += insets.left
73+
locationOnScreen[1] += insets.top
74+
}
75+
}
76+
5977
return Point(locationOnScreen[0], locationOnScreen[1])
6078
}
6179

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootViewUtil.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
package com.facebook.react.uimanager
99

1010
import android.graphics.Point
11-
import android.graphics.Rect
1211
import android.view.View
1312
import androidx.annotation.UiThread
13+
import androidx.core.view.ViewCompat
14+
import androidx.core.view.WindowInsetsCompat
1415
import com.facebook.infer.annotation.Assertions
16+
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
1517

1618
public object RootViewUtil {
1719
/** Returns the root view of a given view in a react application. */
@@ -34,12 +36,20 @@ public object RootViewUtil {
3436
val locationInWindow = IntArray(2)
3537
v.getLocationInWindow(locationInWindow)
3638

37-
// we need to subtract visibleWindowCoords - to subtract possible window insets, split
38-
// screen or multi window
39-
val visibleWindowFrame = Rect()
40-
v.getWindowVisibleDisplayFrame(visibleWindowFrame)
41-
locationInWindow[0] -= visibleWindowFrame.left
42-
locationInWindow[1] -= visibleWindowFrame.top
39+
if (!isEdgeToEdgeFeatureFlagOn) {
40+
// When not in edge-to-edge mode, subtract the top system bar insets so the offset is
41+
// relative to the content area (below the status bar / cutout).
42+
ViewCompat.getRootWindowInsets(v)?.apply {
43+
val insets =
44+
getInsets(
45+
WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.displayCutout()
46+
)
47+
48+
locationInWindow[0] -= insets.left
49+
locationInWindow[1] -= insets.top
50+
}
51+
}
52+
4353
return Point(locationInWindow[0], locationInWindow[1])
4454
}
4555
}

0 commit comments

Comments
 (0)