From 8773024a41536a8bd6c5717c2cd6c83da1bea809 Mon Sep 17 00:00:00 2001 From: Prakhar Saxena Date: Thu, 20 Jul 2023 11:30:35 +0530 Subject: [PATCH] TP-32006 | PS | index return card design (#7165) --- .../models/response/amc/FundCardWidget.kt | 3 + .../widgets/amc/FundCardAdapter.kt | 223 ++++++++++++++++++ .../widgets/amc/FundCardWidgetLayout.kt | 126 +--------- .../src/main/res/layout/layout_fund_card.xml | 5 +- .../layout/layout_fund_card_index_return.xml | 142 +++++++++++ 5 files changed, 372 insertions(+), 127 deletions(-) create mode 100644 navi-widgets/src/main/java/com/navi/naviwidgets/widgets/amc/FundCardAdapter.kt create mode 100644 navi-widgets/src/main/res/layout/layout_fund_card_index_return.xml diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/amc/FundCardWidget.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/amc/FundCardWidget.kt index 72a5bee5a8..de981e30b0 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/amc/FundCardWidget.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/amc/FundCardWidget.kt @@ -36,12 +36,15 @@ data class FundCardWidgetData( data class FundCardData( @SerializedName("title") val title: TextWithStyle? = null, + @SerializedName("subtitle", alternate = ["subTitle"]) val subtitle: TextWithStyle? = null, @SerializedName("iconCode") val iconCode: String? = null, @SerializedName("tagData") val tagData: TagData? = null, @SerializedName("footerIconCode") val footerIconCode: String? = null, @SerializedName("footerBgColor") val footerBgColor: String? = null, @SerializedName("footerTitle") val footerTitle: TextWithStyle? = null, @SerializedName("items") val items: List? = null, + @SerializedName("cta") val cta: SubItemData? = null, + @SerializedName("variantName") val variantName: String? = null, @SerializedName("actionData") val action: ActionData? = null ) diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/amc/FundCardAdapter.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/amc/FundCardAdapter.kt new file mode 100644 index 0000000000..b18236eb7b --- /dev/null +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/amc/FundCardAdapter.kt @@ -0,0 +1,223 @@ +package com.navi.naviwidgets.widgets.amc + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding +import com.navi.base.utils.isNotNullAndNotEmpty +import com.navi.design.utils.CornerRadius +import com.navi.design.utils.dpToPx +import com.navi.design.utils.getNaviDrawable +import com.navi.design.utils.parseColorSafe +import com.navi.design.utils.setSpannableString +import com.navi.naviwidgets.R +import com.navi.naviwidgets.callbacks.WidgetCallback +import com.navi.naviwidgets.databinding.LayoutFundCardBinding +import com.navi.naviwidgets.databinding.LayoutFundCardIndexReturnBinding +import com.navi.naviwidgets.extensions.showWhenDataIsAvailable +import com.navi.naviwidgets.models.response.amc.FundCardData + +class FundCardAdapter( + private val list: List = emptyList(), + private val widgetCallback: WidgetCallback +) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FundCardViewHolder { + return when(viewType) { + INDEX_RETURN_TOP_CTA -> { + val view = LayoutInflater.from(parent.context).inflate(viewType, parent, false) + val itemBinding: LayoutFundCardIndexReturnBinding = DataBindingUtil.bind(view)!! + IndexReturnFundCardViewHolder(itemBinding, widgetCallback) + } + + else -> { + val view = LayoutInflater.from(parent.context).inflate(viewType, parent, false) + val itemBinding: LayoutFundCardBinding = DataBindingUtil.bind(view)!! + DefaultFundCardViewHolder(itemBinding, widgetCallback) + } + } + } + + override fun getItemViewType(position: Int): Int { + return when(list[position].variantName) { + VARIANT_INDEX_RETURN_TOP_CTA -> INDEX_RETURN_TOP_CTA + else -> DEFAULT_FUND_CARD + } + } + + override fun onBindViewHolder(holder: FundCardViewHolder, position: Int) { + holder.bind(list[position], position) + } + + override fun getItemCount() = + list.size + + companion object { + private const val VARIANT_INDEX_RETURN_TOP_CTA = "INDEX_RETURN_TOP_CTA" + private val INDEX_RETURN_TOP_CTA = R.layout.layout_fund_card_index_return + private val DEFAULT_FUND_CARD = R.layout.layout_fund_card + } +} + +sealed class FundCardViewHolder(private val viewBinding: ViewBinding): RecyclerView.ViewHolder(viewBinding.root) { + abstract fun bind(card: FundCardData, position: Int) +} + +class DefaultFundCardViewHolder( + private val viewBinding: LayoutFundCardBinding, + private val widgetCallback: WidgetCallback +) : FundCardViewHolder(viewBinding) { + + override fun bind(card: FundCardData, position: Int) { + viewBinding.apply { + fundCard.background = getNaviDrawable( + cornerRadius = dpToPx(8).toInt(), + strokeColor = ContextCompat.getColor( + itemView.context, + R.color.border_grey_color + ), + strokeWidth = dpToPx(1).toInt(), + backgroundColor = ContextCompat.getColor( + itemView.context, + R.color.white + ) + ) + fundTitle.setSpannableString(card.title) + icon.showWhenDataIsAvailable(card.iconCode) + + card.tagData?.let { + fundTagContainer.isVisible = true + fundTagTitle.setSpannableString(it.title) + fundTagIcon.showWhenDataIsAvailable(it.iconCode) + } ?: kotlin.run { + fundTagContainer.isVisible = false + } + + card.items?.forEachIndexed { index, subItemData -> + when(index) { + 0 -> { + fundSize.title.setSpannableString(subItemData.title) + fundSize.subtitle.setSpannableString(subItemData.subtitle) + if(subItemData.title?.text.isNotNullAndNotEmpty()) { + fundSize.titleIcon.showWhenDataIsAvailable(subItemData.iconCode) + fundSize.icon.visibility = View.GONE + } + else { + fundSize.icon.showWhenDataIsAvailable(subItemData.iconCode) + fundSize.title.visibility = View.GONE + } + } + 1 -> { + returns.title.setSpannableString(subItemData.title) + returns.subtitle.setSpannableString(subItemData.subtitle) + if(subItemData.title?.text.isNotNullAndNotEmpty()) { + returns.titleIcon.showWhenDataIsAvailable(subItemData.iconCode) + returns.icon.visibility = View.GONE + } + else { + returns.icon.showWhenDataIsAvailable(subItemData.iconCode) + returns.title.visibility = View.GONE + } + } + 2 -> { + cta.title.setSpannableString(subItemData.title) + cta.subtitle.setSpannableString(subItemData.subtitle) + if(subItemData.title?.text.isNotNullAndNotEmpty()) { + cta.titleIcon.showWhenDataIsAvailable(subItemData.iconCode) + cta.icon.visibility = View.GONE + } + else { + cta.icon.showWhenDataIsAvailable(subItemData.iconCode) + cta.title.visibility = View.GONE + } + } + } + } + + if(card.footerTitle?.text.isNotNullAndNotEmpty()) { + productStrategyContainer.background = getNaviDrawable( + radii = CornerRadius( + leftBottom = dpToPx(8), + rightBottom = dpToPx(8) + ), + backgroundColor = card.footerBgColor.parseColorSafe() + ) + productStrategyTv.setSpannableString(card.footerTitle) + productStrategyIv.showWhenDataIsAvailable(card.footerIconCode) + } else { + productStrategyContainer.visibility = View.GONE + } + + fundCard.setOnClickListener { + card.action?.let { actionData -> + widgetCallback.onClick(actionData) + } + } + } + } +} + +class IndexReturnFundCardViewHolder( + private val viewBinding: LayoutFundCardIndexReturnBinding, + private val widgetCallback: WidgetCallback +) : FundCardViewHolder(viewBinding) { + + override fun bind(card: FundCardData, position: Int) { + viewBinding.apply { + fundCard.background = getNaviDrawable( + cornerRadius = dpToPx(8).toInt(), + strokeColor = ContextCompat.getColor( + itemView.context, + R.color.border_grey_color + ), + strokeWidth = dpToPx(1).toInt(), + backgroundColor = ContextCompat.getColor( + itemView.context, + R.color.white + ) + ) + title.setSpannableString(card.title) + subtitle.setSpannableString(card.subtitle) + + cta.apply { + title.setSpannableString(card.cta?.title) + subtitle.setSpannableString(card.cta?.subtitle) + if (card.cta?.title?.text.isNotNullAndNotEmpty()) { + titleIcon.showWhenDataIsAvailable(card.cta?.iconCode) + icon.visibility = View.GONE + } else { + icon.showWhenDataIsAvailable(card.cta?.iconCode) + title.visibility = View.GONE + } + } + + card.tagData?.let { + fundTagContainer.isVisible = true + fundTagTitle.setSpannableString(it.title) + fundTagIcon.showWhenDataIsAvailable(it.iconCode) + } ?: kotlin.run { + fundTagContainer.isVisible = false + } + + card.items?.forEachIndexed { index, subItemData -> + when(index) { + 0 -> { + fundTitle.setSpannableString(subItemData.title) + fundSubtitle.setSpannableString(subItemData.subtitle) + fundIcon.showWhenDataIsAvailable(subItemData.iconCode) + } + } + } + + fundCard.setOnClickListener { + card.action?.let { actionData -> + widgetCallback.onClick(actionData) + } + } + } + } +} \ No newline at end of file diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/amc/FundCardWidgetLayout.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/amc/FundCardWidgetLayout.kt index 4ec8d4cd2d..e749e47423 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/amc/FundCardWidgetLayout.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/amc/FundCardWidgetLayout.kt @@ -9,26 +9,16 @@ package com.navi.naviwidgets.widgets.amc import android.content.Context import android.util.AttributeSet -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat -import androidx.core.view.isVisible -import androidx.databinding.DataBindingUtil import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.navi.base.utils.isNotNullAndNotEmpty import com.navi.design.utils.* -import com.navi.naviwidgets.R import com.navi.naviwidgets.callbacks.WidgetCallback -import com.navi.naviwidgets.databinding.LayoutFundCardBinding import com.navi.naviwidgets.databinding.LayoutFundCardSectionBinding import com.navi.naviwidgets.extensions.setGradient import com.navi.naviwidgets.extensions.showWhenDataIsAvailable -import com.navi.naviwidgets.models.response.amc.FundCardData import com.navi.naviwidgets.models.response.amc.FundCardWidget class FundCardWidgetLayout @JvmOverloads constructor( @@ -78,118 +68,4 @@ class FundCardWidgetLayout @JvmOverloads constructor( } } } -} - -class FundCardAdapter( - private val list: List = emptyList(), - private val widgetCallback: WidgetCallback -) : RecyclerView.Adapter() { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder { - val view = - LayoutInflater.from(parent.context).inflate(R.layout.layout_fund_card, parent, false) - val itemBinding: LayoutFundCardBinding = DataBindingUtil.bind(view)!! - return CardViewHolder(itemBinding, widgetCallback) - } - - override fun onBindViewHolder(holder: CardViewHolder, position: Int) { - holder.bind(list[position], position) - } - - override fun getItemCount() = - list.size -} - -class CardViewHolder( - private val viewBinding: LayoutFundCardBinding, - private val widgetCallback: WidgetCallback -) : RecyclerView.ViewHolder(viewBinding.root) { - - fun bind(card: FundCardData, position: Int) { - viewBinding.apply { - fundCard.background = getNaviDrawable( - cornerRadius = dpToPx(8).toInt(), - strokeColor = ContextCompat.getColor( - itemView.context, - R.color.border_grey_color - ), - strokeWidth = dpToPx(1).toInt(), - backgroundColor = ContextCompat.getColor( - itemView.context, - R.color.white - ) - ) - fundTitle.setSpannableString(card.title) - icon.showWhenDataIsAvailable(card.iconCode) - - card.tagData?.let { - fundTagContainer.isVisible = true - fundTagTitle.setSpannableString(it.title) - fundTagIcon.showWhenDataIsAvailable(it.iconCode) - } ?: kotlin.run { - fundTagContainer.isVisible = false - } - - card.items?.forEachIndexed { index, subItemData -> - when(index) { - 0 -> { - fundSize.title.setSpannableString(subItemData.title) - fundSize.subtitle.setSpannableString(subItemData.subtitle) - if(subItemData.title?.text.isNotNullAndNotEmpty()) { - fundSize.titleIcon.showWhenDataIsAvailable(subItemData.iconCode) - fundSize.icon.visibility = View.GONE - } - else { - fundSize.icon.showWhenDataIsAvailable(subItemData.iconCode) - fundSize.title.visibility = View.GONE - } - } - 1 -> { - returns.title.setSpannableString(subItemData.title) - returns.subtitle.setSpannableString(subItemData.subtitle) - if(subItemData.title?.text.isNotNullAndNotEmpty()) { - returns.titleIcon.showWhenDataIsAvailable(subItemData.iconCode) - returns.icon.visibility = View.GONE - } - else { - returns.icon.showWhenDataIsAvailable(subItemData.iconCode) - returns.title.visibility = View.GONE - } - } - 2 -> { - cta.title.setSpannableString(subItemData.title) - cta.subtitle.setSpannableString(subItemData.subtitle) - if(subItemData.title?.text.isNotNullAndNotEmpty()) { - cta.titleIcon.showWhenDataIsAvailable(subItemData.iconCode) - cta.icon.visibility = View.GONE - } - else { - cta.icon.showWhenDataIsAvailable(subItemData.iconCode) - cta.title.visibility = View.GONE - } - } - } - } - - if(card.footerTitle?.text.isNotNullAndNotEmpty()) { - productStrategyContainer.background = getNaviDrawable( - radii = CornerRadius( - leftBottom = dpToPx(8), - rightBottom = dpToPx(8) - ), - backgroundColor = card.footerBgColor.parseColorSafe() - ) - productStrategyTv.setSpannableString(card.footerTitle) - productStrategyIv.showWhenDataIsAvailable(card.footerIconCode) - } else { - productStrategyContainer.visibility = View.GONE - } - - fundCard.setOnClickListener { - card.action?.let { actionData -> - widgetCallback.onClick(actionData) - } - } - } - } -} +} \ No newline at end of file diff --git a/navi-widgets/src/main/res/layout/layout_fund_card.xml b/navi-widgets/src/main/res/layout/layout_fund_card.xml index 54e6911a04..595f94e2b8 100644 --- a/navi-widgets/src/main/res/layout/layout_fund_card.xml +++ b/navi-widgets/src/main/res/layout/layout_fund_card.xml @@ -109,7 +109,8 @@ diff --git a/navi-widgets/src/main/res/layout/layout_fund_card_index_return.xml b/navi-widgets/src/main/res/layout/layout_fund_card_index_return.xml new file mode 100644 index 0000000000..3df3552775 --- /dev/null +++ b/navi-widgets/src/main/res/layout/layout_fund_card_index_return.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file