From 4466b6fa7ce5325cac3233a23b10ffcb4ff038a7 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Mon, 5 Mar 2018 10:55:19 -0800 Subject: [PATCH] Refactor BridgeListener into JSIModulesProvider Reviewed By: achen1 Differential Revision: D7140944 fbshipit-source-id: 092ea8569af5b5f90e005d6dc2c1819c1c9cf58f --- .../facebook/react/ReactInstanceManager.java | 17 +++++++------- .../react/ReactInstanceManagerBuilder.java | 13 +++++------ .../com/facebook/react/ReactNativeHost.java | 8 ++++--- .../facebook/react/bridge/BridgeListener.java | 14 ----------- .../react/bridge/CatalystInstance.java | 6 ++--- .../react/bridge/CatalystInstanceImpl.java | 13 +++++++---- .../com/facebook/react/bridge/JSIModule.java | 7 ++++++ .../react/bridge/JSIModuleHolder.java | 12 ++++++++++ .../react/bridge/JSIModuleRegistry.java | 23 +++++++++++++++++++ .../react/bridge/JSIModulesProvider.java | 15 ++++++++++++ .../com/facebook/react/bridge/UIManager.java | 2 +- 11 files changed, 89 insertions(+), 41 deletions(-) delete mode 100644 ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeListener.java create mode 100644 ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModule.java create mode 100644 ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleHolder.java create mode 100644 ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleRegistry.java create mode 100644 ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModulesProvider.java diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 1ecbd0efd..1d2731a71 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -43,10 +43,10 @@ import com.facebook.debug.tags.ReactDebugOverlayTags; import com.facebook.infer.annotation.Assertions; import com.facebook.infer.annotation.ThreadConfined; import com.facebook.infer.annotation.ThreadSafe; -import com.facebook.react.bridge.BridgeListener; import com.facebook.react.bridge.CatalystInstance; import com.facebook.react.bridge.CatalystInstanceImpl; import com.facebook.react.bridge.JSBundleLoader; +import com.facebook.react.bridge.JSIModulesProvider; import com.facebook.react.bridge.JavaJSExecutor; import com.facebook.react.bridge.JavaScriptExecutor; import com.facebook.react.bridge.JavaScriptExecutorFactory; @@ -71,11 +71,11 @@ import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.devsupport.interfaces.PackagerStatusCallback; import com.facebook.react.modules.appregistry.AppRegistry; -import com.facebook.react.modules.fabric.ReactFabric; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.modules.core.ReactChoreographer; import com.facebook.react.modules.debug.interfaces.DeveloperSettings; +import com.facebook.react.modules.fabric.ReactFabric; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.UIImplementationProvider; import com.facebook.react.uimanager.UIManagerModule; @@ -157,7 +157,7 @@ public class ReactInstanceManager { private final @Nullable NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler; private final boolean mLazyNativeModulesEnabled; private final boolean mDelayViewManagerClassLoadsEnabled; - private final @Nullable BridgeListener mBridgeListener; + private final @Nullable JSIModulesProvider mJSIModulesProvider; private List mViewManagers; private class ReactContextInitParams { @@ -207,7 +207,7 @@ public class ReactInstanceManager { @Nullable DevBundleDownloadListener devBundleDownloadListener, int minNumShakes, int minTimeLeftInFrameForNonBatchedOperationMs, - @Nullable BridgeListener bridgeListener) { + @Nullable JSIModulesProvider jsiModulesProvider) { Log.d(ReactConstants.TAG, "ReactInstanceManager.ctor()"); initializeSoLoaderIfNecessary(applicationContext); @@ -256,7 +256,7 @@ public class ReactInstanceManager { } mPackages.addAll(packages); } - mBridgeListener = bridgeListener; + mJSIModulesProvider = jsiModulesProvider; // Instantiate ReactChoreographer in UI thread. ReactChoreographer.initialize(); @@ -1008,7 +1008,7 @@ public class ReactInstanceManager { CatalystInstance catalystInstance) { Log.d(ReactConstants.TAG, "ReactInstanceManager.attachRootViewToInstance()"); Systrace.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "attachRootViewToInstance"); - UIManager uiManagerModule = rootView.isFabric() ? catalystInstance.getFabricUIManager() : catalystInstance.getNativeModule(UIManagerModule.class); + UIManager uiManagerModule = rootView.isFabric() ? catalystInstance.getJSIModule(UIManager.class) : catalystInstance.getNativeModule(UIManagerModule.class); final int rootTag = uiManagerModule.addRootView(rootView); rootView.setRootViewTag(rootTag); rootView.invokeJSEntryPoint(); @@ -1099,8 +1099,9 @@ public class ReactInstanceManager { Systrace.endSection(TRACE_TAG_REACT_JAVA_BRIDGE); ReactMarker.logMarker(CREATE_CATALYST_INSTANCE_END); } - if (mBridgeListener != null) { - mBridgeListener.onBridgeStarted(reactContext, catalystInstance); + if (mJSIModulesProvider != null) { + catalystInstance.addJSIModules(mJSIModulesProvider + .getJSIModules(reactContext, catalystInstance.getJavaScriptContextHolder())); } if (mBridgeIdleDebugListener != null) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index 5f9042093..75792d83d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -7,8 +7,7 @@ import static com.facebook.react.modules.systeminfo.AndroidInfoHelpers.getFriend import android.app.Activity; import android.app.Application; import com.facebook.infer.annotation.Assertions; -import com.facebook.react.bridge.BridgeListener; -import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.JSIModulesProvider; import com.facebook.react.bridge.JSBundleLoader; import com.facebook.react.bridge.JSCJavaScriptExecutorFactory; import com.facebook.react.bridge.JavaScriptExecutorFactory; @@ -50,7 +49,7 @@ public class ReactInstanceManagerBuilder { private @Nullable JavaScriptExecutorFactory mJavaScriptExecutorFactory; private int mMinNumShakes = 1; private int mMinTimeLeftInFrameForNonBatchedOperationMs = -1; - private @Nullable BridgeListener mBridgeListener; + private @Nullable JSIModulesProvider mJSIModulesProvider; /* package protected */ ReactInstanceManagerBuilder() { } @@ -65,9 +64,9 @@ public class ReactInstanceManagerBuilder { return this; } - public ReactInstanceManagerBuilder setBridgeListener( - @Nullable BridgeListener listener) { - mBridgeListener = listener; + public ReactInstanceManagerBuilder setJSIModulesProvider( + @Nullable JSIModulesProvider jsiModulesProvider) { + mJSIModulesProvider = jsiModulesProvider; return this; } @@ -290,6 +289,6 @@ public class ReactInstanceManagerBuilder { mDevBundleDownloadListener, mMinNumShakes, mMinTimeLeftInFrameForNonBatchedOperationMs, - mBridgeListener); + mJSIModulesProvider); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java b/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java index 243053fcf..e1537d550 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java @@ -7,6 +7,7 @@ package com.facebook.react; +import com.facebook.react.bridge.JSIModulesProvider; import javax.annotation.Nullable; import java.util.List; @@ -14,7 +15,7 @@ import java.util.List; import android.app.Application; import com.facebook.infer.annotation.Assertions; -import com.facebook.react.bridge.BridgeListener; +import com.facebook.react.bridge.JSIModulesProvider; import com.facebook.react.bridge.JavaScriptExecutorFactory; import com.facebook.react.bridge.ReactMarker; import com.facebook.react.bridge.ReactMarkerConstants; @@ -75,7 +76,7 @@ public abstract class ReactNativeHost { .setRedBoxHandler(getRedBoxHandler()) .setJavaScriptExecutorFactory(getJavaScriptExecutorFactory()) .setUIImplementationProvider(getUIImplementationProvider()) - .setBridgeListener(getBridgeListener()) + .setJSIModulesProvider(getJSIModulesProvider()) .setInitialLifecycleState(LifecycleState.BEFORE_CREATE); for (ReactPackage reactPackage : getPackages()) { @@ -122,7 +123,8 @@ public abstract class ReactNativeHost { return new UIImplementationProvider(); } - protected @Nullable BridgeListener getBridgeListener() { + protected @Nullable + JSIModulesProvider getJSIModulesProvider() { return null; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeListener.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeListener.java deleted file mode 100644 index 70b771ff5..000000000 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeListener.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.facebook.react.bridge; - -/** - * Interface to listen to bridge events. - */ -public interface BridgeListener { - - /** - * Called right after the RN Bridge is initialized - * @param catalystInstance {@link CatalystInstance} bridge - */ - void onBridgeStarted(ReactApplicationContext reactApplicationContext, CatalystInstance catalystInstance); - -} diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java index 1f277e6ec..fe6d46112 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java @@ -11,6 +11,7 @@ import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.queue.ReactQueueConfiguration; import com.facebook.react.common.annotations.VisibleForTesting; import java.util.Collection; +import java.util.List; import javax.annotation.Nullable; /** @@ -62,6 +63,7 @@ public interface CatalystInstance T getJSModule(Class jsInterface); boolean hasNativeModule(Class nativeModuleInterface); T getNativeModule(Class nativeModuleInterface); + T getJSIModule(Class jsiModuleInterface); Collection getNativeModules(); /** @@ -99,7 +101,5 @@ public interface CatalystInstance */ JavaScriptContextHolder getJavaScriptContextHolder(); - void setFabricUIManager(T fabricUIManager); - - T getFabricUIManager(); + void addJSIModules(List jsiModules); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index 79233aae2..7ab121626 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -26,6 +26,7 @@ import com.facebook.systrace.TraceListener; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.Nullable; @@ -79,13 +80,13 @@ public class CatalystInstanceImpl implements CatalystInstance { private final Object mJSCallsPendingInitLock = new Object(); private final NativeModuleRegistry mNativeModuleRegistry; + private final JSIModuleRegistry mJSIModuleRegistry = new JSIModuleRegistry(); private final NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler; private final MessageQueueThread mNativeModulesQueueThread; private boolean mInitialized = false; private volatile boolean mAcceptCalls = false; private boolean mJSBundleHasLoaded; - private UIManager mFabricUIManager; private @Nullable String mSourceURL; private JavaScriptContextHolder mJavaScriptContextHolder; @@ -453,12 +454,14 @@ public class CatalystInstanceImpl implements CatalystInstance { return mJavaScriptContextHolder; } - public UIManager getFabricUIManager() { - return mFabricUIManager; + @Override + public void addJSIModules(List jsiModules) { + mJSIModuleRegistry.registerModules(jsiModules); } - public void setFabricUIManager(UIManager fabricUIManager) { - mFabricUIManager = fabricUIManager; + @Override + public T getJSIModule(Class jsiModuleInterface) { + return mJSIModuleRegistry.getModule(jsiModuleInterface); } private native long getJavaScriptContext(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModule.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModule.java new file mode 100644 index 000000000..5b9e24954 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModule.java @@ -0,0 +1,7 @@ +package com.facebook.react.bridge; + +/** + * Marker interface used to represent a JSI Module. + */ +public interface JSIModule { +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleHolder.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleHolder.java new file mode 100644 index 000000000..de98ae54b --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleHolder.java @@ -0,0 +1,12 @@ +package com.facebook.react.bridge; + +/** + * Holder class used to register {@link JSIModule} into JSI Bridge. + */ +public interface JSIModuleHolder { + + Class getJSIModuleClass(); + + T getJSIModule(); + +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleRegistry.java new file mode 100644 index 000000000..913aae68b --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleRegistry.java @@ -0,0 +1,23 @@ +package com.facebook.react.bridge; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.facebook.infer.annotation.Assertions; + +public class JSIModuleRegistry { + + private final Map mModules = new HashMap<>(); + + public JSIModuleRegistry() { } + + public T getModule(Class moduleClass) { + return (T) Assertions.assertNotNull(mModules.get(moduleClass)); + } + + public void registerModules(List jsiModules) { + for (JSIModuleHolder holder : jsiModules) { + mModules.put(holder.getJSIModuleClass(), holder.getJSIModule()); + } + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModulesProvider.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModulesProvider.java new file mode 100644 index 000000000..8abaa1ff7 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModulesProvider.java @@ -0,0 +1,15 @@ +package com.facebook.react.bridge; + +import java.util.List; + +/** + * Interface used to initialize JSI Modules into the JSI Bridge. + */ +public interface JSIModulesProvider { + + /** + * @return a {@link List} that contain the list of JSI Modules. + */ + List getJSIModules(ReactApplicationContext reactApplicationContext, JavaScriptContextHolder jsContext); + +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java index ff3e93ca1..6cbca5de6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java @@ -3,7 +3,7 @@ package com.facebook.react.bridge; import com.facebook.react.uimanager.common.MeasureSpecProvider; import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; -public interface UIManager { +public interface UIManager extends JSIModule { /** * Registers a new root view.