Add BorderDrawable to replace border logic on CSSBackgroundDrawable (#46745)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/46745

**Note:** This diff still does nothing yet, it will be enabled on a diff further up the stack. This split is just to simplify reviewing

`CSSBackgroundDrawable` holds the drawing logic for both **Borders** and **Background**. This is not ideal since it results in a huge file which does 2 things.

We now have `CompositeBackgroundDrawable` which allows us to set a different drawable per "layer" on our view.

By splitting up **Border** and **Background** logic we get better modularity and it'll make it easier to implement more `backgroundImage` features without further bloating the `CSSBackgroundDrawable` file

Also, this helps with the kotlinification efforts

Changelog: [Internal]

Reviewed By: NickGerleman

Differential Revision: D62898246

fbshipit-source-id: 15d1a4ef61f0c757e648c002fc7ef26626d8e3f6
This commit is contained in:
Jorge Cabiedes Acosta
2024-10-21 21:24:19 -07:00
committed by Facebook GitHub Bot
parent f41c59da96
commit b3d5b793a4
2 changed files with 1178 additions and 0 deletions
@@ -0,0 +1,107 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.uimanager.style
import android.content.Context
import android.graphics.Color
import android.util.LayoutDirection
import androidx.annotation.ColorInt
import com.facebook.react.modules.i18nmanager.I18nUtil
internal data class ColorEdges(
@ColorInt val left: Int = Color.BLACK,
@ColorInt val top: Int = Color.BLACK,
@ColorInt val right: Int = Color.BLACK,
@ColorInt val bottom: Int = Color.BLACK,
)
@JvmInline
internal value class BorderColors(
@ColorInt val edgeColors: Array<Int?> = arrayOfNulls<Int?>(LogicalEdge.values().size)
) {
public fun resolve(layoutDirection: Int, context: Context): ColorEdges {
return when (layoutDirection) {
LayoutDirection.LTR ->
ColorEdges(
edgeColors[LogicalEdge.START.ordinal]
?: edgeColors[LogicalEdge.LEFT.ordinal]
?: edgeColors[LogicalEdge.HORIZONTAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.BLOCK_START.ordinal]
?: edgeColors[LogicalEdge.TOP.ordinal]
?: edgeColors[LogicalEdge.BLOCK.ordinal]
?: edgeColors[LogicalEdge.VERTICAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.END.ordinal]
?: edgeColors[LogicalEdge.RIGHT.ordinal]
?: edgeColors[LogicalEdge.HORIZONTAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.BLOCK_END.ordinal]
?: edgeColors[LogicalEdge.BOTTOM.ordinal]
?: edgeColors[LogicalEdge.BLOCK.ordinal]
?: edgeColors[LogicalEdge.VERTICAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK)
LayoutDirection.RTL ->
if (I18nUtil.instance.doLeftAndRightSwapInRTL(context)) {
ColorEdges(
edgeColors[LogicalEdge.END.ordinal]
?: edgeColors[LogicalEdge.RIGHT.ordinal]
?: edgeColors[LogicalEdge.HORIZONTAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.BLOCK_START.ordinal]
?: edgeColors[LogicalEdge.TOP.ordinal]
?: edgeColors[LogicalEdge.BLOCK.ordinal]
?: edgeColors[LogicalEdge.VERTICAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.START.ordinal]
?: edgeColors[LogicalEdge.LEFT.ordinal]
?: edgeColors[LogicalEdge.HORIZONTAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.BLOCK_END.ordinal]
?: edgeColors[LogicalEdge.BOTTOM.ordinal]
?: edgeColors[LogicalEdge.BLOCK.ordinal]
?: edgeColors[LogicalEdge.VERTICAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK)
} else {
ColorEdges(
edgeColors[LogicalEdge.END.ordinal]
?: edgeColors[LogicalEdge.LEFT.ordinal]
?: edgeColors[LogicalEdge.HORIZONTAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.BLOCK_START.ordinal]
?: edgeColors[LogicalEdge.TOP.ordinal]
?: edgeColors[LogicalEdge.BLOCK.ordinal]
?: edgeColors[LogicalEdge.VERTICAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.START.ordinal]
?: edgeColors[LogicalEdge.RIGHT.ordinal]
?: edgeColors[LogicalEdge.HORIZONTAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK,
edgeColors[LogicalEdge.BLOCK_END.ordinal]
?: edgeColors[LogicalEdge.BOTTOM.ordinal]
?: edgeColors[LogicalEdge.BLOCK.ordinal]
?: edgeColors[LogicalEdge.VERTICAL.ordinal]
?: edgeColors[LogicalEdge.ALL.ordinal]
?: Color.BLACK)
}
else -> throw IllegalArgumentException("Expected resolved layout direction")
}
}
}