mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Android: Use enum type for looking up JSIModule's
Summary: To avoid unnecessary class loads, and better modularity, let's use string keys (enum) to access JSIModule's. For now all JSIModule's are all known inside the core infra (only FabricUIManager and TurboModuleManager right now), so let's keep it simple and explicitly list them out. The only problem here is we lose some form of type safety... Reviewed By: JoshuaGross Differential Revision: D15872777 fbshipit-source-id: 9c2de7ef1e88ef3a6dff5888d644f9d8963af2a3
This commit is contained in:
committed by
Facebook Github Bot
parent
0d971f97d5
commit
2df90738d5
@@ -66,7 +66,7 @@ public interface CatalystInstance
|
||||
<T extends NativeModule> boolean hasNativeModule(Class<T> nativeModuleInterface);
|
||||
<T extends NativeModule> T getNativeModule(Class<T> nativeModuleInterface);
|
||||
NativeModule getNativeModule(String moduleName);
|
||||
<T extends JSIModule> T getJSIModule(Class<T> jsiModuleInterface);
|
||||
JSIModule getJSIModule(JSIModuleType moduleType);
|
||||
Collection<NativeModule> getNativeModules();
|
||||
|
||||
/**
|
||||
|
||||
@@ -511,8 +511,8 @@ public class CatalystInstanceImpl implements CatalystInstance {
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends JSIModule> T getJSIModule(Class<T> jsiModuleInterface) {
|
||||
return mJSIModuleRegistry.getModule(jsiModuleInterface);
|
||||
public JSIModule getJSIModule(JSIModuleType moduleType) {
|
||||
return mJSIModuleRegistry.getModule(moduleType);
|
||||
}
|
||||
|
||||
private native long getJavaScriptContext();
|
||||
|
||||
@@ -14,21 +14,21 @@ import java.util.Map;
|
||||
|
||||
public class JSIModuleRegistry {
|
||||
|
||||
private final Map<Class, JSIModuleHolder> mModules = new HashMap<>();
|
||||
private final Map<JSIModuleType, JSIModuleHolder> mModules = new HashMap<>();
|
||||
|
||||
public JSIModuleRegistry() { }
|
||||
|
||||
public <T extends JSIModule> T getModule(Class<T> moduleClass) {
|
||||
JSIModuleHolder jsiModuleHolder = mModules.get(moduleClass);
|
||||
public JSIModule getModule(JSIModuleType moduleType) {
|
||||
JSIModuleHolder jsiModuleHolder = mModules.get(moduleType);
|
||||
if (jsiModuleHolder == null) {
|
||||
throw new IllegalArgumentException("Unable to find JSIModule for class " + moduleClass);
|
||||
throw new IllegalArgumentException("Unable to find JSIModule for class " + moduleType);
|
||||
}
|
||||
return (T) Assertions.assertNotNull(jsiModuleHolder.getJSIModule());
|
||||
return Assertions.assertNotNull(jsiModuleHolder.getJSIModule());
|
||||
}
|
||||
|
||||
public void registerModules(List<JSIModuleSpec> jsiModules) {
|
||||
for (JSIModuleSpec spec : jsiModules) {
|
||||
mModules.put(spec.getJSIModuleClass(), new JSIModuleHolder(spec));
|
||||
mModules.put(spec.getJSIModuleType(), new JSIModuleHolder(spec));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ package com.facebook.react.bridge;
|
||||
*/
|
||||
public interface JSIModuleSpec<T extends JSIModule> {
|
||||
|
||||
Class<? extends JSIModule> getJSIModuleClass();
|
||||
JSIModuleType getJSIModuleType();
|
||||
|
||||
JSIModuleProvider<T> getJSIModuleProvider();
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its 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.bridge;
|
||||
|
||||
/**
|
||||
* A list of support JSIModules. These are usually core infra pieces, so there
|
||||
* should be an explicit list.
|
||||
*/
|
||||
public enum JSIModuleType {
|
||||
TurboModuleManager,
|
||||
UIManager,
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import static com.facebook.react.uimanager.common.UIManagerType.DEFAULT;
|
||||
import static com.facebook.react.uimanager.common.ViewUtil.getUIManagerType;
|
||||
|
||||
import com.facebook.react.bridge.CatalystInstance;
|
||||
import com.facebook.react.bridge.JSIModuleType;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.UIManager;
|
||||
import com.facebook.react.uimanager.common.UIManagerType;
|
||||
@@ -34,7 +35,7 @@ public class UIManagerHelper {
|
||||
public static UIManager getUIManager(ReactContext context, @UIManagerType int uiManagerType) {
|
||||
CatalystInstance catalystInstance = context.getCatalystInstance();
|
||||
return uiManagerType == FABRIC ?
|
||||
catalystInstance.getJSIModule(UIManager.class) :
|
||||
(UIManager)catalystInstance.getJSIModule(JSIModuleType.UIManager) :
|
||||
catalystInstance.getNativeModule(UIManagerModule.class);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user