From f0218859920a5b6f71a8519627afdc8ecd0615df Mon Sep 17 00:00:00 2001 From: "GitHubArchive\\Adarsh S" <139381665+o0rClIeHrI23hkZQNHTgAlLrNOmkLr7VPP2MMz9@users.noreply.github.com> Date: Thu, 20 Jul 2023 10:14:26 +0530 Subject: [PATCH] Feature/rewards blocked state handling (#6955) * TP-33169 | Handle rewards blocked state * TP-33169 | Mock * TP-32564 | Removed unused files * TP-35536 | Spotless apply * TP-35536 | Replaced lottie json files with dotLottie file --------- Co-authored-by: adarshs Co-authored-by: Girish Suragani --- .../ui/bottomsheet/RewardsBottomsSheetView.kt | 14 ++++++- .../ui/fragment/RewardsDetailFragment.kt | 38 ++++++++++-------- .../res/layout/layout_rewards_bottomsheet.xml | 5 ++- .../navi/naviwidgets/extensions/WidgetExt.kt | 8 +++- .../models/response/RewardWidget.kt | 8 +++- .../com/navi/naviwidgets/utils/LottieEnums.kt | 4 +- .../widgets/RewardsWidgetLayout.kt | 30 +++++++------- .../drawable/ic_rewards_blocked_corner.xml | 19 +++++++++ .../main/res/raw/rewards_blocked_large.lottie | Bin 0 -> 4001 bytes .../main/res/raw/rewards_blocked_small.lottie | Bin 0 -> 4000 bytes 10 files changed, 87 insertions(+), 39 deletions(-) create mode 100644 navi-widgets/src/main/res/drawable/ic_rewards_blocked_corner.xml create mode 100644 navi-widgets/src/main/res/raw/rewards_blocked_large.lottie create mode 100644 navi-widgets/src/main/res/raw/rewards_blocked_small.lottie diff --git a/navi-rr/src/main/java/com/navi/rr/rewards/ui/bottomsheet/RewardsBottomsSheetView.kt b/navi-rr/src/main/java/com/navi/rr/rewards/ui/bottomsheet/RewardsBottomsSheetView.kt index 496c79068c..49172d5188 100644 --- a/navi-rr/src/main/java/com/navi/rr/rewards/ui/bottomsheet/RewardsBottomsSheetView.kt +++ b/navi-rr/src/main/java/com/navi/rr/rewards/ui/bottomsheet/RewardsBottomsSheetView.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.rr.rewards.ui.bottomsheet import android.content.Context @@ -5,11 +12,13 @@ import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import androidx.databinding.DataBindingUtil +import com.navi.base.model.ImageDetail import com.navi.base.model.NaviWidgetClickWithActionData import com.navi.design.utils.CornerRadius import com.navi.design.utils.getNaviDrawableFromBackend import com.navi.design.utils.parseColorSafe import com.navi.design.utils.spannedText +import com.navi.naviwidgets.extensions.showWhenDataIsAvailable import com.navi.naviwidgets.models.response.RewardInfo import com.navi.rr.R import com.navi.rr.databinding.LayoutRewardsBottomsheetBinding @@ -35,6 +44,9 @@ constructor(parentContext: Context, attrs: AttributeSet? = null, defStyleAttr: I ) { this.rewardInfo = rewardInfo binding.apply { + rewardInfo?.imageUrl?.let { url -> + ivIcon.showWhenDataIsAvailable(imageDetail = ImageDetail(url = url)) + } tvTitle.text = rewardInfo?.title?.text.spannedText( context, rewardInfo?.title?.span @@ -79,4 +91,4 @@ constructor(parentContext: Context, attrs: AttributeSet? = null, defStyleAttr: I } } } -} \ No newline at end of file +} diff --git a/navi-rr/src/main/java/com/navi/rr/rewards/ui/fragment/RewardsDetailFragment.kt b/navi-rr/src/main/java/com/navi/rr/rewards/ui/fragment/RewardsDetailFragment.kt index 20243748b0..3b5adb32b4 100644 --- a/navi-rr/src/main/java/com/navi/rr/rewards/ui/fragment/RewardsDetailFragment.kt +++ b/navi-rr/src/main/java/com/navi/rr/rewards/ui/fragment/RewardsDetailFragment.kt @@ -13,8 +13,8 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import androidx.core.view.isVisible -import com.navi.base.deeplink.DeepLinkManager import androidx.lifecycle.ViewModelProvider +import com.navi.base.deeplink.DeepLinkManager import com.navi.base.model.ActionData import com.navi.base.model.ImageDetail import com.navi.base.model.NaviWidgetClickWithActionData @@ -24,7 +24,6 @@ import com.navi.common.model.RewardBottomSheetType import com.navi.common.model.RewardState import com.navi.common.ui.dialog.BaseDialogFragment import com.navi.common.utils.Constants.WEB_URL -import com.navi.rr.utils.Constants.REWARDS_UPI import com.navi.common.utils.toCtaData import com.navi.design.utils.CornerRadius import com.navi.design.utils.getNaviDrawableFromBackend @@ -43,6 +42,7 @@ import com.navi.rr.rewards.ui.bottomsheet.RewardsPLUnlockDetailsBottomSheetView import com.navi.rr.rewards.ui.bottomsheet.RewardsUnLockDetailsBottomSheetView import com.navi.rr.rewards.viewmodels.RewardDashboardSharedVM import com.navi.rr.utils.Constants.REWARDS_DETAILS_SCREEN +import com.navi.rr.utils.Constants.REWARDS_UPI import com.navi.rr.utils.NaviRRAnalytics class RewardsDetailFragment : @@ -135,22 +135,26 @@ class RewardsDetailFragment : ImageDetail(url = rewardsWidgetData?.rewardsInfo?.largeIconUrl) ) if (rewardsWidgetData?.rewardsInfo?.showCornerImg == true) { - ivCornerImg.setImageResource( - when (rewardsWidgetData?.rewardsInfo?.rewardType) { - RewardType.GOLD.name -> { - ivRewardIcon.isVisible = false - com.navi.naviwidgets.R.drawable.ic_rewards_detail_corner + if (rewardsWidgetData?.rewardsInfo?.isBlocked == true) { + ivCornerImg.setImageResource(com.navi.naviwidgets.R.drawable.ic_rewards_blocked_corner) + } else { + ivCornerImg.setImageResource( + when (rewardsWidgetData?.rewardsInfo?.rewardType) { + RewardType.GOLD.name -> { + ivRewardIcon.isVisible = false + com.navi.naviwidgets.R.drawable.ic_rewards_detail_corner + } + RewardType.CASH.name -> { + ivRewardIcon.isVisible = false + com.navi.naviwidgets.R.drawable.ic_rewards_detail_corner + } + else -> { + ivRewardIcon.isVisible = true + com.navi.naviwidgets.R.drawable.ic_rewards_detail_corner + } } - RewardType.CASH.name -> { - ivRewardIcon.isVisible = false - com.navi.naviwidgets.R.drawable.ic_rewards_detail_corner - } - else -> { - ivRewardIcon.isVisible = true - com.navi.naviwidgets.R.drawable.ic_rewards_detail_corner - } - } - ) + ) + } } ivRewardLottie.showWhenDataIsAvailable( lottieName = rewardsWidgetData?.rewardsInfo?.lottieFileName diff --git a/navi-rr/src/main/res/layout/layout_rewards_bottomsheet.xml b/navi-rr/src/main/res/layout/layout_rewards_bottomsheet.xml index 8246b5ebe1..0b82d44054 100644 --- a/navi-rr/src/main/res/layout/layout_rewards_bottomsheet.xml +++ b/navi-rr/src/main/res/layout/layout_rewards_bottomsheet.xml @@ -20,8 +20,8 @@ { setAnimation(R.raw.digilocker_success) } + LottieEnums.REWARDS_BLOCKED_POPUP_COIN.name -> { + setAnimation(R.raw.rewards_blocked_large) + } + LottieEnums.MY_REWARDS_BLOCKED_COIN.name -> { + setAnimation(R.raw.rewards_blocked_small) + } else -> { isInAppLottie = false CoroutineScope(Dispatchers.Main).launch { diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/RewardWidget.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/RewardWidget.kt index 8630a65cb3..251723b181 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/RewardWidget.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/RewardWidget.kt @@ -79,7 +79,9 @@ data class RewardsInfo( @SerializedName("lottieFileName") val lottieFileName: String? = null, @SerializedName("lottieFileNameMyRewards") - val lottieFileNameMyRewards: String? = null + val lottieFileNameMyRewards: String? = null, + @SerializedName("isBlocked") + val isBlocked: Boolean? = false ) : Serializable, Parcelable @Parcelize @@ -129,7 +131,9 @@ data class RewardInfo( @SerializedName("infoText") val infoText: NaviTextComponent? = null, @SerializedName("actionData") - val actionData: ActionData? = null + val actionData: ActionData? = null, + @SerializedName("imageUrl") + val imageUrl: String? = null ) : Serializable, Parcelable @Parcelize diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/utils/LottieEnums.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/utils/LottieEnums.kt index 3a0c326da1..43b9c080a1 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/utils/LottieEnums.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/utils/LottieEnums.kt @@ -85,5 +85,7 @@ enum class LottieEnums { NAVI_REWARDS_GOLD_V2, NAVI_REWARDS_GOLD_DISABLED_V2, GOLD_REWARD_CONFETTI, - DIGILOCKER_SUCCESS + DIGILOCKER_SUCCESS, + REWARDS_BLOCKED_POPUP_COIN, + MY_REWARDS_BLOCKED_COIN } diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/RewardsWidgetLayout.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/RewardsWidgetLayout.kt index 576af09917..52d769940e 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/RewardsWidgetLayout.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/RewardsWidgetLayout.kt @@ -14,8 +14,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import com.navi.base.model.ImageDetail import com.navi.base.utils.isNull import com.navi.design.utils.CornerRadius -import com.navi.design.utils.deviceWidth -import com.navi.design.utils.dpToPxInInt import com.navi.design.utils.getNaviDrawableFromBackend import com.navi.design.utils.parseColorSafe import com.navi.design.utils.spannedText @@ -71,19 +69,23 @@ class RewardsWidgetLayout @JvmOverloads constructor( tvRewardPrice.showWhenDataIsAvailable(showText = info.widgetData.rewardsInfo?.value) tvRewardType.showWhenDataIsAvailable(showText = info.widgetData.rewardsInfo?.label) if (info.widgetData.rewardsInfo?.showCornerImg == true) { - ivCornerImg.setImageResource( - when (info.widgetData.rewardsInfo.rewardType) { - RewardType.GOLD.name -> { - R.drawable.ic_rewards_detail_corner + if (info.widgetData.rewardsInfo.isBlocked == true) { + ivCornerImg.setImageResource(R.drawable.ic_rewards_blocked_corner) + } else { + ivCornerImg.setImageResource( + when (info.widgetData.rewardsInfo.rewardType) { + RewardType.GOLD.name -> { + R.drawable.ic_rewards_detail_corner + } + RewardType.CASH.name -> { + R.drawable.ic_rewards_detail_corner + } + else -> { + R.drawable.ic_rewards_detail_corner + } } - RewardType.CASH.name -> { - R.drawable.ic_rewards_detail_corner - } - else -> { - R.drawable.ic_rewards_detail_corner - } - } - ) + ) + } } if(info.widgetData.rewardsInfo?.smallIconUrl.isNull()) { ivRewardIcon.visibility = View.GONE diff --git a/navi-widgets/src/main/res/drawable/ic_rewards_blocked_corner.xml b/navi-widgets/src/main/res/drawable/ic_rewards_blocked_corner.xml new file mode 100644 index 0000000000..dafcdf81f6 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_rewards_blocked_corner.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/navi-widgets/src/main/res/raw/rewards_blocked_large.lottie b/navi-widgets/src/main/res/raw/rewards_blocked_large.lottie new file mode 100644 index 0000000000000000000000000000000000000000..f822089f4009fdf13c49baf2901cff1e2d277601 GIT binary patch literal 4001 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 G>HY^&$Yu5b literal 0 HcmV?d00001 diff --git a/navi-widgets/src/main/res/raw/rewards_blocked_small.lottie b/navi-widgets/src/main/res/raw/rewards_blocked_small.lottie new file mode 100644 index 0000000000000000000000000000000000000000..61105e8aed30d20965d68e50d61cb31fc6699b9c GIT binary patch literal 4000 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 JZvg+U{sBz6b2k70 literal 0 HcmV?d00001