diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.kt index 2e0f0b207eb487..f04d4d4dc459f4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.kt @@ -128,6 +128,7 @@ internal class CoreModulesPackage( reactModule.needsEagerInit, reactModule.isCxxModule, ReactModuleInfo.classIsTurboModule(moduleClass), + moduleClass, ) } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.kt index 43c5e363b01361..82fcc6289eb068 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.kt @@ -105,6 +105,7 @@ public abstract class ReactPackageTurboModuleManagerDelegate : TurboModuleManage true, reactModule.isCxxModule, ReactModuleInfo.classIsTurboModule(moduleClass), + moduleClass, ) else ReactModuleInfo( @@ -114,6 +115,7 @@ public abstract class ReactPackageTurboModuleManagerDelegate : TurboModuleManage true, CxxModuleWrapper::class.java.isAssignableFrom(moduleClass), ReactModuleInfo.classIsTurboModule(moduleClass), + moduleClass, ) reactModuleInfoMap[moduleName] = moduleInfo @@ -153,6 +155,23 @@ public abstract class ReactPackageTurboModuleManagerDelegate : TurboModuleManage return resolvedModule as TurboModule } + override fun getModulesConformingToInterface( + clazz: Class + ): List { + val modules = mutableListOf() + + for (moduleProvider in moduleProviders) { + val moduleInfos = packageModuleInfos[moduleProvider]?.values ?: continue + for (moduleInfo in moduleInfos) { + if (clazz.isAssignableFrom(moduleInfo.moduleClass) && moduleInfo.isTurboModule) { + modules.add(moduleProvider.getModule(moduleInfo.name) as TurboModule) + } + } + } + + return modules + } + override fun unstable_isModuleRegistered(moduleName: String): Boolean { for (moduleProvider in moduleProviders) { val moduleInfo: ReactModuleInfo? = packageModuleInfos[moduleProvider]?.get(moduleName) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.kt index d4315652ebebf4..ccd323cb94d5f3 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.kt @@ -62,6 +62,7 @@ public class ModuleHolder { true, CxxModuleWrapper::class.java.isAssignableFrom(nativeModule.javaClass), ReactModuleInfo.classIsTurboModule(nativeModule.javaClass), + nativeModule.javaClass, ) internalModule = nativeModule diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManager.kt index dc018457ba7351..bf4bc33f1457ae 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManager.kt @@ -211,6 +211,12 @@ public class TurboModuleManager( return module } + public fun getModulesConformingToInterface( + clazz: Class + ): List { + return delegate?.getModulesConformingToInterface(clazz) ?: emptyList() + } + /** * Given a ModuleHolder, and the TurboModule's moduleName, return the TurboModule instance. * diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManagerDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManagerDelegate.kt index 202e8aecb60790..d51de7c57bd532 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManagerDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleManagerDelegate.kt @@ -36,6 +36,10 @@ public abstract class TurboModuleManagerDelegate { */ public abstract fun getModule(moduleName: String): TurboModule? + public abstract fun getModulesConformingToInterface( + clazz: Class + ): List + public abstract fun unstable_isModuleRegistered(moduleName: String): Boolean /** diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/module/model/ReactModuleInfo.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/module/model/ReactModuleInfo.kt index 2394271a4a03c6..545f61fc3b678e 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/module/model/ReactModuleInfo.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/module/model/ReactModuleInfo.kt @@ -20,14 +20,39 @@ public class ReactModuleInfo( @get:JvmName("needsEagerInit") public val needsEagerInit: Boolean, public val isCxxModule: Boolean, public val isTurboModule: Boolean, + public val moduleClass: Class<*> ) { @Deprecated( - "This constructor is deprecated and will be removed in the future. Use ReactModuleInfo(String, String, boolean, boolean, boolean, boolean)]", + "This constructor is deprecated and will be removed in the future. Use ReactModuleInfo(String, String, boolean, boolean, boolean, boolean, Class<*>)]", replaceWith = ReplaceWith( expression = - "ReactModuleInfo(name, className, canOverrideExistingModule, needsEagerInit, isCxxModule, isTurboModule)"), + "ReactModuleInfo(name, className, canOverrideExistingModule, needsEagerInit, isCxxModule, isTurboModule, moduleClass)"), + level = DeprecationLevel.WARNING, + ) + public constructor( + name: String, + className: String, + canOverrideExistingModule: Boolean, + needsEagerInit: Boolean, + isCxxModule: Boolean, + isTurboModule: Boolean + ) : this( + name, + className, + canOverrideExistingModule, + needsEagerInit, + isCxxModule, + isTurboModule, + ReactModuleInfo::class.java /* placeholder */) + + @Deprecated( + "This constructor is deprecated and will be removed in the future. Use ReactModuleInfo(String, String, boolean, boolean, boolean, boolean, Class<*>)]", + replaceWith = + ReplaceWith( + expression = + "ReactModuleInfo(name, className, canOverrideExistingModule, needsEagerInit, isCxxModule, isTurboModule, moduleClass)"), level = DeprecationLevel.WARNING, ) public constructor( @@ -37,8 +62,15 @@ public class ReactModuleInfo( needsEagerInit: Boolean, @Suppress("UNUSED_PARAMETER") hasConstants: Boolean, isCxxModule: Boolean, - isTurboModule: Boolean, - ) : this(name, className, canOverrideExistingModule, needsEagerInit, isCxxModule, isTurboModule) + isTurboModule: Boolean + ) : this( + name, + className, + canOverrideExistingModule, + needsEagerInit, + isCxxModule, + isTurboModule, + ReactModuleInfo::class.java /* placeholder */) public companion object { /** diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.kt index d2b992d649aa37..ab55355b2c4852 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.kt @@ -108,6 +108,7 @@ internal class CoreReactPackage( reactModule.needsEagerInit, reactModule.isCxxModule, ReactModuleInfo.classIsTurboModule(moduleClass), + moduleClass, ) } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.kt index 7c115f18a9f682..4c120214f7f458 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.kt @@ -289,6 +289,7 @@ constructor(private val config: MainPackageConfig? = null) : reactModule.needsEagerInit, reactModule.isCxxModule, classIsTurboModule(moduleClass), + moduleClass, ) } return ReactModuleInfoProvider { moduleMap } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/model/ReactModuleInfoTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/model/ReactModuleInfoTest.kt index 85576444a541b8..febeb8aba87771 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/model/ReactModuleInfoTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/model/ReactModuleInfoTest.kt @@ -24,12 +24,14 @@ class ReactModuleInfoTest { /* needsEagerInit = */ false, /* isCxxModule = */ false, /* isTurboModule = */ false, + /* moduleClass = */ ReactModuleInfoTest::class.java, ) assertThat(reactModuleInfo.name).isEqualTo("name") assertThat(reactModuleInfo.canOverrideExistingModule).isFalse() assertThat(reactModuleInfo.needsEagerInit).isFalse() assertThat(reactModuleInfo.isCxxModule).isFalse() assertThat(reactModuleInfo.isTurboModule).isFalse() + assertThat(reactModuleInfo.moduleClass).isEqualTo(ReactModuleInfoTest::class.java) } @Test diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt index 507a08ad4a97a4..79c29f348e3114 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt @@ -75,6 +75,7 @@ internal class RNTesterApplication : Application(), ReactApplication { needsEagerInit = false, isCxxModule = false, isTurboModule = true, + SampleTurboModule::class.java, ), SampleLegacyModule.NAME to ReactModuleInfo( @@ -84,6 +85,7 @@ internal class RNTesterApplication : Application(), ReactApplication { needsEagerInit = false, isCxxModule = false, isTurboModule = false, + SampleTurboModule::class.java, ), ) }