From 0ef7a3224b66ad170610ed87e02c35b9ffc84ff1 Mon Sep 17 00:00:00 2001 From: Mathieu Acthernoene Date: Fri, 10 Apr 2026 16:56:10 +0200 Subject: [PATCH 1/4] Respect theme enforceNavigationBarContrast attribute --- .../facebook/react/views/view/WindowUtil.kt | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt index 0cff3bc458d8..6599f69cb6e8 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt @@ -106,23 +106,40 @@ private fun Window.statusBarShow() { internal fun Window.enableEdgeToEdge() { WindowCompat.setDecorFitsSystemWindows(this, false) + val insetsController = WindowInsetsControllerCompat(this, decorView) val isDarkMode = UiModeUtils.isDarkMode(context) + statusBarColor = Color.TRANSPARENT + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + navigationBarColor = Color.TRANSPARENT + + val attrs = intArrayOf(android.R.attr.enforceNavigationBarContrast) + val typedArray = context.theme.obtainStyledAttributes(attrs) + + val isContrastEnforced = + try { + typedArray.getBoolean(0, true) + } finally { + typedArray.recycle() + } + isStatusBarContrastEnforced = false - isNavigationBarContrastEnforced = true - } + isNavigationBarContrastEnforced = isContrastEnforced - statusBarColor = Color.TRANSPARENT - navigationBarColor = - when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> Color.TRANSPARENT - Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isDarkMode -> LightNavigationBarColor - else -> DarkNavigationBarColor - } - - WindowInsetsControllerCompat(this, decorView).run { - isAppearanceLightNavigationBars = !isDarkMode + if (isContrastEnforced) { + insetsController.isAppearanceLightNavigationBars = !isDarkMode + } + } else { + val isAppearanceLight = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isDarkMode + + navigationBarColor = + when { + isAppearanceLight -> LightNavigationBarColor + else -> DarkNavigationBarColor + } + + insetsController.isAppearanceLightNavigationBars = isAppearanceLight } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { From 8695ff0931365799fe5f13a9c9b69b5f29977894 Mon Sep 17 00:00:00 2001 From: Mathieu Acthernoene Date: Mon, 13 Apr 2026 10:20:32 +0200 Subject: [PATCH 2/4] Use if / else --- .../main/java/com/facebook/react/views/view/WindowUtil.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt index 6599f69cb6e8..ce539ca9b0e5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt @@ -132,13 +132,7 @@ internal fun Window.enableEdgeToEdge() { } } else { val isAppearanceLight = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isDarkMode - - navigationBarColor = - when { - isAppearanceLight -> LightNavigationBarColor - else -> DarkNavigationBarColor - } - + navigationBarColor = if (isAppearanceLight) LightNavigationBarColor else DarkNavigationBarColor insetsController.isAppearanceLightNavigationBars = isAppearanceLight } From eacb072a16ac7bb4bef5aa93c22b96b2916a5faa Mon Sep 17 00:00:00 2001 From: Mathieu Acthernoene Date: Mon, 13 Apr 2026 10:24:39 +0200 Subject: [PATCH 3/4] Rename variables to mention navigation bar --- .../com/facebook/react/views/view/WindowUtil.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt index ce539ca9b0e5..c27884ce36b1 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt @@ -117,7 +117,7 @@ internal fun Window.enableEdgeToEdge() { val attrs = intArrayOf(android.R.attr.enforceNavigationBarContrast) val typedArray = context.theme.obtainStyledAttributes(attrs) - val isContrastEnforced = + val enforceNavigationBarContrast = try { typedArray.getBoolean(0, true) } finally { @@ -125,15 +125,18 @@ internal fun Window.enableEdgeToEdge() { } isStatusBarContrastEnforced = false - isNavigationBarContrastEnforced = isContrastEnforced + isNavigationBarContrastEnforced = enforceNavigationBarContrast - if (isContrastEnforced) { + if (enforceNavigationBarContrast) { insetsController.isAppearanceLightNavigationBars = !isDarkMode } } else { - val isAppearanceLight = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isDarkMode - navigationBarColor = if (isAppearanceLight) LightNavigationBarColor else DarkNavigationBarColor - insetsController.isAppearanceLightNavigationBars = isAppearanceLight + val isAppearanceLightNavigationBars = + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isDarkMode + + navigationBarColor = + if (isAppearanceLightNavigationBars) LightNavigationBarColor else DarkNavigationBarColor + insetsController.isAppearanceLightNavigationBars = isAppearanceLightNavigationBars } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { From 2f72ed3f03afe52e8cedbbb70722466c03eb5ff9 Mon Sep 17 00:00:00 2001 From: Mathieu Acthernoene Date: Mon, 13 Apr 2026 10:28:03 +0200 Subject: [PATCH 4/4] Rename attrs -> attributes --- .../src/main/java/com/facebook/react/views/view/WindowUtil.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt index c27884ce36b1..bac3acc79a7c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt @@ -114,8 +114,8 @@ internal fun Window.enableEdgeToEdge() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { navigationBarColor = Color.TRANSPARENT - val attrs = intArrayOf(android.R.attr.enforceNavigationBarContrast) - val typedArray = context.theme.obtainStyledAttributes(attrs) + val attributes = intArrayOf(android.R.attr.enforceNavigationBarContrast) + val typedArray = context.theme.obtainStyledAttributes(attributes) val enforceNavigationBarContrast = try {