From 748d674dd546a0b796c660bcd7d827372bd1bbad Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 22 Jan 2024 04:43:03 -0800 Subject: [PATCH] Fabric Automatic Interop for Android (#42294) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/42294 This changes enables the Fabric Intrerop Layer automatically for all the users. Practically I'm removing the fallback `ComponentDescriptor` inside the `ComponentDescriptorRegistry` so that if a component hasn't been automatically registered by a user, instead of showing the UnimplementedView, it loads a `UnstableLegacyViewManagerAutomaticComponentDescriptor`. This ComponentDescriptor is built starting from the legacy component name, and responds with correct `ComponentName` and `ComponentHandle` (similarly to the `UnstableLegacyViewManagerInteropComponentDescriptor` but without using C++ templates). Changelog: [Internal] [Changed] - Fabric Automatic Interop for Android Reviewed By: sammy-SC Differential Revision: D52663244 fbshipit-source-id: f466486c638bb1362ef59128cd69bb9731bb9739 --- .../react/config/ReactNativeConfig.cpp | 3 ++ .../renderer/componentregistry/CMakeLists.txt | 2 ++ .../ComponentDescriptorRegistry.cpp | 19 ++++++++-- ...iewManagerAutomaticComponentDescriptor.cpp | 26 ++++++++++++++ ...yViewManagerAutomaticComponentDescriptor.h | 35 +++++++++++++++++++ ...leLegacyViewManagerAutomaticShadowNode.cpp | 13 +++++++ ...ableLegacyViewManagerAutomaticShadowNode.h | 22 ++++++++++++ .../android/app/src/main/jni/OnLoad.cpp | 4 --- 8 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.cpp create mode 100644 packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.h create mode 100644 packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.cpp create mode 100644 packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h diff --git a/packages/react-native/ReactCommon/react/config/ReactNativeConfig.cpp b/packages/react-native/ReactCommon/react/config/ReactNativeConfig.cpp index 11585835245..2fbf85bbbab 100644 --- a/packages/react-native/ReactCommon/react/config/ReactNativeConfig.cpp +++ b/packages/react-native/ReactCommon/react/config/ReactNativeConfig.cpp @@ -13,6 +13,9 @@ bool EmptyReactNativeConfig::getBool(const std::string& param) const { if (param == "react_fabric:enabled_layout_animations_ios") { return true; } + if (param == "react_fabric:enabled_automatic_interop_android") { + return true; + } if (param == "react_native_devx:enable_modern_cdp_registry") { return false; } diff --git a/packages/react-native/ReactCommon/react/renderer/componentregistry/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/componentregistry/CMakeLists.txt index ed5cb2e737f..32209a348a1 100644 --- a/packages/react-native/ReactCommon/react/renderer/componentregistry/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/componentregistry/CMakeLists.txt @@ -23,8 +23,10 @@ target_link_libraries(react_render_componentregistry folly_runtime glog_init jsi + react_config react_debug react_render_core react_render_debug react_utils + rrc_legacyviewmanagerinterop ) diff --git a/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp b/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp index 7c650cf21c0..cbf6bcc1bd5 100644 --- a/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp +++ b/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp @@ -9,11 +9,13 @@ #include "componentNameByReactViewName.h" +#include #include #include +#include +#include #include #include - #include namespace facebook::react { @@ -82,12 +84,23 @@ const ComponentDescriptor& ComponentDescriptorRegistry::at( } if (it == _registryByName.end()) { - if (_fallbackComponentDescriptor == nullptr) { + auto reactNativeConfig_ = + contextContainer_->at>( + "ReactNativeConfig"); + if (reactNativeConfig_->getBool( + "react_fabric:enabled_automatic_interop_android")) { + auto componentDescriptor = std::make_shared< + const UnstableLegacyViewManagerAutomaticComponentDescriptor>( + parameters_, unifiedComponentName); + registerComponentDescriptor(componentDescriptor); + return *_registryByName.find(unifiedComponentName)->second; + } else if (_fallbackComponentDescriptor == nullptr) { throw std::invalid_argument( ("Unable to find componentDescriptor for " + unifiedComponentName) .c_str()); + } else { + return *_fallbackComponentDescriptor.get(); } - return *_fallbackComponentDescriptor.get(); } return *it->second; diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.cpp b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.cpp new file mode 100644 index 00000000000..b6ba28e651f --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.cpp @@ -0,0 +1,26 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "UnstableLegacyViewManagerAutomaticComponentDescriptor.h" +#include +#include +#include +#include + +namespace facebook::react { +ComponentName +UnstableLegacyViewManagerAutomaticComponentDescriptor::getComponentName() + const { + return legacyComponentName_.c_str(); +} + +ComponentHandle +UnstableLegacyViewManagerAutomaticComponentDescriptor::getComponentHandle() + const { + return reinterpret_cast(getComponentName()); +} +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.h new file mode 100644 index 00000000000..24458840edc --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) Meta Platforms, Inc. and 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 + +namespace facebook::react { + +class UnstableLegacyViewManagerAutomaticComponentDescriptor final + : public ConcreteComponentDescriptor< + LegacyViewManagerAndroidInteropShadowNode> { + public: + using ConcreteComponentDescriptor::ConcreteComponentDescriptor; + + UnstableLegacyViewManagerAutomaticComponentDescriptor( + const ComponentDescriptorParameters& parameters, + std::string legacyComponentName) + : ConcreteComponentDescriptor(parameters), + legacyComponentName_(std::move(legacyComponentName)) {} + + ComponentHandle getComponentHandle() const override; + ComponentName getComponentName() const override; + + private: + std::string legacyComponentName_; +}; +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.cpp new file mode 100644 index 00000000000..f5c24f5310f --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.cpp @@ -0,0 +1,13 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +namespace facebook::react { + +extern const char LegacyViewManagerAndroidInteropComponentName[] = + "LegacyViewManagerInterop"; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h new file mode 100644 index 00000000000..fd0315155f8 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) Meta Platforms, Inc. and 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 + +namespace facebook::react { + +extern const char LegacyViewManagerAndroidInteropComponentName[]; + +using LegacyViewManagerAndroidInteropShadowNode = ConcreteViewShadowNode< + LegacyViewManagerAndroidInteropComponentName, + LegacyViewManagerInteropViewProps>; + +} // namespace facebook::react diff --git a/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp b/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp index c7b717bdda0..4fd2a640de0 100644 --- a/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp +++ b/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp @@ -13,7 +13,6 @@ #include #include #include -#include namespace facebook { namespace react { @@ -24,9 +23,6 @@ void registerComponents( std::shared_ptr registry) { registry->add(concreteComponentDescriptorProvider< RNTMyNativeViewComponentDescriptor>()); - registry->add(concreteComponentDescriptorProvider< - UnstableLegacyViewManagerInteropComponentDescriptor< - RNTMyNativeViewName>>()); } std::shared_ptr cxxModuleProvider(