Skip to content

Commit b7a224a

Browse files
javachemeta-codesync[bot]
authored andcommitted
Add FabricUIManager measure helper
Summary: Fabric components that measure through `FabricUIManager` repeat the same JNI signature, map conversion, constraint forwarding, and result decoding. Add a shared Android C++ helper and migrate the existing representative callers. Changelog: [Android][Added] - Add a reusable C++ helper for measuring Fabric components Differential Revision: D126142997
1 parent 1fcf9b8 commit b7a224a

7 files changed

Lines changed: 128 additions & 78 deletions

File tree

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#pragma once
9+
10+
#include <fbjni/fbjni.h>
11+
#include <folly/dynamic.h>
12+
#include <react/jni/ReadableNativeMap.h>
13+
#include <react/renderer/core/LayoutConstraints.h>
14+
#include <react/renderer/core/ReactPrimitives.h>
15+
#include <react/renderer/core/conversions.h>
16+
#include <bit>
17+
#include <utility>
18+
19+
namespace facebook::react {
20+
21+
struct FabricUIManagerMeasureArgs {
22+
SurfaceId surfaceId;
23+
const char *componentName;
24+
LayoutConstraints layoutConstraints;
25+
folly::dynamic localData{nullptr};
26+
folly::dynamic props{nullptr};
27+
folly::dynamic state{nullptr};
28+
};
29+
30+
inline Size measureWithFabricUIManager(const jni::global_ref<jobject> &fabricUIManager, FabricUIManagerMeasureArgs args)
31+
{
32+
static const auto measure = jni::findClassStatic("com/facebook/react/fabric/FabricUIManager")
33+
->getMethod<jlong(
34+
jint,
35+
jstring,
36+
ReadableMap::javaobject,
37+
ReadableMap::javaobject,
38+
ReadableMap::javaobject,
39+
jfloat,
40+
jfloat,
41+
jfloat,
42+
jfloat)>("measure");
43+
44+
auto toReadableMap = [](folly::dynamic &value) {
45+
auto nativeMap = jni::make_local(ReadableNativeMap::createWithContents(std::move(value)));
46+
return jni::adopt_local(std::bit_cast<ReadableMap::javaobject>(nativeMap.release()));
47+
};
48+
49+
auto componentName = jni::make_jstring(args.componentName);
50+
auto localData = toReadableMap(args.localData);
51+
auto props = toReadableMap(args.props);
52+
auto state = toReadableMap(args.state);
53+
const auto &minimumSize = args.layoutConstraints.minimumSize;
54+
const auto &maximumSize = args.layoutConstraints.maximumSize;
55+
56+
return yogaMeassureToSize(measure(
57+
fabricUIManager,
58+
args.surfaceId,
59+
componentName.get(),
60+
localData.get(),
61+
props.get(),
62+
state.get(),
63+
minimumSize.width,
64+
maximumSize.width,
65+
minimumSize.height,
66+
maximumSize.height));
67+
}
68+
69+
} // namespace facebook::react

‎packages/react-native/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarMeasurementsManager.cpp‎

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,8 @@
77

88
#include "AndroidProgressBarMeasurementsManager.h"
99

10-
#include <fbjni/fbjni.h>
11-
#include <react/jni/ReadableNativeMap.h>
10+
#include <react/fabric/FabricUIManagerMeasure.h>
1211
#include <react/renderer/components/progressbar/conversions.h>
13-
#include <react/renderer/core/conversions.h>
14-
15-
using namespace facebook::jni;
1612

