diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java index 10520b5c52c..73c4d6468f5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java @@ -168,6 +168,26 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule return (TurboModule) resolvedModule; } + public boolean unstable_isModuleRegistered(String moduleName) { + for (final ModuleProvider moduleProvider : mModuleProviders) { + final ReactModuleInfo moduleInfo = mPackageModuleInfos.get(moduleProvider).get(moduleName); + if (moduleInfo != null && moduleInfo.isTurboModule()) { + return true; + } + } + return false; + } + + public boolean unstable_isLegacyModuleRegistered(String moduleName) { + for (final ModuleProvider moduleProvider : mModuleProviders) { + final ReactModuleInfo moduleInfo = mPackageModuleInfos.get(moduleProvider).get(moduleName); + if (moduleInfo != null && !moduleInfo.isTurboModule()) { + return true; + } + } + return false; + } + @Nullable @Override public NativeModule getLegacyModule(String moduleName) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java index 18a104a452f..4cc3ac4f5dd 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java @@ -38,6 +38,7 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { private final List mEagerInitModuleNames; private final ModuleProvider mTurboModuleProvider; private final ModuleProvider mLegacyModuleProvider; + private final TurboModuleManagerDelegate mDelegate; // Prevents the creation of new TurboModules once cleanup as been initiated. private final Object mModuleCleanupLock = new Object(); @@ -59,6 +60,7 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { CallInvokerHolder jsCallInvokerHolder, CallInvokerHolder nativeCallInvokerHolder) { maybeLoadSoLibrary(); + mDelegate = delegate; mHybridData = initHybrid( runtimeExecutor, @@ -93,6 +95,14 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { }; } + private boolean isTurboModule(String moduleName) { + return mDelegate != null && mDelegate.unstable_isModuleRegistered(moduleName); + } + + private boolean isLegacyModule(String moduleName) { + return mDelegate != null && mDelegate.unstable_isLegacyModuleRegistered(moduleName); + } + private static boolean shouldCreateLegacyModules() { return ReactFeatureFlags.enableBridgelessArchitecture && ReactFeatureFlags.unstable_useTurboModuleInterop; @@ -117,12 +127,20 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { @DoNotStrip @Nullable private NativeModule getLegacyJavaModule(String moduleName) { - final NativeModule module = getModule(moduleName); - if (shouldRouteTurboModulesThroughInteropLayer()) { + final NativeModule module = getModule(moduleName); return !(module instanceof CxxModuleWrapper) ? module : null; } + /* + * This API is invoked from global.nativeModuleProxy. + * Only call getModule if the native module is a legacy module. + */ + if (!isLegacyModule(moduleName)) { + return null; + } + + final NativeModule module = getModule(moduleName); return !(module instanceof CxxModuleWrapper) && !(module instanceof TurboModule) ? module : null; @@ -132,12 +150,20 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { @DoNotStrip @Nullable private CxxModuleWrapper getLegacyCxxModule(String moduleName) { - final NativeModule module = getModule(moduleName); - if (shouldRouteTurboModulesThroughInteropLayer()) { + final NativeModule module = getModule(moduleName); return module instanceof CxxModuleWrapper ? (CxxModuleWrapper) module : null; } + /* + * This API is invoked from global.nativeModuleProxy. + * Only call getModule if the native module is a legacy module. + */ + if (!isLegacyModule(moduleName)) { + return null; + } + + final NativeModule module = getModule(moduleName); return module instanceof CxxModuleWrapper && !(module instanceof TurboModule) ? (CxxModuleWrapper) module : null; @@ -151,6 +177,14 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { return null; } + /* + * This API is invoked from global.__turboModuleProxy. + * Only call getModule if the native module is a turbo module. + */ + if (!isTurboModule(moduleName)) { + return null; + } + final NativeModule module = getModule(moduleName); return module instanceof CxxModuleWrapper && module instanceof TurboModule ? (CxxModuleWrapper) module @@ -164,6 +198,14 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { return null; } + /* + * This API is invoked from global.__turboModuleProxy. + * Only call getModule if the native module is a turbo module. + */ + if (!isTurboModule(moduleName)) { + return null; + } + final NativeModule module = getModule(moduleName); return !(module instanceof CxxModuleWrapper) && module instanceof TurboModule ? (TurboModule) module diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java index 8d87981021f..4c187079eb3 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java @@ -38,6 +38,8 @@ public abstract class TurboModuleManagerDelegate { @Nullable public abstract TurboModule getModule(String moduleName); + public abstract boolean unstable_isModuleRegistered(String moduleName); + /** * Create an return a legacy NativeModule with name `moduleName`. If `moduleName` is a * TurboModule, return null. @@ -47,6 +49,10 @@ public abstract class TurboModuleManagerDelegate { return null; } + public boolean unstable_isLegacyModuleRegistered(String moduleName) { + return false; + }; + public List getEagerInitModuleNames() { return new ArrayList<>(); }