diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.kt index 5f5f5a4308ef..2d20ced6fb33 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.kt @@ -43,7 +43,19 @@ internal class DeviceInfoModule(reactContext: ReactApplicationContext) : windowDisplayMetrics.setTo(reactApplicationContext.resources.displayMetrics) val activity = reactApplicationContext.currentActivity ?: return windowDisplayMetrics - val bounds = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(activity).bounds + val bounds = + try { + WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(activity).bounds + } catch (error: NoSuchMethodError) { + ReactSoftExceptionLogger.logSoftException( + NAME, + ReactNoCrashSoftException( + "WindowMetrics API is unavailable; falling back to resource display metrics.", + error, + ), + ) + return windowDisplayMetrics + } if (isEdgeToEdgeFeatureFlagOn) { windowDisplayMetrics.widthPixels = bounds.width() diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt index a0d5b7de8acd..a609d5b5d368 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt @@ -208,6 +208,26 @@ class DeviceInfoModuleTest : TestCase() { } } + @Test + fun getWindowDisplayMetrics_fallsBackWhenWindowMetricsApiIsMissing() { + val activity = mock() + doReturn(activity).whenever(reactContext).currentActivity + + val calculator = mock() + whenever(calculator.computeCurrentWindowMetrics(activity)) + .thenThrow(NoSuchMethodError("WindowMetrics.getDensity()")) + + withWindowMetricsCalculator(calculator) { + val resourceMetrics = reactContext.resources.displayMetrics + val metrics = deviceInfoModule.getWindowDisplayMetrics() + + assertThat(metrics.widthPixels).isEqualTo(resourceMetrics.widthPixels) + assertThat(metrics.heightPixels).isEqualTo(resourceMetrics.heightPixels) + assertThat(metrics.density).isEqualTo(resourceMetrics.density) + assertThat(metrics.densityDpi).isEqualTo(resourceMetrics.densityDpi) + } + } + private fun givenDisplayMetricsHolderContains(fakeDisplayMetrics: WritableMap?) { doReturn(fakeDisplayMetrics).whenever(deviceInfoModule).getDisplayMetricsWritableMap() }