diff --git a/app/src/main/res/raw/mock.json b/app/src/main/res/raw/mock.json index 11a76e4..987ee85 100644 --- a/app/src/main/res/raw/mock.json +++ b/app/src/main/res/raw/mock.json @@ -14662,5 +14662,29 @@ } } } + }, + "aspectRatioMock": { + "data": { + "background_image": { + "iconUrl": "https://public-assets.prod.navi-sa.in/investment-tab/Investment+Tab+visual+assets+2/Investment+tab+banners/amc_no_reward_banner.webp", + "viewType": "Image", + "placeholderIcon": "IMAGE_PLACEHOLDER_XX_LARGE" + } + }, + "parentComposeView": [ + { + "property": { + "width": "80", + "height": "10", + "aspectRatioProperties": { + "aspectRatio": 0.66, + "screenWidthFactor": 0.5 + }, + "layoutId": "background_image", + "viewType": "Image", + "contentScale": "FillBounds" + } + } + ] } } \ No newline at end of file diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/ImageProperty.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/ImageProperty.kt index c58bba4..5af12d5 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/ui/ImageProperty.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/ImageProperty.kt @@ -8,11 +8,13 @@ package com.navi.uitron.model.ui data class ImageProperty( - var contentScale: String? = null + var contentScale: String? = null, + var aspectRatioProperties: AspectRatioProperties? = null ) : BaseProperty() { override fun copyNonNullFrom(property: BaseProperty?) { super.copyNonNullFrom(property) val imageProperty = property as? ImageProperty? imageProperty?.contentScale?.let { contentScale = it } + imageProperty?.aspectRatioProperties?.let { aspectRatioProperties = it } } } 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 2bd0d3c..ad1f76a 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 @@ -389,4 +389,11 @@ data class Cuts( data class Cut( val centerRatio: Float, var radius: Float +) +data class AspectRatioProperties( + val aspectRatio: Float? = null, + val width: String? = null, + val height: String? = null, + val screenWidthFactor: Float? = null, + val screenHeightFactor: Float? = null ) \ No newline at end of file diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/ImageRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/ImageRenderer.kt index 12915b9..1923549 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/render/ImageRenderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/render/ImageRenderer.kt @@ -11,6 +11,7 @@ import alfredMaskSensitiveComposable import androidx.compose.foundation.Image import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.layout.layoutId @@ -27,6 +28,7 @@ import com.navi.uitron.model.data.ImageData import com.navi.uitron.model.data.UiTronData import com.navi.uitron.model.ui.ImageProperty import com.navi.uitron.modifer.ModifierBuilder +import com.navi.uitron.utils.AspectRatioFacade import com.navi.uitron.utils.KEY_MVEL_ACTION import com.navi.uitron.utils.KEY_PROPERTY import com.navi.uitron.utils.KEY_UI_TRON_DATA @@ -35,6 +37,8 @@ import customClickable import customCombinedClick import customOffset import getContentScale +import isNotNull +import isNotNullAndNotEmpty import orFalse import orTrue import setBackground @@ -83,6 +87,26 @@ class ImageRenderer : Renderer { Pair(KEY_MVEL_ACTION, extrasState.value?.get(MvelAction.KEY_MVEL) as? MvelAction) ) ) + if (property.aspectRatioProperties.isNotNull()) { + val aspectRatioFacade = remember { + AspectRatioFacade( + aspectRatioProperties = property.aspectRatioProperties + ) + } + val customWidth = remember { + aspectRatioFacade.calculateWidthFromAspectRatio() + } + val customHeight = remember { + aspectRatioFacade.calculateHeightFromAspectRatio() + } + if (customWidth.isNotNullAndNotEmpty()) { + property.width = customWidth + } + if (customHeight.isNotNullAndNotEmpty()) { + property.height = customHeight + } + } + if (property.visible.orTrue()) { val rootView = LocalView.current.rootView UiTronSdkManager.getDependencyProvider().getIconResourceId(uiTronImageData?.iconUrl)?.let { iconCode -> diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/PagerIndicatorRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/PagerIndicatorRenderer.kt index 77261c5..edce7ce 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/render/PagerIndicatorRenderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/render/PagerIndicatorRenderer.kt @@ -40,6 +40,7 @@ import customOffset import hexToComposeColor import orFalse import orTrue +import orZero import setBackground import setHeight import setHeightRange @@ -77,7 +78,7 @@ class PagerIndicatorRenderer : Renderer { val pagerState = uiTronViewModel.stateHolder.getOrUpdatePagerState(property.pagerStateKey) - if (property.visible.orTrue()) { + if (property.visible.orTrue() && pagerState?.pageCount.orZero() > 1) { val rootView = LocalView.current.rootView if (property.orientation == PagerIndicatorProperty.ORIENTATION_VERTICAL) { VerticalPagerIndicator( diff --git a/navi-uitron/src/main/java/com/navi/uitron/utils/AspectRatioFacade.kt b/navi-uitron/src/main/java/com/navi/uitron/utils/AspectRatioFacade.kt new file mode 100644 index 0000000..adfb349 --- /dev/null +++ b/navi-uitron/src/main/java/com/navi/uitron/utils/AspectRatioFacade.kt @@ -0,0 +1,54 @@ +package com.navi.uitron.utils + +import android.content.res.Resources +import com.navi.uitron.model.ui.AspectRatioProperties +import isNotNull +import toNearestInt + +class AspectRatioFacade( + private val aspectRatioProperties: AspectRatioProperties? +) { + fun calculateWidthFromAspectRatio(): String? { + return if (aspectRatioProperties?.aspectRatio.isNotNull()) { + if (aspectRatioProperties?.screenWidthFactor.isNotNull()) { + getScreenWidthWithFactor( + aspectRatioProperties?.screenWidthFactor ?: 1.0f + ).toNearestInt() + .toString() + } else { + (getScreenHeightWithFactor( + aspectRatioProperties?.screenHeightFactor ?: 1.0f + ) / (aspectRatioProperties?.aspectRatio ?: 1.0f)).toNearestInt() + .toString() + } + } else { + null + } + } + + fun calculateHeightFromAspectRatio(): String? { + return if (aspectRatioProperties?.aspectRatio.isNotNull()) { + if (aspectRatioProperties?.screenHeightFactor.isNotNull()) { + getScreenHeightWithFactor( + aspectRatioProperties?.screenHeightFactor ?: 1.0f + ).toNearestInt() + .toString() + } else { + (getScreenWidthWithFactor( + aspectRatioProperties?.screenWidthFactor ?: 1.0f + ) * (aspectRatioProperties?.aspectRatio ?: 1.0f)).toNearestInt() + .toString() + } + } else { + null + } + } + + private fun getScreenWidthWithFactor(factor: Float): Float { + return (Resources.getSystem().displayMetrics.widthPixels.toFloat() / Resources.getSystem().displayMetrics.density) * factor + } + + private fun getScreenHeightWithFactor(factor: Float): Float { + return (Resources.getSystem().displayMetrics.heightPixels.toFloat() / Resources.getSystem().displayMetrics.density) * factor + } +} \ No newline at end of file diff --git a/navi-uitron/src/main/java/com/navi/uitron/utils/Ext.kt b/navi-uitron/src/main/java/com/navi/uitron/utils/Ext.kt index 5d4d62b..f824514 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/utils/Ext.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/utils/Ext.kt @@ -541,6 +541,8 @@ fun getContentPaddingValues(contentPadding: ComposePadding?): PaddingValues { fun Any?.isNull(): Boolean = this == null +fun Any?.isNotNull(): Boolean = this != null + fun dpToPx(inpDp: Int): Float { return (inpDp * Resources.getSystem().displayMetrics.density) }