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 cfbbd336b194da..9c3f7ed518f9d8 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 @@ -23,6 +23,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CountDownLatch; + import javax.inject.Provider; public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModuleManagerDelegate { @@ -31,6 +33,8 @@ interface ModuleProvider { NativeModule getModule(String moduleName); } + private CountDownLatch initTasksLeft = new CountDownLatch(1); + private final List mModuleProviders = new ArrayList<>(); private final Map> mPackageModuleInfos = new HashMap<>(); @@ -59,80 +63,85 @@ protected ReactPackageTurboModuleManagerDelegate( private void initialize( ReactApplicationContext reactApplicationContext, List packages) { - final ReactApplicationContext applicationContext = reactApplicationContext; - for (ReactPackage reactPackage : packages) { - if (reactPackage instanceof BaseReactPackage) { - final BaseReactPackage baseReactPackage = (BaseReactPackage) reactPackage; - final ModuleProvider moduleProvider = - moduleName -> baseReactPackage.getModule(moduleName, applicationContext); - mModuleProviders.add(moduleProvider); - mPackageModuleInfos.put( - moduleProvider, baseReactPackage.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()); + Thread worker = new Thread(() -> { + final ReactApplicationContext applicationContext = reactApplicationContext; + for (ReactPackage reactPackage : packages) { + if (reactPackage instanceof BaseReactPackage) { + final BaseReactPackage baseReactPackage = (BaseReactPackage) reactPackage; + final ModuleProvider moduleProvider = + moduleName -> baseReactPackage.getModule(moduleName, applicationContext); + mModuleProviders.add(moduleProvider); + mPackageModuleInfos.put( + moduleProvider, baseReactPackage.getReactModuleInfoProvider().getReactModuleInfos()); + continue; } - final ModuleProvider moduleProvider = - moduleName -> { - Provider provider = moduleSpecProviderMap.get(moduleName); - return provider != null ? provider.get() : null; - }; - - mModuleProviders.add(moduleProvider); - mPackageModuleInfos.put( - 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.isCxxModule(), - ReactModuleInfo.classIsTurboModule(moduleClass)) - : new ReactModuleInfo( - moduleName, - moduleClass.getName(), - module.canOverrideExistingModule(), - true, - CxxModuleWrapper.class.isAssignableFrom(moduleClass), - ReactModuleInfo.classIsTurboModule(moduleClass)); - - reactModuleInfoMap.put(moduleName, moduleInfo); - moduleMap.put(moduleName, module); + 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 = + moduleName -> { + Provider provider = moduleSpecProviderMap.get(moduleName); + return provider != null ? provider.get() : null; + }; + + mModuleProviders.add(moduleProvider); + mPackageModuleInfos.put( + moduleProvider, lazyPkg.getReactModuleInfoProvider().getReactModuleInfos()); + continue; } - final ModuleProvider moduleProvider = moduleMap::get; - - mModuleProviders.add(moduleProvider); - mPackageModuleInfos.put(moduleProvider, reactModuleInfoMap); + 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.isCxxModule(), + ReactModuleInfo.classIsTurboModule(moduleClass)) + : new ReactModuleInfo( + moduleName, + moduleClass.getName(), + module.canOverrideExistingModule(), + true, + CxxModuleWrapper.class.isAssignableFrom(moduleClass), + ReactModuleInfo.classIsTurboModule(moduleClass)); + + reactModuleInfoMap.put(moduleName, moduleInfo); + moduleMap.put(moduleName, module); + } + + final ModuleProvider moduleProvider = moduleMap::get; + + mModuleProviders.add(moduleProvider); + mPackageModuleInfos.put(moduleProvider, reactModuleInfoMap); + } } - } + initTasksLeft.countDown(); + }); + worker.start(); + } @Override @@ -143,6 +152,11 @@ public boolean unstable_shouldEnableLegacyModuleInterop() { @Nullable @Override public TurboModule getModule(String moduleName) { + try { + initTasksLeft.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } NativeModule resolvedModule = null; for (final ModuleProvider moduleProvider : mModuleProviders) { @@ -169,6 +183,11 @@ public TurboModule getModule(String moduleName) { @Override public boolean unstable_isModuleRegistered(String moduleName) { + try { + initTasksLeft.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } for (final ModuleProvider moduleProvider : mModuleProviders) { final ReactModuleInfo moduleInfo = mPackageModuleInfos.get(moduleProvider).get(moduleName); if (moduleInfo != null && moduleInfo.isTurboModule()) { @@ -180,6 +199,11 @@ public boolean unstable_isModuleRegistered(String moduleName) { @Override public boolean unstable_isLegacyModuleRegistered(String moduleName) { + try { + initTasksLeft.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } for (final ModuleProvider moduleProvider : mModuleProviders) { final ReactModuleInfo moduleInfo = mPackageModuleInfos.get(moduleProvider).get(moduleName); if (moduleInfo != null && !moduleInfo.isTurboModule()) { @@ -192,6 +216,11 @@ public boolean unstable_isLegacyModuleRegistered(String moduleName) { @Nullable @Override public NativeModule getLegacyModule(String moduleName) { + try { + initTasksLeft.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } if (!unstable_shouldEnableLegacyModuleInterop()) { return null; } @@ -222,6 +251,11 @@ public NativeModule getLegacyModule(String moduleName) { @Override public List getEagerInitModuleNames() { + try { + initTasksLeft.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } List moduleNames = new ArrayList<>(); for (final ModuleProvider moduleProvider : mModuleProviders) { for (final ReactModuleInfo moduleInfo : mPackageModuleInfos.get(moduleProvider).values()) {