Skip to content

Commit 6245a67

Browse files
committed
Remove isDeviceRunningEdgeToEdge
1 parent acacab6 commit 6245a67

4 files changed

Lines changed: 28 additions & 33 deletions

File tree

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import com.facebook.react.bridge.ReadableMap
1616
import com.facebook.react.module.annotations.ReactModule
1717
import com.facebook.react.uimanager.DisplayMetricsHolder.getDisplayMetricsWritableMap
1818
import com.facebook.react.uimanager.DisplayMetricsHolder.initDisplayMetricsIfNotInitialized
19-
import com.facebook.react.views.view.isDeviceRunningEdgeToEdge
19+
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
2020

2121
/** Module that exposes Android Constants to JS. */
2222
@ReactModule(name = NativeDeviceInfoSpec.NAME)
@@ -38,7 +38,7 @@ internal class DeviceInfoModule(reactContext: ReactApplicationContext) :
3838

3939
return mapOf(
4040
"Dimensions" to displayMetrics.toHashMap(),
41-
"isEdgeToEdge" to isDeviceRunningEdgeToEdge,
41+
"isEdgeToEdge" to isEdgeToEdgeFeatureFlagOn,
4242
)
4343
}
4444

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/statusbar/StatusBarModule.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import com.facebook.react.common.ReactConstants
2323
import com.facebook.react.module.annotations.ReactModule
2424
import com.facebook.react.uimanager.DisplayMetricsHolder.getStatusBarHeightPx
2525
import com.facebook.react.uimanager.PixelUtil
26-
import com.facebook.react.views.view.isDeviceRunningEdgeToEdge
26+
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
2727
import com.facebook.react.views.view.setStatusBarTranslucency
2828
import com.facebook.react.views.view.setStatusBarVisibility
2929