1713
namespace facebook::react {
1814

@@ -23,41 +19,14 @@ Size AndroidProgressBarMeasurementsManager::measure(
2319
const jni::global_ref<jobject>& fabricUIManager =
2420
contextContainer_->at<jni::global_ref<jobject>>("FabricUIManager");
2521

26-
static auto measure = facebook::jni::findClassStatic(
27-
"com/facebook/react/fabric/FabricUIManager")
28-
->getMethod<jlong(
29-
jint,
30-
jstring,
31-
ReadableMap::javaobject,
32-
ReadableMap::javaobject,
33-
ReadableMap::javaobject,
34-
jfloat,
35-
jfloat,
36-
jfloat,
37-
jfloat)>("measure");
38-
39-
auto minimumSize = layoutConstraints.minimumSize;
40-
auto maximumSize = layoutConstraints.maximumSize;
41-
42-
local_ref<JString> componentName = make_jstring("AndroidProgressBar");
43-
44-
auto serialiazedProps = toDynamic(props);
45-
local_ref<ReadableNativeMap::javaobject> propsRNM =
46-
ReadableNativeMap::newObjectCxxArgs(serialiazedProps);
47-
local_ref<ReadableMap::javaobject> propsRM =
48-
make_local(reinterpret_cast<ReadableMap::javaobject>(propsRNM.get()));
49-
50-
return yogaMeassureToSize(measure(
22+
return measureWithFabricUIManager(
5123
fabricUIManager,
52-
surfaceId,
53-
componentName.get(),
54-
nullptr,
55-
propsRM.get(),
56-
nullptr,
57-
minimumSize.width,
58-
maximumSize.width,
59-
minimumSize.height,
60-
maximumSize.height));
24+
{
25+
.surfaceId = surfaceId,
26+
.componentName = "AndroidProgressBar",
27+
.layoutConstraints = layoutConstraints,
28+
.props = toDynamic(props),
29+
});
6130
}
6231

6332
} // namespace facebook::react

‎packages/react-native/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchMeasurementsManager.cpp‎

Lines changed: 11 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,51 +7,23 @@
77

88
#include "AndroidSwitchMeasurementsManager.h"
99

10-
#include <fbjni/fbjni.h>
11-
#include <react/jni/ReadableNativeMap.h>
12-
#include <react/renderer/core/conversions.h>
13-
14-
using namespace facebook::jni;
10+
#include <react/fabric/FabricUIManagerMeasure.h>
1511

1612
namespace facebook::react {
1713

1814
Size AndroidSwitchMeasurementsManager::measure(
1915
SurfaceId surfaceId,
2016
LayoutConstraints layoutConstraints) const {
21-
{
22-
const jni::global_ref<jobject>& fabricUIManager =
23-
contextContainer_->at<jni::global_ref<jobject>>("FabricUIManager");
24-
25-
static auto measure =
26-
jni::findClassStatic("com/facebook/react/fabric/FabricUIManager")
27-
->getMethod<jlong(
28-
jint,
29-
jstring,
30-
ReadableMap::javaobject,
31-
ReadableMap::javaobject,
32-
ReadableMap::javaobject,
33-
jfloat,
34-
jfloat,
35-
jfloat,
36-
jfloat)>("measure");
37-
38-
auto minimumSize = layoutConstraints.minimumSize;
39-
auto maximumSize = layoutConstraints.maximumSize;
40-
41-
local_ref<JString> componentName = make_jstring("AndroidSwitch");
42-
43-
return yogaMeassureToSize(measure(
44-
fabricUIManager,
45-
surfaceId,
46-
componentName.get(),
47-
nullptr,
48-
nullptr,
49-
nullptr,
50-
minimumSize.width,
51-
maximumSize.width,
52-
minimumSize.height,
53-
maximumSize.height));
54-
}
17+
const jni::global_ref<jobject>& fabricUIManager =
18+
contextContainer_->at<jni::global_ref<jobject>>("FabricUIManager");
19+
20+
return measureWithFabricUIManager(
21+
fabricUIManager,
22+
{
23+
.surfaceId = surfaceId,
24+
.componentName = "AndroidSwitch",
25+
.layoutConstraints = layoutConstraints,
26+
});
5527
}
5628

5729
} // namespace facebook::react

‎scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ facebook::react::SharedColor facebook::react::colorFromComponents(facebook::reac
514514
facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
515515
facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value);
516516
facebook::react::SharedColor facebook::react::whiteColor();
517+
facebook::react::Size facebook::react::measureWithFabricUIManager(const jni::global_ref<jobject>& fabricUIManager, facebook::react::FabricUIManagerMeasureArgs args);
517518
facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value);
518519
facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value);
519520
facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value);
@@ -3244,6 +3245,15 @@ struct facebook::react::EventPayload {
32443245
public virtual ~EventPayload() = default;
32453246
}
32463247

