From 7bdd77d4d69afa9791058bf92231b78d50ab8c00 Mon Sep 17 00:00:00 2001 From: navi-kishan Date: Thu, 24 Mar 2022 20:30:18 +0530 Subject: [PATCH] Offer tag feature implemented --- app/build.gradle | 2 + .../dashboard/adapter/NewHomeAdapter.kt | 4 +- .../views/customView/DashboardLoanCardView.kt | 34 +++++++++++-- .../views/customView/TopUpLoanCardView.kt | 41 ++++++++++++++-- .../customView/UpcomingLoanStatusCardView.kt | 37 +++++++++++++- .../response/DashboardLoanWidgetConfig.kt | 18 ++++++- .../DashboardSecondLoanWidgetConfig.kt | 4 +- .../models/response/StyledTextWithIconCode.kt | 19 +++++-- .../models/response/WidgetGenericResponse.kt | 4 +- app/src/main/java/com/naviapp/utils/Ext.kt | 12 +++++ .../main/java/com/naviapp/utils/IconUtils.kt | 2 + app/src/main/res/drawable/ic_flash_red.xml | 13 +++++ .../main/res/layout/item_dashboard_loan.xml | 6 ++- app/src/main/res/layout/offer_tag_layout.xml | 49 +++++++++++++++++++ .../res/layout/upcoming_loan_status_card.xml | 6 ++- app/src/main/res/values/integers.xml | 1 + dependencies.gradle | 4 ++ .../java/com/navi/common/utils/Constants.kt | 5 ++ .../main/java/com/navi/common/utils/Ext.kt | 12 +++++ navi-insurance/build.gradle | 2 +- 20 files changed, 252 insertions(+), 23 deletions(-) create mode 100644 app/src/main/res/drawable/ic_flash_red.xml create mode 100644 app/src/main/res/layout/offer_tag_layout.xml diff --git a/app/build.gradle b/app/build.gradle index 7228596780..15dbd81ce9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -397,6 +397,8 @@ dependencies { //one tap sms verification implementation 'com.google.android.gms:play-services-auth-api-phone:18.0.1' + implementation shimmer.implementation + } tasks.withType(Compiler) { diff --git a/app/src/main/java/com/naviapp/dashboard/adapter/NewHomeAdapter.kt b/app/src/main/java/com/naviapp/dashboard/adapter/NewHomeAdapter.kt index 8c3d56e200..626c3c15fd 100644 --- a/app/src/main/java/com/naviapp/dashboard/adapter/NewHomeAdapter.kt +++ b/app/src/main/java/com/naviapp/dashboard/adapter/NewHomeAdapter.kt @@ -111,9 +111,7 @@ class NewHomeAdapter( holder.view.setListener(homeActionListener) } is SecondLoanWidgetViewHolder -> { - val upcomingLoanStatus = - (widgetConfig as? DashboardSecondLoanWidgetConfig)?.widgetBody?.upcomingLoanStatus - holder.view.setData(upcomingLoanStatus) + holder.view.setData(widgetConfig as? DashboardSecondLoanWidgetConfig) holder.view.setListener(homeActionListener) } is PaymentWidgetViewHolder -> { diff --git a/app/src/main/java/com/naviapp/dashboard/views/customView/DashboardLoanCardView.kt b/app/src/main/java/com/naviapp/dashboard/views/customView/DashboardLoanCardView.kt index 2a8dd568d8..79221f1495 100644 --- a/app/src/main/java/com/naviapp/dashboard/views/customView/DashboardLoanCardView.kt +++ b/app/src/main/java/com/naviapp/dashboard/views/customView/DashboardLoanCardView.kt @@ -19,16 +19,21 @@ import android.view.LayoutInflater import android.view.View import androidx.cardview.widget.CardView import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import com.navi.common.model.CtaData +import com.navi.insurance.util.CornerRadius +import com.navi.insurance.util.DrawableShape +import com.navi.insurance.util.getNaviDrawable +import com.navi.naviwidgets.extensions.isValidHexColor import com.naviapp.R import com.naviapp.dashboard.listeners.HomeActionListener import com.naviapp.databinding.ItemDashboardLoanBinding import com.naviapp.models.CardStatus -import com.naviapp.models.response.DashboardLoanWidgetConfig -import com.naviapp.models.response.ImageDetail -import com.naviapp.models.response.WidgetConfig +import com.naviapp.models.response.* +import com.naviapp.utils.Constants.PERSONAL_LOAN import com.naviapp.utils.IconUtils +import com.naviapp.utils.spannableString class DashboardLoanCardView(context: Context, attrs: AttributeSet? = null) : CardView(context, attrs) { @@ -71,6 +76,10 @@ class DashboardLoanCardView(context: Context, attrs: AttributeSet? = null) : setCta(widgetBody.ctaData, widgetConfig) setSecondCta(widgetBody.secondCtaData, widgetConfig) setImageDetail(widgetBody.imageDetail) + + if (DashboardLoanWidgetConfig.widgetId == PERSONAL_LOAN) { + setOfferTag(widgetBody) + } } } } @@ -175,4 +184,23 @@ class DashboardLoanCardView(context: Context, attrs: AttributeSet? = null) : } } } + + private fun setOfferTag(widgetBody: DashboardLoanWidgetBody) { + widgetBody.offerTag?.let { offerTag -> + binding.tagLayout.offerTagContainer.isVisible = true + if (isValidHexColor(offerTag.bgColor)) { + binding.tagLayout.offerTagContainer.background = getNaviDrawable( + shape = DrawableShape.RECTANGLE, + backgroundColor = Color.parseColor(offerTag.bgColor), + radii = CornerRadius(rightTop = resources.getDimension(R.dimen.dp_4)) + ) + } + offerTag.title?.let { + binding.tagLayout.tagTitle.spannableString(it) + it.iconCode?.let { iconCode -> + IconUtils.updateIcon(iconCode, binding.tagLayout.tagImg) + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/dashboard/views/customView/TopUpLoanCardView.kt b/app/src/main/java/com/naviapp/dashboard/views/customView/TopUpLoanCardView.kt index 76e9cfd7ac..123a8be391 100644 --- a/app/src/main/java/com/naviapp/dashboard/views/customView/TopUpLoanCardView.kt +++ b/app/src/main/java/com/naviapp/dashboard/views/customView/TopUpLoanCardView.kt @@ -8,21 +8,31 @@ package com.naviapp.dashboard.views.customView import android.content.Context +import android.graphics.Color import android.os.Build import android.util.AttributeSet import android.view.LayoutInflater import androidx.cardview.widget.CardView import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil +import com.navi.insurance.util.CornerRadius +import com.navi.insurance.util.DrawableShape +import com.navi.insurance.util.getNaviDrawable +import com.navi.naviwidgets.extensions.isValidHexColor import com.naviapp.R +import com.naviapp.dashboard.adapter.NewHomeWidgetType import com.naviapp.dashboard.binder.BasicDataBinder import com.naviapp.dashboard.listeners.HomeActionListener import com.naviapp.databinding.UpcomingLoanStatusCardBinding -import com.naviapp.models.response.GenericWidgetConfig -import com.naviapp.utils.orFalse +import com.naviapp.models.response.* +import com.naviapp.utils.IconUtils +import com.naviapp.utils.spannableString -class TopUpLoanCardView(context: Context, attrs: AttributeSet? = null, - private val isOnDemand: Boolean = false) : CardView(context, attrs) { +class TopUpLoanCardView( + context: Context, attrs: AttributeSet? = null, + private val isOnDemand: Boolean = false +) : CardView(context, attrs) { private var binding: UpcomingLoanStatusCardBinding init { @@ -54,5 +64,28 @@ class TopUpLoanCardView(context: Context, attrs: AttributeSet? = null, ) } } + widgetConfig?.widgetBody?.let { body -> + setOfferTag(body) + } + } + + private fun setOfferTag(widgetBody: GenericWidgetBody) { + widgetBody.offerTag?.let { offerTag -> + binding.tagLayout.offerTagContainer.isVisible = true + if (isValidHexColor(offerTag.bgColor)) { + binding.tagLayout.offerTagContainer.background = getNaviDrawable( + shape = DrawableShape.RECTANGLE, + backgroundColor = Color.parseColor(offerTag.bgColor), + radii = CornerRadius(rightTop = resources.getDimension(R.dimen.dp_4)) + ) + } + offerTag.title?.let { + binding.tagLayout.tagTitle.spannableString(it) + it.iconCode?.let { iconCode -> + IconUtils.updateIcon(iconCode, binding.tagLayout.tagImg) + } + } + + } } } \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/dashboard/views/customView/UpcomingLoanStatusCardView.kt b/app/src/main/java/com/naviapp/dashboard/views/customView/UpcomingLoanStatusCardView.kt index 9a98969166..072d0c71c9 100644 --- a/app/src/main/java/com/naviapp/dashboard/views/customView/UpcomingLoanStatusCardView.kt +++ b/app/src/main/java/com/naviapp/dashboard/views/customView/UpcomingLoanStatusCardView.kt @@ -7,16 +7,26 @@ package com.naviapp.dashboard.views.customView import android.content.Context +import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil +import com.navi.insurance.util.CornerRadius +import com.navi.insurance.util.DrawableShape +import com.navi.insurance.util.getNaviDrawable +import com.navi.naviwidgets.extensions.isValidHexColor import com.naviapp.R import com.naviapp.dashboard.binder.BasicDataBinder import com.naviapp.dashboard.listeners.HomeActionListener import com.naviapp.databinding.UpcomingLoanStatusCardBinding +import com.naviapp.models.response.DashboardSecondLoanWidgetBody +import com.naviapp.models.response.DashboardSecondLoanWidgetConfig import com.naviapp.payment.models.UpcomingLoanStatus +import com.naviapp.utils.IconUtils +import com.naviapp.utils.spannableString class UpcomingLoanStatusCardView @JvmOverloads constructor( context: Context, @@ -38,8 +48,11 @@ class UpcomingLoanStatusCardView @JvmOverloads constructor( layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) } - fun setData(data: UpcomingLoanStatus?) { - data?.let { + fun setData(dashboardSecondLoanWidgetConfig: DashboardSecondLoanWidgetConfig?) { + dashboardSecondLoanWidgetConfig?.widgetBody?.upcomingLoanStatus?.let { + dashboardSecondLoanWidgetConfig.widgetBody.let { offerTag -> + setOfferTag(offerTag) + } initUi(it) } ?: run { binding.upcomingLoanStatusCardView.visibility = View.GONE @@ -62,4 +75,24 @@ class UpcomingLoanStatusCardView @JvmOverloads constructor( listener?.onUpcomingLoanClick(data) } } + + private fun setOfferTag(widgetBody: DashboardSecondLoanWidgetBody) { + widgetBody.offerTag?.let { offerTag -> + binding.tagLayout.offerTagContainer.isVisible = true + if (isValidHexColor(offerTag.bgColor)) { + binding.tagLayout.offerTagContainer.background = getNaviDrawable( + shape = DrawableShape.RECTANGLE, + backgroundColor = Color.parseColor(offerTag.bgColor), + radii = CornerRadius(rightTop = resources.getDimension(R.dimen.dp_4)) + ) + } + offerTag.title?.let { + binding.tagLayout.tagTitle.spannableString(it) + it.iconCode?.let { iconCode -> + IconUtils.updateIcon(iconCode, binding.tagLayout.tagImg) + } + } + + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/models/response/DashboardLoanWidgetConfig.kt b/app/src/main/java/com/naviapp/models/response/DashboardLoanWidgetConfig.kt index 7f2c7078e0..8b4d4b4e39 100644 --- a/app/src/main/java/com/naviapp/models/response/DashboardLoanWidgetConfig.kt +++ b/app/src/main/java/com/naviapp/models/response/DashboardLoanWidgetConfig.kt @@ -7,8 +7,10 @@ package com.naviapp.models.response +import android.os.Parcelable import com.google.gson.annotations.SerializedName import com.navi.common.model.CtaData +import kotlinx.android.parcel.Parcelize data class DashboardLoanWidgetConfig( @SerializedName("body") @@ -36,5 +38,17 @@ data class DashboardLoanWidgetBody( @SerializedName("descriptionBgColor") val descriptionBgColor: String? = null, @SerializedName("descriptionIconCode") - val descriptionIconCode: String? =null -) + val descriptionIconCode: String? = null, + @SerializedName("offerTag") + val offerTag: OfferTag? = null, + ) + +@Parcelize +data class OfferTag( + @SerializedName("bgColor") + val bgColor: String? = null, + @SerializedName("animationEnabled") + val animationEnabled: Boolean? = false, + @SerializedName("title") + val title: StyledTextWithIconCode? = null +) : Parcelable diff --git a/app/src/main/java/com/naviapp/models/response/DashboardSecondLoanWidgetConfig.kt b/app/src/main/java/com/naviapp/models/response/DashboardSecondLoanWidgetConfig.kt index 86b3f689b1..ad1a9b8441 100644 --- a/app/src/main/java/com/naviapp/models/response/DashboardSecondLoanWidgetConfig.kt +++ b/app/src/main/java/com/naviapp/models/response/DashboardSecondLoanWidgetConfig.kt @@ -17,5 +17,7 @@ data class DashboardSecondLoanWidgetConfig( data class DashboardSecondLoanWidgetBody( @SerializedName("subsequentLoanCard") - val upcomingLoanStatus: UpcomingLoanStatus? = null + val upcomingLoanStatus: UpcomingLoanStatus? = null, + @SerializedName("offerTag") + val offerTag: OfferTag? = null, ) diff --git a/app/src/main/java/com/naviapp/models/response/StyledTextWithIconCode.kt b/app/src/main/java/com/naviapp/models/response/StyledTextWithIconCode.kt index 3a152d7296..07ecaa16f6 100644 --- a/app/src/main/java/com/naviapp/models/response/StyledTextWithIconCode.kt +++ b/app/src/main/java/com/naviapp/models/response/StyledTextWithIconCode.kt @@ -7,18 +7,29 @@ package com.naviapp.models.response +import android.os.Parcelable import com.google.gson.annotations.SerializedName +import kotlinx.android.parcel.Parcelize +@Parcelize data class StyledTextWithIconCode( @SerializedName("iconCode") val iconCode: String? = null, @SerializedName("text") val text: String? = null, @SerializedName("bold") val boldText: List? = null, @SerializedName("underline") val underlineText: List? = null, @SerializedName("colorTextList") val colorTextList: List? = null, - @SerializedName("hexColorCode") val hexColorCode: String? = null -) + @SerializedName("hexColorCode") val hexColorCode: String? = null, + @SerializedName("boldTypeList") val boldTypeList: List? = null, +) : Parcelable +@Parcelize data class TextColor( @SerializedName("hexColorCode") val hexColorCode: String? = null, - @SerializedName("text") val text: String? = null -) \ No newline at end of file + @SerializedName("text") val text: String? = null, +) : Parcelable + +@Parcelize +data class BoldTypeList( + @SerializedName("text") val text: String? = null, + @SerializedName("fontType") val fontType: String? = null +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/models/response/WidgetGenericResponse.kt b/app/src/main/java/com/naviapp/models/response/WidgetGenericResponse.kt index ba365c41fd..d02da66781 100644 --- a/app/src/main/java/com/naviapp/models/response/WidgetGenericResponse.kt +++ b/app/src/main/java/com/naviapp/models/response/WidgetGenericResponse.kt @@ -51,7 +51,9 @@ open class GenericWidgetBody( @SerializedName("cta") val cta: CtaData? = null, @SerializedName("documentUrl") - val documentUrl: String? = null + val documentUrl: String? = null, + @SerializedName("offerTag") + val offerTag : OfferTag? = null, ) : Parcelable @Parcelize diff --git a/app/src/main/java/com/naviapp/utils/Ext.kt b/app/src/main/java/com/naviapp/utils/Ext.kt index 1fe4eab93e..2be666d78f 100644 --- a/app/src/main/java/com/naviapp/utils/Ext.kt +++ b/app/src/main/java/com/naviapp/utils/Ext.kt @@ -30,6 +30,7 @@ import androidx.constraintlayout.widget.Group import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.viewpager.widget.ViewPager +import com.navi.common.utils.getFontAsset import com.naviapp.R import com.naviapp.app.NaviApplication import com.naviapp.common.customview.CustomTypefaceSpan @@ -174,6 +175,17 @@ fun TextView.spannableString(styledTextWithIconCode: StyledTextWithIconCode) { ) } } + styledTextWithIconCode.boldTypeList?.forEach { boldType-> + boldType.text?.let{ + val startIndex = data.indexOf(it) + textData.setSpan( + CustomTypefaceSpan(ResourcesCompat.getFont(context,getFontAsset(boldType.fontType))!!), + startIndex, + startIndex + it.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + } this.setText(textData, TextView.BufferType.SPANNABLE) } catch (e: Exception) { e.log() diff --git a/app/src/main/java/com/naviapp/utils/IconUtils.kt b/app/src/main/java/com/naviapp/utils/IconUtils.kt index b8c25d3235..008ef28b05 100644 --- a/app/src/main/java/com/naviapp/utils/IconUtils.kt +++ b/app/src/main/java/com/naviapp/utils/IconUtils.kt @@ -166,6 +166,7 @@ object IconUtils { const val ICON_DOWNLOAD_WHITE = "ICON_DOWNLOAD_WHITE" const val INFO_YELLOW = "INFO_YELLOW" const val ICON_INFO_GREY = "ICON_INFO_GREY" + const val ICON_FLASH_RED = "ICON_FLASH_RED" fun updateIcon(imageDetail: ImageDetail, imageView: ImageView) { imageDetail.iconCode?.let { iconCode -> @@ -341,6 +342,7 @@ object IconUtils { ICON_DOWNLOAD_WHITE -> R.drawable.ic_download_white INFO_YELLOW -> R.drawable.ic_info_yellow ICON_INFO_GREY -> R.drawable.ic_info_grey_svg + ICON_FLASH_RED -> R.drawable.ic_flash_red else -> -1 } } diff --git a/app/src/main/res/drawable/ic_flash_red.xml b/app/src/main/res/drawable/ic_flash_red.xml new file mode 100644 index 0000000000..a782934926 --- /dev/null +++ b/app/src/main/res/drawable/ic_flash_red.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/item_dashboard_loan.xml b/app/src/main/res/layout/item_dashboard_loan.xml index 3791f5386f..921d7246eb 100644 --- a/app/src/main/res/layout/item_dashboard_loan.xml +++ b/app/src/main/res/layout/item_dashboard_loan.xml @@ -15,6 +15,10 @@ android:layout_height="wrap_content" android:background="@drawable/bg_white_rounded_12"> + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/upcoming_loan_status_card.xml b/app/src/main/res/layout/upcoming_loan_status_card.xml index c1857e4301..cdbfda88ac 100644 --- a/app/src/main/res/layout/upcoming_loan_status_card.xml +++ b/app/src/main/res/layout/upcoming_loan_status_card.xml @@ -34,6 +34,10 @@ android:layout_height="wrap_content" android:clickable="false"> + + diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index 5dbf49c763..5c8edd787a 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -5,6 +5,7 @@ --> + 1000 500 200 350 diff --git a/dependencies.gradle b/dependencies.gradle index 53fa6f1114..f905d69409 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -24,4 +24,8 @@ ext { implementation : "com.google.android.play:core-ktx:1.8.1" ] + shimmer = [ + implementation : 'com.facebook.shimmer:shimmer:0.5.0' + ] + } \ No newline at end of file diff --git a/navi-common/src/main/java/com/navi/common/utils/Constants.kt b/navi-common/src/main/java/com/navi/common/utils/Constants.kt index 19d242224b..cfebfeeb38 100644 --- a/navi-common/src/main/java/com/navi/common/utils/Constants.kt +++ b/navi-common/src/main/java/com/navi/common/utils/Constants.kt @@ -16,4 +16,9 @@ object Constants { const val LEFT_RIGHT = "LEFT_RIGHT" + const val BOLD = "BOLD" + const val SEMI_BOLD = "SEMI_BOLD" + const val REGULAR = "REGULAR" + const val EXTRA_BOLD = "EXTRA_BOLD" + } \ No newline at end of file diff --git a/navi-common/src/main/java/com/navi/common/utils/Ext.kt b/navi-common/src/main/java/com/navi/common/utils/Ext.kt index e6841c14fa..4114f3f216 100644 --- a/navi-common/src/main/java/com/navi/common/utils/Ext.kt +++ b/navi-common/src/main/java/com/navi/common/utils/Ext.kt @@ -6,6 +6,7 @@ import android.os.Handler import android.view.inputmethod.InputMethodManager import android.widget.EditText import com.navi.common.CommonLibManager +import com.navi.common.R import com.navi.common.network.retrofit.RetrofitService import timber.log.Timber import java.util.* @@ -48,3 +49,14 @@ fun String.capitalize(): String { "" } } + + +fun getFontAsset(fontCode: String?): Int { + return when (fontCode) { + Constants.BOLD -> R.font.navi_bold + Constants.SEMI_BOLD -> R.font.navi_semi_bold + Constants.REGULAR -> R.font.navi_regular + Constants.EXTRA_BOLD -> R.font.navi_extra_bold + else -> R.font.navi_regular + } +} diff --git a/navi-insurance/build.gradle b/navi-insurance/build.gradle index 32724e23f8..432e69af7f 100644 --- a/navi-insurance/build.gradle +++ b/navi-insurance/build.gradle @@ -136,7 +136,7 @@ dependencies { implementation 'com.google.android.gms:play-services-maps:17.0.0' implementation 'com.google.android.gms:play-services-location:17.1.0' - implementation 'com.facebook.shimmer:shimmer:0.5.0' + implementation shimmer.implementation implementation 'in.payu:payu-checkout-pro:1.7.6' implementation 'com.google.android.play:core:1.10.0'