@@ -56,7 +56,7 @@ internal class StatusBarModule(reactContext: ReactApplicationContext?) :
5656
)
5757
return
5858
}
59-
if (isDeviceRunningEdgeToEdge) {
59+
if (isEdgeToEdgeFeatureFlagOn) {
6060
FLog.w(
6161
ReactConstants.TAG,
6262
"StatusBarModule: Ignored status bar change, current activity is edge-to-edge.",
@@ -93,7 +93,7 @@ internal class StatusBarModule(reactContext: ReactApplicationContext?) :
9393
)
9494
return
9595
}
96-
if (isDeviceRunningEdgeToEdge) {
96+
if (isEdgeToEdgeFeatureFlagOn) {
9797
FLog.w(
9898
ReactConstants.TAG,
9999
"StatusBarModule: Ignored status bar change, current activity is edge-to-edge.",

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import com.facebook.react.views.common.ContextUtils
5353
import com.facebook.react.views.view.ReactViewGroup
5454
import com.facebook.react.views.view.disableEdgeToEdge
5555
import com.facebook.react.views.view.enableEdgeToEdge
56-
import com.facebook.react.views.view.isDeviceRunningEdgeToEdge
56+
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
5757
import com.facebook.react.views.view.setStatusBarTranslucency
5858

5959
/**
@@ -81,17 +81,17 @@ public class ReactModalHostView(context: ThemedReactContext) :
8181
public var onRequestCloseListener: OnRequestCloseListener? = null
8282

8383
public var statusBarTranslucent: Boolean = false
84-
get() = field || isDeviceRunningEdgeToEdge
84+
get() = field || isEdgeToEdgeFeatureFlagOn
8585
set(value) {
8686
field = value
87-
createNewDialog = createNewDialog || !isDeviceRunningEdgeToEdge
87+
createNewDialog = createNewDialog || !isEdgeToEdgeFeatureFlagOn
8888
}
8989

9090
public var navigationBarTranslucent: Boolean = false
91-
get() = field || isDeviceRunningEdgeToEdge
91+
get() = field || isEdgeToEdgeFeatureFlagOn
9292
set(value) {
9393
field = value
94-
createNewDialog = createNewDialog || !isDeviceRunningEdgeToEdge
94+
createNewDialog = createNewDialog || !isEdgeToEdgeFeatureFlagOn
9595
}
9696

9797
public var animationType: String? = null
@@ -428,7 +428,7 @@ public class ReactModalHostView(context: ThemedReactContext) :
428428
val dialogWindowInsetsController =
429429
WindowInsetsControllerCompat(dialogWindow, dialogWindow.decorView)
430430

431-
if (isDeviceRunningEdgeToEdge) {
431+
if (isEdgeToEdgeFeatureFlagOn) {
432432
activityWindowInsetsController.systemBarsBehavior =
433433
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
434434
dialogWindowInsetsController.systemBarsBehavior =

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

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,6 @@ internal val LightNavigationBarColor = Color.argb(0xe6, 0xFF, 0xFF, 0xFF)
2828
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/res/remote_color_resources_res/values/colors.xml;l=67
2929
internal val DarkNavigationBarColor = Color.argb(0x80, 0x1b, 0x1b, 0x1b)
3030

31-
/**
32-
* Whether edge-to-edge is enforced. Computed once in [initEdgeToEdge], based on:
33-
* - The edge-to-edge feature flag has been explicitly enabled
34-
* - The device is running Android 16+ with targetSdk 35+ (where edge-to-edge is always enforced)
35-
* - The device is running Android 15 with targetSdk 35+ without opting out
36-
*/
37-
internal var isDeviceRunningEdgeToEdge: Boolean = false
38-
private set
39-
4031
/**
4132
* This does not enable or apply edge-to-edge behavior, it simply tracks whether it has been flagged
4233
* as enabled elsewhere in the application.
@@ -49,23 +40,27 @@ public fun setEdgeToEdgeFeatureFlagOn() {
4940
}
5041

5142
internal fun initEdgeToEdge(activity: Activity) {
52-
isDeviceRunningEdgeToEdge =
53-
when {
54-
!AndroidVersion.isAtLeastTargetSdk35(activity) -> isEdgeToEdgeFeatureFlagOn
55-
Build.VERSION.SDK_INT >= AndroidVersion.VERSION_CODE_BAKLAVA -> true
56-
else -> {
57-
val attributes = intArrayOf(AndroidVersion.ATTR_WINDOW_OPT_OUT_EDGE_TO_EDGE_ENFORCEMENT)
58-
val typedArray = activity.theme.obtainStyledAttributes(attributes)
59-
43+
// When the app targets SDK 35+, edge-to-edge may be enforced by the OS even if the
44+
// feature flag wasn't explicitly set. In that case, turn the flag on to match.
45+
if (AndroidVersion.isAtLeastTargetSdk35(activity)) {
46+
if (Build.VERSION.SDK_INT >= AndroidVersion.VERSION_CODE_BAKLAVA) {
47+
// The device is running Android 16+ (where edge-to-edge is always enforced)
48+
isEdgeToEdgeFeatureFlagOn = true
49+
} else {
50+
val attributes = intArrayOf(AndroidVersion.ATTR_WINDOW_OPT_OUT_EDGE_TO_EDGE_ENFORCEMENT)
51+
val typedArray = activity.theme.obtainStyledAttributes(attributes)
52+
53+
// The device is running Android 15 with / without opting out
54+
isEdgeToEdgeFeatureFlagOn =
6055
try {
6156
!typedArray.getBoolean(0, false)
6257
} finally {
6358
typedArray.recycle()
6459
}
65-
}
66-
}
60+
}
61+
}
6762

68-
if (isDeviceRunningEdgeToEdge) {
63+
if (isEdgeToEdgeFeatureFlagOn) {
6964
activity.window.enableEdgeToEdge()
7065
}
7166
}
@@ -100,7 +95,7 @@ internal fun Window.setStatusBarVisibility(isHidden: Boolean) {
10095

10196
@Suppress("DEPRECATION")
10297
private fun Window.statusBarHide() {
103-
if (isDeviceRunningEdgeToEdge) {
98+
if (isEdgeToEdgeFeatureFlagOn) {
10499
WindowInsetsControllerCompat(this, decorView).run {
105100
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
106101
hide(WindowInsetsCompat.Type.statusBars())
@@ -119,7 +114,7 @@ private fun Window.statusBarHide() {
119114

120115
@Suppress("DEPRECATION")
121116
private fun Window.statusBarShow() {
122-
if (isDeviceRunningEdgeToEdge) {
117+
if (isEdgeToEdgeFeatureFlagOn) {
123118
WindowInsetsControllerCompat(this, decorView).run {
124119
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
125120
show(WindowInsetsCompat.Type.statusBars())

0 commit comments

Comments
 (0)