3248+
struct facebook::react::FabricUIManagerMeasureArgs {
3249+
public const char* componentName;
3250+
public facebook::react::LayoutConstraints layoutConstraints;
3251+
public facebook::react::SurfaceId surfaceId;
3252+
public folly::dynamic localData;
3253+
public folly::dynamic props;
3254+
public folly::dynamic state;
3255+
}
3256+
32473257
struct facebook::react::FilterFunction {
32483258
public bool operator==(const facebook::react::FilterFunction& other) const = default;
32493259
public facebook::react::FilterType type;

‎scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,7 @@ facebook::react::SharedColor facebook::react::colorFromComponents(facebook::reac
741741
facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
742742
facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value);
743743
facebook::react::SharedColor facebook::react::whiteColor();
744+
facebook::react::Size facebook::react::measureWithFabricUIManager(const jni::global_ref<jobject>& fabricUIManager, facebook::react::FabricUIManagerMeasureArgs args);
744745
facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value);
745746
facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept;
746747
facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value);
@@ -6082,6 +6083,15 @@ struct facebook::react::EventPayload {
60826083
public virtual ~EventPayload() = default;
60836084
}
60846085

6086+
struct facebook::react::FabricUIManagerMeasureArgs {
6087+
public const char* componentName;
6088+
public facebook::react::LayoutConstraints layoutConstraints;
6089+
public facebook::react::SurfaceId surfaceId;
6090+
public folly::dynamic localData;
6091+
public folly::dynamic props;
6092+
public folly::dynamic state;
6093+
}
6094+
60856095
struct facebook::react::FilterFunction {
60866096
public bool operator==(const facebook::react::FilterFunction& other) const = default;
60876097
public facebook::react::FilterType type;

‎scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ facebook::react::SharedColor facebook::react::colorFromComponents(facebook::reac
514514
facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
515515
facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value);
516516
facebook::react::SharedColor facebook::react::whiteColor();
517+
facebook::react::Size facebook::react::measureWithFabricUIManager(const jni::global_ref<jobject>& fabricUIManager, facebook::react::FabricUIManagerMeasureArgs args);
517518
facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value);
518519
facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value);
519520
facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value);
@@ -3237,6 +3238,15 @@ struct facebook::react::EventPayload {
32373238
public virtual ~EventPayload() = default;
32383239
}
32393240

3241+
struct facebook::react::FabricUIManagerMeasureArgs {
3242+
public const char* componentName;
3243+
public facebook::react::LayoutConstraints layoutConstraints;
3244+
public facebook::react::SurfaceId surfaceId;
3245+
public folly::dynamic localData;
3246+
public folly::dynamic props;
3247+
public folly::dynamic state;
3248+
}
3249+
32403250
struct facebook::react::FilterFunction {
32413251
public bool operator==(const facebook::react::FilterFunction& other) const = default;
32423252
public facebook::react::FilterType type;

‎scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ facebook::react::SharedColor facebook::react::colorFromComponents(facebook::reac
514514
facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
515515
facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value);
516516
facebook::react::SharedColor facebook::react::whiteColor();
517+
facebook::react::Size facebook::react::measureWithFabricUIManager(const jni::global_ref<jobject>& fabricUIManager, facebook::react::FabricUIManagerMeasureArgs args);
517518
facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value);
518519
facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value);
519520
facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value);
@@ -3237,6 +3238,15 @@ struct facebook::react::EventPayload {
32373238
public virtual ~EventPayload() = default;
32383239
}
32393240

3241+
struct facebook::react::FabricUIManagerMeasureArgs {
3242+
public const char* componentName;
3243+
public facebook::react::LayoutConstraints layoutConstraints;
3244+
public facebook::react::SurfaceId surfaceId;
3245+
public folly::dynamic localData;
3246+
public folly::dynamic props;
3247+
public folly::dynamic state;
3248+
}
3249+
32403250
struct facebook::react::FilterFunction {
32413251
public bool operator==(const facebook::react::FilterFunction& other) const = default;
32423252
public facebook::react::FilterType type;

0 commit comments

Comments
 (0)