From 875f273dbaf1b6f351d2fedfdf829a847ae58776 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Wed, 18 Oct 2017 19:30:06 -0700 Subject: [PATCH] Implement border(Start|End)Color for rounded borders Reviewed By: achen1 Differential Revision: D6014637 fbshipit-source-id: 33c10ec1f84075e0bb1c1f529aa7231497028380 --- .../view/ReactViewBackgroundDrawable.java | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) 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 e5f0ffad552..394ebb97a53 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 @@ -310,10 +310,48 @@ public class ReactViewBackgroundDrawable extends Drawable { canvas.clipPath(mOuterClipPathForBorderRadius, Region.Op.INTERSECT); canvas.clipPath(mInnerClipPathForBorderRadius, Region.Op.DIFFERENCE); - final int colorLeft = getBorderColor(Spacing.LEFT); - final int colorTop = getBorderColor(Spacing.TOP); - final int colorRight = getBorderColor(Spacing.RIGHT); - final int colorBottom = getBorderColor(Spacing.BOTTOM); + int colorLeft = getBorderColor(Spacing.LEFT); + int colorTop = getBorderColor(Spacing.TOP); + int colorRight = getBorderColor(Spacing.RIGHT); + int colorBottom = getBorderColor(Spacing.BOTTOM); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + final boolean isRTL = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; + int colorStart = getBorderColor(Spacing.START); + int colorEnd = getBorderColor(Spacing.END); + + if (I18nUtil.getInstance().doesRTLFlipLeftAndRightStyles(mContext)) { + if (!isBorderColorDefined(Spacing.START)) { + colorStart = colorLeft; + } + + if (!isBorderColorDefined(Spacing.END)) { + colorEnd = colorRight; + } + + final int directionAwareColorLeft = isRTL ? colorEnd : colorStart; + final int directionAwareColorRight = isRTL ? colorStart : colorEnd; + + colorLeft = directionAwareColorLeft; + colorRight = directionAwareColorRight; + } else { + final int directionAwareColorLeft = isRTL ? colorEnd : colorStart; + final int directionAwareColorRight = isRTL ? colorStart : colorEnd; + + final boolean isColorStartDefined = isBorderColorDefined(Spacing.START); + final boolean isColorEndDefined = isBorderColorDefined(Spacing.END); + final boolean isDirectionAwareColorLeftDefined = isRTL ? isColorEndDefined : isColorStartDefined; + final boolean isDirectionAwareColorRightDefined = isRTL ? isColorStartDefined : isColorEndDefined; + + if (isDirectionAwareColorLeftDefined) { + colorLeft = directionAwareColorLeft; + } + + if (isDirectionAwareColorRightDefined) { + colorRight = directionAwareColorRight; + } + } + } final float left = mOuterClipTempRectForBorderRadius.left; final float right = mOuterClipTempRectForBorderRadius.right;