[android] Simplify dynamic property setters, handle null better

This commit is contained in:
Mikael Sand
2018-10-14 17:51:50 +03:00
parent b94bb0558a
commit bd50941204
14 changed files with 84 additions and 358 deletions
@@ -15,7 +15,6 @@ import android.graphics.Paint;
import android.graphics.Path;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.uimanager.annotations.ReactProp;
/**
@@ -28,31 +27,19 @@ class CircleShadowNode extends RenderableShadowNode {
@ReactProp(name = "cx")
public void setCx(Dynamic cx) {
if (cx.getType() == ReadableType.String) {
mCx = cx.asString();
} else {
mCx = String.valueOf(cx.asDouble());
}
mCx = getStringFromDynamic(cx);
markUpdated();
}
@ReactProp(name = "cy")
public void setCy(Dynamic cy) {
if (cy.getType() == ReadableType.String) {
mCy = cy.asString();
} else {
mCy = String.valueOf(cy.asDouble());
}
mCy = getStringFromDynamic(cy);
markUpdated();
}
@ReactProp(name = "r")
public void setR(Dynamic r) {
if (r.getType() == ReadableType.String) {
mR = r.asString();
} else {
mR = String.valueOf(r.asDouble());
}
mR = getStringFromDynamic(r);
markUpdated();
}
@@ -15,7 +15,6 @@ import android.graphics.Path;
import android.graphics.RectF;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.uimanager.annotations.ReactProp;
/**
@@ -29,41 +28,25 @@ class EllipseShadowNode extends RenderableShadowNode {
@ReactProp(name = "cx")
public void setCx(Dynamic cx) {
if (cx.getType() == ReadableType.String) {
mCx = cx.asString();
} else {
mCx = String.valueOf(cx.asDouble());
}
mCx = getStringFromDynamic(cx);
markUpdated();
}
@ReactProp(name = "cy")
public void setCy(Dynamic cy) {
if (cy.getType() == ReadableType.String) {
mCy = cy.asString();
} else {
mCy = String.valueOf(cy.asDouble());
}
mCy = getStringFromDynamic(cy);
markUpdated();
}
@ReactProp(name = "rx")
public void setRx(Dynamic rx) {
if (rx.getType() == ReadableType.String) {
mRx = rx.asString();
} else {
mRx = String.valueOf(rx.asDouble());
}
mRx = getStringFromDynamic(rx);
markUpdated();
}
@ReactProp(name = "ry")
public void setRy(Dynamic ry) {
if (ry.getType() == ReadableType.String) {
mRy = ry.asString();
} else {
mRy = String.valueOf(ry.asDouble());
}
mRy = getStringFromDynamic(ry);
markUpdated();
}
@@ -30,7 +30,6 @@ import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.views.imagehelper.ImageSource;
@@ -56,50 +55,27 @@ class ImageShadowNode extends RenderableShadowNode {
private int mMeetOrSlice;
private final AtomicBoolean mLoading = new AtomicBoolean(false);
private static final float[] sRawMatrix = new float[]{
1, 0, 0,
0, 1, 0,
0, 0, 1
};
private Matrix mMatrix = null;
@ReactProp(name = "x")
public void setX(Dynamic x) {
if (x.getType() == ReadableType.String) {
mX = x.asString();
} else {
mX = String.valueOf(x.asDouble());
}
mX = getStringFromDynamic(x);
markUpdated();
}
@ReactProp(name = "y")
public void setY(Dynamic y) {
if (y.getType() == ReadableType.String) {
mY = y.asString();
} else {
mY = String.valueOf(y.asDouble());
}
mY = getStringFromDynamic(y);
markUpdated();
}
@ReactProp(name = "width")
public void setWidth(Dynamic width) {
if (width.getType() == ReadableType.String) {
mW = width.asString();
} else {
mW = String.valueOf(width.asDouble());
}
mW = getStringFromDynamic(width);
markUpdated();
}
@ReactProp(name = "height")
public void seHeight(Dynamic height) {
if (height.getType() == ReadableType.String) {
mH = height.asString();
} else {
mH = String.valueOf(height.asDouble());
}
public void setHeight(Dynamic height) {
mH = getStringFromDynamic(height);
markUpdated();
}
@@ -139,27 +115,6 @@ class ImageShadowNode extends RenderableShadowNode {
markUpdated();
}
@ReactProp(name = "matrix")
public void setMatrix(Dynamic matrixArray) {
ReadableType type = matrixArray.getType();
if (!matrixArray.isNull() && type.equals(ReadableType.Array)) {
int matrixSize = PropHelper.toMatrixData(matrixArray.asArray(), sRawMatrix, mScale);
if (matrixSize == 6) {
if (mMatrix == null) {
mMatrix = new Matrix();
}
mMatrix.setValues(sRawMatrix);
} else if (matrixSize != -1) {
FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6");
}
} else {
mMatrix = null;
}
markUpdated();
}
@Override
void draw(final Canvas canvas, final Paint paint, final float opacity) {
if (!mLoading.get()) {
@@ -14,7 +14,6 @@ import android.graphics.Paint;
import android.graphics.Path;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.uimanager.annotations.ReactProp;
/**
@@ -28,41 +27,25 @@ class LineShadowNode extends RenderableShadowNode {
@ReactProp(name = "x1")
public void setX1(Dynamic x1) {
if (x1.getType() == ReadableType.String) {
mX1 = x1.asString();
} else {
mX1 = String.valueOf(x1.asDouble());
}
mX1 = getStringFromDynamic(x1);
markUpdated();
}
@ReactProp(name = "y1")
public void setY1(Dynamic y1) {
if (y1.getType() == ReadableType.String) {
mY1 = y1.asString();
} else {
mY1 = String.valueOf(y1.asDouble());
}
mY1 = getStringFromDynamic(y1);
markUpdated();
}
@ReactProp(name = "x2")
public void setX2(Dynamic x2) {
if (x2.getType() == ReadableType.String) {
mX2 = x2.asString();
} else {
mX2 = String.valueOf(x2.asDouble());
}
mX2 = getStringFromDynamic(x2);
markUpdated();
}
@ReactProp(name = "y2")
public void setY2(Dynamic y2) {
if (y2.getType() == ReadableType.String) {
mY2 = y2.asString();
} else {
mY2 = String.valueOf(y2.asDouble());
}
mY2 = getStringFromDynamic(y2);
markUpdated();
}
@@ -15,7 +15,6 @@ import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -41,44 +40,27 @@ class LinearGradientShadowNode extends DefinitionShadowNode {
};
private Matrix mMatrix = null;
@ReactProp(name = "x1")
public void setX1(Dynamic x1) {
if (x1.getType() == ReadableType.String) {
mX1 = x1.asString();
} else {
mX1 = String.valueOf(x1.asDouble());
}
mX1 = getStringFromDynamic(x1);
markUpdated();
}
@ReactProp(name = "y1")
public void setY1(Dynamic y1) {
if (y1.getType() == ReadableType.String) {
mY1 = y1.asString();
} else {
mY1 = String.valueOf(y1.asDouble());
}
mY1 = getStringFromDynamic(y1);
markUpdated();
}
@ReactProp(name = "x2")
public void setX2(Dynamic x2) {
if (x2.getType() == ReadableType.String) {
mX2 = x2.asString();
} else {
mX2 = String.valueOf(x2.asDouble());
}
mX2 = getStringFromDynamic(x2);
markUpdated();
}
@ReactProp(name = "y2")
public void setY2(Dynamic y2) {
if (y2.getType() == ReadableType.String) {
mY2 = y2.asString();
} else {
mY2 = String.valueOf(y2.asDouble());
}
mY2 = getStringFromDynamic(y2);
markUpdated();
}
@@ -14,7 +14,6 @@ import android.graphics.Matrix;
import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -27,8 +26,8 @@ class MaskShadowNode extends GroupShadowNode {
String mX;
String mY;
String mWidth;
String mHeight;
String mW;
String mH;
// TODO implement proper support for units
@SuppressWarnings({"FieldCanBeLocal", "unused"})
@@ -45,41 +44,25 @@ class MaskShadowNode extends GroupShadowNode {
@ReactProp(name = "x")
public void setX(Dynamic x) {
if (x.getType() == ReadableType.String) {
mX = x.asString();
} else {
mX = String.valueOf(x.asDouble());
}
mX = getStringFromDynamic(x);
markUpdated();
}
@ReactProp(name = "y")
public void setY(Dynamic y) {
if (y.getType() == ReadableType.String) {
mY = y.asString();
} else {
mY = String.valueOf(y.asDouble());
}
mY = getStringFromDynamic(y);
markUpdated();
}
@ReactProp(name = "width")
public void setWidth(Dynamic width) {
if (width.getType() == ReadableType.String) {
mWidth = width.asString();
} else {
mWidth = String.valueOf(width.asDouble());
}
mW = getStringFromDynamic(width);
markUpdated();
}
@ReactProp(name = "height")
public void setHeight(Dynamic height) {
if (height.getType() == ReadableType.String) {
mHeight = height.asString();
} else {
mHeight = String.valueOf(height.asDouble());
}
mH = getStringFromDynamic(height);
markUpdated();
}
@@ -16,7 +16,6 @@ import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -30,8 +29,8 @@ class PatternShadowNode extends GroupShadowNode {
private String mX;
private String mY;
private String mWidth;
private String mHeight;
private String mW;
private String mH;
private Brush.BrushUnits mPatternUnits;
private Brush.BrushUnits mPatternContentUnits;
@@ -51,41 +50,25 @@ class PatternShadowNode extends GroupShadowNode {
@ReactProp(name = "x")
public void setX(Dynamic x) {
if (x.getType() == ReadableType.String) {
mX = x.asString();
} else {
mX = String.valueOf(x.asDouble());
}
mX = getStringFromDynamic(x);
markUpdated();
}
@ReactProp(name = "y")
public void setY(Dynamic y) {
if (y.getType() == ReadableType.String) {
mY = y.asString();
} else {
mY = String.valueOf(y.asDouble());
}
mY = getStringFromDynamic(y);
markUpdated();
}
@ReactProp(name = "width")
public void setWidth(Dynamic width) {
if (width.getType() == ReadableType.String) {
mWidth = width.asString();
} else {
mWidth = String.valueOf(width.asDouble());
}
mW = getStringFromDynamic(width);
markUpdated();
}
@ReactProp(name = "height")
public void setHeight(Dynamic height) {
if (height.getType() == ReadableType.String) {
mHeight = height.asString();
} else {
mHeight = String.valueOf(height.asDouble());
}
mH = getStringFromDynamic(height);
markUpdated();
}
@@ -181,8 +164,8 @@ class PatternShadowNode extends GroupShadowNode {
WritableArray points = Arguments.createArray();
points.pushString(mX);
points.pushString(mY);
points.pushString(mWidth);
points.pushString(mHeight);
points.pushString(mW);
points.pushString(mH);
Brush brush = new Brush(Brush.BrushType.PATTERN, points, mPatternUnits);
brush.setContentUnits(mPatternContentUnits);
@@ -15,7 +15,6 @@ import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.common.ReactConstants;
@@ -44,61 +43,37 @@ class RadialGradientShadowNode extends DefinitionShadowNode {
@ReactProp(name = "fx")
public void setFx(Dynamic fx) {
if (fx.getType() == ReadableType.String) {
mFx = fx.asString();
} else {
mFx = String.valueOf(fx.asDouble());
}
mFx = getStringFromDynamic(fx);
markUpdated();
}
@ReactProp(name = "fy")
public void setFy(Dynamic fy) {
if (fy.getType() == ReadableType.String) {
mFy = fy.asString();
} else {
mFy = String.valueOf(fy.asDouble());
}
mFy = getStringFromDynamic(fy);
markUpdated();
}
@ReactProp(name = "rx")
public void setRx(Dynamic rx) {
if (rx.getType() == ReadableType.String) {
mRx = rx.asString();
} else {
mRx = String.valueOf(rx.asDouble());
}
mRx = getStringFromDynamic(rx);
markUpdated();
}
@ReactProp(name = "ry")
public void setRy(Dynamic ry) {
if (ry.getType() == ReadableType.String) {
mRy = ry.asString();
} else {
mRy = String.valueOf(ry.asDouble());
}
mRy = getStringFromDynamic(ry);
markUpdated();
}
@ReactProp(name = "cx")
public void setCx(Dynamic cx) {
if (cx.getType() == ReadableType.String) {
mCx = cx.asString();
} else {
mCx = String.valueOf(cx.asDouble());
}
mCx = getStringFromDynamic(cx);
markUpdated();
}
@ReactProp(name = "cy")
public void setCy(Dynamic cy) {
if (cy.getType() == ReadableType.String) {
mCy = cy.asString();
} else {
mCy = String.valueOf(cy.asDouble());
}
mCy = getStringFromDynamic(cy);
markUpdated();
}
@@ -15,7 +15,6 @@ import android.graphics.Path;
import android.graphics.RectF;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.uimanager.annotations.ReactProp;
/**
@@ -29,64 +28,39 @@ class RectShadowNode extends RenderableShadowNode {
private String mRx;
private String mRy;
@ReactProp(name = "x")
public void setX(Dynamic x) {
if (x.getType() == ReadableType.String) {
mX = x.asString();
} else {
mX = String.valueOf(x.asDouble());
}
mX = getStringFromDynamic(x);
markUpdated();
}
@ReactProp(name = "y")
public void setY(Dynamic y) {
if (y.getType() == ReadableType.String) {
mY = y.asString();
} else {
mY = String.valueOf(y.asDouble());
}
mY = getStringFromDynamic(y);
markUpdated();
}
@ReactProp(name = "width")
public void setWidth(Dynamic width) {
if (width.getType() == ReadableType.String) {
mW = width.asString();
} else {
mW = String.valueOf(width.asDouble());
}
mW = getStringFromDynamic(width);
markUpdated();
}
@ReactProp(name = "height")
public void setHeight(Dynamic height) {
if (height.getType() == ReadableType.String) {
mH = height.asString();
} else {
mH = String.valueOf(height.asDouble());
}
mH = getStringFromDynamic(height);
markUpdated();
}
@ReactProp(name = "rx")
public void setRx(Dynamic rx) {
if (rx.getType() == ReadableType.String) {
mRx = rx.asString();
} else {
mRx = String.valueOf(rx.asDouble());
}
mRx = getStringFromDynamic(rx);
markUpdated();
}
@ReactProp(name = "ry")
public void setRy(Dynamic ry) {
if (ry.getType() == ReadableType.String) {
mRy = ry.asString();
} else {
mRy = String.valueOf(ry.asDouble());
}
mRy = getStringFromDynamic(ry);
markUpdated();
}
@@ -174,11 +174,7 @@ abstract public class RenderableShadowNode extends VirtualNode {
@ReactProp(name = "strokeWidth")
public void setStrokeWidth(Dynamic strokeWidth) {
if (strokeWidth.getType() == ReadableType.String) {
mStrokeWidth = strokeWidth.asString();
} else {
mStrokeWidth = String.valueOf(strokeWidth.asDouble());
}
mStrokeWidth = getStringFromDynamic(strokeWidth);
markUpdated();
}
@@ -263,8 +259,8 @@ abstract public class RenderableShadowNode extends VirtualNode {
// Clip to mask bounds and render the mask
float maskX = (float) relativeOnWidth(mask.mX);
float maskY = (float) relativeOnWidth(mask.mY);
float maskWidth = (float) relativeOnWidth(mask.mWidth);
float maskHeight = (float) relativeOnWidth(mask.mHeight);
float maskWidth = (float) relativeOnWidth(mask.mW);
float maskHeight = (float) relativeOnWidth(mask.mH);
maskCanvas.clipRect(maskX, maskY, maskWidth, maskHeight);
Paint maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
@@ -441,12 +441,12 @@ class RenderableViewManager<T extends VirtualNode> extends ViewGroupManager<Rend
@ReactProp(name = "imageheight")
public void setImageHeight(RenderableView<ImageShadowNode> node, Dynamic height) {
node.shadowNode.seHeight(height);
node.shadowNode.setHeight(height);
}
@ReactProp(name = "height")
public void setHeight(RenderableView<ImageShadowNode> node, Dynamic height) {
node.shadowNode.seHeight(height);
node.shadowNode.setHeight(height);
}
@ReactProp(name = "src")
@@ -14,7 +14,6 @@ import android.graphics.Paint;
import android.graphics.Path;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.uimanager.annotations.ReactProp;
import javax.annotation.Nullable;
@@ -41,11 +40,7 @@ class TextPathShadowNode extends TextShadowNode {
@ReactProp(name = "startOffset")
public void setStartOffset(Dynamic startOffset) {
if (startOffset.getType() == ReadableType.String) {
mStartOffset = startOffset.asString();
} else {
mStartOffset = String.valueOf(startOffset.asDouble());
}
mStartOffset = getStringFromDynamic(startOffset);
markUpdated();
}
@@ -15,10 +15,8 @@ import android.graphics.Path;
import android.graphics.Region;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.JavaOnlyArray;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.uimanager.ReactShadowNode;
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -49,11 +47,7 @@ class TextShadowNode extends GroupShadowNode {
@ReactProp(name = "textLength")
public void setTextLength(Dynamic length) {
if (length.getType() == ReadableType.String) {
mTextLength = length.asString();
} else {
mTextLength = String.valueOf(length.asDouble());
}
mTextLength = getStringFromDynamic(length);
markUpdated();
}
@@ -71,11 +65,7 @@ class TextShadowNode extends GroupShadowNode {
@ReactProp(name = "baselineShift")
public void setBaselineShift(Dynamic baselineShift) {
if (baselineShift.getType() == ReadableType.String) {
mBaselineShift = baselineShift.asString();
} else {
mBaselineShift = String.valueOf(baselineShift.asDouble());
}
mBaselineShift = getStringFromDynamic(baselineShift);
markUpdated();
}
@@ -103,116 +93,31 @@ class TextShadowNode extends GroupShadowNode {
@ReactProp(name = "rotate")
public void setRotate(Dynamic rotate) {
if (rotate.isNull()) {
mRotate = null;
} else {
switch (rotate.getType()) {
case Array: {
mRotate = rotate.asArray();
break;
}
case String: {
mRotate = JavaOnlyArray.of(rotate.asString());
break;
}
case Number: {
mRotate = JavaOnlyArray.of(String.valueOf(rotate.asDouble()));
break;
}
}
}
mRotate = getStringArrayFromDynamic(rotate);
markUpdated();
}
@ReactProp(name = "dx")
public void setDeltaX(Dynamic deltaX) {
if (deltaX.isNull()) {
mDeltaX = null;
} else {
switch (deltaX.getType()) {
case Array: {
mDeltaX = deltaX.asArray();
break;
}
case String: {
mDeltaX = JavaOnlyArray.of(deltaX.asString());
break;
}
case Number: {
mDeltaX = JavaOnlyArray.of(String.valueOf(deltaX.asDouble()));
break;
}
}
}
mDeltaX = getStringArrayFromDynamic(deltaX);
markUpdated();
}
@ReactProp(name = "dy")
public void setDeltaY(Dynamic deltaY) {
if (deltaY.isNull()) {
mDeltaY = null;
} else {
switch (deltaY.getType()) {
case Array: {
mDeltaY = deltaY.asArray();
break;
}
case String: {
mDeltaY = JavaOnlyArray.of(deltaY.asString());
break;
}
case Number: {
mDeltaY = JavaOnlyArray.of(String.valueOf(deltaY.asDouble()));
break;
}
}
}
mDeltaY = getStringArrayFromDynamic(deltaY);
markUpdated();
}
@ReactProp(name = "x")
public void setPositionX(Dynamic positionX) {
if (positionX.isNull()) {
mPositionX = null;
} else {
switch (positionX.getType()) {
case Array: {
mPositionX = positionX.asArray();
break;
}
case String: {
mPositionX = JavaOnlyArray.of(positionX.asString());
break;
}
case Number: {
mPositionX = JavaOnlyArray.of(String.valueOf(positionX.asDouble()));
break;
}
}
}
mPositionX = getStringArrayFromDynamic(positionX);
markUpdated();
}
@ReactProp(name = "y")
public void setPositionY(Dynamic positionY) {
if (positionY.isNull()) {
mPositionY = null;
} else {
switch (positionY.getType()) {
case Array: {
mPositionY = positionY.asArray();
break;
}
case String: {
mPositionY = JavaOnlyArray.of(positionY.asString());
break;
}
case Number: {
mPositionY = JavaOnlyArray.of(String.valueOf(positionY.asDouble()));
break;
}
}
}
mPositionY = getStringArrayFromDynamic(positionY);
markUpdated();
}
@@ -18,6 +18,8 @@ import android.graphics.Region;
import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.JavaOnlyArray;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.DisplayMetricsHolder;
@@ -415,4 +417,27 @@ abstract class VirtualNode<T> extends LayoutShadowNode {
return mClientRect;
}
String getStringFromDynamic(Dynamic dynamic) {
switch (dynamic.getType()) {
case String:
return dynamic.asString();
case Number:
return String.valueOf(dynamic.asDouble());
default:
return null;
}
}
ReadableArray getStringArrayFromDynamic(Dynamic dynamic) {
switch (dynamic.getType()) {
case Array:
return dynamic.asArray();
case String:
return JavaOnlyArray.of(dynamic.asString());
case Number:
return JavaOnlyArray.of(String.valueOf(dynamic.asDouble()));
default:
return null;
}
}
}