diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManager.cpp new file mode 100644 index 000000000000..4db7ec727978 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManager.cpp @@ -0,0 +1,74 @@ +/* + * 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 "FabricUIManager.h" + +#include + +#include +#include +#include +#include + +namespace facebook::react { + +Size measureHostComponent( + const ContextContainer* contextContainer, + FabricUIManagerMeasureArgs args) { + if (contextContainer == nullptr) { + return {}; + } + + const auto fabricUIManager = + contextContainer->at>("FabricUIManager"); + static const auto measure = + jni::findClassStatic("com/facebook/react/fabric/FabricUIManager") + ->getMethod("measure"); + + auto toReadableMap = + [](folly::dynamic& value) -> jni::local_ref { + if (value.isNull()) { + return {}; + } + auto nativeMap = jni::make_local( + ReadableNativeMap::createWithContents(std::move(value))); + // NOLINTBEGIN(cppcoreguidelines-pro-type-reinterpret-cast) + return jni::adopt_local( + reinterpret_cast(nativeMap.release())); + // NOLINTEND(cppcoreguidelines-pro-type-reinterpret-cast) + }; + + auto componentName = jni::make_jstring(args.componentName); + auto localData = toReadableMap(args.localData); + auto props = toReadableMap(args.props); + auto state = toReadableMap(args.state); + const auto& minimumSize = args.layoutConstraints.minimumSize; + const auto& maximumSize = args.layoutConstraints.maximumSize; + + return yogaMeassureToSize(measure( + fabricUIManager, + args.surfaceId, + componentName.get(), + localData.get(), + props.get(), + state.get(), + minimumSize.width, + maximumSize.width, + minimumSize.height, + maximumSize.height)); +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManager.h b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManager.h new file mode 100644 index 000000000000..22a0d9922e9b --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricUIManager.h @@ -0,0 +1,29 @@ +/* + * 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 { + +class ContextContainer; + +struct FabricUIManagerMeasureArgs { + SurfaceId surfaceId; + const char *componentName; + LayoutConstraints layoutConstraints; + folly::dynamic localData{nullptr}; + folly::dynamic props{nullptr}; + folly::dynamic state{nullptr}; +}; + +Size measureHostComponent(const ContextContainer *contextContainer, FabricUIManagerMeasureArgs args); + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarMeasurementsManager.cpp b/packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarMeasurementsManager.cpp index ac4739ec6a20..1267cd0aea68 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarMeasurementsManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarMeasurementsManager.cpp @@ -7,12 +7,8 @@ #include "AndroidProgressBarMeasurementsManager.h" -#include -#include +#include #include -#include - -using namespace facebook::jni; namespace facebook::react { @@ -20,44 +16,14 @@ Size AndroidProgressBarMeasurementsManager::measure( SurfaceId surfaceId, const AndroidProgressBarProps& props, LayoutConstraints layoutConstraints) const { - const jni::global_ref& fabricUIManager = - contextContainer_->at>("FabricUIManager"); - - static auto measure = facebook::jni::findClassStatic( - "com/facebook/react/fabric/FabricUIManager") - ->getMethod("measure"); - - auto minimumSize = layoutConstraints.minimumSize; - auto maximumSize = layoutConstraints.maximumSize; - - local_ref componentName = make_jstring("AndroidProgressBar"); - - auto serialiazedProps = toDynamic(props); - local_ref propsRNM = - ReadableNativeMap::newObjectCxxArgs(serialiazedProps); - local_ref propsRM = - make_local(reinterpret_cast(propsRNM.get())); - - return yogaMeassureToSize(measure( - fabricUIManager, - surfaceId, - componentName.get(), - nullptr, - propsRM.get(), - nullptr, - minimumSize.width, - maximumSize.width, - minimumSize.height, - maximumSize.height)); + return measureHostComponent( + contextContainer_.get(), + { + .surfaceId = surfaceId, + .componentName = "AndroidProgressBar", + .layoutConstraints = layoutConstraints, + .props = toDynamic(props), + }); } } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchMeasurementsManager.cpp b/packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchMeasurementsManager.cpp index 82757553314b..31120579bb54 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchMeasurementsManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchMeasurementsManager.cpp @@ -7,51 +7,20 @@ #include "AndroidSwitchMeasurementsManager.h" -#include -#include -#include - -using namespace facebook::jni; +#include namespace facebook::react { Size AndroidSwitchMeasurementsManager::measure( SurfaceId surfaceId, LayoutConstraints layoutConstraints) const { - { - const jni::global_ref& fabricUIManager = - contextContainer_->at>("FabricUIManager"); - - static auto measure = - jni::findClassStatic("com/facebook/react/fabric/FabricUIManager") - ->getMethod("measure"); - - auto minimumSize = layoutConstraints.minimumSize; - auto maximumSize = layoutConstraints.maximumSize; - - local_ref componentName = make_jstring("AndroidSwitch"); - - return yogaMeassureToSize(measure( - fabricUIManager, - surfaceId, - componentName.get(), - nullptr, - nullptr, - nullptr, - minimumSize.width, - maximumSize.width, - minimumSize.height, - maximumSize.height)); - } + return measureHostComponent( + contextContainer_.get(), + { + .surfaceId = surfaceId, + .componentName = "AndroidSwitch", + .layoutConstraints = layoutConstraints, + }); } } // namespace facebook::react diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index 7579a261eb06..374d6ab4e821 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -513,6 +513,7 @@ facebook::react::SharedColor facebook::react::colorFromComponents(facebook::reac facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); +facebook::react::Size facebook::react::measureHostComponent(const facebook::react::ContextContainer* contextContainer, facebook::react::FabricUIManagerMeasureArgs args); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); @@ -3243,6 +3244,15 @@ struct facebook::react::EventPayload { public virtual ~EventPayload() = default; } +struct facebook::react::FabricUIManagerMeasureArgs { + public const char* componentName; + public facebook::react::LayoutConstraints layoutConstraints; + public facebook::react::SurfaceId surfaceId; + public folly::dynamic localData; + public folly::dynamic props; + public folly::dynamic state; +} + struct facebook::react::FilterFunction { public bool operator==(const facebook::react::FilterFunction& other) const = default; public facebook::react::FilterType type; diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api index 69efb6e2de07..02452582b5b8 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api @@ -740,6 +740,7 @@ facebook::react::SharedColor facebook::react::colorFromComponents(facebook::reac facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); +facebook::react::Size facebook::react::measureHostComponent(const facebook::react::ContextContainer* contextContainer, facebook::react::FabricUIManagerMeasureArgs args); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); @@ -6081,6 +6082,15 @@ struct facebook::react::EventPayload { public virtual ~EventPayload() = default; } +struct facebook::react::FabricUIManagerMeasureArgs { + public const char* componentName; + public facebook::react::LayoutConstraints layoutConstraints; + public facebook::react::SurfaceId surfaceId; + public folly::dynamic localData; + public folly::dynamic props; + public folly::dynamic state; +} + struct facebook::react::FilterFunction { public bool operator==(const facebook::react::FilterFunction& other) const = default; public facebook::react::FilterType type; diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api index 3b07cc3df7c8..ceafbff61aff 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api @@ -513,6 +513,7 @@ facebook::react::SharedColor facebook::react::colorFromComponents(facebook::reac facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); +facebook::react::Size facebook::react::measureHostComponent(const facebook::react::ContextContainer* contextContainer, facebook::react::FabricUIManagerMeasureArgs args); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); @@ -3236,6 +3237,15 @@ struct facebook::react::EventPayload { public virtual ~EventPayload() = default; } +struct facebook::react::FabricUIManagerMeasureArgs { + public const char* componentName; + public facebook::react::LayoutConstraints layoutConstraints; + public facebook::react::SurfaceId surfaceId; + public folly::dynamic localData; + public folly::dynamic props; + public folly::dynamic state; +} + struct facebook::react::FilterFunction { public bool operator==(const facebook::react::FilterFunction& other) const = default; public facebook::react::FilterType type; diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index 3b07cc3df7c8..ceafbff61aff 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -513,6 +513,7 @@ facebook::react::SharedColor facebook::react::colorFromComponents(facebook::reac facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); +facebook::react::Size facebook::react::measureHostComponent(const facebook::react::ContextContainer* contextContainer, facebook::react::FabricUIManagerMeasureArgs args); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); @@ -3236,6 +3237,15 @@ struct facebook::react::EventPayload { public virtual ~EventPayload() = default; } +struct facebook::react::FabricUIManagerMeasureArgs { + public const char* componentName; + public facebook::react::LayoutConstraints layoutConstraints; + public facebook::react::SurfaceId surfaceId; + public folly::dynamic localData; + public folly::dynamic props; + public folly::dynamic state; +} + struct facebook::react::FilterFunction { public bool operator==(const facebook::react::FilterFunction& other) const = default; public facebook::react::FilterType type;