From f23da3aeb0cd824f0b0816fd70f82456584606bd Mon Sep 17 00:00:00 2001 From: Emily Janzer Date: Thu, 23 May 2019 13:43:57 -0700 Subject: [PATCH] Use startSurface on Android Summary: Right now calling FabricUIManager.addRootView() doesn't actually start running the application on Android. This diff: 1. Removes the #ifndef so that we actually call UIManagerBinding.startSurface() on Android 2. Passes through the JS module name from addRootView so we can render the surface (falls back to an empty string if not provided, which is the current behavior) 3. Adds an option for starting the surface using `RN$SurfaceRegistry` instead of `AppRegistry`, if that global property has been defined in JS. This is used for Venice (bridgeless RN) Reviewed By: shergin Differential Revision: D15366200 fbshipit-source-id: 4a506a589108905d4852b9723aac6fb0fad2d86e --- .../react/fabric/FabricUIManager.java | 9 +++++-- .../facebook/react/fabric/jsi/Binding.java | 2 +- .../facebook/react/fabric/jsi/jni/Binding.cpp | 8 ++++-- .../facebook/react/fabric/jsi/jni/Binding.h | 5 +++- ReactCommon/fabric/uimanager/Scheduler.cpp | 4 --- .../fabric/uimanager/UIManagerBinding.cpp | 25 +++++++++++++------ 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index 9b9c6f78107..3c2070910a0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -128,13 +128,18 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { @Override public int addRootView( - final T rootView, final WritableMap initialProps, final @Nullable String initialUITemplate) { + final T rootView, final WritableMap initialProps, final @Nullable String initialUITemplate) { + return addRootView(rootView, null, initialProps, initialUITemplate); + } + + public int addRootView( + final T rootView, final @Nullable String moduleName, final WritableMap initialProps, final @Nullable String initialUITemplate) { final int rootTag = ReactRootViewTagGenerator.getNextRootViewTag(); ThemedReactContext reactContext = new ThemedReactContext(mReactApplicationContext, rootView.getContext()); mMountingManager.addRootView(rootTag, rootView); mReactContextForRootTag.put(rootTag, reactContext); - mBinding.startSurface(rootTag, (NativeMap) initialProps); + mBinding.startSurface(rootTag, moduleName == null ? "" : moduleName, (NativeMap) initialProps); if (initialUITemplate != null) { mBinding.renderTemplateToSurface(rootTag, initialUITemplate); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/Binding.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/Binding.java index 441e9809110..664cd6d94da 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/Binding.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/Binding.java @@ -40,7 +40,7 @@ public class Binding { ComponentFactoryDelegate componentsRegistry, Object reactNativeConfig); - public native void startSurface(int surfaceId, NativeMap initialProps); + public native void startSurface(int surfaceId, String moduleName, NativeMap initialProps); public native void renderTemplateToSurface(int surfaceId, String uiTemplate); diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.cpp index 286392d5590..171935a1aca 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.cpp @@ -45,9 +45,13 @@ jni::local_ref Binding::initHybrid( return makeCxxInstance(); } -void Binding::startSurface(jint surfaceId, NativeMap *initialProps) { +void Binding::startSurface( + jint surfaceId, + jni::alias_ref moduleName, + NativeMap *initialProps) { if (scheduler_) { - scheduler_->startSurface(surfaceId, "", initialProps->consume()); + scheduler_->startSurface( + surfaceId, moduleName->toStdString(), initialProps->consume()); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.h b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.h index 6486763e7ee..6981de4937a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.h +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.h @@ -50,7 +50,10 @@ class Binding : public jni::HybridClass, public SchedulerDelegate { ComponentFactoryDelegate *componentsRegistry, jni::alias_ref reactNativeConfig); - void startSurface(jint surfaceId, NativeMap *initialProps); + void startSurface( + jint surfaceId, + jni::alias_ref moduleName, + NativeMap *initialProps); void renderTemplateToSurface(jint surfaceId, jstring uiTemplate); diff --git a/ReactCommon/fabric/uimanager/Scheduler.cpp b/ReactCommon/fabric/uimanager/Scheduler.cpp index c4637c1a3d5..aab1121d934 100644 --- a/ReactCommon/fabric/uimanager/Scheduler.cpp +++ b/ReactCommon/fabric/uimanager/Scheduler.cpp @@ -96,12 +96,10 @@ void Scheduler::startSurface( shadowTreeRegistry_.add(std::move(shadowTree)); -#ifndef ANDROID runtimeExecutor_([=](jsi::Runtime &runtime) { uiManagerBinding_->startSurface( runtime, surfaceId, moduleName, initialProps); }); -#endif } void Scheduler::renderTemplateToSurface( @@ -171,11 +169,9 @@ void Scheduler::stopSurface(SurfaceId surfaceId) const { auto shadowTree = shadowTreeRegistry_.remove(surfaceId); shadowTree->setDelegate(nullptr); -#ifndef ANDROID runtimeExecutor_([=](jsi::Runtime &runtime) { uiManagerBinding_->stopSurface(runtime, surfaceId); }); -#endif } Size Scheduler::measureSurface( diff --git a/ReactCommon/fabric/uimanager/UIManagerBinding.cpp b/ReactCommon/fabric/uimanager/UIManagerBinding.cpp index afcb6aff7d4..ac72b2437be 100644 --- a/ReactCommon/fabric/uimanager/UIManagerBinding.cpp +++ b/ReactCommon/fabric/uimanager/UIManagerBinding.cpp @@ -46,14 +46,25 @@ void UIManagerBinding::startSurface( parameters["initialProps"] = initalProps; parameters["fabric"] = true; - auto module = getModule(runtime, "AppRegistry"); - auto method = module.getPropertyAsFunction(runtime, "runApplication"); + if (runtime.global().hasProperty(runtime, "RN$SurfaceRegistry")) { + auto registry = + runtime.global().getPropertyAsObject(runtime, "RN$SurfaceRegistry"); + auto method = registry.getPropertyAsFunction(runtime, "renderSurface"); - method.callWithThis( - runtime, - module, - {jsi::String::createFromUtf8(runtime, moduleName), - jsi::valueFromDynamic(runtime, parameters)}); + method.call( + runtime, + {jsi::String::createFromUtf8(runtime, moduleName), + jsi::valueFromDynamic(runtime, parameters)}); + } else { + auto module = getModule(runtime, "AppRegistry"); + auto method = module.getPropertyAsFunction(runtime, "runApplication"); + + method.callWithThis( + runtime, + module, + {jsi::String::createFromUtf8(runtime, moduleName), + jsi::valueFromDynamic(runtime, parameters)}); + } } void UIManagerBinding::stopSurface(jsi::Runtime &runtime, SurfaceId surfaceId)