From 1c5ba299b3c243a83b4e2ba1216e58852d7ddd2c Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Sat, 11 Mar 2023 16:59:39 -0800 Subject: [PATCH] Add LazyReactPackage support to TurboModule system Summary: Make the TurboModule system understand LazyReactPackages. **Note:** The TurboModule system can only create TurboModules in LazyReactPackages. Changelog: [Internal] Reviewed By: christophpurrer Differential Revision: D43254982 fbshipit-source-id: 4260cc7dc1d28b1ad6268087720c6e02cfc20d32 --- ...eactPackageTurboModuleManagerDelegate.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java b/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java index 12d6bb29219..c1ce66fa3a7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java @@ -11,8 +11,10 @@ import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.CxxModuleWrapper; +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.model.ReactModuleInfo; import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate; import com.facebook.react.turbomodule.core.interfaces.TurboModule; @@ -20,6 +22,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.inject.Provider; public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModuleManagerDelegate { interface ModuleProvider { @@ -31,6 +34,11 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule private final Map> mPackageModuleInfos = new HashMap<>(); + private static boolean shouldSupportLegacyPackages() { + return ReactFeatureFlags.enableBridgelessArchitecture + && ReactFeatureFlags.unstable_useTurboModuleInterop; + } + protected ReactPackageTurboModuleManagerDelegate( ReactApplicationContext reactApplicationContext, List packages) { super(); @@ -46,6 +54,28 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule mModuleProviders.add(moduleProvider); mPackageModuleInfos.put( moduleProvider, turboPkg.getReactModuleInfoProvider().getReactModuleInfos()); + continue; + } + + if (shouldSupportLegacyPackages() && reactPackage instanceof LazyReactPackage) { + // TODO(T145105887): Output warnings that LazyReactPackage was used + final LazyReactPackage lazyPkg = ((LazyReactPackage) reactPackage); + final List moduleSpecs = lazyPkg.getNativeModules(reactApplicationContext); + final Map> moduleSpecProviderMap = new HashMap<>(); + for (final ModuleSpec moduleSpec : moduleSpecs) { + moduleSpecProviderMap.put(moduleSpec.getName(), moduleSpec.getProvider()); + } + + final ModuleProvider moduleProvider = + (name) -> { + Provider provider = moduleSpecProviderMap.get(name); + return provider != null ? provider.get() : null; + }; + + mModuleProviders.add(moduleProvider); + mPackageModuleInfos.put( + moduleProvider, lazyPkg.getReactModuleInfoProvider().getReactModuleInfos()); + continue; } } }