NTP-18296 | Gold landing page revamp (#14205)

This commit is contained in:
Varun Jain
2024-12-24 16:57:38 +05:30
committed by GitHub
parent f95cdfe35d
commit 11fe9b362a
42 changed files with 1548 additions and 161 deletions

View File

@@ -33,6 +33,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.analytics.utils.SCREEN_NAME
import com.navi.base.AppServiceManager
@@ -114,6 +115,7 @@ import com.navi.gold.navigator.NaviDigitalGoldDeeplinkNavigator
import com.navi.gold.navigator.NaviDigitalGoldDeeplinkNavigator.GOLD
import com.navi.gold.toOpenBottomSheet
import com.navi.gold.util.CommonUtils
import com.navi.gold.util.CommonUtils.updateColorsBasedOnPosition
import com.navi.gold.util.Constants
import com.navi.gold.util.Constants.AMOUNT_DATA
import com.navi.gold.util.Constants.APP_ACTION_OBJECTIVE_REWARDS_CAMPAIGN_ONBOARD
@@ -140,6 +142,7 @@ import com.navi.gold.util.Constants.PAN_VERIFY_BOTTOM_SHEET
import com.navi.gold.util.Constants.PD_RPD_SELECTION
import com.navi.gold.util.Constants.SETTINGS
import com.navi.gold.util.Constants.SETUP_SIP_REFRESH
import com.navi.gold.util.Constants.SETUP_SIP_WIDGET
import com.navi.gold.util.Constants.SHOW_OFFER_BOTTOMSHEET
import com.navi.gold.util.Constants.SHOW_WIDGET_BOTTOM_SHEET
import com.navi.gold.util.Constants.SIP_SETUP_FAILED
@@ -189,6 +192,7 @@ import com.navi.naviwidgets.models.GoldPortfolioCardWidget
import com.navi.naviwidgets.models.NaviBaseAdapterModel
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.ShareData
import com.navi.naviwidgets.models.SipCardWidget
import com.navi.naviwidgets.models.TextCardWithShimmerWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.models.response.HomeProductWidget
@@ -405,6 +409,7 @@ class DigitalGoldHomeActivity :
onBackPressed()
}
}
setScrollListener()
}
private fun showShimmer() {
@@ -1238,6 +1243,7 @@ class DigitalGoldHomeActivity :
private fun processHeader(response: WidgetResponse?) {
response?.header?.let {
homeVM.setStatusBarColor(it.backgroundColor.parseColorSafe(COLOR_WHITE))
it.title?.let { title ->
it.leftIconCode?.let { leftIconCode ->
binding.ivBack.showWhenDataIsAvailable(leftIconCode)
@@ -1289,6 +1295,23 @@ class DigitalGoldHomeActivity :
}
}
private fun setScrollListener() {
binding.rvGoldItems.addOnScrollListener(
object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
updateColorsBasedOnPosition(
recyclerView = recyclerView,
activity = this@DigitalGoldHomeActivity,
headerView = binding.clHeaderView,
defaultColor = Color.WHITE,
statusBarColor = homeVM.getStatusBarColor()
)
}
}
)
}
private fun fetchDigitalHomePageDetails(
forceRefresh: Boolean = true,
setUpSipRefresh: Boolean = false
@@ -1813,8 +1836,9 @@ class DigitalGoldHomeActivity :
is GoldMinOfferSectionClickAction -> {
if (naviClickAction.actionData?.url == SHOW_OFFER_BOTTOMSHEET) {
val bundle = Bundle()
naviClickAction.offerSectionData?.content?.remainingAmount =
homeVM.getRemainingAmount().formatAmount()
naviClickAction.offerSectionData?.content?.offerTickets?.forEach { card ->
card.remainingAmount = homeVM.getRemainingAmount().formatAmount()
}
bundle.putParcelable(DATA, naviClickAction.offerSectionData)
GoldOfferBottomSheet.newInstance(bundle = bundle).apply {
safelyShowBottomSheet(this, GoldOfferBottomSheet.TAG)
@@ -1880,6 +1904,20 @@ class DigitalGoldHomeActivity :
)
)
}
if (
naviWidget is SipCardWidget &&
(naviWidget.widgetId == SETUP_SIP_WIDGET &&
(state && naviWidget.widgetId == widgetId || !state))
) {
val sipCardWidget = naviWidget.widgetData
sipCardWidget?.buttonLoaderState = ButtonLoaderState(state)
isScreenBlocked = state
naviAdapter.notifyItemChanged(
index,
WidgetChangedData(WIDGET_STATE_CHANGE, sipCardWidget?.buttonLoaderState)
)
}
if (naviWidget is ContainerWidget) {
val itemsOfContainerWidget = naviWidget.widgetData?.items
@@ -2009,6 +2047,17 @@ class DigitalGoldHomeActivity :
}
startTimer()
binding.rvGoldItems.layoutManager?.let { layoutManager ->
if (layoutManager is LinearLayoutManager) {
updateColorsBasedOnPosition(
recyclerView = binding.rvGoldItems,
activity = this@DigitalGoldHomeActivity,
headerView = binding.clHeaderView,
defaultColor = Color.WHITE,
statusBarColor = homeVM.getStatusBarColor()
)
}
}
}
private fun checkForLocationPermission(): Boolean {
@@ -2178,6 +2227,8 @@ class DigitalGoldHomeActivity :
super.onStop()
timer?.cancel()
timer = null
binding.clHeaderView.setBackgroundColor(Color.WHITE)
window?.statusBarColor = Color.WHITE
}
override fun onDestroy() {

View File

@@ -19,6 +19,7 @@ import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.analytics.utils.SCREEN_NAME
@@ -62,11 +63,13 @@ import com.navi.design.utils.parseColorSafe
import com.navi.gold.R
import com.navi.gold.databinding.ActivityDigitalGoldTransactionBinding
import com.navi.gold.util.CommonUtils
import com.navi.gold.util.CommonUtils.updateColorsBasedOnPosition
import com.navi.gold.util.Constants
import com.navi.gold.util.Constants.CSAT_POPUP_DELAY
import com.navi.gold.util.Constants.CSAT_POPUP_DELAY_TIME
import com.navi.gold.util.Constants.REDIRECTION_SOURCE
import com.navi.gold.util.Constants.SHOW_REWARD_GRATIFICATION
import com.navi.gold.util.Constants.TYPE
import com.navi.gold.util.GoldAnalytics
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_TRANSACTION_SCREEN
import com.navi.gold.util.GoldAnalytics.FEEDBACK
@@ -85,6 +88,7 @@ import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.response.CSATResponse
import com.navi.naviwidgets.models.response.CsatWidget
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import com.navi.naviwidgets.widgets.InfoWithTimerWidgetLayout.Companion.COLOR_WHITE
import com.navi.rr.scratchcard.ui.fragment.ScratchCardFragment
import com.navi.rr.scratchcard.vm.ScratchCardSharedVm
import dagger.hilt.android.AndroidEntryPoint
@@ -179,6 +183,17 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
viewModel.fetchDigitalGoldCSATResponse(DG_TRANSACTION, null, screenName = screenName)
startCsat(0)
}
binding.rvGoldItems.layoutManager?.let { layoutManager ->
if (layoutManager is LinearLayoutManager) {
updateColorsBasedOnPosition(
recyclerView = binding.rvGoldItems,
activity = this@DigitalGoldTransactionActivity,
headerView = binding.clHeaderView,
defaultColor = Color.WHITE,
statusBarColor = viewModel.getStatusBarColor()
)
}
}
}
override fun onPause() {
@@ -339,6 +354,7 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
private fun setPageContent(pageContent: WidgetResponse) {
processHeader(pageContent)
setScrollListener()
pageContent.contentWidget?.let { listOfWidgets -> naviAdapter.setData(listOfWidgets) }
}
@@ -361,6 +377,7 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
private fun processHeader(response: WidgetResponse?) {
response?.header?.let {
viewModel.setStatusBarColor(it.backgroundColor.parseColorSafe(COLOR_WHITE))
viewModel.prefetchData(it.actionData?.url, screenName)
it.title?.let { title ->
it.leftIconCode?.let { leftIconCode ->
@@ -380,6 +397,23 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
}
}
private fun setScrollListener() {
binding.rvGoldItems.addOnScrollListener(
object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
updateColorsBasedOnPosition(
recyclerView = recyclerView,
activity = this@DigitalGoldTransactionActivity,
headerView = binding.clHeaderView,
defaultColor = Color.WHITE,
statusBarColor = viewModel.getStatusBarColor()
)
}
}
)
}
private fun fetchData() {
fetchDigitalTransactionPageDetails()
viewModel.fetchDigitalGoldCSATResponse(DG_TRANSACTION, null, screenName = screenName)
@@ -487,6 +521,20 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
if (naviClickAction.actionData?.type == "DOWNLOAD_INVOICE") {
fetchDigitalGoldInvoiceDownloadUrl(naviClickAction.actionData?.title)
return
} else if (naviClickAction.actionData?.url == "back") {
onBackPressed()
return
}
val bundle = Bundle()
naviClickAction.actionData?.let {
bundle.putString(TYPE, it.type.orEmpty())
DeepLinkManager.getDeepLinkListener()
?.navigateTo(
this,
it.toCtaData(),
bundle = bundle,
finish = naviClickAction.isFinish
)
}
}
is ActionData -> {
@@ -571,6 +619,12 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
}
}
override fun onStop() {
super.onStop()
binding.clHeaderView.setBackgroundColor(Color.WHITE)
window?.statusBarColor = Color.WHITE
}
override fun onDestroy() {
super.onDestroy()
binding.unbind()

View File

@@ -55,7 +55,12 @@ fun OfferBottomSheet(
onDismiss = { onDismiss() },
modifier = Modifier.padding(bottom = 16.dp)
)
OfferCard(offerContentData = bottomSheetData?.content)
repeat(bottomSheetData?.content?.offerTickets?.size ?: 0) { index ->
OfferCard(offerContentData = bottomSheetData?.content?.offerTickets?.get(index))
if (index != bottomSheetData?.content?.offerTickets?.size?.minus(1)) {
Spacer(modifier = Modifier.height(16.dp))
}
}
BottomSheetFooter(footerData = bottomSheetData?.footer)
}
}

