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:
Kevin Gozali
2019-06-18 16:22:17 -07:00
committed by Facebook Github Bot
parent 0d971f97d5
commit 2df90738d5
7 changed files with 32 additions and 13 deletions
@@ -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);
}