Skip to content

Commit 70dc98d

Browse files
MengjueWFacebook Github Bot 8
authored andcommitted
Provide RTL support for RCTShadowView according to new csslayout
Summary: The make current RCTShadowView support RTL layout. 1 Change all left/right to start/end for margin, padding, boarder and position 2 Calculate position in the same way as margin, padding and boarder Reviewed By: fkgozali Differential Revision: D3619292 fbshipit-source-id: eaaa6faeee93c964d59bb6f498d89effc09ed567
1 parent 654a360 commit 70dc98d

File tree

4 files changed

+58
-70
lines changed

4 files changed

+58
-70
lines changed

ReactAndroid/src/main/java/com/facebook/csslayout/CSSNode.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -378,11 +378,11 @@ public void setBorder(int spacingType, float border) {
378378
/**
379379
* Get this node's position, as defined by style.
380380
*/
381-
public Spacing getPosition() {
381+
public Spacing getPositionValue() {
382382
return style.position;
383383
}
384384

385-
public void setPosition(int spacingType, float position) {
385+
public void setPositionValue(int spacingType, float position) {
386386
if (style.position.set(spacingType, position)) {
387387
dirty();
388388
}
@@ -396,9 +396,7 @@ public float getPositionTop() {
396396
}
397397

398398
public void setPositionTop(float positionTop) {
399-
if (style.position.set(TOP, positionTop)) {
400-
dirty();
401-
}
399+
setPositionValue(TOP, positionTop);
402400
}
403401

404402
/**
@@ -409,9 +407,7 @@ public float getPositionBottom() {
409407
}
410408

411409
public void setPositionBottom(float positionBottom) {
412-
if (style.position.set(BOTTOM, positionBottom)) {
413-
dirty();
414-
}
410+
setPositionValue(BOTTOM, positionBottom);
415411
}
416412

417413
/**
@@ -422,9 +418,7 @@ public float getPositionLeft() {
422418
}
423419

424420
public void setPositionLeft(float positionLeft) {
425-
if (style.position.set(LEFT, positionLeft)) {
426-
dirty();
427-
}
421+
setPositionValue(LEFT, positionLeft);
428422
}
429423

430424
/**
@@ -435,9 +429,7 @@ public float getPositionRight() {
435429
}
436430

437431
public void setPositionRight(float positionRight) {
438-
if (style.position.set(RIGHT, positionRight)) {
439-
dirty();
440-
}
432+
setPositionValue(RIGHT, positionRight);
441433
}
442434

443435
/**

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

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,26 +51,6 @@ public void setMaxHeight(float maxHeight) {
5151
setStyleMaxHeight(CSSConstants.isUndefined(maxHeight) ? maxHeight : PixelUtil.toPixelFromDIP(maxHeight));
5252
}
5353

54-
@ReactProp(name = ViewProps.LEFT, defaultFloat = CSSConstants.UNDEFINED)
55-
public void setLeft(float left) {
56-
setPositionLeft(CSSConstants.isUndefined(left) ? left : PixelUtil.toPixelFromDIP(left));
57-
}
58-
59-
@ReactProp(name = ViewProps.TOP, defaultFloat = CSSConstants.UNDEFINED)
60-
public void setTop(float top) {
61-
setPositionTop(CSSConstants.isUndefined(top) ? top : PixelUtil.toPixelFromDIP(top));
62-
}
63-
64-
@ReactProp(name = ViewProps.BOTTOM, defaultFloat = CSSConstants.UNDEFINED)
65-
public void setBottom(float bottom) {
66-
setPositionBottom(CSSConstants.isUndefined(bottom) ? bottom : PixelUtil.toPixelFromDIP(bottom));
67-
}
68-
69-
@ReactProp(name = ViewProps.RIGHT, defaultFloat = CSSConstants.UNDEFINED)
70-
public void setRight(float right) {
71-
setPositionRight(CSSConstants.isUndefined(right) ? right : PixelUtil.toPixelFromDIP(right));
72-
}
73-
7454
@ReactProp(name = ViewProps.FLEX, defaultFloat = 0f)
7555
public void setFlex(float flex) {
7656
super.setFlex(flex);
@@ -146,6 +126,19 @@ public void setBorderWidths(int index, float borderWidth) {
146126
setBorder(ViewProps.BORDER_SPACING_TYPES[index], PixelUtil.toPixelFromDIP(borderWidth));
147127
}
148128

129+
@ReactPropGroup(names = {
130+
ViewProps.LEFT,
131+
ViewProps.RIGHT,
132+
ViewProps.TOP,
133+
ViewProps.BOTTOM,
134+
}, defaultFloat = CSSConstants.UNDEFINED)
135+
public void setPositionValues(int index, float position) {
136+
setPositionValue(
137+
ViewProps.POSITION_SPACING_TYPES[index],
138+
CSSConstants.isUndefined(position) ? position : PixelUtil.toPixelFromDIP(position)
139+
);
140+
}
141+
149142
@ReactProp(name = ViewProps.POSITION)
150143
public void setPosition(@Nullable String position) {
151144
CSSPositionType positionType = position == null ?

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,15 @@ public class ViewProps {
9090
public static final String BORDER_BOTTOM_LEFT_RADIUS = "borderBottomLeftRadius";
9191
public static final String BORDER_BOTTOM_RIGHT_RADIUS = "borderBottomRightRadius";
9292
public static final int[] BORDER_SPACING_TYPES = {
93-
Spacing.ALL, Spacing.LEFT, Spacing.RIGHT, Spacing.TOP, Spacing.BOTTOM
93+
Spacing.ALL, Spacing.START, Spacing.END, Spacing.TOP, Spacing.BOTTOM
9494
};
9595
public static final int[] PADDING_MARGIN_SPACING_TYPES = {
96-
Spacing.ALL, Spacing.VERTICAL, Spacing.HORIZONTAL, Spacing.LEFT, Spacing.RIGHT, Spacing.TOP,
96+
Spacing.ALL, Spacing.VERTICAL, Spacing.HORIZONTAL, Spacing.START, Spacing.END, Spacing.TOP,
9797
Spacing.BOTTOM
9898
};
99+
public static final int[] POSITION_SPACING_TYPES = {
100+
Spacing.START, Spacing.END, Spacing.TOP, Spacing.BOTTOM
101+
};
99102

100103
private static final HashSet<String> LAYOUT_ONLY_PROPS = new HashSet<>(
101104
Arrays.asList(

ReactAndroid/src/test/java/com/facebook/react/uimanager/LayoutPropertyApplicatorTest.java

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ public void testDimensions() {
8383
verify(map).getFloat(eq("width"), anyFloat());
8484
verify(reactShadowNode).setStyleHeight(anyFloat());
8585
verify(map).getFloat(eq("height"), anyFloat());
86-
verify(reactShadowNode).setPositionLeft(anyFloat());
86+
verify(reactShadowNode).setPositionValue(eq(Spacing.START), anyFloat());
8787
verify(map).getFloat(eq("left"), anyFloat());
88-
verify(reactShadowNode).setPositionTop(anyFloat());
88+
verify(reactShadowNode).setPositionValue(eq(Spacing.TOP), anyFloat());
8989
verify(map).getFloat(eq("top"), anyFloat());
9090

9191
reactShadowNode = spy(new LayoutShadowNode());
@@ -96,9 +96,9 @@ public void testDimensions() {
9696
verify(map, never()).getFloat(eq("width"), anyFloat());
9797
verify(reactShadowNode, never()).setStyleHeight(anyFloat());
9898
verify(map, never()).getFloat(eq("height"), anyFloat());
99-
verify(reactShadowNode, never()).setPositionLeft(anyFloat());
99+
verify(reactShadowNode, never()).setPositionValue(eq(Spacing.START), anyFloat());
100100
verify(map, never()).getFloat(eq("left"), anyFloat());
101-
verify(reactShadowNode, never()).setPositionTop(anyFloat());
101+
verify(reactShadowNode, never()).setPositionValue(eq(Spacing.TOP), anyFloat());
102102
verify(map, never()).getFloat(eq("top"), anyFloat());
103103
}
104104

@@ -128,8 +128,8 @@ public void testPosition() {
128128
"right", 5.0));
129129

130130
reactShadowNode.updateProperties(map);
131-
verify(reactShadowNode).setPositionBottom(anyFloat());
132-
verify(reactShadowNode).setPositionRight(anyFloat());
131+
verify(reactShadowNode).setPositionValue(eq(Spacing.BOTTOM), anyFloat());
132+
verify(reactShadowNode).setPositionValue(eq(Spacing.END), anyFloat());
133133
verify(reactShadowNode).setPositionType(any(CSSPositionType.class));
134134
verify(map).getFloat("bottom", Float.NaN);
135135
verify(map).getFloat("right", Float.NaN);
@@ -138,8 +138,8 @@ public void testPosition() {
138138
map = spy(buildStyles());
139139

140140
reactShadowNode.updateProperties(map);
141-
verify(reactShadowNode, never()).setPositionBottom(anyFloat());
142-
verify(reactShadowNode, never()).setPositionRight(anyFloat());
141+
verify(reactShadowNode, never()).setPositionValue(eq(Spacing.BOTTOM), anyFloat());
142+
verify(reactShadowNode, never()).setPositionValue(eq(Spacing.END), anyFloat());
143143
verify(reactShadowNode, never()).setPositionType(any(CSSPositionType.class));
144144
verify(map, never()).getFloat("bottom", Float.NaN);
145145
verify(map, never()).getFloat("right", Float.NaN);
@@ -192,15 +192,15 @@ public void testMargin() {
192192
map = spy(buildStyles("marginLeft", 10.0));
193193

194194
reactShadowNode.updateProperties(map);
195-
verify(reactShadowNode).setMargin(eq(Spacing.LEFT), anyFloat());
195+
verify(reactShadowNode).setMargin(eq(Spacing.START), anyFloat());
196196
verify(map).getFloat("marginLeft", CSSConstants.UNDEFINED);
197197

198198
// marginRight
199199
reactShadowNode = spy(new LayoutShadowNode());
200200
map = spy(buildStyles("marginRight", 10.0));
201201

202202
reactShadowNode.updateProperties(map);
203-
verify(reactShadowNode).setMargin(eq(Spacing.RIGHT), anyFloat());
203+
verify(reactShadowNode).setMargin(eq(Spacing.END), anyFloat());
204204
verify(map).getFloat("marginRight", CSSConstants.UNDEFINED);
205205

206206
// no margin
@@ -259,15 +259,15 @@ public void testPadding() {
259259
map = spy(buildStyles("paddingLeft", 10.0));
260260

261261
reactShadowNode.updateProperties(map);
262-
verify(reactShadowNode).setPadding(eq(Spacing.LEFT), anyFloat());
262+
verify(reactShadowNode).setPadding(eq(Spacing.START), anyFloat());
263263
verify(map).getFloat("paddingLeft", CSSConstants.UNDEFINED);
264264

265265
// paddingRight
266266
reactShadowNode = spy(new LayoutShadowNode());
267267
map = spy(buildStyles("paddingRight", 10.0));
268268

269269
reactShadowNode.updateProperties(map);
270-
verify(reactShadowNode).setPadding(eq(Spacing.RIGHT), anyFloat());
270+
verify(reactShadowNode).setPadding(eq(Spacing.END), anyFloat());
271271
verify(map).getFloat("paddingRight", CSSConstants.UNDEFINED);
272272

273273
// no padding
@@ -332,11 +332,11 @@ public void testPropertiesResetToDefault() {
332332
reactShadowNode.updateProperties(map);
333333
verify(reactShadowNode).setStyleWidth(10.f);
334334
verify(reactShadowNode).setStyleHeight(10.f);
335-
verify(reactShadowNode).setPositionLeft(10.f);
336-
verify(reactShadowNode).setPositionTop(10.f);
335+
verify(reactShadowNode).setPositionValue(Spacing.START, 10.f);
336+
verify(reactShadowNode).setPositionValue(Spacing.TOP, 10.f);
337337
verify(reactShadowNode).setFlex(1.0f);
338338
verify(reactShadowNode).setPadding(Spacing.ALL, 10.f);
339-
verify(reactShadowNode).setMargin(Spacing.LEFT, 10.f);
339+
verify(reactShadowNode).setMargin(Spacing.START, 10.f);
340340
verify(reactShadowNode).setBorder(Spacing.TOP, 10.f);
341341
verify(reactShadowNode).setFlexDirection(CSSFlexDirection.ROW);
342342
verify(reactShadowNode).setAlignSelf(CSSAlign.STRETCH);
@@ -363,11 +363,11 @@ public void testPropertiesResetToDefault() {
363363
reactShadowNode.updateProperties(map);
364364
verify(reactShadowNode).setStyleWidth(CSSConstants.UNDEFINED);
365365
verify(reactShadowNode).setStyleHeight(CSSConstants.UNDEFINED);
366-
verify(reactShadowNode).setPositionLeft(CSSConstants.UNDEFINED);
367-
verify(reactShadowNode).setPositionTop(CSSConstants.UNDEFINED);
366+
verify(reactShadowNode).setPositionValue(Spacing.START, CSSConstants.UNDEFINED);
367+
verify(reactShadowNode).setPositionValue(Spacing.TOP, CSSConstants.UNDEFINED);
368368
verify(reactShadowNode).setFlex(0.f);
369369
verify(reactShadowNode).setPadding(Spacing.ALL, CSSConstants.UNDEFINED);
370-
verify(reactShadowNode).setMargin(Spacing.LEFT, CSSConstants.UNDEFINED);
370+
verify(reactShadowNode).setMargin(Spacing.START, CSSConstants.UNDEFINED);
371371
verify(reactShadowNode).setBorder(Spacing.TOP, CSSConstants.UNDEFINED);
372372
verify(reactShadowNode).setFlexDirection(CSSFlexDirection.COLUMN);
373373
verify(reactShadowNode).setAlignSelf(CSSAlign.AUTO);
@@ -391,9 +391,9 @@ public Float answer(InvocationOnMock invocation) throws Throwable {
391391
LayoutShadowNode[] nodes = new LayoutShadowNode[7];
392392
for (int idx = 0; idx < nodes.length; idx++) {
393393
nodes[idx] = new LayoutShadowNode();
394-
nodes[idx].setDefaultPadding(Spacing.LEFT, 15);
394+
nodes[idx].setDefaultPadding(Spacing.START, 15);
395395
nodes[idx].setDefaultPadding(Spacing.TOP, 25);
396-
nodes[idx].setDefaultPadding(Spacing.RIGHT, 35);
396+
nodes[idx].setDefaultPadding(Spacing.END, 35);
397397
nodes[idx].setDefaultPadding(Spacing.BOTTOM, 45);
398398
}
399399

@@ -413,39 +413,39 @@ public Float answer(InvocationOnMock invocation) throws Throwable {
413413
nodes[idx].updateProperties(mapNodes[idx]);
414414
}
415415

416-
assertEquals(10.0, nodes[0].getPadding().get(Spacing.LEFT), .0001);
416+
assertEquals(10.0, nodes[0].getPadding().get(Spacing.START), .0001);
417417
assertEquals(25.0, nodes[0].getPadding().get(Spacing.TOP), .0001);
418-
assertEquals(5.0, nodes[0].getPadding().get(Spacing.RIGHT), .0001);
418+
assertEquals(5.0, nodes[0].getPadding().get(Spacing.END), .0001);
419419
assertEquals(45.0, nodes[0].getPadding().get(Spacing.BOTTOM), .0001);
420420

421-
assertEquals(10.0, nodes[1].getPadding().get(Spacing.LEFT), .0001);
421+
assertEquals(10.0, nodes[1].getPadding().get(Spacing.START), .0001);
422422
assertEquals(5.0, nodes[1].getPadding().get(Spacing.TOP), .0001);
423-
assertEquals(10.0, nodes[1].getPadding().get(Spacing.RIGHT), .0001);
423+
assertEquals(10.0, nodes[1].getPadding().get(Spacing.END), .0001);
424424
assertEquals(10.0, nodes[1].getPadding().get(Spacing.BOTTOM), .0001);
425425

426-
assertEquals(10.0, nodes[2].getPadding().get(Spacing.LEFT), .0001);
426+
assertEquals(10.0, nodes[2].getPadding().get(Spacing.START), .0001);
427427
assertEquals(5.0, nodes[2].getPadding().get(Spacing.TOP), .0001);
428-
assertEquals(35.0, nodes[2].getPadding().get(Spacing.RIGHT), .0001);
428+
assertEquals(35.0, nodes[2].getPadding().get(Spacing.END), .0001);
429429
assertEquals(5.0, nodes[2].getPadding().get(Spacing.BOTTOM), .0001);
430430

431-
assertEquals(5.0, nodes[3].getPadding().get(Spacing.LEFT), .0001);
431+
assertEquals(5.0, nodes[3].getPadding().get(Spacing.START), .0001);
432432
assertEquals(25.0, nodes[3].getPadding().get(Spacing.TOP), .0001);
433-
assertEquals(5.0, nodes[3].getPadding().get(Spacing.RIGHT), .0001);
433+
assertEquals(5.0, nodes[3].getPadding().get(Spacing.END), .0001);
434434
assertEquals(10.0, nodes[3].getPadding().get(Spacing.BOTTOM), .0001);
435435

436-
assertEquals(15.0, nodes[4].getPadding().get(Spacing.LEFT), .0001);
436+
assertEquals(15.0, nodes[4].getPadding().get(Spacing.START), .0001);
437437
assertEquals(5.0, nodes[4].getPadding().get(Spacing.TOP), .0001);
438-
assertEquals(35.0, nodes[4].getPadding().get(Spacing.RIGHT), .0001);
438+
assertEquals(35.0, nodes[4].getPadding().get(Spacing.END), .0001);
439439
assertEquals(45.0, nodes[4].getPadding().get(Spacing.BOTTOM), .0001);
440440

441-
assertEquals(15.0, nodes[5].getPadding().get(Spacing.LEFT), .0001);
441+
assertEquals(15.0, nodes[5].getPadding().get(Spacing.START), .0001);
442442
assertEquals(7.0, nodes[5].getPadding().get(Spacing.TOP), .0001);
443-
assertEquals(10.0, nodes[5].getPadding().get(Spacing.RIGHT), .0001);
443+
assertEquals(10.0, nodes[5].getPadding().get(Spacing.END), .0001);
444444
assertEquals(7.0, nodes[5].getPadding().get(Spacing.BOTTOM), .0001);
445445

446-
assertEquals(15.0, nodes[6].getPadding().get(Spacing.LEFT), .0001);
446+
assertEquals(15.0, nodes[6].getPadding().get(Spacing.START), .0001);
447447
assertEquals(25.0, nodes[6].getPadding().get(Spacing.TOP), .0001);
448-
assertEquals(35.0, nodes[6].getPadding().get(Spacing.RIGHT), .0001);
448+
assertEquals(35.0, nodes[6].getPadding().get(Spacing.END), .0001);
449449
assertEquals(45.0, nodes[6].getPadding().get(Spacing.BOTTOM), .0001);
450450
}
451451
}

0 commit comments

Comments
 (0)