Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -31,6 +33,8 @@ interface ModuleProvider {
NativeModule getModule(String moduleName);
}

private CountDownLatch initTasksLeft = new CountDownLatch(1);

private final List<ModuleProvider> mModuleProviders = new ArrayList<>();
private final Map<ModuleProvider, Map<String, ReactModuleInfo>> mPackageModuleInfos =
new HashMap<>();
Expand Down Expand Up @@ -59,80 +63,85 @@ protected ReactPackageTurboModuleManagerDelegate(

private void initialize(
ReactApplicationContext reactApplicationContext, List<ReactPackage> 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<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());
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<? extends NativeModule> 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<NativeModule> nativeModules =
reactPackage.createNativeModules(reactApplicationContext);

final Map<String, NativeModule> moduleMap = new HashMap<>();
final Map<String, ReactModuleInfo> reactModuleInfoMap = new HashMap<>();

for (final NativeModule module : nativeModules) {
final Class<? extends NativeModule> 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<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 =
moduleName -> {
Provider<? extends NativeModule> 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<NativeModule> nativeModules =
reactPackage.createNativeModules(reactApplicationContext);

final Map<String, NativeModule> moduleMap = new HashMap<>();
final Map<String, ReactModuleInfo> reactModuleInfoMap = new HashMap<>();

for (final NativeModule module : nativeModules) {
final Class<? extends NativeModule> 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
Expand All @@ -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) {
Expand All @@ -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()) {
Expand All @@ -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()) {
Expand All @@ -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;
}
Expand Down Expand Up @@ -222,6 +251,11 @@ public NativeModule getLegacyModule(String moduleName) {

@Override
public List<String> getEagerInitModuleNames() {
try {
initTasksLeft.await();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
List<String> moduleNames = new ArrayList<>();
for (final ModuleProvider moduleProvider : mModuleProviders) {
for (final ReactModuleInfo moduleInfo : mPackageModuleInfos.get(moduleProvider).values()) {
Expand Down
Loading