From a15e7234760b3007a4cc010b6f821ba7202b13ce Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Mon, 11 Feb 2019 16:36:27 -0800 Subject: [PATCH] Support MobileConfig in Fabric Core C++ in FB4A and Catalyst Summary: MobileConfig should be wrapped and presented as a ReactNativeConfig object so that core Fabric C++ code can use it. This is just a noop plumbing diff. Real support will be added in follow-on diff. Reviewed By: fkgozali Differential Revision: D13985466 fbshipit-source-id: a2ac2175688e855eda3b89aa69faf07749c6bd31 --- .../react/fabric/FabricJSIModuleProvider.java | 7 ++-- .../react/fabric/ReactNativeConfig.java | 15 ++++++++ .../facebook/react/fabric/jsi/Binding.java | 9 +++-- .../facebook/react/fabric/jsi/jni/Binding.cpp | 6 ++-- .../facebook/react/fabric/jsi/jni/Binding.h | 2 +- .../jsi/jni/ReactNativeConfigHolder.cpp | 36 +++++++++++++++++++ .../fabric/jsi/jni/ReactNativeConfigHolder.h | 36 +++++++++++++++++++ 7 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/ReactNativeConfig.java create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/ReactNativeConfigHolder.cpp create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/ReactNativeConfigHolder.h diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java index efe12296997..5d010e0ed00 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java @@ -37,14 +37,17 @@ public class FabricJSIModuleProvider implements JSIModuleProvider { private final JavaScriptContextHolder mJSContext; private final ReactApplicationContext mReactApplicationContext; private final ComponentFactoryDelegate mComponentFactoryDelegate; + private final ReactNativeConfig mConfig; public FabricJSIModuleProvider( ReactApplicationContext reactApplicationContext, JavaScriptContextHolder jsContext, - ComponentFactoryDelegate componentFactoryDelegate) { + ComponentFactoryDelegate componentFactoryDelegate, + ReactNativeConfig config) { mReactApplicationContext = reactApplicationContext; mJSContext = jsContext; mComponentFactoryDelegate = componentFactoryDelegate; + mConfig = config; } @Override @@ -63,7 +66,7 @@ public class FabricJSIModuleProvider implements JSIModuleProvider { .getReactQueueConfiguration() .getJSQueueThread(); binding.register(mJSContext, uiManager, eventBeatManager, jsMessageQueueThread, - mComponentFactoryDelegate); + mComponentFactoryDelegate, mConfig); Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE); return uiManager; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/ReactNativeConfig.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/ReactNativeConfig.java new file mode 100644 index 00000000000..ae180b5fb5e --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/ReactNativeConfig.java @@ -0,0 +1,15 @@ +/** + * 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.fabric; + +// This is a wrapper for the ReactNativeConfig object in C++ +public interface ReactNativeConfig { + boolean getBool(String param); + int getInt64(String param); + String getString(String param); + double getDouble(String param); +} 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 95d1cf681d9..b3346ecf9b3 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 @@ -12,6 +12,7 @@ import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.JavaScriptContextHolder; import com.facebook.react.bridge.NativeMap; import com.facebook.react.bridge.queue.MessageQueueThread; +import com.facebook.react.fabric.ReactNativeConfig; import com.facebook.react.fabric.FabricUIManager; import com.facebook.react.uimanager.PixelUtil; @@ -36,7 +37,8 @@ public class Binding { Object uiManager, EventBeatManager eventBeatManager, MessageQueueThread jsMessageQueueThread, - ComponentFactoryDelegate componentsRegistry); + ComponentFactoryDelegate componentsRegistry, + Object reactNativeConfig); public native void startSurface(int surfaceId, NativeMap initialProps); @@ -54,10 +56,11 @@ public class Binding { FabricUIManager fabricUIManager, EventBeatManager eventBeatManager, MessageQueueThread jsMessageQueueThread, - ComponentFactoryDelegate componentFactoryDelegate) { + ComponentFactoryDelegate componentFactoryDelegate, + ReactNativeConfig reactNativeConfig) { fabricUIManager.setBinding(this); installFabricUIManager( - jsContext.get(), fabricUIManager, eventBeatManager, jsMessageQueueThread, componentFactoryDelegate); + jsContext.get(), fabricUIManager, eventBeatManager, jsMessageQueueThread, componentFactoryDelegate, reactNativeConfig); setPixelDensity(PixelUtil.getDisplayMetricDensity()); } 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 31410c43a3e..ed661ed50cb 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 @@ -5,13 +5,13 @@ #include "AsyncEventBeat.h" #include "Binding.h" #include "EventEmitterWrapper.h" +#include "ReactNativeConfigHolder.h" #include #include #include #include #include -#include #include #include #include @@ -79,7 +79,7 @@ void Binding::setConstraints(jint rootTag, jfloat minWidth, jfloat maxWidth, jfl } } -void Binding::installFabricUIManager(jlong jsContextNativePointer, jni::alias_ref javaUIManager, EventBeatManager* eventBeatManager, jni::alias_ref jsMessageQueueThread, ComponentFactoryDelegate* componentsRegistry) { +void Binding::installFabricUIManager(jlong jsContextNativePointer, jni::alias_ref javaUIManager, EventBeatManager* eventBeatManager, jni::alias_ref jsMessageQueueThread, ComponentFactoryDelegate* componentsRegistry, jni::alias_ref reactNativeConfig) { Runtime* runtime = (Runtime*) jsContextNativePointer; javaUIManager_ = make_global(javaUIManager); @@ -104,7 +104,7 @@ void Binding::installFabricUIManager(jlong jsContextNativePointer, jni::alias_re }; // TODO: Provide non-empty impl for ReactNativeConfig. - std::shared_ptr config = std::make_shared(); + std::shared_ptr config = std::make_shared(reactNativeConfig); contextContainer->registerInstance(config, "ReactNativeConfig"); contextContainer->registerInstance(synchronousBeatFactory, "synchronous"); contextContainer->registerInstance(asynchronousBeatFactory, "asynchronous"); 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 4b967952e6b..a9be059538d 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 @@ -38,7 +38,7 @@ private: static jni::local_ref initHybrid(jni::alias_ref); - void installFabricUIManager(jlong jsContextNativePointer, jni::alias_ref javaUIManager, EventBeatManager* eventBeatManager, jni::alias_ref jsMessageQueueThread, ComponentFactoryDelegate* componentsRegistry); + void installFabricUIManager(jlong jsContextNativePointer, jni::alias_ref javaUIManager, EventBeatManager* eventBeatManager, jni::alias_ref jsMessageQueueThread, ComponentFactoryDelegate* componentsRegistry, jni::alias_ref reactNativeConfig); void startSurface(jint surfaceId, NativeMap *initialProps); diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/ReactNativeConfigHolder.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/ReactNativeConfigHolder.cpp new file mode 100644 index 00000000000..e5e61cbf820 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/ReactNativeConfigHolder.cpp @@ -0,0 +1,36 @@ +/** + * 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. + */ + +#import "ReactNativeConfigHolder.h" + +#include + +using namespace facebook::react; + +bool ReactNativeConfigHolder::getBool(const std::string ¶m) const { + static const auto method = facebook::jni::findClassStatic("com/facebook/react/fabric/ReactNativeConfig") + ->getMethod("getBool"); + return method(reactNativeConfig_, facebook::jni::make_jstring(param).get()); +} + +std::string ReactNativeConfigHolder::getString(const std::string ¶m) const { + static const auto method = facebook::jni::findClassStatic("com/facebook/react/fabric/ReactNativeConfig") + ->getMethod("getString"); + return method(reactNativeConfig_, facebook::jni::make_jstring(param).get())->toString(); +} + +int64_t ReactNativeConfigHolder::getInt64(const std::string ¶m) const { + static const auto method = facebook::jni::findClassStatic("com/facebook/react/fabric/ReactNativeConfig") + ->getMethod("getInt64"); + return method(reactNativeConfig_, facebook::jni::make_jstring(param).get()); +} + +double ReactNativeConfigHolder::getDouble(const std::string ¶m) const { + static const auto method = facebook::jni::findClassStatic("com/facebook/react/fabric/ReactNativeConfig") + ->getMethod("getDouble"); + return method(reactNativeConfig_, facebook::jni::make_jstring(param).get()); +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/ReactNativeConfigHolder.h b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/ReactNativeConfigHolder.h new file mode 100644 index 00000000000..134fba31b56 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/ReactNativeConfigHolder.h @@ -0,0 +1,36 @@ +/** + * 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. + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace facebook { +namespace react { + +/** + * Implementation of ReactNativeConfig that wraps a FabricMobileConfig Java object. + */ +class ReactNativeConfigHolder : public ReactNativeConfig { +public: + ReactNativeConfigHolder(jni::alias_ref reactNativeConfig) : reactNativeConfig_(reactNativeConfig) {}; + + bool getBool(const std::string ¶m) const override; + std::string getString(const std::string ¶m) const override; + int64_t getInt64(const std::string ¶m) const override; + double getDouble(const std::string ¶m) const override; + +private: + jni::alias_ref reactNativeConfig_; +}; + +} // namespace react +} // namespace facebook