Migrate NativeModuleRegistryBuilder to Kotlin (#47508)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47508

Changelog: [Internal]

Reviewed By: tdn120

Differential Revision: D60037204

fbshipit-source-id: 2b405e492520e075b83a075009d25fb7b7fa8925
This commit is contained in:
Pieter De Baets
2024-11-08 10:37:37 -08:00
committed by Facebook GitHub Bot
parent 2ec547ad28
commit e3c3a0c8a7
4 changed files with 66 additions and 73 deletions
@@ -68,10 +68,11 @@ public class com/facebook/react/MemoryPressureRouter : android/content/Component
public fun removeMemoryPressureListener (Lcom/facebook/react/bridge/MemoryPressureListener;)V
}
public class com/facebook/react/NativeModuleRegistryBuilder {
public final class com/facebook/react/NativeModuleRegistryBuilder {
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;Lcom/facebook/react/ReactInstanceManager;)V
public fun build ()Lcom/facebook/react/bridge/NativeModuleRegistry;
public fun processPackage (Lcom/facebook/react/ReactPackage;)V
public final fun build ()Lcom/facebook/react/bridge/NativeModuleRegistry;
public final fun processPackage (Lcom/facebook/react/ReactPackage;)V
}
public abstract class com/facebook/react/ReactActivity : androidx/appcompat/app/AppCompatActivity, com/facebook/react/modules/core/DefaultHardwareBackBtnHandler, com/facebook/react/modules/core/PermissionAwareActivity {
@@ -1,69 +0,0 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react;
import com.facebook.react.bridge.ModuleHolder;
import com.facebook.react.bridge.NativeModuleRegistry;
import com.facebook.react.bridge.ReactApplicationContext;
import java.util.HashMap;
import java.util.Map;
/** Helper class to build NativeModuleRegistry. */
public class NativeModuleRegistryBuilder {
private final ReactApplicationContext mReactApplicationContext;
private final Map<String, ModuleHolder> mModules = new HashMap<>();
public NativeModuleRegistryBuilder(
ReactApplicationContext reactApplicationContext, ReactInstanceManager reactInstanceManager) {
mReactApplicationContext = reactApplicationContext;
}
public void processPackage(ReactPackage reactPackage) {
// We use an iterable instead of an iterator here to ensure thread safety, and that this list
// cannot be modified
Iterable<ModuleHolder> moduleHolders;
if (reactPackage instanceof LazyReactPackage) {
moduleHolders =
((LazyReactPackage) reactPackage).getNativeModuleIterator(mReactApplicationContext);
} else if (reactPackage instanceof BaseReactPackage) {
moduleHolders =
((BaseReactPackage) reactPackage).getNativeModuleIterator(mReactApplicationContext);
} else {
moduleHolders =
ReactPackageHelper.getNativeModuleIterator(reactPackage, mReactApplicationContext);
}
for (ModuleHolder moduleHolder : moduleHolders) {
String name = moduleHolder.getName();
if (mModules.containsKey(name)) {
ModuleHolder existingNativeModule = mModules.get(name);
if (!moduleHolder.getCanOverrideExistingModule()) {
throw new IllegalStateException(
"Native module "
+ name
+ " tried to override "
+ existingNativeModule.getClassName()
+ ". Check the getPackages() method in MainApplication.java, it might be that"
+ " module is being created twice. If this was your intention, set"
+ " canOverrideExistingModule=true. This error may also be present if the package"
+ " is present only once in getPackages() but is also automatically added later"
+ " during build time by autolinking. Try removing the existing entry and"
+ " rebuild.");
}
mModules.remove(existingNativeModule);
}
mModules.put(name, moduleHolder);
}
}
public NativeModuleRegistry build() {
return new NativeModuleRegistry(mReactApplicationContext, mModules);
}
}
@@ -0,0 +1,61 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react
import com.facebook.react.bridge.ModuleHolder
import com.facebook.react.bridge.NativeModuleRegistry
import com.facebook.react.bridge.ReactApplicationContext
/** Helper class to build NativeModuleRegistry. */
public class NativeModuleRegistryBuilder(
private val reactApplicationContext: ReactApplicationContext,
) {
private val modules = HashMap<String, ModuleHolder>()
@Deprecated(
"ReactInstanceManager is not used",
ReplaceWith("NativeModuleRegistryBuilder(reactApplicationContext)"))
public constructor(
reactApplicationContext: ReactApplicationContext,
@Suppress("UNUSED_PARAMETER") reactInstanceManager: ReactInstanceManager
) : this(reactApplicationContext) {}
public fun processPackage(reactPackage: ReactPackage) {
// We use an iterable instead of an iterator here to ensure thread safety, and that this list
// cannot be modified
val moduleHolders =
@Suppress("DEPRECATION")
if (reactPackage is LazyReactPackage) {
reactPackage.getNativeModuleIterator(reactApplicationContext)
} else if (reactPackage is BaseReactPackage) {
reactPackage.getNativeModuleIterator(reactApplicationContext)
} else {
ReactPackageHelper.getNativeModuleIterator(reactPackage, reactApplicationContext)
}
for (moduleHolder in moduleHolders) {
val name = moduleHolder.name
val existingNativeModule = modules[name]
if (existingNativeModule != null) {
check(moduleHolder.canOverrideExistingModule) {
"""
Native module $name tried to override ${existingNativeModule.className}.
Check the getPackages() method in MainApplication.java, it might be that module is being created twice.
If this was your intention, set canOverrideExistingModule=true. This error may also be present if the
package is present only once in getPackages() but is also automatically added later during build time
by autolinking. Try removing the existing entry and rebuild.
"""
}
}
modules[name] = moduleHolder
}
}
public fun build(): NativeModuleRegistry = NativeModuleRegistry(reactApplicationContext, modules)
}
@@ -1536,7 +1536,7 @@ public class ReactInstanceManager {
private NativeModuleRegistry processPackages(
ReactApplicationContext reactContext, List<ReactPackage> packages) {
NativeModuleRegistryBuilder nativeModuleRegistryBuilder =
new NativeModuleRegistryBuilder(reactContext, this);
new NativeModuleRegistryBuilder(reactContext);
ReactMarker.logMarker(PROCESS_PACKAGES_START);