From 9c4da7b9057bde70a135f1e272f7f466f02f350d Mon Sep 17 00:00:00 2001 From: Mathieu Acthernoene Date: Thu, 3 Jul 2025 11:37:55 -0700 Subject: [PATCH] Fix Dimensions window values on Android < 15 (#47554) Summary: This PR (initially created for edge-to-edge opt-in support, rebased multiple times) fixes the `Dimensions` API `window` values on Android < 15, when edge-to-edge is enabled. Currently the window height doesn't include the status and navigation bar heights (but it does on Android >= 15): Screenshot 2025-06-27 at 16 23 02 Using `WindowMetricsCalculator` from AndroidX: Screenshot 2025-06-27 at 16 34 01 Fixes https://github.com/facebook/react-native/issues/47080 ## Changelog: [Android] [Fixed] Fix `Dimensions` `window` values on Android < 15 when edge-to-edge is enabled Pull Request resolved: https://github.com/facebook/react-native/pull/47554 Test Plan: Run the example app on an Android < 15 device. Rollback Plan: Reviewed By: cortinico Differential Revision: D77547628 Pulled By: alanleedev fbshipit-source-id: 9d841f642d5b7ef3294dfbf3868137087a672ad6 --- .../react-native/ReactAndroid/build.gradle.kts | 1 + .../react/uimanager/DisplayMetricsHolder.kt | 16 +++++++++++++++- packages/react-native/gradle/libs.versions.toml | 2 ++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index a24a08ceed9..1e9fef41e96 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -620,6 +620,7 @@ dependencies { api(libs.androidx.autofill) api(libs.androidx.swiperefreshlayout) api(libs.androidx.tracing) + api(libs.androidx.window) api(libs.fbjni) api(libs.fresco) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/DisplayMetricsHolder.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/DisplayMetricsHolder.kt index 9f6c9310a69..994990b83c4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/DisplayMetricsHolder.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/DisplayMetricsHolder.kt @@ -13,8 +13,10 @@ import android.util.DisplayMetrics import android.view.WindowManager import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.window.layout.WindowMetricsCalculator import com.facebook.react.bridge.WritableMap import com.facebook.react.bridge.WritableNativeMap +import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn /** * Holds an instance of the current DisplayMetrics so we don't have to thread it through all the @@ -62,9 +64,19 @@ public object DisplayMetricsHolder { @JvmStatic public fun initDisplayMetrics(context: Context) { val displayMetrics = context.resources.displayMetrics - windowDisplayMetrics = displayMetrics + val windowDisplayMetrics = DisplayMetrics() val screenDisplayMetrics = DisplayMetrics() + + windowDisplayMetrics.setTo(displayMetrics) screenDisplayMetrics.setTo(displayMetrics) + + if (isEdgeToEdgeFeatureFlagOn) { + WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(context).let { + windowDisplayMetrics.widthPixels = it.bounds.width() + windowDisplayMetrics.heightPixels = it.bounds.height() + } + } + val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager // Get the real display metrics if we are using API level 17 or higher. // The real metrics include system decor elements (e.g. soft menu bar). @@ -72,6 +84,8 @@ public object DisplayMetricsHolder { // See: // http://developer.android.com/reference/android/view/Display.html#getRealMetrics(android.util.DisplayMetrics) @Suppress("DEPRECATION") wm.defaultDisplay.getRealMetrics(screenDisplayMetrics) + + DisplayMetricsHolder.windowDisplayMetrics = windowDisplayMetrics DisplayMetricsHolder.screenDisplayMetrics = screenDisplayMetrics } diff --git a/packages/react-native/gradle/libs.versions.toml b/packages/react-native/gradle/libs.versions.toml index f0902b7441d..db117f7dfc8 100644 --- a/packages/react-native/gradle/libs.versions.toml +++ b/packages/react-native/gradle/libs.versions.toml @@ -16,6 +16,7 @@ androidx-swiperefreshlayout = "1.1.0" androidx-test = "1.5.0" androidx-test-junit = "1.2.1" androidx-tracing = "1.1.0" +androidx-window = "1.4.0" assertj = "3.21.0" binary-compatibility-validator = "0.13.2" download = "5.4.0" @@ -63,6 +64,7 @@ androidx-test-rules = { module = "androidx.test:rules", version.ref = "androidx- androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test" } androidx-tracing = { module = "androidx.tracing:tracing", version.ref = "androidx-tracing" } androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" } +androidx-window = { module = "androidx.window:window", version.ref = "androidx-window" } fbjni = { module = "com.facebook.fbjni:fbjni", version.ref = "fbjni" } fresco = { module = "com.facebook.fresco:fresco", version.ref = "fresco" }