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 dd9e3db37d..6506531c57 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 @@ -73,6 +73,9 @@ class ComposePropertyDeserializer : JsonDeserializer { ComposeViewType.RadioButton.name -> { context?.deserialize(jsonObject, RadioButtonProperty::class.java) } + ComposeViewType.Switch.name -> { + context?.deserialize(jsonObject, SwitchProperty::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 bb0f2ae04d..88653ed870 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 @@ -94,6 +94,9 @@ class UiTronDataDeserializer : JsonDeserializer { ComposeViewType.RadioButton.name -> { context?.deserialize(jsonObject, RadioButtonData::class.java) } + ComposeViewType.Switch.name -> { + context?.deserialize(jsonObject, SwitchData::class.java) + } else -> null } } diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/data/SwitchData.kt b/navi-uitron/src/main/java/com/navi/uitron/model/data/SwitchData.kt new file mode 100644 index 0000000000..73688643fd --- /dev/null +++ b/navi-uitron/src/main/java/com/navi/uitron/model/data/SwitchData.kt @@ -0,0 +1,13 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.uitron.model.data + +data class SwitchData( + val checkedStateClickData: UiTronClickData? = null, + val unCheckedStateClickData: UiTronClickData? = null +) : UiTronData() diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/SwitchProperty.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/SwitchProperty.kt new file mode 100644 index 0000000000..a27b1ad387 --- /dev/null +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/SwitchProperty.kt @@ -0,0 +1,27 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.uitron.model.ui + +data class SwitchProperty( + val isChecked: Boolean? = null, + val enabled: Boolean? = null, + val switchColors: SwitchColors, +) : ComposeViewProperty() + +data class SwitchColors( + val checkedThumbColor: String? = null, + val checkedTrackColor: String? = null, + val checkedTrackAlpha: Float? = null, + val uncheckedThumbColor: String? = null, + val uncheckedTrackColor: String? = null, + val uncheckedTrackAlpha: Float? = null, + val disabledCheckedThumbColor: String? = null, + val disabledCheckedTrackColor: String? = null, + val disabledUncheckedThumbColor: String? = null, + val disabledUncheckedTrackColor: String? = null +) diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronComposeView.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronComposeView.kt index 4314003815..365cdf387a 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronComposeView.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronComposeView.kt @@ -29,6 +29,7 @@ open class ComposeViewProperty( val isStateFul: Boolean? = false, val interaction: UiTronInteraction? = null, var backGroundBrushData: BrushData? = null, + var scaleData: ScaleData? = null, var backgroundColor: String? = null, var shape: UiTronShape? = null, var statesMap: Map? = null, @@ -41,6 +42,7 @@ open class ComposeViewProperty( if (property?.constraintLinks != null) constraintLinks = property.constraintLinks if (property?.clipData != null) clipData = property.clipData if (property?.backGroundBrushData != null) backGroundBrushData = property.backGroundBrushData + if (property?.scaleData != null) scaleData = property.scaleData if (property?.backgroundColor != null) backgroundColor = property.backgroundColor if (property?.shape != null) shape = property.shape if (property?.statesMap != null) statesMap = property.statesMap @@ -85,6 +87,12 @@ data class OffSetData( val y: Float? = null, ) : Parcelable +@Parcelize +data class ScaleData( + val x: Float? = null, + val y: Float? = null, +) : Parcelable + enum class ComposeSize { WRAP_CONTENT, MATCH_PARENT, @@ -108,7 +116,8 @@ enum class ComposeViewType { Lottie, Slider, Checkbox, - RadioButton + RadioButton, + Switch } enum class HorizontalArrangementType { diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/SwitchRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/SwitchRenderer.kt new file mode 100644 index 0000000000..379e592844 --- /dev/null +++ b/navi-uitron/src/main/java/com/navi/uitron/render/SwitchRenderer.kt @@ -0,0 +1,89 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.uitron.render + +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.padding +import androidx.compose.material.ContentAlpha +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Switch +import androidx.compose.material.SwitchDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.graphics.compositeOver +import androidx.compose.ui.layout.layoutId +import androidx.compose.ui.unit.dp +import com.navi.base.utils.orTrue +import com.navi.uitron.model.data.SwitchData +import com.navi.uitron.model.data.UiTronData +import com.navi.uitron.model.ui.SwitchProperty +import com.navi.uitron.viewmodel.UiTronViewModel +import hexToComposeColor + +class SwitchRenderer(private val uiTronViewModel: UiTronViewModel? = null) : + Renderer { + + @Composable + override fun Render(property: SwitchProperty, uiTronData: UiTronData?) { + val switchData = uiTronData as? SwitchData + val isChecked = remember { + mutableStateOf(property.isChecked ?: false) + } + if (property.visible.orTrue()) { + Switch( + checked = isChecked.value, + onCheckedChange = { + isChecked.value = isChecked.value.not() + if (isChecked.value) { + uiTronViewModel?.handleActions(switchData?.checkedStateClickData) + } else { + uiTronViewModel?.handleActions(switchData?.unCheckedStateClickData) + } + }, + modifier = Modifier + .padding( + top = property.padding?.top?.dp ?: 0.dp, + bottom = property.padding?.bottom?.dp ?: 0.dp, + start = property.padding?.start?.dp ?: 0.dp, + end = property.padding?.end?.dp ?: 0.dp + ) + .scale(property.scaleData?.x ?: 1.0f, property.scaleData?.y ?: 1.0f) + .layoutId(property.layoutId.orEmpty()), + enabled = property.enabled ?: true, + interactionSource = remember { MutableInteractionSource() }, + colors = SwitchDefaults.colors( + checkedThumbColor = property.switchColors.checkedThumbColor?.hexToComposeColor + ?: MaterialTheme.colors.secondaryVariant, + checkedTrackColor = property.switchColors.checkedTrackColor?.hexToComposeColor + ?: MaterialTheme.colors.secondaryVariant, + checkedTrackAlpha = property.switchColors.checkedTrackAlpha ?: 0.54f, + uncheckedThumbColor = property.switchColors.uncheckedThumbColor?.hexToComposeColor + ?: MaterialTheme.colors.surface, + uncheckedTrackColor = property.switchColors.uncheckedTrackColor?.hexToComposeColor + ?: MaterialTheme.colors.onSurface, + uncheckedTrackAlpha = property.switchColors.uncheckedTrackAlpha ?: 0.38f, + disabledCheckedThumbColor = property.switchColors.disabledCheckedThumbColor?.hexToComposeColor + ?: MaterialTheme.colors.secondaryVariant.copy(alpha = ContentAlpha.disabled) + .compositeOver(MaterialTheme.colors.surface), + disabledCheckedTrackColor = property.switchColors.disabledCheckedTrackColor?.hexToComposeColor + ?: MaterialTheme.colors.secondaryVariant.copy(alpha = ContentAlpha.disabled) + .compositeOver(MaterialTheme.colors.surface), + disabledUncheckedThumbColor = property.switchColors.disabledUncheckedThumbColor?.hexToComposeColor + ?: MaterialTheme.colors.surface.copy(alpha = ContentAlpha.disabled) + .compositeOver(MaterialTheme.colors.surface), + disabledUncheckedTrackColor = property.switchColors.disabledUncheckedTrackColor?.hexToComposeColor + ?: MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled) + .compositeOver(MaterialTheme.colors.surface), + ) + ) + } + } +} 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 375574a031..c97ed9a789 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 @@ -192,6 +192,15 @@ class UiTronRenderer( ) } } + ComposeViewType.Switch.name -> { + (composeView.property as? SwitchProperty)?.let { + SwitchRenderer(uiTronViewModel = uiTronViewModel).Render( + property = it, uiTronData = dataMap?.getOrElse( + it.layoutId.orEmpty() + ) { null } + ) + } + } } } }