Skip to content

Commit 4e396a0

Browse files
committed
1 parent 6c22dc6 commit 4e396a0

File tree

7 files changed

+40
-22
lines changed

7 files changed

+40
-22
lines changed

packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateEntryPointTask.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,7 @@ abstract class GenerateEntryPointTask : DefaultTask() {
9797
DefaultNewArchitectureEntryPoint.load();
9898
}
9999
100-
if ({{packageName}}.BuildConfig.IS_EDGE_TO_EDGE_ENABLED) {
101-
WindowUtilKt.setEdgeToEdgeFeatureFlagOn();
102-
}
100+
WindowUtilKt.initEdgeToEdge(context, {{packageName}}.BuildConfig.IS_EDGE_TO_EDGE_ENABLED);
103101
}
104102
}
105103
"""

packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateEntryPointTaskTest.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,7 @@ class GenerateEntryPointTaskTest {
8080
DefaultNewArchitectureEntryPoint.load();
8181
}
8282
83-
if (com.facebook.react.BuildConfig.IS_EDGE_TO_EDGE_ENABLED) {
84-
WindowUtilKt.setEdgeToEdgeFeatureFlagOn();
85-
}
83+
WindowUtilKt.initEdgeToEdge(context, com.facebook.react.BuildConfig.IS_EDGE_TO_EDGE_ENABLED);
8684
}
8785
}
8886
"""

packages/react-native/ReactAndroid/api/ReactAndroid.api

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6537,7 +6537,8 @@ public final class com/facebook/react/views/view/ReactViewManager$Companion {
65376537

65386538
public final class com/facebook/react/views/view/WindowUtilKt {
65396539
public static final fun isEdgeToEdgeFeatureFlagOn ()Z
6540-
public static final fun setEdgeToEdgeFeatureFlagOn ()V
6540+
public static final fun isEdgeToEdge ()Z
6541+
public static final fun initEdgeToEdge (Landroid/content/Context;Z)V
65416542
}
65426543

65436544
public final class com/facebook/react/views/virtual/VirtualViewMode : java/lang/Enum {

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
@@ -22,7 +22,7 @@ import com.facebook.react.bridge.WritableNativeMap
2222
import com.facebook.react.module.annotations.ReactModule
2323
import com.facebook.react.uimanager.DisplayMetricsHolder.getScreenDisplayMetrics
2424
import com.facebook.react.uimanager.DisplayMetricsHolder.initDisplayMetricsIfNotInitialized
25-
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
25+
import com.facebook.react.views.view.isEdgeToEdge
2626

2727
/** Module that exposes Android Constants to JS. */
2828
@ReactModule(name = NativeDeviceInfoSpec.NAME)
@@ -91,7 +91,7 @@ internal class DeviceInfoModule(reactContext: ReactApplicationContext) :
9191

9292
return mapOf(
9393
"Dimensions" to displayMetrics.toHashMap(),
94-
"isEdgeToEdge" to isEdgeToEdgeFeatureFlagOn,
94+
"isEdgeToEdge" to isEdgeToEdge,
9595
)
9696
}
9797

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.isEdgeToEdgeFeatureFlagOn
26+
import com.facebook.react.views.view.isEdgeToEdge
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 (isEdgeToEdgeFeatureFlagOn) {
59+
if (isEdgeToEdge) {
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 (isEdgeToEdgeFeatureFlagOn) {
96+
if (isEdgeToEdge) {
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.isEdgeToEdgeFeatureFlagOn
56+
import com.facebook.react.views.view.isEdgeToEdge
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 || isEdgeToEdgeFeatureFlagOn
84+
get() = field || isEdgeToEdge
8585
set(value) {
8686
field = value
87-
createNewDialog = createNewDialog || !isEdgeToEdgeFeatureFlagOn
87+
createNewDialog = createNewDialog || !isEdgeToEdge
8888
}
8989

9090
public var navigationBarTranslucent: Boolean = false
91-
get() = field || isEdgeToEdgeFeatureFlagOn
91+
get() = field || isEdgeToEdge
9292
set(value) {
9393
field = value
94-
createNewDialog = createNewDialog || !isEdgeToEdgeFeatureFlagOn
94+
createNewDialog = createNewDialog || !isEdgeToEdge
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 (isEdgeToEdgeFeatureFlagOn) {
431+
if (isEdgeToEdge) {
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: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package com.facebook.react.views.view
99

10+
import android.content.Context
1011
import android.graphics.Color
1112
import android.os.Build
1213
import android.view.Window
@@ -33,8 +34,28 @@ internal val DarkNavigationBarColor = Color.argb(0x80, 0x1b, 0x1b, 0x1b)
3334
public var isEdgeToEdgeFeatureFlagOn: Boolean = false
3435
private set
3536

36-
public fun setEdgeToEdgeFeatureFlagOn() {
37-
isEdgeToEdgeFeatureFlagOn = true
37+
/**
38+
* Whether edge-to-edge is enforced. Computed once in [initEdgeToEdge], based on:
39+
* - The device is running Android 16+ (where edge-to-edge is always enforced)
40+
* - The edge-to-edge feature flag has been explicitly enabled
41+
* - The device is running Android 15 (API 35) without opting out
42+
*/
43+
public var isEdgeToEdge: Boolean = false
44+
private set
45+
46+
public fun initEdgeToEdge(context: Context, flag: Boolean) {
47+
isEdgeToEdgeFeatureFlagOn = flag
48+
isEdgeToEdge =
49+
when {
50+
Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA || flag -> true
51+
Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM -> false
52+
else ->
53+
context.theme
54+
.obtainStyledAttributes(
55+
intArrayOf(android.R.attr.windowOptOutEdgeToEdgeEnforcement)
56+
)
57+
.use { !it.getBoolean(0, false) }
58+
}
3859
}
3960

4061
@Suppress("DEPRECATION")
@@ -67,7 +88,7 @@ internal fun Window.setStatusBarVisibility(isHidden: Boolean) {
6788

6889
@Suppress("DEPRECATION")
6990
private fun Window.statusBarHide() {
70-
if (isEdgeToEdgeFeatureFlagOn) {
91+
if (isEdgeToEdge) {
7192
WindowInsetsControllerCompat(this, decorView).run {
7293
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
7394
hide(WindowInsetsCompat.Type.statusBars())
@@ -86,7 +107,7 @@ private fun Window.statusBarHide() {
86107

87108
@Suppress("DEPRECATION")
88109
private fun Window.statusBarShow() {
89-
if (isEdgeToEdgeFeatureFlagOn) {
110+
if (isEdgeToEdge) {
90111
WindowInsetsControllerCompat(this, decorView).run {
91112
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
92113
show(WindowInsetsCompat.Type.statusBars())

0 commit comments

Comments
 (0)