@@ -13,25 +13,29 @@ import android.util.DisplayMetrics
1313import android.view.WindowManager
1414import androidx.core.view.ViewCompat
1515import androidx.core.view.WindowInsetsCompat
16+ import androidx.window.layout.WindowMetricsCalculator
1617import com.facebook.react.bridge.WritableMap
1718import com.facebook.react.bridge.WritableNativeMap
1819import com.facebook.react.uimanager.PixelUtil.pxToDp
20+ import com.facebook.react.views.view.isEdgeToEdgeFeatureFlagOn
1921
2022/* *
2123 * Holds an instance of the current DisplayMetrics so we don't have to thread it through all the
2224 * classes that need it.
2325 */
2426public object DisplayMetricsHolder {
25- private const val INITIALIZATION_MISSING_MESSAGE =
26- " DisplayMetricsHolder must be initialized with initDisplayMetricsIfNotInitialized or initDisplayMetrics"
27+ private const val SCREEN_INITIALIZATION_MISSING_MESSAGE =
28+ " DisplayMetricsHolder must be initialized with initScreenDisplayMetricsIfNotInitialized or initScreenDisplayMetrics"
29+ private const val WINDOW_INITIALIZATION_MISSING_MESSAGE =
30+ " DisplayMetricsHolder must be initialized with initWindowDisplayMetricsIfNotInitialized or initWindowDisplayMetrics"
2731
2832 @JvmStatic private var windowDisplayMetrics: DisplayMetrics ? = null
2933 @JvmStatic private var screenDisplayMetrics: DisplayMetrics ? = null
3034
3135 /* * The metrics of the window associated to the Context used to initialize ReactNative */
3236 @JvmStatic
3337 public fun getWindowDisplayMetrics (): DisplayMetrics {
34- checkNotNull(windowDisplayMetrics) { INITIALIZATION_MISSING_MESSAGE }
38+ checkNotNull(windowDisplayMetrics) { WINDOW_INITIALIZATION_MISSING_MESSAGE }
3539 return windowDisplayMetrics as DisplayMetrics
3640 }
3741
@@ -43,7 +47,7 @@ public object DisplayMetricsHolder {
4347 /* * Screen metrics returns the metrics of the default screen on the device. */
4448 @JvmStatic
4549 public fun getScreenDisplayMetrics (): DisplayMetrics {
46- checkNotNull(screenDisplayMetrics) { INITIALIZATION_MISSING_MESSAGE }
50+ checkNotNull(screenDisplayMetrics) { SCREEN_INITIALIZATION_MISSING_MESSAGE }
4751 return screenDisplayMetrics as DisplayMetrics
4852 }
4953
@@ -53,33 +57,53 @@ public object DisplayMetricsHolder {
5357 }
5458
5559 @JvmStatic
56- public fun initDisplayMetricsIfNotInitialized (context : Context ) {
57- if (screenDisplayMetrics ! = null ) {
58- return
60+ public fun initScreenDisplayMetricsIfNotInitialized (context : Context ) {
61+ if (screenDisplayMetrics = = null ) {
62+ initScreenDisplayMetrics(context)
5963 }
60- initDisplayMetrics(context)
6164 }
6265
6366 @JvmStatic
64- public fun initDisplayMetrics (context : Context ) {
65- val displayMetrics = context.resources.displayMetrics
66- windowDisplayMetrics = displayMetrics
67- val screenDisplayMetrics = DisplayMetrics ()
68- screenDisplayMetrics.setTo(displayMetrics)
67+ public fun initWindowDisplayMetricsIfNotInitialized (context : Context ) {
68+ if (windowDisplayMetrics == null ) {
69+ initWindowDisplayMetrics(context)
70+ }
71+ }
72+
73+ @JvmStatic
74+ public fun initScreenDisplayMetrics (context : Context ) {
75+ val displayMetrics = DisplayMetrics ()
76+ displayMetrics.setTo(context.resources.displayMetrics)
77+
6978 val wm = context.getSystemService(Context .WINDOW_SERVICE ) as WindowManager
7079 // Get the real display metrics if we are using API level 17 or higher.
7180 // The real metrics include system decor elements (e.g. soft menu bar).
7281 //
7382 // See:
7483 // http://developer.android.com/reference/android/view/Display.html#getRealMetrics(android.util.DisplayMetrics)
75- @Suppress(" DEPRECATION" ) wm.defaultDisplay.getRealMetrics(screenDisplayMetrics)
76- DisplayMetricsHolder .screenDisplayMetrics = screenDisplayMetrics
84+ @Suppress(" DEPRECATION" ) wm.defaultDisplay.getRealMetrics(displayMetrics)
85+ screenDisplayMetrics = displayMetrics
86+ }
87+
88+ @JvmStatic
89+ public fun initWindowDisplayMetrics (context : Context ) {
90+ val displayMetrics = DisplayMetrics ()
91+ displayMetrics.setTo(context.resources.displayMetrics)
92+
93+ if (isEdgeToEdgeFeatureFlagOn) {
94+ WindowMetricsCalculator .getOrCreate().computeCurrentWindowMetrics(context).let {
95+ displayMetrics.widthPixels = it.bounds.width()
96+ displayMetrics.heightPixels = it.bounds.height()
97+ }
98+ }
99+
100+ windowDisplayMetrics = displayMetrics
77101 }
78102
79103 @JvmStatic
80104 public fun getDisplayMetricsWritableMap (fontScale : Double ): WritableMap {
81- checkNotNull(windowDisplayMetrics) { INITIALIZATION_MISSING_MESSAGE }
82- checkNotNull(screenDisplayMetrics) { INITIALIZATION_MISSING_MESSAGE }
105+ checkNotNull(windowDisplayMetrics) { WINDOW_INITIALIZATION_MISSING_MESSAGE }
106+ checkNotNull(screenDisplayMetrics) { SCREEN_INITIALIZATION_MISSING_MESSAGE }
83107
84108 return WritableNativeMap ().apply {
85109 putMap(
0 commit comments