From bb15437db9341c17a7f9f30edaeec326eab120bf Mon Sep 17 00:00:00 2001 From: David Vacca Date: Fri, 7 Aug 2020 19:45:52 -0700 Subject: [PATCH] Create CoreComponentsRegistry Summary: This diff introduces the class CoreComponentsRegistry that is responsible of registering core components in fabric. This is required to make RN Tester to work in Fabric, in the future we'll extract this registry into another module (once we figure it out what's the best way to do this) changelog: [internal] internal Reviewed By: JoshuaGross Differential Revision: D22991876 fbshipit-source-id: 15e85e15aac5dd981161d9eae35eb2cee4fa66b6 --- .../react/fabric/CoreComponentsRegistry.java | 26 ++++++++ .../fabric/jni/CoreComponentsRegistry.cpp | 65 +++++++++++++++++++ .../react/fabric/jni/CoreComponentsRegistry.h | 42 ++++++++++++ .../com/facebook/react/fabric/jni/OnLoad.cpp | 2 + 4 files changed, 135 insertions(+) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.h diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java new file mode 100644 index 00000000000..288ded2d568 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java @@ -0,0 +1,26 @@ +/* + * 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; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.soloader.SoLoader; + +@DoNotStrip +public class CoreComponentsRegistry extends ComponentRegistry { + static { + SoLoader.loadLibrary("fabricjni"); + } + + private CoreComponentsRegistry(ComponentFactory componentFactory) { + super(componentFactory); + } + + public static CoreComponentsRegistry register(ComponentFactory componentFactory) { + return new CoreComponentsRegistry(componentFactory); + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp new file mode 100644 index 00000000000..962facf0eb4 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp @@ -0,0 +1,65 @@ +/* + * 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. + */ + +#include "CoreComponentsRegistry.h" + +#include + +#include + +#include +#include + +namespace facebook { +namespace react { + +CoreComponentsRegistry::CoreComponentsRegistry(ComponentFactory *delegate) + : delegate_(delegate) {} + +std::shared_ptr +CoreComponentsRegistry::sharedProviderRegistry() { + static auto providerRegistry = + []() -> std::shared_ptr { + auto providerRegistry = + std::make_shared(); + + providerRegistry->add( + concreteComponentDescriptorProvider()); + return providerRegistry; + }(); + + return providerRegistry; +} + +jni::local_ref +CoreComponentsRegistry::initHybrid( + jni::alias_ref, + ComponentFactory *delegate) { + auto instance = makeCxxInstance(delegate); + + auto buildRegistryFunction = + [](EventDispatcher::Weak const &eventDispatcher, + ContextContainer::Shared const &contextContainer) + -> ComponentDescriptorRegistry::Shared { + auto registry = CoreComponentsRegistry::sharedProviderRegistry() + ->createComponentDescriptorRegistry( + {eventDispatcher, contextContainer}); + return registry; + }; + + delegate->buildRegistryFunction = buildRegistryFunction; + return instance; +} + +void CoreComponentsRegistry::registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", CoreComponentsRegistry::initHybrid), + }); +} + +} // namespace react +} // namespace facebook diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.h b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.h new file mode 100644 index 00000000000..255a51a12f9 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.h @@ -0,0 +1,42 @@ +/* + * 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 "ComponentFactory.h" + +namespace facebook { +namespace react { + +class CoreComponentsRegistry + : public facebook::jni::HybridClass { + public: + constexpr static auto kJavaDescriptor = + "Lcom/facebook/react/fabric/CoreComponentsRegistry;"; + + static void registerNatives(); + + CoreComponentsRegistry(ComponentFactory *delegate); + + private: + friend HybridBase; + + static std::shared_ptr + sharedProviderRegistry(); + + const ComponentFactory *delegate_; + + static jni::local_ref initHybrid( + jni::alias_ref, + ComponentFactory *delegate); +}; + +} // namespace react +} // namespace facebook diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp index 7d6008ccd04..03005372a65 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp @@ -9,6 +9,7 @@ #include "Binding.h" #include "ComponentFactory.h" +#include "CoreComponentsRegistry.h" #include "EventBeatManager.h" #include "EventEmitterWrapper.h" #include "StateWrapperImpl.h" @@ -20,5 +21,6 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { facebook::react::EventEmitterWrapper::registerNatives(); facebook::react::StateWrapperImpl::registerNatives(); facebook::react::ComponentFactory::registerNatives(); + facebook::react::CoreComponentsRegistry::registerNatives(); }); }