diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseJavaModule.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseJavaModule.java index 9fac0a18ef..f911938b40 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseJavaModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseJavaModule.java @@ -59,14 +59,14 @@ public abstract class BaseJavaModule implements NativeModule { } public abstract @Nullable T extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex); + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex); } static final private ArgumentExtractor ARGUMENT_EXTRACTOR_BOOLEAN = new ArgumentExtractor() { @Override public Boolean extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { return jsArguments.getBoolean(atIndex); } }; @@ -75,7 +75,7 @@ public abstract class BaseJavaModule implements NativeModule { new ArgumentExtractor() { @Override public Double extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { return jsArguments.getDouble(atIndex); } }; @@ -84,7 +84,7 @@ public abstract class BaseJavaModule implements NativeModule { new ArgumentExtractor() { @Override public Float extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { return (float) jsArguments.getDouble(atIndex); } }; @@ -93,7 +93,7 @@ public abstract class BaseJavaModule implements NativeModule { new ArgumentExtractor() { @Override public Integer extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { return (int) jsArguments.getDouble(atIndex); } }; @@ -102,7 +102,7 @@ public abstract class BaseJavaModule implements NativeModule { new ArgumentExtractor() { @Override public String extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { return jsArguments.getString(atIndex); } }; @@ -111,7 +111,7 @@ public abstract class BaseJavaModule implements NativeModule { new ArgumentExtractor() { @Override public ReadableNativeArray extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { return jsArguments.getArray(atIndex); } }; @@ -120,7 +120,7 @@ public abstract class BaseJavaModule implements NativeModule { new ArgumentExtractor() { @Override public Dynamic extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { return DynamicFromArray.create(jsArguments, atIndex); } }; @@ -129,7 +129,7 @@ public abstract class BaseJavaModule implements NativeModule { new ArgumentExtractor() { @Override public ReadableMap extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { return jsArguments.getMap(atIndex); } }; @@ -138,12 +138,12 @@ public abstract class BaseJavaModule implements NativeModule { new ArgumentExtractor() { @Override public @Nullable Callback extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { if (jsArguments.isNull(atIndex)) { return null; } else { int id = (int) jsArguments.getDouble(atIndex); - return new CallbackImpl(catalystInstance, executorToken, id); + return new CallbackImpl(jsInstance, executorToken, id); } } }; @@ -157,11 +157,11 @@ public abstract class BaseJavaModule implements NativeModule { @Override public Promise extractArgument( - CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { + JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray jsArguments, int atIndex) { Callback resolve = ARGUMENT_EXTRACTOR_CALLBACK - .extractArgument(catalystInstance, executorToken, jsArguments, atIndex); + .extractArgument(jsInstance, executorToken, jsArguments, atIndex); Callback reject = ARGUMENT_EXTRACTOR_CALLBACK - .extractArgument(catalystInstance, executorToken, jsArguments, atIndex + 1); + .extractArgument(jsInstance, executorToken, jsArguments, atIndex + 1); return new PromiseImpl(resolve, reject); } }; @@ -307,7 +307,7 @@ public abstract class BaseJavaModule implements NativeModule { } @Override - public void invoke(CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray parameters) { + public void invoke(JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray parameters) { SystraceMessage.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "callJavaModuleMethod") .arg("method", mTraceName) .flush(); @@ -329,7 +329,7 @@ public abstract class BaseJavaModule implements NativeModule { try { for (; i < mArgumentExtractors.length; i++) { mArguments[i + executorTokenOffset] = mArgumentExtractors[i].extractArgument( - catalystInstance, executorToken, parameters, jsArgumentsConsumed); + jsInstance, executorToken, parameters, jsArgumentsConsumed); jsArgumentsConsumed += mArgumentExtractors[i].getJSArgumentsNeeded(); } } catch (UnexpectedNativeTypeException e) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CallbackImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CallbackImpl.java index 7ba988a959..aeef58ec4e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CallbackImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CallbackImpl.java @@ -14,13 +14,13 @@ package com.facebook.react.bridge; */ public final class CallbackImpl implements Callback { - private final CatalystInstance mCatalystInstance; + private final JSInstance mJSInstance; private final ExecutorToken mExecutorToken; private final int mCallbackId; private boolean mInvoked; - public CallbackImpl(CatalystInstance bridge, ExecutorToken executorToken, int callbackId) { - mCatalystInstance = bridge; + public CallbackImpl(JSInstance jsInstance, ExecutorToken executorToken, int callbackId) { + mJSInstance = jsInstance; mExecutorToken = executorToken; mCallbackId = callbackId; mInvoked = false; @@ -33,7 +33,7 @@ public final class CallbackImpl implements Callback { "module. This callback type only permits a single invocation from "+ "native code."); } - mCatalystInstance.invokeCallback(mExecutorToken, mCallbackId, Arguments.fromJavaArgs(args)); + mJSInstance.invokeCallback(mExecutorToken, mCallbackId, Arguments.fromJavaArgs(args)); mInvoked = true; } } 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 725182227d..4f3640aede 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java @@ -23,7 +23,8 @@ import com.facebook.react.common.annotations.VisibleForTesting; * Java APIs be invokable from JavaScript as well. */ @DoNotStrip -public interface CatalystInstance extends MemoryPressureListener { +public interface CatalystInstance + extends MemoryPressureListener, JSInstance { void runJSBundle(); /** @@ -34,8 +35,11 @@ public interface CatalystInstance extends MemoryPressureListener { // This is called from java code, so it won't be stripped anyway, but proguard will rename it, // which this prevents. - @DoNotStrip - void invokeCallback(ExecutorToken executorToken, final int callbackID, final NativeArray arguments); + @Override @DoNotStrip + void invokeCallback( + ExecutorToken executorToken, + int callbackID, + NativeArray arguments); @DoNotStrip void callFunction( ExecutorToken executorToken, diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSInstance.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSInstance.java new file mode 100644 index 0000000000..30cb7be79f --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSInstance.java @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +package com.facebook.react.bridge; + +/** + * This interface includes the methods needed to use a running JS + * instance, without specifying any of the bridge-specific + * initialization or lifecycle management. + */ +public interface JSInstance { + void invokeCallback( + ExecutorToken executorToken, + int callbackID, + NativeArray arguments); + // TODO if this interface survives refactoring, think about adding + // callFunction. +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java index b92ed701a9..830f563014 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java @@ -20,7 +20,7 @@ import java.util.Map; */ public interface NativeModule { interface NativeMethod { - void invoke(CatalystInstance catalystInstance, ExecutorToken executorToken, ReadableNativeArray parameters); + void invoke(JSInstance jsInstance, ExecutorToken executorToken, ReadableNativeArray parameters); String getType(); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java index 0b564b42a9..4e9d9c0883 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java @@ -176,12 +176,13 @@ public class CatalystInstanceImpl implements CatalystInstance { } } - private native void initializeBridge(ReactCallback callback, - JavaScriptExecutor jsExecutor, - MessageQueueThread jsQueue, - MessageQueueThread moduleQueue, - Collection javaModules, - Collection cxxModules); + private native void initializeBridge( + ReactCallback callback, + JavaScriptExecutor jsExecutor, + MessageQueueThread jsQueue, + MessageQueueThread moduleQueue, + Collection javaModules, + Collection cxxModules); /** * This API is used in situations where the JS bundle is being executed not on @@ -232,7 +233,6 @@ public class CatalystInstanceImpl implements CatalystInstance { mJSCallsPendingInit.clear(); } - // This is registered after JS starts since it makes a JS call Systrace.registerListener(mTraceListener); } @@ -302,7 +302,7 @@ public class CatalystInstanceImpl implements CatalystInstance { mReactQueueConfiguration.getNativeModulesQueueThread().runOnQueue(new Runnable() { @Override public void run() { - mJavaRegistry.notifyCatalystInstanceDestroy(); + mJavaRegistry.notifyJSInstanceDestroy(); } }); boolean wasIdle = (mPendingJSCalls.getAndSet(0) == 0); @@ -341,7 +341,7 @@ public class CatalystInstanceImpl implements CatalystInstance { mReactQueueConfiguration.getNativeModulesQueueThread().runOnQueue(new Runnable() { @Override public void run() { - mJavaRegistry.notifyCatalystInstanceInitialized(); + mJavaRegistry.notifyJSInstanceInitialized(); } }); } @@ -390,7 +390,7 @@ public class CatalystInstanceImpl implements CatalystInstance { if (mDestroyed) { return; } - switch(level) { + switch (level) { case UI_HIDDEN: handleMemoryPressureUiHidden(); break; diff --git a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/JavaModuleWrapper.java b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/JavaModuleWrapper.java index e0e07af6b7..fb31909114 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/JavaModuleWrapper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/JavaModuleWrapper.java @@ -16,8 +16,8 @@ import java.util.Map; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.BaseJavaModule; -import com.facebook.react.bridge.CatalystInstance; import com.facebook.react.bridge.ExecutorToken; +import com.facebook.react.bridge.JSInstance; import com.facebook.react.bridge.NativeArray; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactMarker; @@ -54,12 +54,12 @@ public class JavaModuleWrapper { String type; } - private final CatalystInstance mCatalystInstance; + private final JSInstance mJSInstance; private final ModuleHolder mModuleHolder; private final ArrayList mMethods; - public JavaModuleWrapper(CatalystInstance catalystinstance, ModuleHolder moduleHolder) { - mCatalystInstance = catalystinstance; + public JavaModuleWrapper(JSInstance jsInstance, ModuleHolder moduleHolder) { + mJSInstance = jsInstance; mModuleHolder = moduleHolder; mMethods = new ArrayList<>(); } @@ -135,6 +135,6 @@ public class JavaModuleWrapper { return; } - mMethods.get(methodId).invoke(mCatalystInstance, token, parameters); + mMethods.get(methodId).invoke(mJSInstance, token, parameters); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/NativeModuleRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/NativeModuleRegistry.java index 93d9e276d7..2b0a576259 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/NativeModuleRegistry.java +++ b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/NativeModuleRegistry.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Map; import com.facebook.infer.annotation.Assertions; +import com.facebook.react.bridge.JSInstance; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.OnBatchCompleteListener; import com.facebook.react.bridge.ReactApplicationContext; @@ -41,12 +42,12 @@ public class NativeModuleRegistry { } /* package */ Collection getJavaModules( - CatalystInstanceImpl catalystInstanceImpl) { + JSInstance jsInstance) { ArrayList javaModules = new ArrayList<>(); for (Map.Entry, ModuleHolder> entry : mModules.entrySet()) { Class type = entry.getKey(); if (!CxxModuleWrapper.class.isAssignableFrom(type)) { - javaModules.add(new JavaModuleWrapper(catalystInstanceImpl, entry.getValue())); + javaModules.add(new JavaModuleWrapper(jsInstance, entry.getValue())); } } return javaModules; @@ -63,11 +64,11 @@ public class NativeModuleRegistry { return cxxModules; } - /* package */ void notifyCatalystInstanceDestroy() { + /* package */ void notifyJSInstanceDestroy() { mReactApplicationContext.assertOnNativeModulesQueueThread(); Systrace.beginSection( Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, - "NativeModuleRegistry_notifyCatalystInstanceDestroy"); + "NativeModuleRegistry_notifyJSInstanceDestroy"); try { for (ModuleHolder module : mModules.values()) { module.destroy(); @@ -77,7 +78,7 @@ public class NativeModuleRegistry { } } - /* package */ void notifyCatalystInstanceInitialized() { + /* package */ void notifyJSInstanceInitialized() { mReactApplicationContext.assertOnNativeModulesQueueThread("From version React Native v0.44, " + "native modules are explicitly not initialized on the UI thread. See " + "https://github.com/facebook/react-native/wiki/Breaking-Changes#d4611211-reactnativeandroidbreaking-move-nativemodule-initialization-off-ui-thread---aaachiuuu " + @@ -85,7 +86,7 @@ public class NativeModuleRegistry { ReactMarker.logMarker(ReactMarkerConstants.NATIVE_MODULE_INITIALIZE_START); Systrace.beginSection( Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, - "NativeModuleRegistry_notifyCatalystInstanceInitialized"); + "NativeModuleRegistry_notifyJSInstanceInitialized"); try { for (ModuleHolder module : mModules.values()) { module.initialize();