View File

@@ -42,6 +42,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.unit.dp
import com.navi.common.uitron.render.TicketWithDividerRenderer
import com.navi.design.R
import com.navi.naviwidgets.extensions.NaviImage
import com.navi.naviwidgets.extensions.NaviTextWidgetized
import com.navi.naviwidgets.models.OfferContentData
@@ -92,6 +93,26 @@ fun OfferCard(
) {
Spacer(modifier = Modifier.width(17.dp))
NaviTextWidgetized(textFieldData = offerContentData?.title)
Spacer(modifier = Modifier.width(3.dp))
NaviImage(
imageFieldData = offerContentData?.titleIcon,
modifier =
Modifier.width(
(offerContentData?.titleIcon?.iconWidth
?: R.integer.integer_16)
.dp
)
.height(
(offerContentData?.titleIcon?.iconHeight
?: R.integer.integer_16)
.dp
)
.align(Alignment.CenterVertically)
)
Spacer(modifier = Modifier.width(2.dp))
NaviTextWidgetized(
textFieldData = offerContentData?.titleSuffix,
)
}
Box(
@@ -112,13 +133,24 @@ fun OfferCard(
Spacer(modifier = Modifier.height(8.dp))
NaviTextWidgetized(textFieldData = offerContentData?.subTitle)
Spacer(modifier = Modifier.height(6.dp))
Row() {
NaviTextWidgetized(textFieldData = offerContentData?.additionalInfoPrefix)
offerContentData?.additionalInfoAmount?.text =
"${offerContentData?.remainingAmount} "
NaviTextWidgetized(textFieldData = offerContentData?.additionalInfoAmount)
NaviTextWidgetized(textFieldData = offerContentData?.additionalInfoSuffix)
if (
offerContentData?.additionalInfoAmount != null &&
(offerContentData.remainingAmount?.toDoubleOrNull() ?: 0.0) > 0.0
) {
Spacer(modifier = Modifier.height(6.dp))
Row() {
NaviTextWidgetized(
textFieldData = offerContentData.additionalInfoPrefix
)
offerContentData.additionalInfoAmount?.text =
"${offerContentData.remainingAmount} "
NaviTextWidgetized(
textFieldData = offerContentData.additionalInfoAmount
)
NaviTextWidgetized(
textFieldData = offerContentData.additionalInfoSuffix
)
}
}
Spacer(modifier = Modifier.height(12.dp))
}

View File

@@ -10,8 +10,11 @@ package com.navi.gold.util
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.deeplink.DeepLinkManager
import com.navi.base.model.ActionData
@@ -139,4 +142,28 @@ object CommonUtils {
TemporaryStorageHelper.SOFT_REF_CACHE.remove(NaviDigitalGoldDeeplinkNavigator.GOLD)
TemporaryStorageHelper.setIsDataModified(NaviDigitalGoldDeeplinkNavigator.GOLD, true)
}
fun updateColorsBasedOnPosition(
recyclerView: RecyclerView,
activity: Activity,
headerView: View?,
defaultColor: Int,
statusBarColor: Int
) {
val layoutManager = recyclerView.layoutManager as? LinearLayoutManager
val firstVisibleItemPosition =
layoutManager?.findFirstVisibleItemPosition() ?: RecyclerView.NO_POSITION
if (firstVisibleItemPosition == RecyclerView.NO_POSITION) {
return
}
val colorToSet = if (firstVisibleItemPosition == 0) statusBarColor else defaultColor
headerView?.let { updateStatusBarAndHeaderColor(activity, colorToSet, it) }
}
private fun updateStatusBarAndHeaderColor(activity: Activity, color: Int, headerView: View) {
activity.window?.let { it.statusBarColor = color }
headerView.setBackgroundColor(color)
}
}

View File

@@ -64,6 +64,7 @@ object Constants {
const val GOLD_INVESTMENT_PLAN_WIDGET = "GOLD_INVESTMENT_PLAN_WIDGET"
const val SIP_SETUP_SUCCESS_CARD = "SIP_SETUP_SUCCESS_CARD"
const val SIP_SETUP_IN_PROGRESS = "SIP_SETUP_IN_PROGRESS"
const val SETUP_SIP_WIDGET = "SETUP_SIP_WIDGET"
const val BUY_SUMMARY_BOTTOM_SHEET = "buy-summary-bottomsheet"
const val PAN_VERIFY_BOTTOM_SHEET = "pan_verify_bottom_sheet"
const val LOADER = "loader"

View File

@@ -7,6 +7,7 @@
package com.navi.gold.viewmodels
import android.graphics.Color
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
@@ -74,6 +75,7 @@ constructor(
private var actualSellAmount: Double = 0.0
private var remainingAmount: Double = 0.0
private var statusBarColor: Int = Color.WHITE
private val _buyBottomSheetData = SingleLiveEvent<WidgetResponse>()
val buyBottomSheetData: LiveData<WidgetResponse>
@@ -119,6 +121,12 @@ constructor(
fun getRemainingAmount() = remainingAmount
fun setStatusBarColor(color: Int) {
statusBarColor = color
}
fun getStatusBarColor() = statusBarColor
fun setUserEnteredGoldValue(userEnteredGoldValue: String) {
_goldValueState.value = userEnteredGoldValue
}

View File

@@ -7,6 +7,7 @@
package com.navi.gold.viewmodels
import android.graphics.Color
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
@@ -59,6 +60,7 @@ constructor(
get() = isCsatCoroutineScopeCancelled
private var isAutoClickConsumed: Boolean = false
private var statusBarColor: Int = Color.WHITE
private val _scratchCardResponse = SingleLiveEvent<GratificationStatus.Success>()
val scratchCardResponse: LiveData<GratificationStatus.Success>
@@ -210,4 +212,12 @@ constructor(
}
}
}
fun setStatusBarColor(color: Int) {
statusBarColor = color
}
fun getStatusBarColor(): Int {
return statusBarColor
}
}

View File

@@ -37,9 +37,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:shadowColor="@color/shadowColorTwo"
app:cardBackgroundColor="@color/white"
app:cardElevation="@dimen/dp_6"
app:cardElevation="@dimen/dp_0"
app:layout_constraintBottom_toTopOf="@id/rvGoldItems"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"

View File

@@ -24,7 +24,7 @@
android:clipToPadding="false"
android:shadowColor="@color/shadowColorTwo"
app:cardBackgroundColor="@color/white"
app:cardElevation="@dimen/dp_6"
app:cardElevation="@dimen/dp_0"
app:layout_constraintBottom_toTopOf="@id/rvGoldItems"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"