diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/AlertFragment.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/AlertFragment.java index 8bc0481f686..4e81931ccab 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/AlertFragment.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/AlertFragment.java @@ -8,12 +8,12 @@ package com.facebook.react.modules.dialog; import android.annotation.SuppressLint; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; /** A fragment used to display the dialog. */ diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/dialog/DialogModuleTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/dialog/DialogModuleTest.kt index dda9e82c14b..b66d7533fbf 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/dialog/DialogModuleTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/dialog/DialogModuleTest.kt @@ -7,10 +7,11 @@ package com.facebook.react.modules.dialog -import android.app.AlertDialog import android.content.DialogInterface import android.os.Looper.getMainLooper +import androidx.appcompat.app.AlertDialog import androidx.fragment.app.FragmentActivity +import com.facebook.react.R import com.facebook.react.bridge.Callback import com.facebook.react.bridge.JavaOnlyMap import com.facebook.react.bridge.ReactApplicationContext @@ -48,6 +49,9 @@ class DialogModuleTest { fun setUp() { activityController = Robolectric.buildActivity(FragmentActivity::class.java) activity = activityController.create().start().resume().get() + // We must set the theme to a descendant of AppCompat for the AlertDialog to show without + // raising an exception + activity.setTheme(APP_COMPAT_THEME) val context: ReactApplicationContext = mock(ReactApplicationContext::class.java) whenever(context.hasActiveReactInstance()).thenReturn(true) @@ -62,6 +66,19 @@ class DialogModuleTest { activityController.pause().stop().destroy() } + @Test + fun testIllegalActivityTheme() { + val options = JavaOnlyMap() + activity.setTheme(NON_APP_COMPAT_THEME) + + assertThrows(NullPointerException::class.java) { + dialogModule.showAlert(options, null, null) + shadowOf(getMainLooper()).idle() + } + + activity.setTheme(APP_COMPAT_THEME) + } + @Test fun testAllOptions() { val options = @@ -158,4 +175,9 @@ class DialogModuleTest { return activity.supportFragmentManager.findFragmentByTag(DialogModule.FRAGMENT_TAG) as? AlertFragment } + + companion object { + private val APP_COMPAT_THEME: Int = R.style.Theme_ReactNative_AppCompat_Light + private val NON_APP_COMPAT_THEME: Int = android.R.style.Theme_DeviceDefault_Light + } }