Skip to content

Commit 5c0da01

Browse files
mdvaccafacebook-github-bot
authored andcommitted
Add support to measure shadow nodes in the FabricUIManager
Summary: In this diff I added support to be able to measure C++ shadowNode in Android. As an example I implemented the measurement of TextViews Reviewed By: shergin Differential Revision: D9583972 fbshipit-source-id: 1344782d4c586c94a4576b18a4acfa4775e46952
1 parent 52dd7db commit 5c0da01

File tree

14 files changed

+851
-11
lines changed

14 files changed

+851
-11
lines changed

ReactAndroid/src/main/java/com/facebook/react/uimanager/PixelUtil.java

+7
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ public static float toPixelFromDIP(double value) {
3131
return toPixelFromDIP((float) value);
3232
}
3333

34+
/**
35+
* Convert from PX to SP
36+
*/
37+
public static float toSPFromPixel(float value) {
38+
return value / DisplayMetricsHolder.getScreenDisplayMetrics().scaledDensity;
39+
}
40+
3441
/**
3542
* Convert from SP to PX
3643
*/

ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java

+14
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
import android.view.View;
1111
import com.facebook.react.bridge.BaseJavaModule;
1212
import com.facebook.react.bridge.ReactApplicationContext;
13+
import com.facebook.react.bridge.ReactContext;
1314
import com.facebook.react.bridge.ReadableArray;
15+
import com.facebook.react.bridge.ReadableNativeMap;
1416
import com.facebook.react.touch.JSResponderHandler;
1517
import com.facebook.react.touch.ReactInterceptingViewGroup;
1618
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -202,4 +204,16 @@ public void receiveCommand(T root, int commandId, @Nullable ReadableArray args)
202204
public Map<String, String> getNativeProps() {
203205
return ViewManagerPropertyUpdater.getNativeProps(getClass(), getShadowNodeClass());
204206
}
207+
208+
public float[] measure(
209+
ReactContext context,
210+
T view,
211+
ReadableNativeMap localData,
212+
ReadableNativeMap props,
213+
float width,
214+
int widthMode,
215+
float height,
216+
int heightMode) {
217+
return null;
218+
}
205219
}

ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java

+10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import android.graphics.drawable.Drawable;
1212
import android.os.Build;
1313
import android.text.Layout;
14+
import android.text.Spannable;
1415
import android.text.Spanned;
1516
import android.text.TextUtils;
1617
import android.view.Gravity;
@@ -36,6 +37,7 @@ public class ReactTextView extends TextView implements ReactCompoundView {
3637
private TextUtils.TruncateAt mEllipsizeLocation = TextUtils.TruncateAt.END;
3738

3839
private ReactViewBackgroundManager mReactBackgroundManager;
40+
private Spannable mSpanned;
3941

4042
public ReactTextView(Context context) {
4143
super(context);
@@ -255,4 +257,12 @@ public void setBorderRadius(float borderRadius, int position) {
255257
public void setBorderStyle(@Nullable String style) {
256258
mReactBackgroundManager.setBorderStyle(style);
257259
}
260+
261+
public void setSpanned(Spannable spanned) {
262+
mSpanned = spanned;
263+
}
264+
265+
public Spannable getSpanned() {
266+
return mSpanned;
267+
}
258268
}

ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java

+24
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99

1010
import android.text.Spannable;
1111
import com.facebook.react.common.MapBuilder;
12+
import com.facebook.react.bridge.ReactContext;
13+
import com.facebook.react.bridge.ReadableNativeMap;
1214
import com.facebook.react.common.annotations.VisibleForTesting;
1315
import com.facebook.react.module.annotations.ReactModule;
1416
import com.facebook.react.uimanager.ThemedReactContext;
1517
import java.util.Map;
1618
import javax.annotation.Nullable;
19+
import com.facebook.yoga.YogaMeasureMode;
1720

1821
/**
1922
* Concrete class for {@link ReactTextAnchorViewManager} which represents view managers of anchor
@@ -66,4 +69,25 @@ protected void onAfterUpdateTransaction(ReactTextView view) {
6669
public @Nullable Map getExportedCustomDirectEventTypeConstants() {
6770
return MapBuilder.of("topTextLayout", MapBuilder.of("registrationName", "onTextLayout"));
6871
}
72+
73+
public float[] measure(
74+
ReactContext context,
75+
ReactTextView view,
76+
ReadableNativeMap localData,
77+
ReadableNativeMap props,
78+
float width,
79+
int widthMode,
80+
float height,
81+
int heightMode) {
82+
83+
// TODO: should widthMode and heightMode be a YogaMeasureMode?
84+
return TextLayoutManager.measureText(context,
85+
view,
86+
localData,
87+
props,
88+
width,
89+
YogaMeasureMode.fromInt(widthMode),
90+
height,
91+
YogaMeasureMode.fromInt(heightMode));
92+
}
6993
}

0 commit comments

Comments
 (0)