diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java index 7aef44b1b4096b..eaf5ecfc685ac6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java @@ -46,6 +46,8 @@ /* package */ class ReactViewBackgroundDrawable extends Drawable { private static final int DEFAULT_BORDER_COLOR = Color.BLACK; + private static final int DEFAULT_BORDER_RGB = 0x00FFFFFF & DEFAULT_BORDER_COLOR; + private static final int DEFAULT_BORDER_ALPHA = (0xFF000000 & DEFAULT_BORDER_COLOR) >>> 24; private static enum BorderStyle { SOLID, @@ -73,7 +75,8 @@ private static enum BorderStyle { /* Value at Spacing.ALL index used for rounded borders, whole array used by rectangular borders */ private @Nullable Spacing mBorderWidth; - private @Nullable Spacing mBorderColor; + private @Nullable Spacing mBorderRGB; + private @Nullable Spacing mBorderAlpha; private @Nullable BorderStyle mBorderStyle; /* Used for rounded border and rounded background */ @@ -164,16 +167,37 @@ public void setBorderWidth(int position, float width) { } } - public void setBorderColor(int position, float color) { - if (mBorderColor == null) { - mBorderColor = new Spacing(); - mBorderColor.setDefault(Spacing.LEFT, DEFAULT_BORDER_COLOR); - mBorderColor.setDefault(Spacing.TOP, DEFAULT_BORDER_COLOR); - mBorderColor.setDefault(Spacing.RIGHT, DEFAULT_BORDER_COLOR); - mBorderColor.setDefault(Spacing.BOTTOM, DEFAULT_BORDER_COLOR); + public void setBorderColor(int position, float rgb, float alpha) { + this.setBorderRGB(position, rgb); + this.setBorderAlpha(position, alpha); + } + + private void setBorderRGB(int position, float rgb) { + // set RGB component + if (mBorderRGB == null) { + mBorderRGB = new Spacing(); + mBorderRGB.setDefault(Spacing.LEFT, DEFAULT_BORDER_RGB); + mBorderRGB.setDefault(Spacing.TOP, DEFAULT_BORDER_RGB); + mBorderRGB.setDefault(Spacing.RIGHT, DEFAULT_BORDER_RGB); + mBorderRGB.setDefault(Spacing.BOTTOM, DEFAULT_BORDER_RGB); } - if (!FloatUtil.floatsEqual(mBorderColor.getRaw(position), color)) { - mBorderColor.set(position, color); + if (!FloatUtil.floatsEqual(mBorderRGB.getRaw(position), rgb)) { + mBorderRGB.set(position, rgb); + invalidateSelf(); + } + } + + private void setBorderAlpha(int position, float alpha) { + // set Alpha component + if (mBorderAlpha == null) { + mBorderAlpha = new Spacing(); + mBorderAlpha.setDefault(Spacing.LEFT, DEFAULT_BORDER_ALPHA); + mBorderAlpha.setDefault(Spacing.TOP, DEFAULT_BORDER_ALPHA); + mBorderAlpha.setDefault(Spacing.RIGHT, DEFAULT_BORDER_ALPHA); + mBorderAlpha.setDefault(Spacing.BOTTOM, DEFAULT_BORDER_ALPHA); + } + if (!FloatUtil.floatsEqual(mBorderAlpha.getRaw(position), alpha)) { + mBorderAlpha.set(position, alpha); invalidateSelf(); } } @@ -327,8 +351,11 @@ private float getFullBorderWidth() { * {@link #getFullBorderWidth}. */ private int getFullBorderColor() { - return (mBorderColor != null && !CSSConstants.isUndefined(mBorderColor.getRaw(Spacing.ALL))) ? - (int) (long) mBorderColor.getRaw(Spacing.ALL) : DEFAULT_BORDER_COLOR; + float rgb = (mBorderRGB != null && !CSSConstants.isUndefined(mBorderRGB.getRaw(Spacing.ALL))) ? + mBorderRGB.getRaw(Spacing.ALL) : DEFAULT_BORDER_RGB; + float alpha = (mBorderAlpha != null && !CSSConstants.isUndefined(mBorderAlpha.getRaw(Spacing.ALL))) ? + mBorderAlpha.getRaw(Spacing.ALL) : DEFAULT_BORDER_ALPHA; + return ReactViewBackgroundDrawable.colorFromAlphaAndRGBComponents(alpha, rgb); } private void drawRectangularBackgroundWithBorders(Canvas canvas) { @@ -419,8 +446,17 @@ private int getBorderWidth(int position) { return mBorderWidth != null ? Math.round(mBorderWidth.get(position)) : 0; } + private static int colorFromAlphaAndRGBComponents(float alpha, float rgb) { + int rgbComponent = 0x00FFFFFF & (int)rgb; + int alphaComponent = 0xFF000000 & ((int)alpha) << 24; + + return rgbComponent | alphaComponent; + } + private int getBorderColor(int position) { - // Check ReactStylesDiffMap#getColorInt() to see why this is needed - return mBorderColor != null ? (int) (long) mBorderColor.get(position) : DEFAULT_BORDER_COLOR; + float rgb = mBorderRGB != null ? mBorderRGB.get(position) : DEFAULT_BORDER_RGB; + float alpha = mBorderAlpha != null ? mBorderAlpha.get(position) : DEFAULT_BORDER_ALPHA; + + return ReactViewBackgroundDrawable.colorFromAlphaAndRGBComponents(alpha, rgb); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java index 63ceac761e0845..1d26a80b101f88 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java @@ -201,8 +201,8 @@ public void setBorderWidth(int position, float width) { getOrCreateReactViewBackground().setBorderWidth(position, width); } - public void setBorderColor(int position, float color) { - getOrCreateReactViewBackground().setBorderColor(position, color); + public void setBorderColor(int position, float rgb, float alpha) { + getOrCreateReactViewBackground().setBorderColor(position, rgb, alpha); } public void setBorderRadius(float borderRadius) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.java index ed9dc09e492da0..71b5ca76207728 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.java @@ -135,9 +135,9 @@ public void setBorderWidth(ReactViewGroup view, int index, float width) { "borderColor", "borderLeftColor", "borderRightColor", "borderTopColor", "borderBottomColor" }, customType = "Color") public void setBorderColor(ReactViewGroup view, int index, Integer color) { - view.setBorderColor( - SPACING_TYPES[index], - color == null ? CSSConstants.UNDEFINED : (float) color); + float rgbComponent = color == null ? CSSConstants.UNDEFINED : (float) ((int)color & 0x00FFFFFF); + float alphaComponent = color == null ? CSSConstants.UNDEFINED : (float) ((int)color >>> 24); + view.setBorderColor(SPACING_TYPES[index], rgbComponent, alphaComponent); } @ReactProp(name = ViewProps.COLLAPSABLE)