Revert "TP-41269 | Dg buy journey loader removal " (#8188)

This commit is contained in:
Saksham Mahajan
2023-10-09 18:00:37 +05:30
committed by GitHub
parent 15caa33d3b
commit e30defed42
33 changed files with 188 additions and 945 deletions

View File

@@ -14,13 +14,11 @@ import android.os.PersistableBundle
import android.view.MenuItem
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.TextView
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
@@ -46,7 +44,6 @@ import com.navi.base.utils.orFalse
import com.navi.base.utils.orZero
import com.navi.base.utils.toLongWithSafe
import com.navi.common.R
import com.navi.common.databinding.BaseActivityBinding
import com.navi.common.firebasedb.FirebaseDataHelper
import com.navi.common.firebasedb.FirebaseDataReceiveListener
import com.navi.common.listeners.ActivityFinishListener
@@ -90,11 +87,11 @@ import com.navi.common.utils.updateSessionId
import com.navi.common.viewmodel.BaseVM
import com.navi.common.viewmodel.FeedbackVM
import com.navi.naviwidgets.models.LottieFieldData
import java.lang.ref.WeakReference
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import timber.log.Timber
import java.lang.ref.WeakReference
abstract class BaseActivity :
AppCompatActivity(),
@@ -107,7 +104,6 @@ abstract class BaseActivity :
ProviderConfigListener,
InAppUpdateListener {
private lateinit var binding: BaseActivityBinding
private var toolbar: Toolbar? = null
private var toolbarHeading: TextView? = null
@@ -140,7 +136,6 @@ abstract class BaseActivity :
var eventTrackingScreenName: String? = null
protected val queryMap = HashMap<String, String>()
private var isBlockInteractability = false
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
@@ -149,36 +144,13 @@ abstract class BaseActivity :
}
override fun onCreate(savedInstanceState: Bundle?) {
binding = DataBindingUtil.setContentView(
this,
R.layout.base_activity
)
super.onCreate(savedInstanceState)
handleRedirection()
}
override fun setContentView(view: View?) {
unblockInteractability()
if (view?.parent != null) {
(view.parent as? ViewGroup)?.removeView(view)
}
binding.content.addView(view)
super.setContentView(binding.root)
layoutView = binding.root
}
fun unblockInteractability() {
isBlockInteractability = false
binding.overlayView.visibility = View.GONE
}
fun blockInteractability() {
isBlockInteractability = true
binding.overlayView.visibility = View.VISIBLE
}
fun isBlockInteractability(): Boolean {
return this.isBlockInteractability
super.setContentView(view)
layoutView = view
}
private fun handleRedirection() {

View File

@@ -24,7 +24,6 @@ import com.navi.base.utils.orTrue
import com.navi.common.R
import com.navi.common.databinding.LayoutWidgetsSupportedBottomsheetBinding
import com.navi.common.listeners.AppShareListener
import com.navi.common.model.common.WidgetResponse
import com.navi.common.ui.fragment.BaseBottomSheet
import com.navi.common.utils.CommonNaviAnalytics
import com.navi.common.utils.Constants.ALLOW_PERMISSIONS
@@ -38,22 +37,16 @@ import com.navi.common.utils.Constants.WHATSAPP_SHARE
import com.navi.common.utils.observeNonNull
import com.navi.common.utils.shareReferral
import com.navi.common.utils.toCtaData
import com.navi.common.viewmodel.WidgetSupportedBottomSheetSharedVM
import com.navi.naviwidgets.actions.ImplicitShareClickAction
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.ContainerWidget
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.PaymentWidget
import com.navi.naviwidgets.models.ShareData
import com.navi.naviwidgets.models.TextWithTimerWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.utils.APP_SHARE
import com.navi.naviwidgets.utils.STORE_BANK_UPI_ID
import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import com.navi.common.viewmodel.WidgetSupportedBottomSheetSharedVM
import com.navi.naviwidgets.actions.ImplicitShareClickAction
import com.navi.naviwidgets.utils.APP_SHARE
class WidgetsSupportedBottomSheet : BaseBottomSheet(), WidgetCallback {
@@ -138,9 +131,7 @@ class WidgetsSupportedBottomSheet : BaseBottomSheet(), WidgetCallback {
val hostActivity = activity
if (hostActivity is WidgetCallback) {
hostActivity.onClick(naviClickAction, widgetId)
if (arguments?.getBoolean(IS_DISMISSABLE_KEY) == true) {
safelyDismissDialog()
}
safelyDismissDialog()
}
}
}
@@ -197,7 +188,7 @@ class WidgetsSupportedBottomSheet : BaseBottomSheet(), WidgetCallback {
safelyDismissDialog()
activity?.onBackPressed()
return
} else if (naviClickAction.actionData?.url == OFFERS_INFO) {
} else if(naviClickAction.actionData?.url == OFFERS_INFO) {
safelyDismissDialog()
return
} else if (naviClickAction.actionData?.type == SELL_GOLD) {
@@ -229,44 +220,6 @@ class WidgetsSupportedBottomSheet : BaseBottomSheet(), WidgetCallback {
}
}
fun stopTimer() {
naviAdapter.list.forEachIndexed { index, naviWidget ->
if (naviWidget is ContainerWidget) {
val itemsOfContainerWidget = naviWidget.widgetData?.items
var textWithTimerWidget: TextWithTimerWidget? = null
itemsOfContainerWidget?.forEach { item ->
if (item is TextWithTimerWidget) {
textWithTimerWidget = item
textWithTimerWidget?.widgetData?.stopTimer = true
naviAdapter.notifyItemChanged(
index,
WidgetChangedData(WIDGET_STATE_CHANGE, textWithTimerWidget)
)
}
}
}
}
}
fun setButtonLoaderState(response: WidgetResponse?, state: Boolean) {
response?.contentWidget?.let { contentWidget ->
naviAdapter.list.forEachIndexed { index, item ->
if (item is PaymentWidget) {
var paymentWidget: PaymentWidget? = null
paymentWidget = item
paymentWidget?.widgetData?.buttonLoaderState = ButtonLoaderState(state)
naviAdapter.notifyItemChanged(
index,
WidgetChangedData(
WIDGET_STATE_CHANGE,
paymentWidget?.widgetData?.buttonLoaderState
)
)
}
}
}
}
override fun onCancel(dialog: DialogInterface) {
super.onCancel(dialog)
sharedVM.clearData()
@@ -278,12 +231,10 @@ class WidgetsSupportedBottomSheet : BaseBottomSheet(), WidgetCallback {
private const val IS_CANCELLABLE_KEY = "isCancellable"
private const val ALLOW_TOP_PADDING = "ALLOW_TOP_PADDING"
private const val BG_COLOR = "BG_COLOR"
private const val IS_DISMISSABLE_KEY = "IS_DISMISSABLE"
fun getInstance(
isCancellable: Boolean = true,
allowTopPadding: Boolean = true,
isDismissable: Boolean = true,
bgColor: Int = Color.WHITE
): WidgetsSupportedBottomSheet {
return WidgetsSupportedBottomSheet().apply {
@@ -291,7 +242,6 @@ class WidgetsSupportedBottomSheet : BaseBottomSheet(), WidgetCallback {
putBoolean(IS_CANCELLABLE_KEY, isCancellable)
putBoolean(ALLOW_TOP_PADDING, allowTopPadding)
putInt(BG_COLOR, bgColor)
putBoolean(IS_DISMISSABLE_KEY, isDismissable)
}
arguments = bundle
}

View File

@@ -19,15 +19,15 @@ import com.navi.base.utils.orZero
import com.navi.common.R
import com.navi.common.databinding.NewCommonBottomSheetBinding
import com.navi.common.listeners.NewBottomSheetListener
import com.navi.design.textview.NaviTextView
import com.navi.design.utils.CornerRadius
import com.navi.design.utils.dpToPx
import com.navi.design.textview.NaviTextView
import com.navi.design.utils.dpToPx
import com.navi.design.utils.dpToPxInInt
import com.navi.design.utils.getNaviDrawable
import com.navi.design.utils.isValidHexColor
import com.navi.design.utils.parseColorSafe
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.utils.setButtonLoaderState
class NewCommonBottomSheet : BaseBottomSheet() {
@@ -100,19 +100,12 @@ class NewCommonBottomSheet : BaseBottomSheet() {
data?.bottomSheetName?.let {
NaviTrackEvent.trackEvent(it)
}
if (isValidHexColor(data?.titleTextColor)) {
if(isValidHexColor(data?.titleTextColor)) {
titleTv.setTextColor(Color.parseColor(data?.titleTextColor))
}
primaryBtn.setOnClickListener {
listener?.buttonClick(data?.actionData)
if (arguments?.getBoolean(IS_BUTTON_LOADER_PRESENT) == true) {
data?.title?.let {
var text = it
setButtonLoaderState(binding.primaryBtn, binding.buttonLoader, true, text)
}
} else {
safelyDismissDialog()
}
safelyDismissDialog()
}
secondaryBtn.setOnClickListener {
listener?.buttonClick(data?.secondaryActionData)
@@ -155,16 +148,11 @@ class NewCommonBottomSheet : BaseBottomSheet() {
companion object {
const val TAG = "NEW_COMMON_BOTTOM_SHEET"
private const val DATA = "DATA"
private const val IS_BUTTON_LOADER_PRESENT = "IS_START_BUTTON_LOADER"
fun getInstance(
data: BottomSheetData?,
isButtonLoaderPresent: Boolean = false
) =
fun getInstance(data: BottomSheetData?) =
NewCommonBottomSheet()
.apply {
arguments = Bundle().apply {
this.putParcelable(DATA, data)
putBoolean(IS_BUTTON_LOADER_PRESENT, isButtonLoaderPresent)
isCancelable = data?.isCancelable == true
}
}

View File

@@ -1,22 +0,0 @@
package com.navi.common.ui.view
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.ScrollView
class ClickBlockingOverlayView : ScrollView {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
override fun onTouchEvent(event: MotionEvent?): Boolean {
return when (event?.action) {
MotionEvent.ACTION_DOWN,
MotionEvent.ACTION_MOVE,
MotionEvent.ACTION_UP -> true
else -> super.onTouchEvent(event)
}
}
}

View File

@@ -165,11 +165,7 @@ object Constants {
const val SELL_GOLD = "SELL_GOLD"
const val GOLD = "gold"
const val GOLD_TRANSACTION = "gold/transactions"
const val GOLD_BUY_URL = "gold/buy"
const val GOLD_TRANSACTION_HISTORY = "GOLD_TRANSACTION_HISTORY"
const val GOLD_PAYMENT = "GOLD_PAYMENT"
const val GOLD_KYC = "GOLD-KYC"
const val GOLD_BUY = "GOLD_BUY"
const val KEY = "key"
const val REWARDS_ANNOUNCEMENT_SCREEN = "rewards_announcement_screen"
const val DISMISS_TEXT = "dismiss"

View File

@@ -40,8 +40,8 @@ class SoftRefLruCache<K, V>(private val maxSize: Int = DEFAULT_CACHE_SIZE) {
maxConsumptions: Int = DEFAULT_MAX_CONSUMPTIONS
) {
//if these values are less than zero, there is no point in storing them
if (maxTtl <= 0 || maxConsumptions <= 0)
//if these values are less than zero, there is no point in storing them
if(maxTtl <= 0 || maxConsumptions <= 0)
return
// Create a CacheEntry with a SoftReference to the value
@@ -138,7 +138,7 @@ class SoftRefLruCache<K, V>(private val maxSize: Int = DEFAULT_CACHE_SIZE) {
private fun isValidEntry(key: K): Boolean {
val entry = cache[key]
return (entry != null)
&& (entry.consumptions < entry.maxConsumptions)
&& (entry.consumptions <= entry.maxConsumptions)
&& ((entry.entryTime + entry.maxTtl) >= System.currentTimeMillis())
&& (entry.value.get() != null)
}

View File

@@ -1,31 +0,0 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/parent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/content"
android:layout_width="@dimen/dp_0"
android:layout_height="@dimen/dp_0"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.navi.common.ui.view.ClickBlockingOverlayView
android:id="@+id/overlayView"
android:layout_width="@dimen/dp_0"
android:layout_height="@dimen/dp_0"
android:background="@color/shadow_color"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -73,45 +73,18 @@
android:visibility="gone"
tools:text="Continue" />
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dp_32">
<com.navi.design.textview.NaviTextView
android:id="@+id/primaryBtn"
style="@style/Small_Bold_White"
android:layout_width="match_parent"
android:layout_width="@dimen/dp_0"
android:layout_height="@dimen/dp_48"
android:layout_marginTop="@dimen/dp_32"
android:layout_weight="@integer/integer_1"
android:background="@drawable/rounded_purple_color_enabled_state"
android:background="@drawable/rounded_positive_button_bg"
android:gravity="center"
android:letterSpacing="0.02"
android:visibility="visible"
tools:text="Continue" />
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/button_loader"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_48"
android:layout_marginTop="@dimen/dp_32"
android:background="@drawable/rounded_purple_color_enabled_state"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/primaryBtn"
app:layout_constraintEnd_toEndOf="@id/primaryBtn"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="@id/primaryBtn"
app:layout_constraintTop_toTopOf="@id/primaryBtn"
app:layout_constraintVertical_bias="1.0"
app:lottie_autoPlay="false"
app:lottie_loop="true"
app:lottie_rawRes="@raw/cta_loader"
app:lottie_speed="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<com.navi.design.textview.NaviTextView
android:id="@+id/tertiaryBtn"
@@ -127,5 +100,4 @@
tools:text="Cancel" />
</LinearLayout>
</layout>

View File

@@ -1,9 +1,6 @@
package com.navi.common.utils
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Assert.*
import org.junit.Test
import java.lang.Thread.sleep
@@ -42,8 +39,10 @@ class SoftRefLruCacheTest {
val cache = SoftRefLruCache<String, Int>()
cache.add("key1", 1, maxConsumptions = 2)
assertEquals(cache.get("key1"), 1)
assertEquals(cache.get("key1"), 1)
cache.get("key1")
cache.get("key1")
cache.get("key1")
assertNull(cache.get("key1")) // Exceeds maxConsumptions
}

View File

@@ -12,7 +12,6 @@ import android.os.Bundle
import androidx.activity.viewModels
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import com.navi.base.model.ActionData
import com.navi.base.model.NaviClickAction
import com.navi.common.listeners.BackPressedListener
@@ -22,11 +21,11 @@ import com.navi.common.ui.activity.BaseActivity
import com.navi.common.ui.fragment.PaymentCheckFragment
import com.navi.common.utils.Constants.GOLD
import com.navi.common.utils.Constants.SUB_REDIRECT
import com.navi.common.utils.observeNonNull
import com.navi.gold.R
import com.navi.gold.databinding.ActivityDigitalGoldBuyBinding
import com.navi.gold.listeners.CommonPermissionRequestListener
import com.navi.gold.model.DigitalGoldPaymentResponse
import com.navi.gold.ui.CommonPermissionFragment
import com.navi.gold.util.Constants.AMOUNT_DATA
import com.navi.gold.util.Constants.TYPE
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_BUY_ACTIVITY
@@ -51,24 +50,10 @@ class DigitalGoldBuyActivity : BaseActivity(), FragmentInterchangeListener,
R.layout.activity_digital_gold_buy
)
setContentView(binding.root)
initObserver()
loadFragment(intent.getStringExtra(SUB_REDIRECT) ?: DigitalGoldBuyFragment.TAG)
}
private fun initObserver() {
lifecycleScope.launchWhenResumed {
sharedVM.isLoading.observeNonNull(this@DigitalGoldBuyActivity) { buttonLoaderState ->
if (buttonLoaderState) {
blockInteractability()
} else {
unblockInteractability()
}
}
}
}
override fun onBackPressed() {
if (isBlockInteractability()) return
var isBackPressedConsumed = false
@@ -85,7 +70,7 @@ class DigitalGoldBuyActivity : BaseActivity(), FragmentInterchangeListener,
override fun onClick(naviClickAction: NaviClickAction, widgetId: String?) {
val currFragment = supportFragmentManager.findFragmentById(R.id.flLoadFragment)
if (currFragment is WidgetCallback) {
if(currFragment is WidgetCallback){
currFragment.onClick(naviClickAction, widgetId)
}
}
@@ -127,7 +112,7 @@ class DigitalGoldBuyActivity : BaseActivity(), FragmentInterchangeListener,
override fun navigateToNextScreen(currentScreenTag: String, args: Bundle) {
when (currentScreenTag) {
when(currentScreenTag){
GOLD -> {
val targetIntent = Intent(this, DigitalGoldHomeActivity::class.java)

View File

@@ -45,20 +45,33 @@ import com.navi.common.ui.fragment.BaseFragment
import com.navi.common.ui.fragment.NewCommonBottomSheet
import com.navi.common.ui.fragment.PaymentCheckFragment
import com.navi.common.utils.ApiPollScheduler
import com.navi.common.utils.Constants
import com.navi.common.utils.Constants.APP
import com.navi.common.utils.Constants.GOLD
import com.navi.common.utils.Constants.GOLD_BUY
import com.navi.common.utils.Constants.REFRESH
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.utils.log
import com.navi.common.utils.observeNonNull
import com.navi.common.utils.toCtaData
import com.navi.common.viewmodel.PaymentCheckViewModel
import com.navi.common.viewmodel.WidgetFullScreenDialogSharedVM
import com.navi.common.viewmodel.PaymentCheckViewModel
import com.navi.common.viewmodel.WidgetSupportedBottomSheetSharedVM
import com.navi.gold.R
import com.navi.gold.databinding.FragmentDigitalGoldBuyBinding
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.actions.PaymentWidgetClickAction
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.models.ContainerWidget
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.TextWithTimerWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import com.navi.payment.paymenthandler.model.PaymentRequest
import com.navi.payment.paymenthandler.model.PaymentStatusData
import com.navi.payment.razorpay.RazorpayHelper
import com.navi.payment.utils.PaymentAnalytics
import com.navi.gold.model.DigitalGoldActionCheckResponse
import com.navi.gold.model.DigitalGoldPollingResponse
import com.navi.gold.model.GoldSellOrderResponse
@@ -68,9 +81,7 @@ import com.navi.gold.util.Constants.AMOUNT_DATA
import com.navi.gold.util.Constants.APP_ACTION_OBJECTIVE_REWARDS_CAMPAIGN_ONBOARD
import com.navi.gold.util.Constants.BUY_GOLD
import com.navi.gold.util.Constants.COMMON_BOTTOM_SHEET_ID
import com.navi.gold.util.Constants.GOlD_KYC_BUY
import com.navi.gold.util.Constants.SHOW_WIDGET_BOTTOM_SHEET
import com.navi.gold.util.Constants.TTL_SOFT_REF_CACHE_API_EXPIRY_TIME
import com.navi.gold.util.GoldAnalytics
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_2X_REWARD_BOTTOM_SHEET_INIT
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_BUY_SCREEN
@@ -79,23 +90,6 @@ import com.navi.gold.util.toActionCheckResponse
import com.navi.gold.viewmodels.DigitalGoldBuySharedVM
import com.navi.gold.viewmodels.DigitalGoldBuyVM
import com.navi.gold.viewmodels.DigitalGoldCommonVM
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.actions.PaymentWidgetClickAction
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.ContainerWidget
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.PaymentWidget
import com.navi.naviwidgets.models.TextWithTimerWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import com.navi.payment.paymenthandler.model.PaymentRequest
import com.navi.payment.paymenthandler.model.PaymentStatusData
import com.navi.payment.razorpay.RazorpayHelper
import com.navi.payment.utils.PaymentAnalytics
import com.razorpay.PaymentData
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope
@@ -114,10 +108,8 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
private val paymentCheckViewModel by activityViewModels<PaymentCheckViewModel>()
private val fullScreenDialogSharedVM by activityViewModels<WidgetFullScreenDialogSharedVM>()
private val bottomSheetSharedVM by activityViewModels<WidgetSupportedBottomSheetSharedVM>()
private var isRefreshPressed = false
private var buyResponse: WidgetResponse? = null
private lateinit var commonBottomSheet: NewCommonBottomSheet
private var digitalGoldActionCheckResponse = DigitalGoldActionCheckResponse()
private val naviAdapter = NaviAdapter(
widgetCallback = this,
factory = ViewHolderFactoryImpl()
@@ -131,7 +123,6 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
private var apiPollScheduler: ApiPollScheduler? = null
private var firebaseDataHelper: FirebaseDataHelper? = null
private var errorTag: String? = null
private var isFetchedFromCache = false
private val onPollingEnd = {
handleTimeOutError(errorTag.orEmpty())
}
@@ -185,15 +176,7 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
private fun initObserver() {
lifecycleScope.launchWhenResumed {
viewModel.digitalGoldBuyWidgets.observeNonNull(this@DigitalGoldBuyFragment) { widgetResponse ->
sharedVM.setButtonLoaderState(false)
if (!isRefreshPressed && !isFetchedFromCache) {
stopShimmer()
}
if (isRefreshPressed) {
commonBottomSheet.safelyDismissDialog()
isRefreshPressed = false
}
buyResponse = widgetResponse
stopShimmer()
processHeader(widgetResponse)
commonVM.updateBackPressObjectiveAction(widgetResponse.header?.backPressObjective)
widgetResponse.contentWidget?.let { listOfWidgets ->
@@ -228,7 +211,6 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
)
}
viewModel.postPaymentStatus.observeNonNull(this@DigitalGoldBuyFragment) {
setButtonLoader(buyResponse, false)
viewModel.postPaymentData(it)
}
viewModel.postPaymentResponse.observeNonNull(this@DigitalGoldBuyFragment) {
@@ -240,21 +222,10 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
)
}
viewModel.digitalGoldPollingUIData.observeNonNull(this@DigitalGoldBuyFragment) {
digitalGoldActionCheckResponse = it
fetchDigitalGoldTransactionHistoryPage()
}
viewModel.digitalGoldTransactionWidgets.observeNonNull(this@DigitalGoldBuyFragment) { widgetResponse ->
TemporaryStorageHelper.SOFT_REF_CACHE.add(
key = Constants.GOLD_TRANSACTION_HISTORY,
value = widgetResponse as Any,
maxTtl = TTL_SOFT_REF_CACHE_API_EXPIRY_TIME, //Hardcoding it to 40 seconds as it is highly unlikely user will be on the screen when payment will get failed
maxConsumptions = 1
)
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
navigateToNextScreen(digitalGoldActionCheckResponse)
navigateToNextScreen(it)
}
sharedVM.paymentResponse.observeNonNull(this@DigitalGoldBuyFragment) {
pgRepaymentStatus(it.description, it.data, it.code)
@@ -284,16 +255,6 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
}
}
private fun fetchDigitalGoldTransactionHistoryPage() {
val params =
activity?.intent?.getStringExtra(com.navi.gold.util.Constants.SHOW_REWARD_GRATIFICATION)
?.let { showRewardGratification ->
mapOf(com.navi.gold.util.Constants.SHOW_REWARD_GRATIFICATION to showRewardGratification)
}
?: emptyMap()
viewModel.fetchDigitalGoldTransactionDetails(params)
}
private fun navigateToNextScreen(paymentCheckResponse: DigitalGoldActionCheckResponse) {
TemporaryStorageHelper.SOFT_REF_CACHE.remove(GOLD)
TemporaryStorageHelper.setIsDataModified(GOLD, true)
@@ -325,17 +286,13 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
}
}
private fun showCommonBottomSheet(
bottomSheetData: BottomSheetData,
isButtonLoaderPresent: Boolean = false
) {
private fun showCommonBottomSheet(bottomSheetData: BottomSheetData) {
try {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
commonBottomSheet = NewCommonBottomSheet.getInstance(
bottomSheetData,
isButtonLoaderPresent
bottomSheetData
)
commonBottomSheet.setListener(this@DigitalGoldBuyFragment)
safelyShowBottomSheet(commonBottomSheet, NewCommonBottomSheet.TAG)
@@ -349,7 +306,7 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
when (splitDeepLink?.getOrNull(1)) {
COMMON_BOTTOM_SHEET_ID -> {
action.bottomSheetData?.let {
showCommonBottomSheet(it, true)
showCommonBottomSheet(it)
}
}
}
@@ -373,8 +330,8 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
toShowBottomSheet(naviClickAction.actionData)
return
} else if (naviClickAction.actionData?.action == REFRESH) {
isRefreshPressed = true
sharedVM.setButtonLoaderState(true)
showShimmer()
hideLoader()
fetchDigitalBuyPageDetails()
return
}
@@ -392,8 +349,6 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
naviClickAction.actionData,
screenName
)
setButtonLoader(buyResponse, true)
sharedVM.setButtonLoaderState(true)
if (toOpenBottomSheet(naviClickAction.actionData.url)) {
toShowBottomSheet(naviClickAction.actionData)
return
@@ -437,18 +392,10 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
}
private fun fetchDigitalBuyPageDetails() {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull() && !isRefreshPressed) {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
if (TemporaryStorageHelper.SOFT_REF_CACHE.contains(GOLD_BUY) || TemporaryStorageHelper.SOFT_REF_CACHE.contains(
GOlD_KYC_BUY
)
) {
isFetchedFromCache = true
}
if (!isRefreshPressed && !isFetchedFromCache) {
showShimmer()
}
showShimmer()
arguments?.let { viewModel.fetchDigitalGoldBuyDetails(it.getDouble(AMOUNT_DATA, 0.0)) }
}
@@ -456,6 +403,7 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
viewModel.digitalGoldBuyWidgets.value?.extraData?.let {
it.totalAmount?.let { it1 ->
it.exchangeRateId?.let { it2 ->
showLoader()
viewModel.fetchBuyOrderResponse(
amount = it1,
exchangeRateId = it2,
@@ -474,6 +422,7 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
paymentStatusPolling = false
)
} else {
hideLoader()
goldSellOrderResponse?.bottomSheetData?.let { showCommonBottomSheet(it) }
goldSellOrderResponse?.widgetisedBottomSheetData?.let { widgetBottomSheetData ->
@@ -490,31 +439,6 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
}
private fun setButtonLoader(response: WidgetResponse?, state: Boolean) {
response?.footerWidget?.let { footerWidget ->
naviFooterAdapter.list.forEachIndexed { index, naviWidget ->
if (naviWidget is ContainerWidget) {
val itemsOfContainerWidget = naviWidget.widgetData?.items
var paymentWidget: PaymentWidget? = null
itemsOfContainerWidget?.forEach { item ->
if (item is PaymentWidget) {
paymentWidget = item
paymentWidget?.widgetData?.buttonLoaderState = ButtonLoaderState(state)
naviFooterAdapter.notifyItemChanged(
index,
WidgetChangedData(
WIDGET_STATE_CHANGE,
paymentWidget?.widgetData?.buttonLoaderState
)
)
}
}
}
}
}
}
private fun stopTimer() {
naviFooterAdapter.list.forEachIndexed { index, naviBaseAdapterModel ->
if (naviBaseAdapterModel is ContainerWidget) {
@@ -603,7 +527,7 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
) {
deInitializeFirebaseListener()
apiPollScheduler?.stopApiPoll()
sharedVM.setButtonLoaderState(false)
hideLoader()
if (sdkCredPollingData) {
startRazorpaySdk(digitalGoldPollingResponse?.paymentRequest)
} else {
@@ -703,7 +627,8 @@ class DigitalGoldBuyFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
} else if (it.action.isNotNullAndNotEmpty()) {
when (it.action) {
REFRESH -> {
isRefreshPressed = true
showShimmer()
hideLoader()
fetchDigitalBuyPageDetails()
}
}

View File

@@ -66,9 +66,6 @@ import com.navi.common.ui.fragment.PaymentCheckFragment
import com.navi.common.utils.ApiPollScheduler
import com.navi.common.utils.Constants.APP
import com.navi.common.utils.Constants.DISPLAY_MESSAGE
import com.navi.common.utils.Constants.GOLD_BUY
import com.navi.common.utils.Constants.GOLD_KYC
import com.navi.common.utils.Constants.GOLD_TRANSACTION_HISTORY
import com.navi.common.utils.Constants.IMAGE_URL
import com.navi.common.utils.Constants.SHAREABLE_LINK
import com.navi.common.utils.Constants.WHATSAPP_SHARE
@@ -97,11 +94,8 @@ import com.navi.gold.util.Constants.APP_ACTION_OBJECTIVE_REWARDS_CAMPAIGN_ONBOAR
import com.navi.gold.util.Constants.BUY_GOLD
import com.navi.gold.util.Constants.BUY_GOLD_BOTTOM_SHEET
import com.navi.gold.util.Constants.COMMON_BOTTOM_SHEET_ID
import com.navi.gold.util.Constants.GOLD_BUY_SUMMARY_URL
import com.navi.gold.util.Constants.GOLD_KYC_URL
import com.navi.gold.util.Constants.NEXT_CTA
import com.navi.gold.util.Constants.SHOW_WIDGET_BOTTOM_SHEET
import com.navi.gold.util.Constants.TTL_SOFT_REF_CACHE_API_EXPIRY_TIME
import com.navi.gold.util.Constants.TYPE
import com.navi.gold.util.GoldAnalytics
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_2X_REWARD_BOTTOM_SHEET_INIT
@@ -125,14 +119,11 @@ import com.navi.naviwidgets.actions.PaymentWidgetClickAction
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.ContainerWidget
import com.navi.naviwidgets.models.GoldConversionWidget
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.ShareData
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.utils.BUTTON_LOADER
import com.navi.naviwidgets.utils.PAYMENT_PAGE
import com.navi.naviwidgets.utils.STORE_DIGITAL_GOLD_AMOUNT
import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
@@ -155,6 +146,7 @@ import java.util.TimerTask
@AndroidEntryPoint
class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetListener,
PaymentResultWithDataListener {
private lateinit var binding: ActivityDigitalGoldHomeBinding
private val eventTracker = GoldAnalytics
private val widgetNaviAnalyticsEventTracker = GoldAnalytics
@@ -165,13 +157,8 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
private val homeVM by lazy { ViewModelProvider(this)[DigitalGoldHomeVM::class.java] }
private val commonVM by lazy { ViewModelProvider(this)[DigitalGoldCommonVM::class.java] }
private val buyVM by lazy { ViewModelProvider(this)[DigitalGoldBuyVM::class.java] }
private var widgetBottomSheet: WidgetsSupportedBottomSheet? = null
private val transactionViewModel by lazy { ViewModelProvider(this)[DigitalGoldTransactionVM::class.java] }
private var homeResponse: WidgetResponse? = null
private var isGoldPriceExpiredReferesh: Boolean? = false
private var isGoldPriceBottomSheetClicked: Boolean = false
private var bottomSheetResponse: WidgetResponse? = null
private var digitalGoldActionCheckResponse = DigitalGoldActionCheckResponse()
private val naviAdapter = NaviAdapter(
widgetCallback = this,
factory = ViewHolderFactoryImpl(),
@@ -179,14 +166,13 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
)
private lateinit var commonBottomSheet: NewCommonBottomSheet
private var timer: Timer? = null
private var cameFromBottomSheet = false
private var provider: Any? = null
private var firebaseDataReceiveListener: FirebaseDataReceiveListener? = null
private var apiPollScheduler: ApiPollScheduler? = null
private var firebaseDataHelper: FirebaseDataHelper? = null
private var errorTag: String? = null
private var ctaData = CtaData()
private var isPaymentExpired = false
private val onPollingEnd = {
handleTimeOutError(errorTag.orEmpty())
}
@@ -279,15 +265,6 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
STORE_DIGITAL_GOLD_AMOUNT -> {
homeVM.setActualSellAmount(value.toString().toDouble())
}
BUTTON_LOADER -> {
blockInteractability()
}
BUY_GOLD -> {
blockInteractability()
}
PAYMENT_PAGE -> {
unblockInteractability()
}
}
}
@@ -299,13 +276,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
private fun initObserver() {
lifecycleScope.launchWhenResumed {
homeVM.digitalGoldHomeWidgets.observeNonNull(this@DigitalGoldHomeActivity) { widgetResponse ->
unblockInteractability()
if (isGoldPriceExpiredReferesh == false) {
stopShimmer()
} else {
commonBottomSheet.dismiss()
}
homeResponse = widgetResponse
stopShimmer()
processHeader(widgetResponse)
commonVM.updateBackPressObjectiveAction(widgetResponse.header?.backPressObjective)
widgetResponse.contentWidget?.let { listOfWidgets ->
@@ -322,23 +293,14 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
hideKeyBoard()
}
homeVM.panVerifyCta.observeNonNull(this@DigitalGoldHomeActivity) { goldKycCheckResponse ->
hideLoader()
goldKycCheckResponse.bottomSheetData?.let { showCommonBottomSheet(it) }
goldKycCheckResponse.actionData?.let {
if (it.url == GOLD_KYC_URL) {
ctaData = it.toCtaData()
fetchDigitalGoldKycScreen()
} else if (it.url == GOLD_BUY_SUMMARY_URL) {
ctaData = it.toCtaData()
fetchDigitalGoldBuyScreen()
} else {
setButtonLoaderState(homeResponse, false)
DeepLinkManager.getDeepLinkListener()?.navigateTo(
this@DigitalGoldHomeActivity,
it.toCtaData(),
finish = false
)
}
DeepLinkManager.getDeepLinkListener()?.navigateTo(
this@DigitalGoldHomeActivity,
it.toCtaData(),
finish = false
)
}
}
transactionViewModel.invoiceDownloadData.observeNonNull(this@DigitalGoldHomeActivity) { invoiceDownloadData ->
@@ -346,10 +308,8 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
}
homeVM.buyBottomSheetData.observeNonNull(this@DigitalGoldHomeActivity) { widgetResponse ->
bottomSheetResponse = widgetResponse
if (isPaymentExpired) {
commonBottomSheet.dismiss()
}
hideLoader()
widgetResponse.extraData?.launchBottomSheetData?.let { launchBottomSheetData ->
widgetNaviAnalyticsEventTracker.onWidgetViewedEvent(launchBottomSheetData.bottomSheetInitEvent)
@@ -365,17 +325,16 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
DIGITAL_GOLD_BUY_SUMMARY_BOTTOM_SHEET_INIT,
mutableMapOf()
)
showWidgetBottomSheet(
widgetList = widgetResponse.contentWidget,
allowTopPadding = false,
bgColor = Color.TRANSPARENT
)
}
setButtonLoaderState(homeResponse, false)
}
buyVM.goldBuyOrderResponse.observeNonNull(this@DigitalGoldHomeActivity) { goldBuyOrderResponse ->
isGoldPriceBottomSheetClicked = true
handleBuyOrderResponse(goldBuyOrderResponse)
}
@@ -390,10 +349,6 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
)
}
buyVM.postPaymentStatus.observeNonNull(this@DigitalGoldHomeActivity) {
if (isGoldPriceBottomSheetClicked) {
widgetBottomSheet?.safelyDismissDialog()
isGoldPriceBottomSheetClicked = false
}
buyVM.postPaymentData(it)
}
buyVM.postPaymentResponse.observeNonNull(this@DigitalGoldHomeActivity) {
@@ -405,56 +360,20 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
)
}
buyVM.digitalGoldPollingUIData.observeNonNull(this@DigitalGoldHomeActivity) {
digitalGoldActionCheckResponse = it
fetchDigitalGoldTransactionHistoryPage()
}
homeVM.digitalGoldTransactionWidgets.observeNonNull(this@DigitalGoldHomeActivity) {
TemporaryStorageHelper.SOFT_REF_CACHE.add(
key = GOLD_TRANSACTION_HISTORY,
value = it as Any,
maxTtl = TTL_SOFT_REF_CACHE_API_EXPIRY_TIME, //Currently adding TTL to 40 seconds as it is highly unlikely user will wait for 40 seconds to press go to next page if payment get failed
maxConsumptions = 1
)
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
navigateToPaymentCheckScreen(digitalGoldActionCheckResponse)
navigateToPaymentCheckScreen(it)
}
buySharedVM.paymentResponse.observeNonNull(this@DigitalGoldHomeActivity) {
pgRepaymentStatus(it.description, it.data, it.code)
}
homeVM.digitalGoldKycWidgets.observeNonNull(this@DigitalGoldHomeActivity) {
TemporaryStorageHelper.SOFT_REF_CACHE.add(
key = GOLD_KYC,
value = it as Any,
maxTtl = TTL_SOFT_REF_CACHE_API_EXPIRY_TIME,
maxConsumptions = 1
)
DeepLinkManager.getDeepLinkListener()?.navigateTo(
this@DigitalGoldHomeActivity,
ctaData,
finish = false
)
}
homeVM.digitalGoldBuyWidgets.observeNonNull(this@DigitalGoldHomeActivity) {
TemporaryStorageHelper.SOFT_REF_CACHE.add(
key = GOLD_BUY,
value = it as Any,
maxTtl = TTL_SOFT_REF_CACHE_API_EXPIRY_TIME,
maxConsumptions = 1
)
DeepLinkManager.getDeepLinkListener()?.navigateTo(
this@DigitalGoldHomeActivity,
ctaData,
finish = false
)
}
commonVM.actionObjectiveData.observeNonNull(this@DigitalGoldHomeActivity) { objectiveResponse ->
hideLoader()
objectiveResponse.response?.let { response ->
response.widgetisedBottomSheetData?.let { widgetList ->
objectiveResponse.request?.id?.let { objectiveId ->
if (objectiveId == APP_ACTION_OBJECTIVE_REWARDS_CAMPAIGN_ONBOARD) {
GoldAnalytics.sendEventsToClickStream(
@@ -474,27 +393,6 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
}
}
private fun fetchDigitalGoldTransactionHistoryPage() {
val params = intent.getStringExtra(com.navi.gold.util.Constants.SHOW_REWARD_GRATIFICATION)
?.let { showRewardGratification ->
mapOf(com.navi.gold.util.Constants.SHOW_REWARD_GRATIFICATION to showRewardGratification)
}
?: emptyMap()
homeVM.fetchDigitalGoldTransactionDetails(params)
}
private fun fetchDigitalGoldBuyScreen() {
homeVM.fetchDigitalGoldBuyDetails(homeVM.getActualSellAmount())
}
private fun fetchDigitalGoldKycScreen() {
homeVM.fetchDigitalGoldKycDetails(
GoldKycPageRequest(
amount = homeVM.getActualSellAmount()
)
)
}
private fun navigateToPaymentCheckScreen(paymentCheckResponse: DigitalGoldActionCheckResponse) {
TemporaryStorageHelper.SOFT_REF_CACHE.remove(GOLD)
TemporaryStorageHelper.setIsDataModified(GOLD, true)
@@ -554,6 +452,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
paymentStatusPolling = false
)
} else {
hideLoader()
goldSellOrderResponse?.bottomSheetData?.let { showCommonBottomSheet(it) }
}
}
@@ -651,6 +550,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
) {
deInitializeFirebaseListener()
apiPollScheduler?.stopApiPoll()
hideLoader()
if (sdkCredPollingData) {
startRazorpaySdk(digitalGoldPollingResponse?.paymentRequest)
} else {
@@ -716,27 +616,21 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
isCancellable: Boolean = true
) {
bottomSheetSharedVM.setBottomSheetData(NaviWidgetClick(listOfWidget = widgetList))
widgetBottomSheet = WidgetsSupportedBottomSheet.getInstance(
val widgetBottomSheet = WidgetsSupportedBottomSheet.getInstance(
allowTopPadding = allowTopPadding,
bgColor = bgColor,
isCancellable = isCancellable,
isDismissable = false
isCancellable = isCancellable
)
safelyShowBottomSheet(widgetBottomSheet!!, WidgetsSupportedBottomSheet.TAG)
unblockInteractability()
safelyShowBottomSheet(widgetBottomSheet, WidgetsSupportedBottomSheet.TAG)
}
private fun showCommonBottomSheet(
bottomSheetData: BottomSheetData,
isButtonLoaderPresent: Boolean = false
) {
private fun showCommonBottomSheet(bottomSheetData: BottomSheetData) {
try {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
commonBottomSheet = NewCommonBottomSheet.getInstance(
bottomSheetData,
isButtonLoaderPresent
bottomSheetData
)
commonBottomSheet.setListener(this@DigitalGoldHomeActivity)
safelyShowBottomSheet(commonBottomSheet, NewCommonBottomSheet.TAG)
@@ -818,10 +712,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
private fun fetchDigitalHomePageDetails(forceRefresh: Boolean = true) {
timer?.cancel()
timer = null
if (isGoldPriceExpiredReferesh == false) {
showShimmer()
}
showShimmer()
val params = mutableMapOf<String, String>()
@@ -878,11 +769,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
override val moduleName: ModuleNameV2 = ModuleNameV2.COMMON
override fun buttonClick(actionData: ActionData?) {
if (actionData?.action != BUY_GOLD_BOTTOM_SHEET) {
commonBottomSheet.dismiss()
} else {
isPaymentExpired = true
}
commonBottomSheet?.dismiss()
actionData?.let {
widgetNaviAnalyticsEventTracker.onWidgetClickEvent(actionData, screenName)
@@ -900,7 +787,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
} else if (it.action.isNotNullAndNotEmpty()) {
when (it.action) {
com.navi.common.utils.Constants.REFRESH -> {
isGoldPriceExpiredReferesh = true
hideLoader()
fetchDigitalHomePageDetails()
}
@@ -963,6 +850,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
val bundle = Bundle()
bundle.putString(AMOUNT_DATA, homeVM.getActualSellAmount().toString())
if (naviClickAction.actionData?.url.equals(NEXT_CTA)) {
showLoader()
homeVM.fetchPanVerifyCta(
GoldKycPageRequest(
type = naviClickAction.actionData?.type,
@@ -971,6 +859,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
)
return
} else if (naviClickAction.actionData?.url.equals(BUY_GOLD_BOTTOM_SHEET, true)) {
val amount = naviClickAction.actionData?.parameters?.firstOrNull() {
it.key.equals(
AMOUNT_DATA
@@ -983,8 +872,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
hideLoader()
fetchDigitalHomePageDetails()
} else if (toOpenBottomSheet(naviClickAction.actionData?.url)) {
isGoldPriceExpiredReferesh = true
toShowBottomSheet(naviClickAction.actionData, true)
toShowBottomSheet(naviClickAction.actionData)
return
}
@@ -1059,8 +947,6 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
}
is PaymentWidgetClickAction -> {
setButtonLoaderState(bottomSheetResponse, true)
widgetBottomSheet?.stopTimer()
widgetNaviAnalyticsEventTracker.onWidgetClickEvent(
naviClickAction.actionData,
screenName
@@ -1069,8 +955,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
toShowBottomSheet(naviClickAction.actionData)
return
} else if (naviClickAction.actionData.url.equals(BUY_GOLD)) {
widgetBottomSheet?.isCancelable = false
blockInteractability()
fetchBuyOrderResponse()
return
}
@@ -1086,6 +971,7 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
}
private fun fetchGoldBuyBottomSheet(amount: Double? = null) {
showLoader()
homeVM.fetchGoldBuyBottomSheetData(
AmountDataRequest(
amount = amount ?: homeVM.getActualSellAmount()
@@ -1093,44 +979,11 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
)
}
private fun setButtonLoaderState(response: WidgetResponse?, state: Boolean) {
if (response == bottomSheetResponse) {
widgetBottomSheet?.setButtonLoaderState(response, state)
} else {
response?.contentWidget?.let { contentWidget ->
naviAdapter.list.forEachIndexed { index, naviWidget ->
if (naviWidget is ContainerWidget) {
val itemsOfContainerWidget = naviWidget.widgetData?.items
var goldContainerWidget: GoldConversionWidget? = null
itemsOfContainerWidget?.forEach { item ->
if (item is GoldConversionWidget) {
goldContainerWidget = item
goldContainerWidget?.widgetData?.buttonLoaderState =
ButtonLoaderState(state)
naviAdapter.notifyItemChanged(
index,
WidgetChangedData(
WIDGET_STATE_CHANGE,
goldContainerWidget?.widgetData?.buttonLoaderState
)
)
}
}
}
}
}
}
if (state) {
blockInteractability()
} else {
unblockInteractability()
}
}
private fun fetchBuyOrderResponse() {
homeVM.buyBottomSheetData.value?.extraData?.let {
it.totalAmount?.let { totalAmount ->
it.exchangeRateId?.let { exchangeRateId ->
showLoader()
buyVM.fetchBuyOrderResponse(
amount = totalAmount,
exchangeRateId = exchangeRateId,
@@ -1143,7 +996,6 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
override fun onResume() {
super.onResume()
setButtonLoaderState(homeResponse, false)
startTimer()
}
@@ -1160,19 +1012,18 @@ class DigitalGoldHomeActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
}
}
private fun toShowBottomSheet(action: ActionData?, isButtonLoaderPresent: Boolean = false) {
private fun toShowBottomSheet(action: ActionData?) {
val splitDeepLink = action?.url?.split("/")
when (splitDeepLink?.getOrNull(1)) {
COMMON_BOTTOM_SHEET_ID -> {
action.bottomSheetData?.let {
showCommonBottomSheet(it, isButtonLoaderPresent)
showCommonBottomSheet(it)
}
}
}
}
override fun onBackPressed() {
if (isBlockInteractability()) return
if (commonVM.shouldPerformBackPressObjective()) {
showLoader()

View File

@@ -26,8 +26,6 @@ import com.navi.base.model.ActionData
import com.navi.base.model.BottomSheetData
import com.navi.base.model.NaviClickAction
import com.navi.base.model.NaviWidgetClickWithActionData
import com.navi.base.utils.PAN_VERIFY
import com.navi.base.utils.PAN_VERIFY_POLLING
import com.navi.base.utils.isNotNull
import com.navi.base.utils.isNotNullAndNotEmpty
import com.navi.base.utils.orTrue
@@ -39,9 +37,6 @@ import com.navi.common.ui.bottomsheet.WidgetsSupportedBottomSheet
import com.navi.common.ui.fragment.BaseFragment
import com.navi.common.ui.fragment.NewCommonBottomSheet
import com.navi.common.ui.fragment.PaymentCheckFragment
import com.navi.common.utils.Constants.GOLD
import com.navi.common.utils.Constants.GOLD_BUY_URL
import com.navi.common.utils.Constants.GOLD_KYC
import com.navi.common.utils.Constants.REFRESH
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.utils.observeNonNull
@@ -51,27 +46,6 @@ import com.navi.common.viewmodel.WidgetFullScreenDialogSharedVM
import com.navi.common.viewmodel.WidgetSupportedBottomSheetSharedVM
import com.navi.gold.R
import com.navi.gold.databinding.FragmentDigitalGoldKycBinding
import com.navi.gold.model.DigitalGoldActionCheckResponse
import com.navi.gold.model.GoldKycCheckResponse
import com.navi.gold.model.GoldKycPageRequest
import com.navi.gold.model.GoldKycVerifyRequest
import com.navi.gold.toOpenBottomSheet
import com.navi.gold.util.CommonUtils
import com.navi.gold.util.Constants.AMOUNT_DATA
import com.navi.gold.util.Constants.APP_ACTION_OBJECTIVE_REWARDS_CAMPAIGN_ONBOARD
import com.navi.gold.util.Constants.COMMON_BOTTOM_SHEET_ID
import com.navi.gold.util.Constants.GOlD_KYC_BUY
import com.navi.gold.util.Constants.SHOW_WIDGET_BOTTOM_SHEET
import com.navi.gold.util.Constants.TTL_SOFT_REF_CACHE_API_EXPIRY_TIME
import com.navi.gold.util.Constants.TYPE
import com.navi.gold.util.GoldAnalytics
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_2X_REWARD_BOTTOM_SHEET_INIT
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_BASIC_DETAIS_PAGE
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_FOMO_NUDGE_BOTTOM_SHEET_INIT
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_KYC_SCREEN
import com.navi.gold.util.toActionCheckResponse
import com.navi.gold.viewmodels.DigitalGoldCommonVM
import com.navi.gold.viewmodels.DigitalGoldKycVM
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.base.BaseInputWidget
@@ -88,8 +62,30 @@ import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import com.navi.naviwidgets.widgets.labeleddateinput.LabeledDateInputWidgetModel
import com.navi.naviwidgets.widgets.labledtextinput.LabeledTextInputWidgetModelV2
import com.navi.gold.model.DigitalGoldActionCheckResponse
import com.navi.gold.model.GoldKycCheckResponse
import com.navi.gold.model.GoldKycPageRequest
import com.navi.gold.model.GoldKycVerifyRequest
import com.navi.gold.toOpenBottomSheet
import com.navi.gold.util.CommonUtils
import com.navi.gold.util.Constants.AMOUNT_DATA
import com.navi.gold.util.Constants.APP_ACTION_OBJECTIVE_REWARDS_CAMPAIGN_ONBOARD
import com.navi.gold.util.Constants.COMMON_BOTTOM_SHEET_ID
import com.navi.gold.util.Constants.SHOW_WIDGET_BOTTOM_SHEET
import com.navi.gold.util.Constants.TYPE
import com.navi.gold.util.GoldAnalytics
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_2X_REWARD_BOTTOM_SHEET_INIT
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_BASIC_DETAIS_PAGE
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_FOMO_NUDGE_BOTTOM_SHEET_INIT
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_KYC_SCREEN
import com.navi.gold.util.toActionCheckResponse
import com.navi.gold.viewmodels.DigitalGoldCommonVM
import com.navi.gold.viewmodels.DigitalGoldKycVM
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import com.navi.base.utils.PAN_VERIFY
import com.navi.base.utils.PAN_VERIFY_POLLING
import com.navi.common.utils.Constants.GOLD
@AndroidEntryPoint
class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetListener,
@@ -106,10 +102,6 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
private lateinit var commonBottomSheet: NewCommonBottomSheet
private var validationCheckMap: HashMap<String, Boolean>? = null
private var isSavedTextNeed: Boolean? = false
private var isFetchedFromCache = false
private var isGoldPageNeedToFetch = false
private var kycResponse = GoldKycCheckResponse()
private var isRefreshPressed = false
private val naviAdapter = NaviAdapter(
widgetCallback = this,
factory = ViewHolderFactoryImpl()
@@ -168,15 +160,7 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
private fun initObserver() {
lifecycleScope.launchWhenResumed {
viewModel.digitalGoldKycWidgets.observeNonNull(this@DigitalGoldKycFragment) { widgetResponse ->
if (!isFetchedFromCache && !isRefreshPressed) {
stopShimmer()
}
if (isRefreshPressed) {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
isRefreshPressed = !isRefreshPressed
}
stopShimmer()
processHeader(widgetResponse)
commonVM.updateBackPressObjectiveAction(widgetResponse.header?.backPressObjective)
if (isSavedTextNeed == true) {
@@ -193,32 +177,10 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
validationCheckMap = widgetResponse.extraData?.validationCheckMap
}
viewModel.panVerifyResponse.observeNonNull(this@DigitalGoldKycFragment) { goldKycResponse ->
if (goldKycResponse.actionData?.url == GOLD_BUY_URL) {
isGoldPageNeedToFetch = true
kycResponse = goldKycResponse
fetchDigitalGoldBuyDetails()
} else {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
handlePanVerifyResponse(goldKycResponse)
}
}
viewModel.digitalGoldBuyWidgets.observeNonNull(this@DigitalGoldKycFragment) { goldBuyResponse ->
if (isGoldPageNeedToFetch) {
TemporaryStorageHelper.SOFT_REF_CACHE.add(
key = GOlD_KYC_BUY,
value = goldBuyResponse as Any,
maxTtl = TTL_SOFT_REF_CACHE_API_EXPIRY_TIME,//Making ttl to 40 seconds as it is highly unlikely that buy summary take more than 40 seconds to load
maxConsumptions = 1
)
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
handlePanVerifyResponse(kycResponse)
isGoldPageNeedToFetch = false
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
handlePanVerifyResponse(goldKycResponse)
}
commonVM.actionObjectiveData.observeNonNull(this@DigitalGoldKycFragment) { objectiveResponse ->
@@ -246,12 +208,6 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
}
}
private fun fetchDigitalGoldBuyDetails() {
viewModel.fetchDigitalGoldBuyDetails(
amount = arguments?.getDouble(AMOUNT_DATA) ?: 0.0
)
}
override fun onFocusChange(widgetId: String?, hasFocus: Boolean, input: String?) {
super.onFocusChange(widgetId, hasFocus, input)
if (!isAdded || activity?.isFinishing.orTrue() || !hasFocus) return
@@ -295,8 +251,7 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
kycVerifyResponse.successBottomSheet?.let { successBottomSheet ->
//Changing the default display time to 500ms otherwise app look stuck
val displayTime = successBottomSheet.displayTime ?: 500L
val displayTime = successBottomSheet.displayTime ?: 1000L
successBottomSheet.bottomSheetData?.data?.let { widgetList ->
val bottomSheet = showWidgetBottomSheet(
widgetList = widgetList,
@@ -304,6 +259,7 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
)
lifecycleScope.launchWhenResumed {
delay(displayTime)
bottomSheet.safelyDismissDialog()
navigateWith(kycVerifyResponse)
}
@@ -440,7 +396,7 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
}
private fun fetchPanVerifyResponse(actionData: ActionData?, usePolling: Boolean = false) {
if (!isInputValid()) {
if(!isInputValid()) {
updateNextButton()
return
}
@@ -471,7 +427,6 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
}
return allValidationsPassed
}
private fun showShimmer() {
binding.shimmerLayout.startShimmer()
binding.shimmerLayout.isVisible = true
@@ -485,11 +440,7 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
}
private fun fetchDigitalKycScreen() {
if (TemporaryStorageHelper.SOFT_REF_CACHE.contains(GOLD_KYC)) {
isFetchedFromCache = true
} else if (!isRefreshPressed) {
showShimmer()
}
showShimmer()
viewModel.fetchDigitalGoldKycDetails(
GoldKycPageRequest(
amount = arguments?.getDouble(AMOUNT_DATA)
@@ -514,8 +465,8 @@ class DigitalGoldKycFragment : BaseFragment(), WidgetCallback, NewBottomSheetLis
} else if (it.action.isNotNullAndNotEmpty()) {
when (it.action) {
REFRESH -> {
isRefreshPressed = true
showShimmer()
hideLoader()
fetchDigitalKycScreen()
}
}

View File

@@ -52,10 +52,22 @@ import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.utils.observeNonNull
import com.navi.common.utils.toCtaData
import com.navi.common.viewmodel.PaymentCheckViewModel
import com.navi.common.viewmodel.WidgetFullScreenDialogSharedVM
import com.navi.common.viewmodel.WidgetSupportedBottomSheetSharedVM
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.common.viewmodel.WidgetFullScreenDialogSharedVM
import com.navi.gold.R
import com.navi.gold.databinding.ActivityDigitalGoldSellBinding
import com.navi.naviwidgets.actions.PaymentWidgetClickAction
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.models.ContainerWidget
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.PaymentWidget
import com.navi.naviwidgets.models.TextWithTimerWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import com.navi.gold.model.DigitalGoldActionCheckResponse
import com.navi.gold.model.GoldSellOrderResponse
import com.navi.gold.toOpenBottomSheet
@@ -71,18 +83,6 @@ import com.navi.gold.util.startExitAnimation
import com.navi.gold.util.toActionCheckResponse
import com.navi.gold.viewmodels.DigitalGoldSellSharedVM
import com.navi.gold.viewmodels.DigitalGoldSellVM
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.actions.PaymentWidgetClickAction
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.models.ContainerWidget
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.PaymentWidget
import com.navi.naviwidgets.models.TextWithTimerWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@@ -576,10 +576,6 @@ class DigitalGoldSellActivity : BaseActivity(), WidgetCallback, NewBottomSheetLi
} else if (it.action.isNotNullAndNotEmpty()) {
when (it.action) {
REFRESH -> {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
unblockInteractability()
}
sharedVM.setRefreshScreen(true)
}
}

View File

@@ -19,10 +19,10 @@ import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.deeplink.DeepLinkManager
import com.navi.base.model.AnalyticsEvent
import com.navi.base.model.CtaType
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.model.AnalyticsEvent
import com.navi.base.model.NaviClickAction
import com.navi.base.model.NaviWidgetClickWithActionData
import com.navi.base.utils.BaseUtils
@@ -42,26 +42,24 @@ import com.navi.common.pushnotification.NotificationConstants.DISMISS
import com.navi.common.ui.activity.BaseActivity
import com.navi.common.ui.bottomsheet.WidgetsSupportedBottomSheet
import com.navi.common.ui.fragment.WidgetFullScreenDialogFragment
import com.navi.common.utils.Constants.GOLD_TRANSACTION_HISTORY
import com.navi.common.utils.PlayStoreInAppRatingHelper
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.utils.log
import com.navi.common.utils.observeNonNull
import com.navi.common.utils.toCtaData
import com.navi.common.viewmodel.WidgetFullScreenDialogSharedVM
import com.navi.common.viewmodel.WidgetSupportedBottomSheetSharedVM
import com.navi.gold.R
import com.navi.gold.databinding.ActivityDigitalGoldTransactionBinding
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_TRANSACTION_SCREEN
import com.navi.gold.viewmodels.DigitalGoldTransactionVM
import com.navi.common.viewmodel.WidgetSupportedBottomSheetSharedVM
import com.navi.gold.util.Constants.CSAT_POPUP_DELAY
import com.navi.gold.util.Constants.SHOW_REWARD_GRATIFICATION
import com.navi.gold.util.Constants.SHOW_WIDGET_BOTTOM_SHEET
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_TRANSACTION_SCREEN
import com.navi.gold.util.GoldAnalytics.FEEDBACK
import com.navi.gold.util.GoldAnalytics.GOLD_VAULT_CSAT_BOTTOMSHEET_CLOSE
import com.navi.gold.util.GoldAnalytics.GOLD_VAULT_CSAT_BOTTOMSHEET_INIT
import com.navi.gold.util.GoldAnalytics.GOLD_VAULT_CSAT_BOTTOMSHEET_SUBMIT
import com.navi.gold.util.startExitAnimation
import com.navi.gold.viewmodels.DigitalGoldTransactionVM
import com.navi.naviwidgets.actions.DownloadClickAction
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.adapters.NaviAdapter
@@ -91,7 +89,6 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
private lateinit var widgetSupportedBottomSheet: WidgetsSupportedBottomSheet
private var csatFlowJob: Job? = null
private var areGratificationParamsConsumed = false
private var isFetchedFromCache = false
private val naviAdapter =
NaviAdapter(widgetCallback = this, factory = ViewHolderFactoryImpl(), isRecyclable = true)
@@ -178,10 +175,7 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
this@DigitalGoldTransactionActivity
) { widgetResponse ->
areGratificationParamsConsumed = true
if (!isFetchedFromCache) {
hideLoader()
}
isFetchedFromCache = false
hideLoader()
val csatPopupDelay =
max(intent.getStringExtra(CSAT_POPUP_DELAY).toLongWithSafe(), 0L)
@@ -293,12 +287,7 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
}
private fun fetchDigitalTransactionPageDetails() {
if (TemporaryStorageHelper.SOFT_REF_CACHE.contains(GOLD_TRANSACTION_HISTORY)) {
isFetchedFromCache = true
areGratificationParamsConsumed = true
} else {
showLoader(isShimmerEffect = true)
}
showLoader(isShimmerEffect = true)
val params =
if (!areGratificationParamsConsumed) {
intent.getStringExtra(SHOW_REWARD_GRATIFICATION)

View File

@@ -18,9 +18,4 @@ object Constants {
const val SHOW_REWARD_GRATIFICATION = "showRewardGratification"
const val KUBER_TARGET_VALUE = "KUBER"
const val CSAT_POPUP_DELAY = "csatPopupDelay"
const val BUTTON_LOADER = "button_loader"
const val GOLD_KYC_URL = "gold/buy/goldKyc"
const val GOLD_BUY_SUMMARY_URL = "gold/buy"
const val GOlD_KYC_BUY = "GOLD_KYC_BUY"
const val TTL_SOFT_REF_CACHE_API_EXPIRY_TIME: Long = 40000
}

View File

@@ -18,16 +18,8 @@ class DigitalGoldBuySharedVM : BaseVM(isExceptionNeedToShow = false) {
val paymentResponse: LiveData<DigitalGoldPaymentResponse>
get() = _paymentResponse
private val _isLoading = MutableLiveData<Boolean>()
val isLoading: LiveData<Boolean>
get() = _isLoading
fun setPaymentData(digitalGoldPaymentResponse: DigitalGoldPaymentResponse) {
_paymentResponse.value = digitalGoldPaymentResponse
}
fun setButtonLoaderState(buttonLoaderState: Boolean) {
_isLoading.value = buttonLoaderState
}
}

View File

@@ -15,26 +15,19 @@ import com.navi.common.model.common.WidgetBottomSheetData
import com.navi.common.model.common.WidgetResponse
import com.navi.common.network.models.RepoResult
import com.navi.common.network.models.SuccessResponse
import com.navi.common.utils.Constants
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.viewmodel.BaseVM
import com.navi.gold.model.DigitalGoldActionCheckResponse
import com.navi.gold.model.DigitalGoldPollingResponse
import com.navi.gold.model.GoldBuyOrderRequest
import com.navi.gold.model.GoldSellOrderResponse
import com.navi.gold.repo.DigitalGoldBuyRepo
import com.navi.gold.repo.DigitalGoldTransactionRepo
import com.navi.gold.util.Constants.GOlD_KYC_BUY
import com.navi.payment.paymenthandler.model.PaymentStatusData
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class DigitalGoldBuyVM @Inject constructor(
private val goldBuyRepo: DigitalGoldBuyRepo,
private val goldTransactionRepo: DigitalGoldTransactionRepo
) :
class DigitalGoldBuyVM @Inject constructor(private val goldBuyRepo: DigitalGoldBuyRepo) :
BaseVM() {
private val _digitalGoldBuyWidgets = MutableLiveData<WidgetResponse>()
@@ -63,10 +56,6 @@ class DigitalGoldBuyVM @Inject constructor(
val postPaymentResponse: LiveData<RepoResult<SuccessResponse>>
get() = _postPaymentResponse
private val _digitalGoldTransactionWidgets = MutableLiveData<WidgetResponse>()
val digitalGoldTransactionWidgets: LiveData<WidgetResponse>
get() = _digitalGoldTransactionWidgets
private var _isBackBottomSheetShownOnce: Boolean = false
fun setPostPaymentResponseStatus(data: PaymentStatusData) {
@@ -74,25 +63,6 @@ class DigitalGoldBuyVM @Inject constructor(
}
fun fetchDigitalGoldBuyDetails(amount: Double) {
if (TemporaryStorageHelper.SOFT_REF_CACHE.contains(GOlD_KYC_BUY)) {
TemporaryStorageHelper.SOFT_REF_CACHE.get(GOlD_KYC_BUY)?.let {
it as? WidgetResponse
}?.let { cachedResponse ->
_digitalGoldBuyWidgets.value = cachedResponse
}
return
}
TemporaryStorageHelper.SOFT_REF_CACHE.get(Constants.GOLD_BUY)?.let {
it as? WidgetResponse
}?.let { cachedResponse ->
_digitalGoldBuyWidgets.value = cachedResponse
} ?: run {
fetchDigitalGoldBuyDetailsRemote(amount)
}
}
private fun fetchDigitalGoldBuyDetailsRemote(amount: Double) {
coroutineScope.launch {
val response = goldBuyRepo.fetchDigitalGoldBuyDetails(amount)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
@@ -103,17 +73,6 @@ class DigitalGoldBuyVM @Inject constructor(
}
}
fun fetchDigitalGoldTransactionDetails(params: Map<String, String> = emptyMap()) {
coroutineScope.launch {
val response = goldTransactionRepo.fetchDigitalGoldTransactionDetails(params)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
_digitalGoldTransactionWidgets.value = response.data
} else {
setErrorData(response.errors, response.error)
}
}
}
fun fetchBuyOrderResponse(
amount: Double,
exchangeRateId: String,
@@ -180,11 +139,10 @@ class DigitalGoldBuyVM @Inject constructor(
}
fun showBackBottomSheet(): Boolean {
return !_isBackBottomSheetShownOnce && _digitalGoldBuyWidgets.value?.extraData?.backBottomSheetData?.data?.isNotEmpty()
.orFalse()
return !_isBackBottomSheetShownOnce && _digitalGoldBuyWidgets.value?.extraData?.backBottomSheetData?.data?.isNotEmpty().orFalse()
}
fun setIsBackBottomSheetShownOnce() {
fun setIsBackBottomSheetShownOnce(){
_isBackBottomSheetShownOnce = true
}
}

View File

@@ -20,21 +20,13 @@ import com.navi.common.viewmodel.BaseVM
import com.navi.gold.model.AmountDataRequest
import com.navi.gold.model.GoldKycCheckResponse
import com.navi.gold.model.GoldKycPageRequest
import com.navi.gold.repo.DigitalGoldBuyRepo
import com.navi.gold.repo.DigitalGoldHomeRepo
import com.navi.gold.repo.DigitalGoldKycRepo
import com.navi.gold.repo.DigitalGoldTransactionRepo
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class DigitalGoldHomeVM @Inject constructor(
private val goldHomeRepo: DigitalGoldHomeRepo,
private val goldKycRepo: DigitalGoldKycRepo,
private val goldBuyRepo: DigitalGoldBuyRepo,
private val goldTransactionRepo: DigitalGoldTransactionRepo
) :
class DigitalGoldHomeVM @Inject constructor(private val goldHomeRepo: DigitalGoldHomeRepo) :
BaseVM() {
private val _digitalGoldHomeWidgets = MutableLiveData<WidgetResponse>()
@@ -43,15 +35,6 @@ class DigitalGoldHomeVM @Inject constructor(
private val _pollingData = MutableLiveData<WidgetResponse>()
val pollingData: LiveData<WidgetResponse>
get() = _pollingData
private val _digitalGoldBuyWidgets = MutableLiveData<WidgetResponse>()
val digitalGoldBuyWidgets: LiveData<WidgetResponse>
get() = _digitalGoldBuyWidgets
private val _digitalGoldKycWidgets = MutableLiveData<WidgetResponse>()
val digitalGoldKycWidgets: LiveData<WidgetResponse>
get() = _digitalGoldKycWidgets
private val _panVerifyCta = MutableLiveData<GoldKycCheckResponse>()
val panVerifyCta: LiveData<GoldKycCheckResponse>
get() = _panVerifyCta
@@ -61,10 +44,6 @@ class DigitalGoldHomeVM @Inject constructor(
val buyBottomSheetData: LiveData<WidgetResponse>
get() = _buyBottomSheetData
private val _digitalGoldTransactionWidgets = MutableLiveData<WidgetResponse>()
val digitalGoldTransactionWidgets: LiveData<WidgetResponse>
get() = _digitalGoldTransactionWidgets
private var _isBackBottomSheetShownOnce: Boolean = false
fun setActualSellAmount(actualSellAmount: Double) {
@@ -117,18 +96,6 @@ class DigitalGoldHomeVM @Inject constructor(
}
}
fun fetchDigitalGoldTransactionDetails(params: Map<String, String> = emptyMap()) {
coroutineScope.launch {
val response = goldTransactionRepo.fetchDigitalGoldTransactionDetails(params)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
_digitalGoldTransactionWidgets.value = response.data
} else {
setErrorData(response.errors, response.error)
}
}
}
fun fetchPanVerifyCta(goldKycPageRequest: GoldKycPageRequest?) {
coroutineScope.launch {
val response = goldHomeRepo.fetchPanVerifyCta(goldKycPageRequest)
@@ -151,29 +118,6 @@ class DigitalGoldHomeVM @Inject constructor(
}
}
fun fetchDigitalGoldKycDetails(goldKycPageRequest: GoldKycPageRequest) {
coroutineScope.launch {
val response = goldKycRepo.fetchDigitalGoldKycDetails(goldKycPageRequest)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
_digitalGoldKycWidgets.value = response.data
} else {
setErrorData(response.errors, response.error)
}
}
}
fun fetchDigitalGoldBuyDetails(amount: Double) {
coroutineScope.launch {
val response = goldBuyRepo.fetchDigitalGoldBuyDetails(amount)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
_digitalGoldBuyWidgets.value = response.data
} else {
setErrorData(response.errors, response.error)
}
}
}
fun startPolling() {
coroutineScope.launch {
val response = goldHomeRepo.fetchDigitalGoldHomeDetailsPolling()

View File

@@ -12,17 +12,14 @@ import androidx.lifecycle.MutableLiveData
import com.navi.base.utils.EMPTY
import com.navi.base.utils.isNull
import com.navi.base.utils.orFalse
import com.navi.base.utils.orZero
import com.navi.common.model.common.WidgetBottomSheetData
import com.navi.common.model.common.WidgetResponse
import com.navi.common.utils.Constants.GOLD_KYC
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.base.utils.orZero
import com.navi.common.viewmodel.BaseVM
import com.navi.gold.model.GoldKycCheckResponse
import com.navi.gold.model.GoldKycPageRequest
import com.navi.gold.model.GoldKycVerifyRequest
import com.navi.gold.model.KycCheckPollingConfigResponse
import com.navi.gold.repo.DigitalGoldBuyRepo
import com.navi.gold.repo.DigitalGoldKycRepo
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
@@ -31,10 +28,7 @@ import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class DigitalGoldKycVM @Inject constructor(
private val goldKycRepo: DigitalGoldKycRepo,
private val goldBuyRepo: DigitalGoldBuyRepo
) :
class DigitalGoldKycVM @Inject constructor(private val goldKycRepo: DigitalGoldKycRepo) :
BaseVM() {
private val _digitalGoldKycWidgets = MutableLiveData<WidgetResponse>()
@@ -44,12 +38,7 @@ class DigitalGoldKycVM @Inject constructor(
val panVerifyResponse: LiveData<GoldKycCheckResponse>
get() = _panVerifyResponse
private val _panVerifyPollingConfigResponse =
MutableStateFlow<KycCheckPollingConfigResponse?>(null)
private val _digitalGoldBuyWidgets = MutableLiveData<WidgetResponse>()
val digitalGoldBuyWidgets: LiveData<WidgetResponse>
get() = _digitalGoldBuyWidgets
private val _panVerifyPollingConfigResponse = MutableStateFlow<KycCheckPollingConfigResponse?>(null)
private enum class KycPollingStatusEnum {
PENDING,
@@ -84,16 +73,6 @@ class DigitalGoldKycVM @Inject constructor(
fun getDob() = dob
fun fetchDigitalGoldKycDetails(goldKycPageRequest: GoldKycPageRequest) {
TemporaryStorageHelper.SOFT_REF_CACHE.get(GOLD_KYC)?.let {
it as? WidgetResponse
}?.let { cachedResponse ->
_digitalGoldKycWidgets.value = cachedResponse
} ?: run {
fetchDigitalGoldKycDetailsRemote(goldKycPageRequest)
}
}
private fun fetchDigitalGoldKycDetailsRemote(goldKycPageRequest: GoldKycPageRequest) {
coroutineScope.launch {
val response = goldKycRepo.fetchDigitalGoldKycDetails(goldKycPageRequest)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
@@ -112,23 +91,9 @@ class DigitalGoldKycVM @Inject constructor(
retryCount++
}
fun fetchDigitalGoldBuyDetails(amount: Double) {
fun fetchGoldKycVerifyDetails(goldKycVerifyRequest: GoldKycVerifyRequest?, usePolling: Boolean = false) {
coroutineScope.launch {
val response = goldBuyRepo.fetchDigitalGoldBuyDetails(amount)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
_digitalGoldBuyWidgets.value = response.data
} else {
setErrorData(response.errors, response.error)
}
}
}
fun fetchGoldKycVerifyDetails(
goldKycVerifyRequest: GoldKycVerifyRequest?,
usePolling: Boolean = false
) {
coroutineScope.launch {
if (usePolling) {
if(usePolling) {
resetPollingRetryCount()
val response = goldKycRepo.fetchGoldKycVerifyPollingConfig(goldKycVerifyRequest)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
@@ -161,11 +126,11 @@ class DigitalGoldKycVM @Inject constructor(
val response = goldKycRepo.pollKycVerificationStatus(pollingRequestId)
incrementPollingRetryCount()
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
if (retryCount > pollingRequestConfig.requestConfig?.numOfRetries.orZero()) {
if(retryCount > pollingRequestConfig.requestConfig?.numOfRetries.orZero()) {
_panVerifyResponse.value = response.data?.timeoutDetails
resetPollingRetryCount()
} else {
if (response.data?.status == KycPollingStatusEnum.PENDING.name) {
if(response.data?.status == KycPollingStatusEnum.PENDING.name) {
pollingRequestId = response.data?.requestId.orEmpty()
delay(pollingRequestConfig.requestConfig?.interval.orZero())
pollKycVerificationStatus()
@@ -185,11 +150,10 @@ class DigitalGoldKycVM @Inject constructor(
}
fun showBackBottomSheet(): Boolean {
return !_isBackBottomSheetShownOnce && _digitalGoldKycWidgets.value?.extraData?.backBottomSheetData?.data?.isNotEmpty()
.orFalse()
return !_isBackBottomSheetShownOnce && _digitalGoldKycWidgets.value?.extraData?.backBottomSheetData?.data?.isNotEmpty().orFalse()
}
fun setIsBackBottomSheetShownOnce() {
fun setIsBackBottomSheetShownOnce(){
_isBackBottomSheetShownOnce = true
}
}

View File

@@ -13,14 +13,12 @@ import com.androidx.lifecycle.SingleLiveEvent
import com.navi.base.utils.isNull
import com.navi.common.model.common.InvoiceDownloadData
import com.navi.common.model.common.WidgetResponse
import com.navi.common.utils.Constants.GOLD_TRANSACTION_HISTORY
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.viewmodel.BaseVM
import com.navi.gold.repo.DigitalGoldTransactionRepo
import com.navi.naviwidgets.models.response.CSATResponse
import com.navi.gold.repo.DigitalGoldTransactionRepo
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlinx.coroutines.launch
@HiltViewModel
class DigitalGoldTransactionVM
@@ -40,16 +38,6 @@ constructor(private val goldTransactionRepo: DigitalGoldTransactionRepo) : BaseV
get() = _csatResponse
fun fetchDigitalGoldTransactionDetails(params: Map<String, String> = emptyMap()) {
TemporaryStorageHelper.SOFT_REF_CACHE.get(GOLD_TRANSACTION_HISTORY)?.let {
it as? WidgetResponse
}?.let { cachedResponse ->
_digitalGoldTransactionWidgets.value = cachedResponse
} ?: run {
fetchDigitalGoldTransactionDetailsRemote(params)
}
}
fun fetchDigitalGoldTransactionDetailsRemote(params: Map<String, String> = emptyMap()) {
coroutineScope.launch {
val response = goldTransactionRepo.fetchDigitalGoldTransactionDetails(params)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
@@ -65,8 +53,8 @@ constructor(private val goldTransactionRepo: DigitalGoldTransactionRepo) : BaseV
val response = goldTransactionRepo.fetchDigitalGoldInvoiceDownloadUrl(transactionId!!)
if (
response.error.isNull() &&
response.errors.isNullOrEmpty() &&
!response.data.isNull()
response.errors.isNullOrEmpty() &&
!response.data.isNull()
) {
_invoiceDownloadData.value = response.data
} else {

View File

@@ -38,5 +38,4 @@ interface GoldConversionWidgetInfo {
fun chipData(): List<AmountChipData>?
fun inputValidationList(): List<BaseInputValidation?>?
fun validationDelay(): Long?
fun isButtonLoaderEnabled(): Boolean?
}

View File

@@ -12,6 +12,7 @@ import com.google.gson.annotations.SerializedName
import com.navi.base.model.ActionData
import com.navi.design.common.Padding
import com.navi.design.textview.model.TextWithStyleVariation
import com.navi.design.utils.CornerRadius
import com.navi.naviwidgets.interfaces.GoldConversionWidgetInfo
import com.navi.naviwidgets.models.response.WidgetError
import com.navi.naviwidgets.validations.BaseInputValidation
@@ -88,8 +89,6 @@ data class GoldConversionWidget(
widgetData?.inputValidationList
override fun validationDelay(): Long? = widgetData?.validationDelay
override fun isButtonLoaderEnabled(): Boolean? = widgetData?.showButtonLoader
}
data class GoldConversionData(
@@ -132,8 +131,6 @@ data class GoldConversionData(
val inputValidationList: List<BaseInputValidation?>? = null,
@SerializedName("validationDelay")
val validationDelay: Long? = null,
val showButtonLoader: Boolean = true,
var buttonLoaderState: ButtonLoaderState? = null
) : Serializable
data class AmountConstraint(
@@ -166,7 +163,6 @@ data class AmountChipData(
@SerializedName("bgColorVariations") val bgColorVariations: Map<String, String?>? = null
)
}
@Parcelize
data class ActionButtonStyle(
@SerializedName("bgColor")
@@ -176,7 +172,3 @@ data class ActionButtonStyle(
@SerializedName("padding")
val padding: Padding? = null
) : Parcelable
data class ButtonLoaderState(
var showLoader: Boolean? = null
)

View File

@@ -16,7 +16,7 @@ data class PaymentWidget(
override val isDependentWidget: Boolean?,
override val dependencyWidgetId: String?,
override var isDependencyWidgetShowing: Boolean?,
override var widgetError: WidgetError?,
override var widgetError: WidgetError?
) : NaviWidget(), Serializable {
companion object {
const val WIDGET_NAME = "PAYMENT_WIDGET"
@@ -34,9 +34,7 @@ data class PaymentWidgetData(
val subTitle: NaviTextComponent? = null,
var totalAmount: Double? = null,
@SerializedName("precision")
val precision: Int? = null,
var showButtonLoader: Boolean = true,
var buttonLoaderState: ButtonLoaderState? = null
val precision: Int? = null
)
data class PaymentData(

View File

@@ -123,7 +123,6 @@ const val SUCCESS = "SUCCESS"
const val FAILURE = "FAILURE"
const val DOWNLOAD = "DOWNLOAD"
const val DOWNLOAD_URL = "DOWNLOAD_URL"
const val BUTTON_LOADER = "button_loader"
const val FEEDBACK_WIDGET_USER_DATA = "FEEDBACK_WIDGET_USER_DATA"
const val BOTTOM_SHEET_KEY = "BOTTOM_SHEET_KEY"
const val METADATA_ANALYTICS_EVENT = "analyticsEvent"
@@ -149,8 +148,5 @@ const val CUSTOM_TIME_FORMAT = "custom_time_format"
const val PAGE_REFRESH = "page_refresh"
const val SELECTED_CUSTOM_PAYMENT_TYPE = "SELECTED_CUSTOM_PAYMENT_TYPE"
const val KEY_CLICKABLE = "Clickable"
const val BUY_GOLD = "BUY_GOLD"
const val PAYMENT_PAGE = "payment_page"

View File

@@ -34,7 +34,6 @@ import androidx.core.content.res.ResourcesCompat
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import com.airbnb.lottie.LottieAnimationView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
@@ -59,7 +58,6 @@ import com.navi.base.utils.isNotNull
import com.navi.base.utils.isNotNullAndNotEmpty
import com.navi.base.utils.isNull
import com.navi.base.utils.orZero
import com.navi.design.textview.NaviTextView
import com.navi.design.textview.model.SpanInterface
import com.navi.design.textview.model.TextWithStyle
import com.navi.design.utils.Constants
@@ -1016,23 +1014,4 @@ fun getInfoBottomSheetDataFromJsonObject(value: String?): BottomSheetInfoV2? {
e.log()
}
return bottomSheetData
}
fun setButtonLoaderState(
button: NaviTextView,
buttonLoader: LottieAnimationView,
isLoading: Boolean,
text: String
) {
if (isLoading) {
button.text = EMPTY
buttonLoader.visibility = View.VISIBLE
buttonLoader.playAnimation()
button.isEnabled = false
} else {
button.text = text
buttonLoader.visibility = View.GONE
buttonLoader.pauseAnimation()
button.isEnabled = true
}
}
}

View File

@@ -11,7 +11,6 @@ import androidx.databinding.ViewDataBinding
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.databinding.LayoutGoldConversionBinding
import com.navi.naviwidgets.interfaces.GoldConversionWidgetInfo
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.GoldConversionData
import com.navi.naviwidgets.models.GoldConversionWidget
import com.navi.naviwidgets.widgets.GoldConversionWidgetLayout
@@ -50,9 +49,6 @@ class GoldConversionWidgetVH(private val viewDataBinding: ViewDataBinding) :
is GoldConversionData -> {
(itemView as GoldConversionWidgetLayout).updatePollingAmountAndWeight(goldConversionData = payload)
}
is ButtonLoaderState -> {
(itemView as GoldConversionWidgetLayout).updateButtonLoader(buttonLoaderState = payload)
}
}
}
}

View File

@@ -10,7 +10,6 @@ package com.navi.naviwidgets.viewholder
import androidx.databinding.ViewDataBinding
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.databinding.PaymentWidgetLayoutBinding
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.PaymentWidget
import com.navi.naviwidgets.widgets.PaymentWidgetLayout
@@ -39,11 +38,6 @@ class PaymentWidgetVH(private val viewDataBinding: ViewDataBinding) :
override fun bindWidgetStateChanged(payload: Any?) {
if (itemView is PaymentWidgetLayout) {
(itemView as PaymentWidgetLayout).updateAmount()
when(payload){
is ButtonLoaderState -> {
(itemView as PaymentWidgetLayout).updateButtonLoader(buttonLoaderState = payload)
}
}
}
}

View File

@@ -10,6 +10,7 @@ package com.navi.naviwidgets.widgets
import android.content.Context
import android.util.AttributeSet
import androidx.cardview.widget.CardView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.LinearLayoutManager
@@ -17,12 +18,7 @@ import com.navi.base.model.ActionData
import com.navi.base.model.GenericAnalyticsData
import com.navi.base.model.NaviClickAction
import com.navi.base.model.NaviWidgetClickWithActionData
import com.navi.design.utils.CornerRadius
import com.navi.design.utils.DrawableShape
import com.navi.design.utils.dpToPx
import com.navi.design.utils.dpToPxInInt
import com.navi.design.utils.getNaviDrawableFromBackend
import com.navi.design.utils.parseColorSafe
import com.navi.design.utils.*
import com.navi.naviwidgets.R
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.adapters.NaviAdapter
@@ -30,13 +26,7 @@ import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.databinding.LayoutContainerBinding
import com.navi.naviwidgets.extensions.deepEqualTo
import com.navi.naviwidgets.interfaces.ContainerWidgetInfo
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.GoldConversionData
import com.navi.naviwidgets.models.GoldConversionWidget
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.PaymentWidget
import com.navi.naviwidgets.models.TextWithTimerWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.models.*
import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.utils.setMargin
import com.navi.naviwidgets.utils.setWidgetLayoutParams
@@ -170,8 +160,7 @@ class ContainerWidgetLayout @JvmOverloads constructor(
root.alpha = 0.4F
}
}
if (info.removeElevation() == true) cwlParent.elevation =
resources.getDimension(R.dimen.dp_0)
if(info.removeElevation() == true) cwlParent.elevation = resources.getDimension(R.dimen.dp_0)
info.setMargin()?.let {
cwlParent.setMargin(it)
}
@@ -237,7 +226,6 @@ class ContainerWidgetLayout @JvmOverloads constructor(
}
}
}
is TextWithTimerWidget -> {
naviAdapter.list.forEachIndexed { index, naviWidget ->
if (naviWidget is TextWithTimerWidget) {
@@ -248,8 +236,7 @@ class ContainerWidgetLayout @JvmOverloads constructor(
}
}
}
is GoldConversionData, GoldConversionWidget, is ButtonLoaderState -> {
is GoldConversionData, GoldConversionWidget -> {
naviAdapter.list.forEachIndexed { index, naviWidget ->
if (naviWidget is GoldConversionWidget) {
naviAdapter.notifyItemChanged(
@@ -257,13 +244,6 @@ class ContainerWidgetLayout @JvmOverloads constructor(
WidgetChangedData(WIDGET_STATE_CHANGE, payLoad)
)
}
if (naviWidget is PaymentWidget) {
naviAdapter.notifyItemChanged(
index,
WidgetChangedData(WIDGET_STATE_CHANGE, payLoad)
)
}
}
}
}

View File

@@ -48,16 +48,13 @@ import com.navi.naviwidgets.extensions.textChanges
import com.navi.naviwidgets.extensions.toSafeDouble
import com.navi.naviwidgets.interfaces.GoldConversionWidgetInfo
import com.navi.naviwidgets.models.AmountChipData
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.GoldConversionData
import com.navi.naviwidgets.models.NaviTextComponent
import com.navi.naviwidgets.utils.BUTTON_LOADER
import com.navi.naviwidgets.utils.COMMA
import com.navi.naviwidgets.utils.EMPTY
import com.navi.naviwidgets.utils.STORE_DIGITAL_GOLD_AMOUNT
import com.navi.naviwidgets.utils.WIDGET_ERROR
import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE
import com.navi.naviwidgets.utils.setButtonLoaderState
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@@ -154,13 +151,6 @@ class GoldConversionWidgetLayout @JvmOverloads constructor(
it[AMOUNT] = info.actualAmount().toString()
it[WEIGHT] = info.actualWeight().toString()
}
if (info?.isButtonLoaderEnabled() == true) {
widgetCallback.widgetUserData(
BUTTON_LOADER,
true
)
updateButtonLoader(ButtonLoaderState(showLoader = true))
}
widgetCallback.onClick(
NaviWidgetClickWithActionData(
actionData = info.actionData()
@@ -302,6 +292,7 @@ class GoldConversionWidgetLayout @JvmOverloads constructor(
}
}
}
private fun unselectChipsIfSelected() {
if (isChipSelected) {
unSelectAllChips()
@@ -604,16 +595,6 @@ class GoldConversionWidgetLayout @JvmOverloads constructor(
}
}
fun updateButtonLoader(buttonLoaderState: ButtonLoaderState) {
info?.actionData()?.title?.let {
var text = it
buttonLoaderState?.showLoader?.let {
var isLoading = it
setButtonLoaderState(binding.tvAction, binding.buttonLoader, isLoading, text)
}
}
}
fun updateAmountAndWeight(info: GoldConversionWidgetInfo) {
this.info = info
resetErrorState()

View File

@@ -18,14 +18,14 @@ import com.navi.naviwidgets.actions.PaymentWidgetClickAction
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.databinding.PaymentWidgetLayoutBinding
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.PaymentWidget
import com.navi.naviwidgets.utils.setButtonLoaderState
import java.math.RoundingMode
import java.text.DecimalFormat
class PaymentWidgetLayout @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
private lateinit var binding: PaymentWidgetLayoutBinding
@@ -77,15 +77,18 @@ class PaymentWidgetLayout @JvmOverloads constructor(
} else {
paymentWidget?.widgetData?.title?.text.spannedText(
context = context, span = paymentWidget?.widgetData?.title?.span
context = context,
span = paymentWidget?.widgetData?.title?.span
)
}
subTitle.text = paymentWidget?.widgetData?.subTitle?.text.spannedText(
context = context, span = paymentWidget?.widgetData?.subTitle?.span
context = context,
span = paymentWidget?.widgetData?.subTitle?.span
)
paymentWidget?.widgetData?.actionButtonStyle?.let { btnStyle ->
tvAction.background = getNaviDrawable(
backgroundColor = btnStyle.bgColor.parseColorSafe(), radii = CornerRadius(
backgroundColor = btnStyle.bgColor.parseColorSafe(),
radii = CornerRadius(
leftTop = dpToPx(btnStyle.radius?.leftTop.orZero()),
rightTop = dpToPx(btnStyle.radius?.rightTop.orZero()),
leftBottom = dpToPx(btnStyle.radius?.leftBottom.orZero()),
@@ -109,7 +112,9 @@ class PaymentWidgetLayout @JvmOverloads constructor(
private fun setActionButtonState() {
binding.apply {
if (paymentWidget?.widgetData?.actionData.isNotNull() && paymentWidget?.widgetData?.actionData?.disabled == false) {
if (paymentWidget?.widgetData?.actionData.isNotNull() &&
paymentWidget?.widgetData?.actionData?.disabled == false
) {
tvAction.alpha = 1f
tvAction.isEnabled = true
} else {
@@ -125,16 +130,6 @@ class PaymentWidgetLayout @JvmOverloads constructor(
setActionButtonState()
}
}
fun updateButtonLoader(buttonLoaderState: ButtonLoaderState) {
paymentWidget?.widgetData?.actionData?.title?.let {
var text = it
buttonLoaderState?.showLoader?.let {
var isLoading = it
setButtonLoaderState(binding.tvAction, binding.buttonLoader, isLoading, text)
}
}
}
}

View File

@@ -104,12 +104,12 @@
android:background="@null"
android:enabled="false"
android:hint="@string/amount_hint_number_one"
android:textColorHint="@color/description_colour_seven"
android:imeOptions="actionDone"
android:inputType="numberDecimal"
android:lines="@integer/integer_1"
android:maxLines="@integer/integer_1"
android:scrollbars="vertical"
android:textColorHint="@color/description_colour_seven"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/tvWeightUnit"
app:layout_constraintTop_toTopOf="parent" />
@@ -233,7 +233,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/dp_48"
android:layout_marginTop="@dimen/dp_32"
android:background="@drawable/rounded_purple_color_enabled_state"
android:background="@drawable/rounded_positive_button_bg"
android:fontFamily="@font/tt_medium"
android:gravity="center"
android:textColor="@color/white"
@@ -246,19 +246,5 @@
tools:text="Sell Gold"
tools:visibility="visible" />
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/button_loader"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_48"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tvAction"
app:layout_constraintEnd_toEndOf="@id/tvAction"
app:layout_constraintStart_toStartOf="@id/tvAction"
app:layout_constraintTop_toTopOf="@id/tvAction"
app:lottie_autoPlay="false"
app:lottie_loop="true"
app:lottie_rawRes="@raw/cta_loader"
app:lottie_speed="1.0" />
</com.navi.naviwidgets.widgets.GoldConversionWidgetLayout>
</layout>

View File

@@ -16,7 +16,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.navi.design.textview.NaviTextView
<com.navi.design.textview.NaviTextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -28,7 +28,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.navi.design.textview.NaviTextView
<com.navi.design.textview.NaviTextView
android:id="@+id/sub_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -44,7 +44,7 @@
android:orientation="vertical"
app:layout_constraintGuide_percent=".50" />
<com.navi.design.textview.NaviTextView
<com.navi.design.textview.NaviTextView
android:id="@+id/tvAction"
style="@style/Small_Bold_White"
android:layout_width="@dimen/dp_0"
@@ -55,20 +55,5 @@
app:layout_constraintStart_toStartOf="@id/guideline"
app:layout_constraintTop_toTopOf="parent"
tools:text="Pay your " />
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/button_loader"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_48"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tvAction"
app:layout_constraintEnd_toEndOf="@id/tvAction"
app:layout_constraintStart_toStartOf="@id/tvAction"
app:layout_constraintTop_toTopOf="@id/tvAction"
app:lottie_autoPlay="false"
app:lottie_loop="true"
app:lottie_rawRes="@raw/cta_loader"
app:lottie_speed="1.0" />
</com.navi.naviwidgets.widgets.PaymentWidgetLayout>
</layout>