diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ca9fcdd..438e8ee 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,13 +18,17 @@ android:label="@string/title_activity_main" android:theme="@style/Theme.UiTron" android:exported="true"> + + + - + \ No newline at end of file diff --git a/app/src/main/java/com/uitron/demo/MockActivity.kt b/app/src/main/java/com/uitron/demo/MockActivity.kt new file mode 100644 index 0000000..5954cb3 --- /dev/null +++ b/app/src/main/java/com/uitron/demo/MockActivity.kt @@ -0,0 +1,23 @@ +package com.uitron.demo + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import com.google.gson.reflect.TypeToken +import com.navi.uitron.model.UiTronResponse +import com.navi.uitron.render.UiTronRenderer +import com.navi.uitron.viewmodel.UiTronViewModel + +class MockActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val type = object : TypeToken() {}.type + val response = mockApiResponse(this, type, "shapeMock") + setContent { + UiTronRenderer( + response.data, + UiTronViewModel() + ).Render(composeViews = response.parentComposeView!!) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/raw/mock.json b/app/src/main/res/raw/mock.json index a997eae..e64c229 100644 --- a/app/src/main/res/raw/mock.json +++ b/app/src/main/res/raw/mock.json @@ -88,5 +88,118 @@ } } } + }, + "gridMock": { + "parentComposeView": [ + { + "property": { + "layoutId": "grid", + "viewType": "Grid", + "width": "MATCH_PARENT", + "height": "WRAP_CONTENT", + "spanCount": 3, + "itemSpacing": 8, + "backgroundColor": "#ABABAB", + "padding": { + "start": 8, + "end": 8, + "top": 8, + "bottom": 8 + } + }, + "childrenViews": [ + { + "property": { + "layoutId": "item_1", + "viewType": "Text", + "width": "WRAP_CONTENT", + "height": "200", + "backgroundColor": "#639674" + } + }, + { + "property": { + "layoutId": "item_2", + "viewType": "Text", + "width": "WRAP_CONTENT", + "height": "200", + "backgroundColor": "#639674" + } + }, + { + "property": { + "layoutId": "item_3", + "viewType": "Text", + "width": "WRAP_CONTENT", + "height": "200", + "backgroundColor": "#639674" + } + }, + { + "property": { + "layoutId": "item_4", + "viewType": "Text", + "width": "WRAP_CONTENT", + "height": "200", + "backgroundColor": "#639674" + } + }, + { + "property": { + "layoutId": "item_5", + "viewType": "Text", + "width": "WRAP_CONTENT", + "height": "200", + "backgroundColor": "#639674" + } + } + ] + } + ], + "data": { + "item_1": { + "viewType": "Text", + "text": "Item 1 Item 1 Item 1 Item 1" + }, + "item_2": { + "viewType": "Text", + "text": "Item 2 Item 2 Item 2 Item 2" + }, + "item_3": { + "viewType": "Text", + "text": "Item 3 Item 3 Item 3 Item 3" + }, + "item_4": { + "viewType": "Text", + "text": "Item 4 Item 4 Item 4 Item 4" + }, + "item_5": { + "viewType": "Text", + "text": "Item 5 Item 5 Item 5 Item 5" + } + } + }, + "shapeMock": { + "parentComposeView": [ + { + "property": { + "viewType": "Spacer", + "height": "200", + "width": "200", + "shape": { + "shapeType": "RoundedCornerShape", + "radius": { + "topStart": 16, + "bottomEnd": 16 + } + }, + "backgroundColor": "#692738", + "padding": { + "start": 16, + "top": 16 + } + } + } + ] } } \ No newline at end of file diff --git a/navi-uitron/src/main/java/com/navi/uitron/deserializer/ComposePropertyDeserializer.kt b/navi-uitron/src/main/java/com/navi/uitron/deserializer/ComposePropertyDeserializer.kt index 39815d0..f69204c 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/deserializer/ComposePropertyDeserializer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/deserializer/ComposePropertyDeserializer.kt @@ -106,12 +106,15 @@ class ComposePropertyDeserializer : JsonDeserializer { ComposeViewType.LazyRow.name -> { context?.deserialize(jsonObject, LazyRowProperty::class.java) } - ComposeViewType.Grid.name -> { - context?.deserialize(jsonObject, GridProperty::class.java) + ComposeViewType.LazyGrid.name -> { + context?.deserialize(jsonObject, LazyGridProperty::class.java) } ComposeViewType.SpannableText.name -> { context?.deserialize(jsonObject, SpannableProperty::class.java) } + ComposeViewType.Grid.name -> { + context?.deserialize(jsonObject, GridProperty::class.java) + } else -> null } } diff --git a/navi-uitron/src/main/java/com/navi/uitron/deserializer/UiTronDataDeserializer.kt b/navi-uitron/src/main/java/com/navi/uitron/deserializer/UiTronDataDeserializer.kt index 026a92e..f86522e 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/deserializer/UiTronDataDeserializer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/deserializer/UiTronDataDeserializer.kt @@ -121,8 +121,8 @@ class UiTronDataDeserializer : JsonDeserializer { ComposeViewType.Pager.name -> { context?.deserialize(jsonObject, PagerData::class.java) } - ComposeViewType.Grid.name -> { - context?.deserialize(jsonObject, GridData::class.java) + ComposeViewType.LazyGrid.name -> { + context?.deserialize(jsonObject, LazyGridData::class.java) } ComposeViewType.SpannableText.name -> { context?.deserialize(jsonObject, SpannableTextData::class.java) diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/data/GridData.kt b/navi-uitron/src/main/java/com/navi/uitron/model/data/LazyGridData.kt similarity index 83% rename from navi-uitron/src/main/java/com/navi/uitron/model/data/GridData.kt rename to navi-uitron/src/main/java/com/navi/uitron/model/data/LazyGridData.kt index bbdd186..8c47140 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/data/GridData.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/data/LazyGridData.kt @@ -1,6 +1,6 @@ package com.navi.uitron.model.data -data class GridData( +data class LazyGridData( // (layoutId, span) val childSpanCountMap: Map? = null ): UiTronData() \ No newline at end of file diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/GridProperty.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/GridProperty.kt index f1401eb..060ac67 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/ui/GridProperty.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/GridProperty.kt @@ -1,39 +1,15 @@ package com.navi.uitron.model.ui data class GridProperty( - var gridStateKey: String? = null, - var contentPadding: ComposePadding? = null, - var gridCell: GridCell? = null, - var orientation: String? = ORIENTATION_VERTICAL, - var reverseLayout: Boolean? = null, - var userScrollEnabled: Boolean? = null, - var horizontalArrangementData: ArrangementData? = null, - var verticalArrangementData: ArrangementData? = null, -) : BaseProperty() { + var spanCount: Int? = 3, + var itemSpacing: Int? = null +): BaseProperty() { + override fun copyNonNullFrom(property: BaseProperty?) { super.copyNonNullFrom(property) val gridProperty = property as? GridProperty? - gridProperty?.gridStateKey?.let { gridStateKey = it } - gridProperty?.contentPadding?.let { contentPadding = it } - gridProperty?.gridCell?.let { gridCell = it } - gridProperty?.orientation?.let { orientation = it } - gridProperty?.reverseLayout?.let { reverseLayout = it } - gridProperty?.userScrollEnabled?.let { userScrollEnabled = it } - gridProperty?.horizontalArrangementData?.let { horizontalArrangementData = it } - gridProperty?.verticalArrangementData?.let { verticalArrangementData = it } - } - - data class GridCell( - var count: Int? = 3, - var minSize: Int? = 100, - var gridType: String? = GRID_TYPE_FIXED - ) - - companion object { - const val ORIENTATION_HORIZONTAL = "horizontal" - const val ORIENTATION_VERTICAL = "vertical" - const val GRID_TYPE_FIXED = "fixed" - const val GRID_TYPE_ADAPTIVE = "adaptive" + gridProperty?.spanCount?.let { spanCount = it } + gridProperty?.itemSpacing?.let { itemSpacing = it } } } diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/LazyGridProperty.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/LazyGridProperty.kt new file mode 100644 index 0000000..5ea0a99 --- /dev/null +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/LazyGridProperty.kt @@ -0,0 +1,39 @@ +package com.navi.uitron.model.ui + +data class LazyGridProperty( + var gridStateKey: String? = null, + var contentPadding: ComposePadding? = null, + var gridCell: GridCell? = null, + var orientation: String? = ORIENTATION_VERTICAL, + var reverseLayout: Boolean? = null, + var userScrollEnabled: Boolean? = null, + var horizontalArrangementData: ArrangementData? = null, + var verticalArrangementData: ArrangementData? = null, +) : BaseProperty() { + override fun copyNonNullFrom(property: BaseProperty?) { + super.copyNonNullFrom(property) + val lazyGridProperty = property as? LazyGridProperty? + lazyGridProperty?.gridStateKey?.let { gridStateKey = it } + lazyGridProperty?.contentPadding?.let { contentPadding = it } + lazyGridProperty?.gridCell?.let { gridCell = it } + lazyGridProperty?.orientation?.let { orientation = it } + lazyGridProperty?.reverseLayout?.let { reverseLayout = it } + lazyGridProperty?.userScrollEnabled?.let { userScrollEnabled = it } + lazyGridProperty?.horizontalArrangementData?.let { horizontalArrangementData = it } + lazyGridProperty?.verticalArrangementData?.let { verticalArrangementData = it } + } + + data class GridCell( + var count: Int? = 3, + var minSize: Int? = 100, + var gridType: String? = GRID_TYPE_FIXED + ) + + companion object { + const val ORIENTATION_HORIZONTAL = "horizontal" + const val ORIENTATION_VERTICAL = "vertical" + const val GRID_TYPE_FIXED = "fixed" + const val GRID_TYPE_ADAPTIVE = "adaptive" + } + +} diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronView.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronView.kt index 4b12ca0..3b2adec 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronView.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronView.kt @@ -69,7 +69,16 @@ data class ComposePadding( @Parcelize data class UiTronShape( val shapeType: String? = null, - val size: Int? = null + val size: Int? = null, + val radius: Radius? = null +) : Parcelable + +@Parcelize +data class Radius( + var topStart: Int? = null, + var topEnd: Int? = null, + var bottomStart: Int? = null, + var bottomEnd: Int? = null ) : Parcelable @Parcelize @@ -133,8 +142,9 @@ enum class ComposeViewType { PagerIndicator, LazyColumn, LazyRow, - Grid, - SpannableText + LazyGrid, + SpannableText, + Grid } enum class HorizontalArrangementType { diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/GridRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/GridRenderer.kt index e37462c..5da7355 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/render/GridRenderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/render/GridRenderer.kt @@ -1,32 +1,24 @@ package com.navi.uitron.render -import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.GridItemSpan -import androidx.compose.foundation.lazy.grid.LazyGridScope -import androidx.compose.foundation.lazy.grid.LazyHorizontalGrid -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.layoutId -import com.navi.uitron.model.data.GridData import com.navi.uitron.model.data.UiTronData import com.navi.uitron.model.ui.GridProperty import com.navi.uitron.model.ui.UiTronView import com.navi.uitron.viewmodel.UiTronViewModel import customClickable -import getContentPaddingValues import orFalse import orTrue -import orVal import setBackground import setHeight -import setHorizontalArrangement -import setVerticalArrangement import setWidth class GridRenderer( @@ -37,7 +29,6 @@ class GridRenderer( @Composable override fun Render(property: GridProperty, uiTronData: UiTronData?) { - val gridData = uiTronData as? GridData if (property.isStateFul.orFalse()) { val state = uiTronViewModel.handle.getStateFlow( property.getPropertyId(), @@ -45,7 +36,6 @@ class GridRenderer( ).collectAsState() property.copyNonNullFrom(property.statesMap?.get(state.value)) } - val gridState = uiTronViewModel.stateHolder.getOrUpdateGridState(key = property.gridStateKey) if (property.visible.orTrue()) { val modifier = Modifier .layoutId(property.layoutId.orEmpty()) @@ -65,68 +55,46 @@ class GridRenderer( uiTronViewModel.handleActions(uiTronData?.onClick) }, interaction = property.interaction, actions = uiTronData?.onClick?.actions ) - if (property.orientation == GridProperty.ORIENTATION_HORIZONTAL) { - LazyHorizontalGrid( - modifier = modifier, - state = gridState ?: rememberLazyGridState(), - contentPadding = getContentPaddingValues(property.contentPadding), - reverseLayout = property.reverseLayout.orFalse(), - verticalArrangement = Arrangement.setVerticalArrangement(arrangementData = property.verticalArrangementData), - horizontalArrangement = Arrangement.setHorizontalArrangement(arrangementData = property.horizontalArrangementData), - rows = if (property.gridCell?.gridType == GridProperty.GRID_TYPE_ADAPTIVE) { - GridCells.Adaptive( - (if ((property.gridCell?.minSize ?: 100) > 0) { - property.gridCell?.minSize ?: 100 - } else { - 100 - }).dp - ) - } else { - GridCells.Fixed(property.gridCell?.count ?: 3) - }, - userScrollEnabled = property.userScrollEnabled ?: true, - content = { - getContent(gridData) - } - ) - } else { - LazyVerticalGrid( - modifier = modifier, - state = gridState ?: rememberLazyGridState(), - contentPadding = getContentPaddingValues(property.contentPadding), - reverseLayout = property.reverseLayout.orFalse(), - verticalArrangement = Arrangement.setVerticalArrangement(arrangementData = property.verticalArrangementData), - horizontalArrangement = Arrangement.setHorizontalArrangement(arrangementData = property.horizontalArrangementData), - columns = if (property.gridCell?.gridType == GridProperty.GRID_TYPE_ADAPTIVE) { - GridCells.Adaptive( - (if ((property.gridCell?.minSize ?: 100) > 0) { - property.gridCell?.minSize ?: 100 - } else { - 100 - }).dp - ) - } else { - GridCells.Fixed(property.gridCell?.count ?: 3) - }, - userScrollEnabled = property.userScrollEnabled ?: true, - content = { - getContent(gridData) - } - ) - } - } - } - private fun LazyGridScope.getContent(gridData: GridData?) { - childrenComposeViews.forEach { uiTronView -> - item( - span = { - GridItemSpan( - currentLineSpan = gridData?.childSpanCountMap?.get(uiTronView.property?.layoutId).orVal(1) - ) + Column(modifier = modifier) { + val itemCount = childrenComposeViews.size + val columns = property.spanCount ?: 3 + var rows = (itemCount / (columns)) + + if (itemCount.mod(columns) > 0) { + rows += 1 + } + + for (rowId in 0 until rows) { + val firstIndex = rowId * columns + + Row { + for (columnId in 0 until columns) { + val index = firstIndex + columnId + Box( + modifier = Modifier + .fillMaxWidth() + .weight(1f) + .padding( + start = if (columnId == 0) { + 0.dp + } else { + (property.itemSpacing ?: 0).dp + }, + top = if (rowId == 0) { + 0.dp + } else { + (property.itemSpacing ?: 0).dp + } + ) + ) { + if (index < itemCount) { + uiTronRenderer.Render(composeViews = listOf(childrenComposeViews[index])) + } + } + } + } } - ) { - uiTronRenderer.Render(listOf(uiTronView)) } } } diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/LazyGridRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/LazyGridRenderer.kt new file mode 100644 index 0000000..e15fab2 --- /dev/null +++ b/navi-uitron/src/main/java/com/navi/uitron/render/LazyGridRenderer.kt @@ -0,0 +1,134 @@ +package com.navi.uitron.render + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.GridItemSpan +import androidx.compose.foundation.lazy.grid.LazyGridScope +import androidx.compose.foundation.lazy.grid.LazyHorizontalGrid +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.rememberLazyGridState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.constraintlayout.compose.layoutId +import com.navi.uitron.model.data.LazyGridData +import com.navi.uitron.model.data.UiTronData +import com.navi.uitron.model.ui.LazyGridProperty +import com.navi.uitron.model.ui.UiTronView +import com.navi.uitron.viewmodel.UiTronViewModel +import customClickable +import getContentPaddingValues +import orFalse +import orTrue +import orVal +import setBackground +import setHeight +import setHorizontalArrangement +import setVerticalArrangement +import setWidth + +class LazyGridRenderer( + private val childrenComposeViews: List, + private val uiTronRenderer: UiTronRenderer, + private val uiTronViewModel: UiTronViewModel +) : Renderer { + + @Composable + override fun Render(property: LazyGridProperty, uiTronData: UiTronData?) { + val lazyGridData = uiTronData as? LazyGridData + if (property.isStateFul.orFalse()) { + val state = uiTronViewModel.handle.getStateFlow( + property.getPropertyId(), + null + ).collectAsState() + property.copyNonNullFrom(property.statesMap?.get(state.value)) + } + val gridState = uiTronViewModel.stateHolder.getOrUpdateGridState(key = property.gridStateKey) + if (property.visible.orTrue()) { + val modifier = Modifier + .layoutId(property.layoutId.orEmpty()) + .setHeight(property.height) + .setWidth(property.width) + .setBackground( + property.backgroundColor, property.shape, property.backGroundBrushData + ) + .padding( + start = property.padding?.start?.dp ?: 0.dp, + end = property.padding?.end?.dp ?: 0.dp, + top = property.padding?.top?.dp ?: 0.dp, + bottom = property.padding?.bottom?.dp ?: 0.dp + ) + .customClickable( + { + uiTronViewModel.handleActions(uiTronData?.onClick) + }, interaction = property.interaction, actions = uiTronData?.onClick?.actions + ) + if (property.orientation == LazyGridProperty.ORIENTATION_HORIZONTAL) { + LazyHorizontalGrid( + modifier = modifier, + state = gridState ?: rememberLazyGridState(), + contentPadding = getContentPaddingValues(property.contentPadding), + reverseLayout = property.reverseLayout.orFalse(), + verticalArrangement = Arrangement.setVerticalArrangement(arrangementData = property.verticalArrangementData), + horizontalArrangement = Arrangement.setHorizontalArrangement(arrangementData = property.horizontalArrangementData), + rows = if (property.gridCell?.gridType == LazyGridProperty.GRID_TYPE_ADAPTIVE) { + GridCells.Adaptive( + (if ((property.gridCell?.minSize ?: 100) > 0) { + property.gridCell?.minSize ?: 100 + } else { + 100 + }).dp + ) + } else { + GridCells.Fixed(property.gridCell?.count ?: 3) + }, + userScrollEnabled = property.userScrollEnabled ?: true, + content = { + getContent(lazyGridData) + } + ) + } else { + LazyVerticalGrid( + modifier = modifier, + state = gridState ?: rememberLazyGridState(), + contentPadding = getContentPaddingValues(property.contentPadding), + reverseLayout = property.reverseLayout.orFalse(), + verticalArrangement = Arrangement.setVerticalArrangement(arrangementData = property.verticalArrangementData), + horizontalArrangement = Arrangement.setHorizontalArrangement(arrangementData = property.horizontalArrangementData), + columns = if (property.gridCell?.gridType == LazyGridProperty.GRID_TYPE_ADAPTIVE) { + GridCells.Adaptive( + (if ((property.gridCell?.minSize ?: 100) > 0) { + property.gridCell?.minSize ?: 100 + } else { + 100 + }).dp + ) + } else { + GridCells.Fixed(property.gridCell?.count ?: 3) + }, + userScrollEnabled = property.userScrollEnabled ?: true, + content = { + getContent(lazyGridData) + } + ) + } + } + } + + private fun LazyGridScope.getContent(lazyGridData: LazyGridData?) { + childrenComposeViews.forEach { uiTronView -> + item( + span = { + GridItemSpan( + currentLineSpan = lazyGridData?.childSpanCountMap?.get(uiTronView.property?.layoutId).orVal(1) + ) + } + ) { + uiTronRenderer.Render(listOf(uiTronView)) + } + } + } + +} \ No newline at end of file diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/UiTronRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/UiTronRenderer.kt index c94e9ab..1a6fd9f 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/render/UiTronRenderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/render/UiTronRenderer.kt @@ -298,9 +298,9 @@ class UiTronRenderer( ) } } - ComposeViewType.Grid.name -> { - (composeView.property as? GridProperty)?.let { - GridRenderer( + ComposeViewType.LazyGrid.name -> { + (composeView.property as? LazyGridProperty)?.let { + LazyGridRenderer( childrenComposeViews = composeView.childrenViews.orEmpty(), uiTronRenderer = this, uiTronViewModel = uiTronViewModel @@ -346,9 +346,20 @@ class UiTronRenderer( ) } } + ComposeViewType.Grid.name -> { + (composeView.property as? GridProperty)?.let { + GridRenderer( + childrenComposeViews = composeView.childrenViews.orEmpty(), + uiTronRenderer = this, + uiTronViewModel = uiTronViewModel + ).Render( + property = it, + uiTronData = dataMap?.getOrElse(it.layoutId.orEmpty()) { null } + ) + } + } } } } - fun getData(layoutId: String?) = dataMap?.get(layoutId) } diff --git a/navi-uitron/src/main/java/com/navi/uitron/utils/ShapeUtil.kt b/navi-uitron/src/main/java/com/navi/uitron/utils/ShapeUtil.kt index cdcc018..f563f51 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/utils/ShapeUtil.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/utils/ShapeUtil.kt @@ -24,19 +24,30 @@ object ShapeUtil { fun getShape(shape: UiTronShape?): Shape { return when (shape?.shapeType) { ShapeType.RoundedCornerShape.name -> { - RoundedCornerShape(shape.size?.dp ?: 0.dp) + if (shape.radius != null) { + RoundedCornerShape( + shape.radius.topStart?.dp ?: 0.dp, shape.radius.topEnd?.dp ?: 0.dp, + shape.radius.bottomEnd?.dp ?: 0.dp, shape.radius.bottomStart?.dp ?: 0.dp + ) + } else { + RoundedCornerShape(shape.size?.dp ?: 0.dp) + } } + ShapeType.TopRoundedCornerShape.name -> { val radius = (shape.size ?: 0).dp RoundedCornerShape(radius, radius) } + ShapeType.BottomRoundedCornerShape.name -> { val radius = (shape.size ?: 0).dp RoundedCornerShape(0.dp, 0.dp, radius, radius) } + ShapeType.CircleShape.name -> { CircleShape } + else -> RectangleShape } }