Skip to content

Commit b801550

Browse files
committed
[DRAFT] fix: new arch measurements
1 parent 166ec7f commit b801550

File tree

19 files changed

+421
-33
lines changed

19 files changed

+421
-33
lines changed

package/android/build.gradle

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ android {
5555
sourceSets {
5656
main {
5757
if (isNewArchitectureEnabled()) {
58-
java.srcDirs += ['src/newarch']
58+
java.srcDirs += ['src/newarch', "${project.buildDir}/generated/source/codegen/java"]
5959
} else {
6060
java.srcDirs += ['src/oldarch']
6161
}
@@ -73,10 +73,3 @@ dependencies {
7373
api 'com.facebook.react:react-native:+'
7474
}
7575

76-
if (isNewArchitectureEnabled()) {
77-
react {
78-
jsRootDir = file("../src")
79-
libraryName = "ReactSlider"
80-
codegenJavaPackageName = "com.reactnativecommunity.slider"
81-
}
82-
}

package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderManagerImpl.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,16 @@ public static void setAccessibilityIncrements(ReactSlider view, ReadableArray ac
134134
view.setAccessibilityIncrements(stringList);
135135
}
136136

137-
public static Map getExportedCustomDirectEventTypeConstants() {
138-
return MapBuilder.of(ReactSlidingCompleteEvent.EVENT_NAME, MapBuilder.of("registrationName", "onRNCSliderSlidingComplete"),
139-
ReactSlidingStartEvent.EVENT_NAME, MapBuilder.of("registrationName", "onRNCSliderSlidingStart"));
137+
public static Map<String, Object> getExportedCustomBubblingEventTypeConstants() {
138+
return MapBuilder.of(
139+
ReactSliderEvent.EVENT_NAME, MapBuilder.of("registrationName", ReactSliderEvent.EVENT_NAME)
140+
);
141+
}
142+
143+
public static Map<String, Object> getExportedCustomDirectEventTypeConstants() {
144+
return MapBuilder.of(
145+
ReactSlidingStartEvent.EVENT_NAME, MapBuilder.of("registrationName", ReactSlidingStartEvent.EVENT_NAME),
146+
ReactSlidingCompleteEvent.EVENT_NAME, MapBuilder.of("registrationName", ReactSlidingCompleteEvent.EVENT_NAME)
147+
);
140148
}
141149
}

package/android/src/main/java/com/reactnativecommunity/slider/ReactSlidingCompleteEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818
public class ReactSlidingCompleteEvent extends Event<ReactSlidingCompleteEvent> {
1919

20-
public static final String EVENT_NAME = "topSlidingComplete";
20+
public static final String EVENT_NAME = "onRNCSliderSlidingComplete";
2121

2222
private final double mValue;
2323

package/android/src/main/java/com/reactnativecommunity/slider/ReactSlidingStartEvent.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818

1919
public class ReactSlidingStartEvent extends Event<ReactSlidingStartEvent> {
20-
public static final String EVENT_NAME = "topSlidingStart";
20+
public static final String EVENT_NAME = "onRNCSliderSlidingStart";
2121

2222
private final double mValue;
2323

@@ -58,4 +58,4 @@ private WritableMap serializeEventData() {
5858
return eventData;
5959
}
6060

61-
}
61+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
cmake_minimum_required(VERSION 3.13)
2+
set(CMAKE_VERBOSE_MAKEFILE ON)
3+
4+
set(LIB_LITERAL RNCSlider)
5+
set(LIB_TARGET_NAME react_codegen_${LIB_LITERAL})
6+
7+
set(LIB_ANDROID_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
8+
set(LIB_COMMON_DIR ${LIB_ANDROID_DIR}/../common/cpp)
9+
set(LIB_ANDROID_GENERATED_JNI_DIR ${LIB_ANDROID_DIR}/build/generated/source/codegen/jni)
10+
set(LIB_ANDROID_GENERATED_COMPONENTS_DIR ${LIB_ANDROID_GENERATED_JNI_DIR}/react/renderer/components/${LIB_LITERAL})
11+
12+
add_compile_options(
13+
-fexceptions
14+
-frtti
15+
-std=c++20
16+
-Wall
17+
-Wpedantic
18+
-Wno-gnu-zero-variadic-macro-arguments
19+
)
20+
21+
file(GLOB LIB_CUSTOM_SRCS CONFIGURE_DEPENDS *.cpp ${LIB_COMMON_DIR}/react/renderer/components/${LIB_LITERAL}/*.cpp)
22+
file(GLOB LIB_CODEGEN_SRCS CONFIGURE_DEPENDS ${LIB_ANDROID_GENERATED_JNI_DIR}/*.cpp ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}/*.cpp)
23+
24+
add_library(
25+
${LIB_TARGET_NAME}
26+
SHARED
27+
${LIB_CUSTOM_SRCS}
28+
${LIB_CODEGEN_SRCS}
29+
)
30+
31+
target_include_directories(
32+
${LIB_TARGET_NAME}
33+
PUBLIC
34+
.
35+
${LIB_COMMON_DIR}
36+
${LIB_ANDROID_GENERATED_JNI_DIR}
37+
${LIB_ANDROID_GENERATED_COMPONENTS_DIR}
38+
)
39+
40+
target_link_libraries(
41+
${LIB_TARGET_NAME}
42+
fbjni
43+
folly_runtime
44+
glog
45+
jsi
46+
react_codegen_rncore
47+
react_debug
48+
react_render_componentregistry
49+
react_render_core
50+
react_render_debug
51+
react_render_graphics
52+
react_render_imagemanager
53+
react_render_mapbuffer
54+
react_render_textlayoutmanager
55+
react_utils
56+
react_nativemodule_core
57+
rrc_image
58+
turbomodulejsijni
59+
rrc_text
60+
rrc_textinput
61+
rrc_view
62+
yoga
63+
)
64+
65+
target_compile_options(
66+
${LIB_TARGET_NAME}
67+
PRIVATE
68+
-DLOG_TAG=\"ReactNative\"
69+
-fexceptions
70+
-frtti
71+
-std=c++20
72+
-Wall
73+
)
74+
75+
target_include_directories(
76+
${CMAKE_PROJECT_NAME}
77+
PUBLIC
78+
${CMAKE_CURRENT_SOURCE_DIR}
79+
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
3+
#include <ReactCommon/JavaTurboModule.h>
4+
#include <ReactCommon/TurboModule.h>
5+
#include <jsi/jsi.h>
6+
#include <react/renderer/components/RNCSlider/RNCSliderComponentDescriptor.h>
7+
8+
namespace facebook {
9+
namespace react {
10+
11+
JSI_EXPORT
12+
std::shared_ptr<TurboModule> RNCSlider_ModuleProvider(
13+
const std::string &moduleName,
14+
const JavaTurboModule::InitParams &params);
15+
16+
} // namespace react
17+
} // namespace facebook
18+

package/android/src/newarch/java/com/reactnativecommunity/slider/ReactSliderManager.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.reactnativecommunity.slider;
22

3+
import android.content.Context;
4+
import android.view.View;
35
import android.widget.SeekBar;
46
import androidx.annotation.Nullable;
57

68
import com.facebook.react.bridge.ReactContext;
79
import com.facebook.react.bridge.ReadableArray;
810
import com.facebook.react.bridge.ReadableMap;
11+
import com.facebook.react.common.MapBuilder;
12+
import com.facebook.react.uimanager.PixelUtil;
913
import com.facebook.react.uimanager.SimpleViewManager;
1014
import com.facebook.react.uimanager.ThemedReactContext;
1115
import com.facebook.react.uimanager.UIManagerHelper;
@@ -17,6 +21,8 @@
1721
import com.facebook.react.viewmanagers.RNCSliderManagerInterface;
1822
import com.facebook.react.viewmanagers.RNCSliderManagerDelegate;
1923
import com.facebook.react.module.annotations.ReactModule;
24+
import com.facebook.yoga.YogaMeasureMode;
25+
import com.facebook.yoga.YogaMeasureOutput;
2026

2127
/**
2228
* Manages instances of {@code ReactSlider}.
@@ -190,11 +196,6 @@ protected void addEventEmitters(final ThemedReactContext reactContext, final Rea
190196
view.setOnSeekBarChangeListener(ON_CHANGE_LISTENER);
191197
}
192198

193-
@Override
194-
public Map getExportedCustomDirectEventTypeConstants() {
195-
return ReactSliderManagerImpl.getExportedCustomDirectEventTypeConstants();
196-
}
197-
198199
// these props are not available on Android, however we must override their setters
199200
@Override
200201
public void setMinimumTrackImage(ReactSlider view, @Nullable ReadableMap readableMap) {}
@@ -210,4 +211,35 @@ public void setTapToSeek(ReactSlider view, boolean value) {}
210211

211212
@Override
212213
public void setVertical(ReactSlider view, boolean value) {}
214+
215+
@Override
216+
public long measure(
217+
Context context,
218+
ReadableMap localData,
219+
ReadableMap props,
220+
ReadableMap state,
221+
float width,
222+
YogaMeasureMode widthMode,
223+
float height,
224+
YogaMeasureMode heightMode,
225+
@Nullable float[] attachmentsPositions) {
226+
ReactSlider view = new ReactSlider(context, null);
227+
int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
228+
view.measure(measureSpec, measureSpec);
229+
return YogaMeasureOutput.make(
230+
PixelUtil.toDIPFromPixel(view.getMeasuredWidth()),
231+
PixelUtil.toDIPFromPixel(view.getMeasuredHeight()));
232+
}
233+
234+
@Nullable
235+
@Override
236+
public Map<String, Object> getExportedCustomBubblingEventTypeConstants() {
237+
return ReactSliderManagerImpl.getExportedCustomBubblingEventTypeConstants();
238+
}
239+
240+
@Nullable
241+
@Override
242+
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
243+
return ReactSliderManagerImpl.getExportedCustomDirectEventTypeConstants();
244+
}
213245
}

package/android/src/oldarch/java/com/reactnativecommunity/slider/ReactSliderManager.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,15 @@ protected void addEventEmitters(final ThemedReactContext reactContext, final Rea
200200
view.setOnSeekBarChangeListener(ON_CHANGE_LISTENER);
201201
}
202202

203-
@Override
204-
public Map getExportedCustomDirectEventTypeConstants() {
205-
return ReactSliderManagerImpl.getExportedCustomDirectEventTypeConstants();
206-
}
203+
@Nullable
204+
@Override
205+
public Map<String, Object> getExportedCustomBubblingEventTypeConstants() {
206+
return ReactSliderManagerImpl.getExportedCustomBubblingEventTypeConstants();
207+
}
208+
209+
@Nullable
210+
@Override
211+
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
212+
return ReactSliderManagerImpl.getExportedCustomDirectEventTypeConstants();
213+
}
207214
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#pragma once
2+
3+
#include <react/renderer/components/RNCSlider/RNCSliderShadowNode.h>
4+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
5+
#include "RNCSliderMeasurementsManager.h"
6+
7+
namespace facebook {
8+
namespace react {
9+
10+
class RNCSliderComponentDescriptor final
11+
: public ConcreteComponentDescriptor<RNCSliderShadowNode> {
12+
public:
13+
RNCSliderComponentDescriptor(const ComponentDescriptorParameters &parameters)
14+
: ConcreteComponentDescriptor(parameters), measurementsManager_(
15+
std::make_shared<RNCSliderMeasurementsManager>(contextContainer_)) {}
16+
17+
void adopt(ShadowNode &shadowNode) const override {
18+
ConcreteComponentDescriptor::adopt(shadowNode);
19+
20+
auto &rncSliderShadowNode =
21+
static_cast<RNCSliderShadowNode &>(shadowNode);
22+
23+
// `RNCSliderShadowNode` uses `RNCSliderMeasurementsManager` to
24+
// provide measurements to Yoga.
25+
rncSliderShadowNode.setSliderMeasurementsManager(
26+
measurementsManager_);
27+
28+
// All `RNCSliderShadowNode`s must have leaf Yoga nodes with properly
29+
// setup measure function.
30+
rncSliderShadowNode.enableMeasurement();
31+
}
32+
33+
private:
34+
const std::shared_ptr<RNCSliderMeasurementsManager> measurementsManager_;
35+
};
36+
37+
} // namespace react
38+
} // namespace facebook
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include "RNCSliderMeasurementsManager.h"
2+
3+
#include <fbjni/fbjni.h>
4+
#include <react/jni/ReadableNativeMap.h>
5+
#include <react/renderer/core/conversions.h>
6+
7+
using namespace facebook::jni;
8+
9+
namespace facebook::react {
10+
11+
Size RNCSliderMeasurementsManager::measure(
12+
SurfaceId surfaceId,
13+
LayoutConstraints layoutConstraints) const {
14+
{
15+
std::scoped_lock lock(mutex_);
16+
if (hasBeenMeasured_) {
17+
return cachedMeasurement_;
18+
}
19+
}
20+
21+
const jni::global_ref<jobject>& fabricUIManager =
22+
contextContainer_->at<jni::global_ref<jobject>>("FabricUIManager");
23+
24+
static auto measure =
25+
jni::findClassStatic("com/facebook/react/fabric/FabricUIManager")
26+
->getMethod<jlong(
27+
jint,
28+
jstring,
29+
ReadableMap::javaobject,
30+
ReadableMap::javaobject,
31+
ReadableMap::javaobject,
32+
jfloat,
33+
jfloat,
34+
jfloat,
35+
jfloat)>("measure");
36+
37+
auto minimumSize = layoutConstraints.minimumSize;
38+
auto maximumSize = layoutConstraints.maximumSize;
39+
40+
local_ref<JString> componentName = make_jstring("RNCSlider");
41+
42+
auto measurement = yogaMeassureToSize(measure(
43+
fabricUIManager,
44+
surfaceId,
45+
componentName.get(),
46+
nullptr,
47+
nullptr,
48+
nullptr,
49+
minimumSize.width,
50+
maximumSize.width,
51+
minimumSize.height,
52+
maximumSize.height));
53+
54+
std::scoped_lock lock(mutex_);
55+
cachedMeasurement_ = measurement;
56+
hasBeenMeasured_ = true;
57+
return measurement;
58+
}
59+
60+
} // namespace facebook::react

0 commit comments

Comments
 (0)