From 1e51431e1cadb85bc69fea26fa8e151cefc6dedf Mon Sep 17 00:00:00 2001 From: Mathieu Acthernoene Date: Tue, 28 Apr 2026 11:40:10 +0200 Subject: [PATCH] Remove getWindowDisplayMetrics from DisplayMetricsHolder --- .../ReactAndroid/api/ReactAndroid.api | 3 -- .../react/uimanager/DisplayMetricsHolder.kt | 50 +------------------ .../react/views/text/TextLayoutManager.kt | 2 +- .../uimanager/DisplayMetricsHolderTest.kt | 43 ---------------- .../facebook/react/uimanager/PixelUtilTest.kt | 6 --- 5 files changed, 2 insertions(+), 102 deletions(-) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 024da3c221b3..6fc86f3c0509 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -3284,13 +3284,10 @@ public abstract class com/facebook/react/uimanager/BaseViewManagerDelegate : com public final class com/facebook/react/uimanager/DisplayMetricsHolder { public static final field INSTANCE Lcom/facebook/react/uimanager/DisplayMetricsHolder; - public static final fun getDisplayMetricsWritableMap (D)Lcom/facebook/react/bridge/WritableMap; public static final fun getScreenDisplayMetrics ()Landroid/util/DisplayMetrics; - public static final fun getWindowDisplayMetrics ()Landroid/util/DisplayMetrics; public static final fun initDisplayMetrics (Landroid/content/Context;)V public static final fun initDisplayMetricsIfNotInitialized (Landroid/content/Context;)V public static final fun setScreenDisplayMetrics (Landroid/util/DisplayMetrics;)V - public static final fun setWindowDisplayMetrics (Landroid/util/DisplayMetrics;)V } public final class com/facebook/react/uimanager/FloatUtil { 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 29c9429ac779..7382c3650aeb 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 @@ -14,8 +14,6 @@ import android.util.DisplayMetrics import android.view.WindowManager import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat -import com.facebook.react.bridge.WritableMap -import com.facebook.react.bridge.WritableNativeMap import com.facebook.react.uimanager.PixelUtil.pxToDp /** @@ -26,23 +24,8 @@ public object DisplayMetricsHolder { private const val INITIALIZATION_MISSING_MESSAGE = "DisplayMetricsHolder must be initialized with initDisplayMetricsIfNotInitialized or initDisplayMetrics" - @JvmStatic private var windowDisplayMetrics: DisplayMetrics? = null @JvmStatic private var screenDisplayMetrics: DisplayMetrics? = null - // TODO(0.87): Remove once we are out of the non-breaking window (see 8d21ffda60) - /** The metrics of the window associated to the Context used to initialize ReactNative */ - @JvmStatic - public fun getWindowDisplayMetrics(): DisplayMetrics { - checkNotNull(windowDisplayMetrics) { INITIALIZATION_MISSING_MESSAGE } - return windowDisplayMetrics as DisplayMetrics - } - - // TODO(0.87): Remove once we are out of the non-breaking window (see 8d21ffda60) - @JvmStatic - public fun setWindowDisplayMetrics(displayMetrics: DisplayMetrics?) { - windowDisplayMetrics = displayMetrics - } - /** Screen metrics returns the metrics of the default screen on the device. */ @JvmStatic public fun getScreenDisplayMetrics(): DisplayMetrics { @@ -64,11 +47,10 @@ public object DisplayMetricsHolder { } @JvmStatic - @SuppressLint("DeprecatedMethod") // for Andriod Lint + @SuppressLint("DeprecatedMethod") // for Android Lint @Suppress("DEPRECATION") // for Kotlin compiler public fun initDisplayMetrics(context: Context) { val displayMetrics = context.resources.displayMetrics - windowDisplayMetrics = displayMetrics val screenDisplayMetrics = DisplayMetrics() screenDisplayMetrics.setTo(displayMetrics) try { @@ -86,36 +68,6 @@ public object DisplayMetricsHolder { DisplayMetricsHolder.screenDisplayMetrics = screenDisplayMetrics } - // TODO(0.87): Remove once we are out of the non-breaking window (see 8d21ffda60) - @JvmStatic - public fun getDisplayMetricsWritableMap(fontScale: Double): WritableMap { - checkNotNull(windowDisplayMetrics) { INITIALIZATION_MISSING_MESSAGE } - checkNotNull(screenDisplayMetrics) { INITIALIZATION_MISSING_MESSAGE } - - return WritableNativeMap().apply { - putMap( - "windowPhysicalPixels", - getPhysicalPixelsWritableMap(windowDisplayMetrics as DisplayMetrics, fontScale), - ) - putMap( - "screenPhysicalPixels", - getPhysicalPixelsWritableMap(screenDisplayMetrics as DisplayMetrics, fontScale), - ) - } - } - - private fun getPhysicalPixelsWritableMap( - displayMetrics: DisplayMetrics, - fontScale: Double, - ): WritableMap = - WritableNativeMap().apply { - putInt("width", displayMetrics.widthPixels) - putInt("height", displayMetrics.heightPixels) - putDouble("scale", displayMetrics.density.toDouble()) - putDouble("fontScale", fontScale) - putDouble("densityDpi", displayMetrics.densityDpi.toDouble()) - } - internal fun getStatusBarHeightPx(activity: Activity?): Int { val windowInsets = activity?.window?.decorView?.let(ViewCompat::getRootWindowInsets) ?: return 0 return windowInsets diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt index f2c88294f656..c1d7a6952030 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt @@ -1333,7 +1333,7 @@ internal object TextLayoutManager { return FontMetricsUtil.getFontMetrics( layout.text, layout, - DisplayMetricsHolder.getWindowDisplayMetrics(), + DisplayMetricsHolder.getScreenDisplayMetrics(), ) } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/DisplayMetricsHolderTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/DisplayMetricsHolderTest.kt index 6b2137c1ba5d..e6e0858c45f7 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/DisplayMetricsHolderTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/DisplayMetricsHolderTest.kt @@ -17,7 +17,6 @@ import android.view.View import android.view.Window import android.view.WindowInsets import androidx.annotation.RequiresApi -import com.facebook.react.bridge.WritableMap import com.facebook.testutils.shadows.ShadowNativeLoader import com.facebook.testutils.shadows.ShadowNativeMap import com.facebook.testutils.shadows.ShadowReadableNativeMap @@ -55,33 +54,19 @@ class DisplayMetricsHolderTest { fun setUp() { context = RuntimeEnvironment.getApplication() displayMetrics = context.resources.displayMetrics - DisplayMetricsHolder.setWindowDisplayMetrics(null) DisplayMetricsHolder.setScreenDisplayMetrics(null) } @After fun tearDown() { - DisplayMetricsHolder.setWindowDisplayMetrics(null) DisplayMetricsHolder.setScreenDisplayMetrics(null) } - @Test(expected = IllegalStateException::class) - fun getWindowDisplayMetrics_failsIfDisplayMetricsIsNotInitialized() { - DisplayMetricsHolder.getWindowDisplayMetrics() - } - @Test(expected = IllegalStateException::class) fun getScreenDisplayMetrics_failsIfDisplayMetricsIsNotInitialized() { DisplayMetricsHolder.getScreenDisplayMetrics() } - @Test - fun setAndGetWindowDisplayMetrics_returnsSetValue() { - DisplayMetricsHolder.setWindowDisplayMetrics(displayMetrics) - val result = DisplayMetricsHolder.getWindowDisplayMetrics() - assertThat(result).isEqualTo(displayMetrics) - } - @Test fun setAndGetScreenDisplayMetrics_returnsSetValue() { DisplayMetricsHolder.setScreenDisplayMetrics(displayMetrics) @@ -92,46 +77,19 @@ class DisplayMetricsHolderTest { @Test fun initDisplayMetrics_setsMetrics() { DisplayMetricsHolder.initDisplayMetrics(context) - assertThat(DisplayMetricsHolder.getWindowDisplayMetrics()).isNotNull() assertThat(DisplayMetricsHolder.getScreenDisplayMetrics()).isNotNull() } @Test fun initDisplayMetricsIfNotInitialized_onlyInitializesOnce() { DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(context) - val firstWindow = DisplayMetricsHolder.getWindowDisplayMetrics() val firstScreen = DisplayMetricsHolder.getScreenDisplayMetrics() // Should not reinitialize DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(context) - val secondWindow = DisplayMetricsHolder.getWindowDisplayMetrics() val secondScreen = DisplayMetricsHolder.getScreenDisplayMetrics() - assertThat(secondWindow).isEqualTo(firstWindow) assertThat(secondScreen).isEqualTo(firstScreen) } - @Test(expected = IllegalStateException::class) - fun getDisplayMetricsWritableMap_failsIfNotInitialized() { - DisplayMetricsHolder.getDisplayMetricsWritableMap(1.0) - } - - @Test - fun getDisplayMetricsWritableMap_returnsCorrectMap() { - // Use the official initialization method to ensure both metrics are set - DisplayMetricsHolder.initDisplayMetrics(context) - val map: WritableMap = DisplayMetricsHolder.getDisplayMetricsWritableMap(1.0) - assertThat(map.hasKey("windowPhysicalPixels")).isTrue() - assertThat(map.hasKey("screenPhysicalPixels")).isTrue() - val windowMap = map.getMap("windowPhysicalPixels") - val screenMap = map.getMap("screenPhysicalPixels") - checkNotNull(windowMap) - checkNotNull(screenMap) - assertThat(windowMap.hasKey("width")).isTrue() - assertThat(windowMap.hasKey("height")).isTrue() - assertThat(windowMap.hasKey("scale")).isTrue() - assertThat(windowMap.hasKey("fontScale")).isTrue() - assertThat(windowMap.hasKey("densityDpi")).isTrue() - } - @Test @RequiresApi(30) fun getEncodedScreenSizeWithoutVerticalInsets_returnsEncodedValue() { @@ -204,7 +162,6 @@ class DisplayMetricsHolderTest { DisplayMetricsHolder.initDisplayMetrics(mockContext) // Metrics should still be set from resource display metrics - assertThat(DisplayMetricsHolder.getWindowDisplayMetrics()).isNotNull() assertThat(DisplayMetricsHolder.getScreenDisplayMetrics()).isNotNull() } } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/PixelUtilTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/PixelUtilTest.kt index 3c3aa3f15d93..46ae613601d3 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/PixelUtilTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/PixelUtilTest.kt @@ -37,13 +37,11 @@ class PixelUtilTest { @Before fun setUp() { context = RuntimeEnvironment.getApplication() - DisplayMetricsHolder.setWindowDisplayMetrics(null) DisplayMetricsHolder.setScreenDisplayMetrics(null) } @After fun tearDown() { - DisplayMetricsHolder.setWindowDisplayMetrics(null) DisplayMetricsHolder.setScreenDisplayMetrics(null) } @@ -57,7 +55,6 @@ class PixelUtilTest { displayMetrics.heightPixels = 1920 displayMetrics.densityDpi = DisplayMetrics.DENSITY_XXHIGH - DisplayMetricsHolder.setWindowDisplayMetrics(displayMetrics) DisplayMetricsHolder.setScreenDisplayMetrics(displayMetrics) // Test that toPixelFromSP respects fontScale < 1.0 @@ -80,7 +77,6 @@ class PixelUtilTest { displayMetrics.heightPixels = 1920 displayMetrics.densityDpi = DisplayMetrics.DENSITY_XXHIGH - DisplayMetricsHolder.setWindowDisplayMetrics(displayMetrics) DisplayMetricsHolder.setScreenDisplayMetrics(displayMetrics) // Test that toPixelFromSP respects fontScale > 1.0 @@ -103,7 +99,6 @@ class PixelUtilTest { displayMetrics.heightPixels = 1920 displayMetrics.densityDpi = DisplayMetrics.DENSITY_XXHIGH - DisplayMetricsHolder.setWindowDisplayMetrics(displayMetrics) DisplayMetricsHolder.setScreenDisplayMetrics(displayMetrics) // Test that maxFontScale limits the scaling @@ -128,7 +123,6 @@ class PixelUtilTest { displayMetrics.heightPixels = 1920 displayMetrics.densityDpi = DisplayMetrics.DENSITY_XXHIGH - DisplayMetricsHolder.setWindowDisplayMetrics(displayMetrics) DisplayMetricsHolder.setScreenDisplayMetrics(displayMetrics) // Test that maxFontScale doesn't prevent scaling down