Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,7 @@ abstract class GenerateEntryPointTask : DefaultTask() {
DefaultNewArchitectureEntryPoint.load();
}

if ({{packageName}}.BuildConfig.IS_EDGE_TO_EDGE_ENABLED) {
WindowUtilKt.setEdgeToEdgeFeatureFlagOn();
}
WindowUtilKt.initEdgeToEdge(context, {{packageName}}.BuildConfig.IS_EDGE_TO_EDGE_ENABLED);
}
}
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,7 @@ class GenerateEntryPointTaskTest {
DefaultNewArchitectureEntryPoint.load();
}

if (com.facebook.react.BuildConfig.IS_EDGE_TO_EDGE_ENABLED) {
WindowUtilKt.setEdgeToEdgeFeatureFlagOn();
}
WindowUtilKt.initEdgeToEdge(context, com.facebook.react.BuildConfig.IS_EDGE_TO_EDGE_ENABLED);
}
}
"""
Expand Down
3 changes: 2 additions & 1 deletion packages/react-native/ReactAndroid/api/ReactAndroid.api
Original file line number Diff line number Diff line change
Expand Up @@ -6540,7 +6540,8 @@ public final class com/facebook/react/views/view/ReactViewManager$Companion {

public final class com/facebook/react/views/view/WindowUtilKt {
public static final fun isEdgeToEdgeFeatureFlagOn ()Z
public static final fun setEdgeToEdgeFeatureFlagOn ()V
public static final fun isEdgeToEdge ()Z
public static final fun initEdgeToEdge (Landroid/content/Context;Z)V
}

public final class com/facebook/react/views/virtual/VirtualViewMode : java/lang/Enum {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import com.facebook.react.bridge.ReadableMap
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.uimanager.DisplayMetricsHolder.getDisplayMetricsWritableMap
import com.facebook.react.uimanager.DisplayMetricsHolder.initDisplayMetricsIfNotInitialized
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
import com.facebook.react.views.view.isEdgeToEdge

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

return mapOf(
"Dimensions" to displayMetrics.toHashMap(),
"isEdgeToEdge" to isEdgeToEdgeFeatureFlagOn,
"isEdgeToEdge" to isEdgeToEdge,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import com.facebook.react.common.ReactConstants
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.uimanager.DisplayMetricsHolder.getStatusBarHeightPx
import com.facebook.react.uimanager.PixelUtil
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
import com.facebook.react.views.view.isEdgeToEdge
import com.facebook.react.views.view.setStatusBarTranslucency
import com.facebook.react.views.view.setStatusBarVisibility

Expand Down Expand Up @@ -56,7 +56,7 @@ internal class StatusBarModule(reactContext: ReactApplicationContext?) :
)
return
}
if (isEdgeToEdgeFeatureFlagOn) {
if (isEdgeToEdge) {
FLog.w(
ReactConstants.TAG,
"StatusBarModule: Ignored status bar change, current activity is edge-to-edge.",
Expand Down Expand Up @@ -93,7 +93,7 @@ internal class StatusBarModule(reactContext: ReactApplicationContext?) :
)
return
}
if (isEdgeToEdgeFeatureFlagOn) {
if (isEdgeToEdge) {
FLog.w(
ReactConstants.TAG,
"StatusBarModule: Ignored status bar change, current activity is edge-to-edge.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ import com.facebook.react.views.common.ContextUtils
import com.facebook.react.views.view.ReactViewGroup
import com.facebook.react.views.view.disableEdgeToEdge
import com.facebook.react.views.view.enableEdgeToEdge
import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
import com.facebook.react.views.view.isEdgeToEdge
import com.facebook.react.views.view.setStatusBarTranslucency

/**
Expand Down Expand Up @@ -81,17 +81,17 @@ public class ReactModalHostView(context: ThemedReactContext) :
public var onRequestCloseListener: OnRequestCloseListener? = null

public var statusBarTranslucent: Boolean = false
get() = field || isEdgeToEdgeFeatureFlagOn
get() = field || isEdgeToEdge
set(value) {
field = value
createNewDialog = createNewDialog || !isEdgeToEdgeFeatureFlagOn
createNewDialog = createNewDialog || !isEdgeToEdge
}

public var navigationBarTranslucent: Boolean = false
get() = field || isEdgeToEdgeFeatureFlagOn
get() = field || isEdgeToEdge
set(value) {
field = value
createNewDialog = createNewDialog || !isEdgeToEdgeFeatureFlagOn
createNewDialog = createNewDialog || !isEdgeToEdge
}

public var animationType: String? = null
Expand Down Expand Up @@ -428,7 +428,7 @@ public class ReactModalHostView(context: ThemedReactContext) :
val dialogWindowInsetsController =
WindowInsetsControllerCompat(dialogWindow, dialogWindow.decorView)

if (isEdgeToEdgeFeatureFlagOn) {
if (isEdgeToEdge) {
activityWindowInsetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
dialogWindowInsetsController.systemBarsBehavior =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

package com.facebook.react.views.view

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

public fun setEdgeToEdgeFeatureFlagOn() {
isEdgeToEdgeFeatureFlagOn = true
/**
* Whether edge-to-edge is enforced. Computed once in [initEdgeToEdge], based on:
* - The device is running Android 16+ (where edge-to-edge is always enforced)
* - The edge-to-edge feature flag has been explicitly enabled
* - The device is running Android 15 (API 35) without opting out
*/
public var isEdgeToEdge: Boolean = false
private set

public fun initEdgeToEdge(context: Context, flag: Boolean) {
isEdgeToEdgeFeatureFlagOn = flag
isEdgeToEdge =
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA || flag -> true
Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM -> false
else ->
context.theme
.obtainStyledAttributes(
intArrayOf(android.R.attr.windowOptOutEdgeToEdgeEnforcement)
)
.use { !it.getBoolean(0, false) }
}
}

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

@Suppress("DEPRECATION")
private fun Window.statusBarHide() {
if (isEdgeToEdgeFeatureFlagOn) {
if (isEdgeToEdge) {
WindowInsetsControllerCompat(this, decorView).run {
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
hide(WindowInsetsCompat.Type.statusBars())
Expand All @@ -86,7 +107,7 @@ private fun Window.statusBarHide() {

@Suppress("DEPRECATION")
private fun Window.statusBarShow() {
if (isEdgeToEdgeFeatureFlagOn) {
if (isEdgeToEdge) {
WindowInsetsControllerCompat(this, decorView).run {
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
show(WindowInsetsCompat.Type.statusBars())
Expand Down
Loading