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
This commit is contained in:
Ramanpreet Nara
2023-03-11 16:59:39 -08:00
committed by Facebook GitHub Bot
parent 5097763f53
commit 1c5ba299b3
@@ -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<ModuleProvider, Map<String, ReactModuleInfo>> mPackageModuleInfos =
new HashMap<>();
private static boolean shouldSupportLegacyPackages() {
return ReactFeatureFlags.enableBridgelessArchitecture
&& ReactFeatureFlags.unstable_useTurboModuleInterop;
}
protected ReactPackageTurboModuleManagerDelegate(
ReactApplicationContext reactApplicationContext, List<ReactPackage> 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<ModuleSpec> moduleSpecs = lazyPkg.getNativeModules(reactApplicationContext);
final Map<String, Provider<? extends NativeModule>> moduleSpecProviderMap = new HashMap<>();
for (final ModuleSpec moduleSpec : moduleSpecs) {
moduleSpecProviderMap.put(moduleSpec.getName(), moduleSpec.getProvider());
}
final ModuleProvider moduleProvider =
(name) -> {
Provider<? extends NativeModule> provider = moduleSpecProviderMap.get(name);
return provider != null ? provider.get() : null;
};
mModuleProviders.add(moduleProvider);
mPackageModuleInfos.put(
moduleProvider, lazyPkg.getReactModuleInfoProvider().getReactModuleInfos());
continue;
}
}
}