From a09a6d4d44ef4f2d0f4adf3d027d74897af989e5 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Sat, 11 Mar 2023 16:59:39 -0800 Subject: [PATCH] Add ReactPackage support to TurboModule system Summary: Make the TurboModule system understand ReactPackages. **Note:** The TurboModule system can only create TurboModules in LazyReactPackages. Changelog: [Internal] Reviewed By: christophpurrer Differential Revision: D43255701 fbshipit-source-id: 74d034732d0a6fb32197b15bb54cac9161abc294 --- ...eactPackageTurboModuleManagerDelegate.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java b/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java index c1ce66fa3a7..5917f71cfb8 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java @@ -15,6 +15,7 @@ import com.facebook.react.bridge.ModuleSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.module.model.ReactModuleInfo; import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate; import com.facebook.react.turbomodule.core.interfaces.TurboModule; @@ -77,6 +78,55 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule moduleProvider, lazyPkg.getReactModuleInfoProvider().getReactModuleInfos()); continue; } + + if (shouldSupportLegacyPackages()) { + // TODO(T145105887): Output warnings that ReactPackage was used + + final List nativeModules = + reactPackage.createNativeModules(reactApplicationContext); + + final Map moduleMap = new HashMap<>(); + final Map reactModuleInfoMap = new HashMap<>(); + + for (final NativeModule module : nativeModules) { + final Class moduleClass = module.getClass(); + final @Nullable ReactModule reactModule = moduleClass.getAnnotation(ReactModule.class); + + final String moduleName = reactModule != null ? reactModule.name() : module.getName(); + + final ReactModuleInfo moduleInfo = + reactModule != null + ? new ReactModuleInfo( + moduleName, + moduleClass.getName(), + reactModule.canOverrideExistingModule(), + true, + reactModule.hasConstants(), + reactModule.isCxxModule(), + TurboModule.class.isAssignableFrom(moduleClass)) + : new ReactModuleInfo( + moduleName, + moduleClass.getName(), + module.canOverrideExistingModule(), + true, + true, + CxxModuleWrapper.class.isAssignableFrom(moduleClass), + TurboModule.class.isAssignableFrom(moduleClass)); + + reactModuleInfoMap.put(moduleName, moduleInfo); + moduleMap.put(moduleName, module); + } + + final ModuleProvider moduleProvider = + new ModuleProvider() { + public NativeModule getModule(String moduleName) { + return moduleMap.get(moduleName); + } + }; + + mModuleProviders.add(moduleProvider); + mPackageModuleInfos.put(moduleProvider, reactModuleInfoMap); + } } }