From 1b5dca6719d193acef20076c2773359141d389fb Mon Sep 17 00:00:00 2001 From: Prakhar Saxena Date: Fri, 20 Dec 2024 19:51:58 +0530 Subject: [PATCH] NTP-21170 | PS | fix token not found error (#14287) --- .../sharedviewmodel/NaviCheckoutViewModel.kt | 10 +-- .../usecase/PmsLinkedAccountUseCase.kt | 82 +++++++++++-------- .../nativepayment/viewmodel/MPSViewModel.kt | 32 +++----- .../nativepayment/viewmodel/NPSViewModel.kt | 33 +++----- .../viewmodel/NaviPaymentViewModel.kt | 6 -- 5 files changed, 75 insertions(+), 88 deletions(-) diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/sharedviewmodel/NaviCheckoutViewModel.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/sharedviewmodel/NaviCheckoutViewModel.kt index 6d91fc67aa..ef5f1d2637 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/sharedviewmodel/NaviCheckoutViewModel.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/sharedviewmodel/NaviCheckoutViewModel.kt @@ -24,7 +24,6 @@ import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.ACTION_TYPE import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.ERROR_RESPONSE -import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.GET_METHOD_RESPONSE import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.PAYMENT_INITIATE_START_TIME import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SCREEN_TYPE import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SDK_PARAMS @@ -34,6 +33,7 @@ import com.navi.payment.nativepayment.model.PaymentActionType import com.navi.payment.nativepayment.model.S2sPaymentMethodResponse import com.navi.payment.nativepayment.repository.PaymentRepository import com.navi.payment.nativepayment.usecase.NetBankingUseCase +import com.navi.payment.nativepayment.usecase.PmsLinkedAccountUseCase import com.navi.payment.nativepayment.utils.getPayloadBasedOnType import com.navi.payment.nativepayment.utils.toGenericErrorResponse import com.navi.payment.nativepayment.viewmodel.NaviPaymentBaseVM @@ -62,6 +62,7 @@ constructor( private val paymentDataProvider: PaymentDataProvider, @PaymentsSdkRetrofit private val deserializer: Gson, private val netBankingUseCase: NetBankingUseCase, + private val pmsLinkedAccountUseCase: PmsLinkedAccountUseCase, private val litmusExperimentsUseCase: LitmusExperimentsUseCase ) : NaviPaymentBaseVM(NaviPaymentAnalyticScreenName.CHECKOUT_SCREEN.screenName) { @@ -72,8 +73,8 @@ constructor( paymentSdkInitParams: PaymentSdkInitParams, ) { viewModelScope.safeLaunch { - fetchPmsExperimentsData(paymentSdkInitParams.paymentSource.orEmpty()) clearPaymentData() + fetchPmsExperimentsData(paymentSdkInitParams.paymentSource.orEmpty()) paymentDataProvider.add(PAYMENT_INITIATE_START_TIME, System.currentTimeMillis()) _paymentResponse.emit(false) val connectedAccountsData = @@ -194,8 +195,7 @@ constructor( } private fun clearPaymentData() { - paymentDataProvider.remove(GET_METHOD_RESPONSE) - paymentDataProvider.remove(ERROR_RESPONSE) - paymentDataProvider.remove(PAYMENT_INITIATE_START_TIME) + paymentDataProvider.clear() + pmsLinkedAccountUseCase.clear() } } diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/usecase/PmsLinkedAccountUseCase.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/usecase/PmsLinkedAccountUseCase.kt index 58942755b4..5f4888be26 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/usecase/PmsLinkedAccountUseCase.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/usecase/PmsLinkedAccountUseCase.kt @@ -8,6 +8,8 @@ package com.navi.payment.nativepayment.usecase import com.navi.base.AppServiceManager +import com.navi.base.utils.isNull +import com.navi.base.utils.orTrue import com.navi.pay.common.usecase.LinkedAccountsUseCase import com.navi.pay.onboarding.account.detail.model.view.LinkedAccountEntity import com.navi.payment.R @@ -20,6 +22,8 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock @OptIn(ExperimentalCoroutinesApi::class) @Singleton @@ -27,56 +31,62 @@ class PmsLinkedAccountUseCase @Inject constructor(private val linkedAccountsUseCase: LinkedAccountsUseCase) { - private val disabledAccountId = mutableSetOf() + private val mutex = Mutex() + private var disabledAccountIdSet: MutableSet? = null suspend fun execute( - pmsConnectedAccounts: List = emptyList(), - requireDisabledAccountUpdate: Boolean = false + pmsConnectedAccounts: List = emptyList() ): Flow> { - if (pmsConnectedAccounts.isNotEmpty() && requireDisabledAccountUpdate) { - val pmsConnectedAccountId = pmsConnectedAccounts.associateBy { it.accountId } - linkedAccountsUseCase.execute(true).first().forEach { account -> - if ( - pmsConnectedAccountId.contains(account.accountId).not() || - pmsConnectedAccountId[account.accountId]?.isDisabled == true - ) { - disabledAccountId.add(account.accountId) + mutex.withLock { + if (pmsConnectedAccounts.isNotEmpty() && disabledAccountIdSet.isNull()) { + disabledAccountIdSet = mutableSetOf() + val pmsConnectedAccountId = pmsConnectedAccounts.associateBy { it.accountId } + linkedAccountsUseCase.execute(true).first().forEach { account -> + if ( + pmsConnectedAccountId.contains(account.accountId).not() || + pmsConnectedAccountId[account.accountId]?.isDisabled == true + ) { + disabledAccountIdSet?.add(account.accountId) + } } } - } - return linkedAccountsUseCase.execute(true).flatMapLatest { list -> - flow { - coroutineScope { - val updatedList = - list.map { newAccount -> - val isAccountEnabled = - disabledAccountId.contains(newAccount.accountId).not() - newAccount.apply { - if (!isAccountEnabled) { - isDisabled = true - infoMessage = - newAccount.infoMessage - ?: AppServiceManager.application.getString( - R.string.payment_instrument_not_support - ) + return linkedAccountsUseCase.execute(true).flatMapLatest { list -> + flow { + coroutineScope { + val updatedList = + list.map { newAccount -> + val isAccountEnabled = + disabledAccountIdSet + ?.contains(newAccount.accountId) + ?.not() + .orTrue() + newAccount.apply { + if (!isAccountEnabled) { + isDisabled = true + infoMessage = + newAccount.infoMessage + ?: AppServiceManager.application.getString( + R.string.payment_instrument_not_support + ) + } } } - } - val connectedAccountsEligibilityMap = - list.associate { it.accountId to it.eligibilityState } + val connectedAccountsEligibilityMap = + list.associate { it.accountId to it.eligibilityState } - updateAccountEligibilityStatus( - connectedAccountsEligibilityMap = connectedAccountsEligibilityMap, - connectedAccounts = updatedList, - ) - emit(updatedList) + updateAccountEligibilityStatus( + connectedAccountsEligibilityMap = connectedAccountsEligibilityMap, + connectedAccounts = updatedList, + ) + emit(updatedList) + } } } } } fun clear() { - disabledAccountId.clear() + disabledAccountIdSet = null } } diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/MPSViewModel.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/MPSViewModel.kt index 50d433f52a..32b420c3bb 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/MPSViewModel.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/MPSViewModel.kt @@ -581,26 +581,18 @@ constructor( } } val finalList = mutableListOf() - pmsLinkedAccountUseCase - .execute( - pmsConnectedAccounts = accountList, - requireDisabledAccountUpdate = - (paymentDataProvider.get(SCREEN_TYPE) as? String) == - NaviPaymentScreenType.MINI_PAYMENT_SCREEN.name - ) - .first() - .let { - it.filter { account -> account.accountId.isAccountIdOfTypeUpiLite() } - .forEach { - it.eligibilityState = - getEligibilityStateForUpiLiteAccount( - paymentAmount.value, - resourceProvider, - it - ) - } - finalList.addAll(updateUpiAccountsRanking(it)) - } + pmsLinkedAccountUseCase.execute(pmsConnectedAccounts = accountList).first().let { + it.filter { account -> account.accountId.isAccountIdOfTypeUpiLite() } + .forEach { + it.eligibilityState = + getEligibilityStateForUpiLiteAccount( + paymentAmount.value, + resourceProvider, + it + ) + } + finalList.addAll(updateUpiAccountsRanking(it)) + } finalList.forEach { accountListCheckBalanceUseCase.updateCheckBalanceStateForLinkedAccount( linkedAccountEntity = it, diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NPSViewModel.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NPSViewModel.kt index f1d59e0587..eedee3d89f 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NPSViewModel.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NPSViewModel.kt @@ -54,7 +54,6 @@ import com.navi.payment.nativepayment.NaviPaymentAnalytics import com.navi.payment.nativepayment.common.usecase.TransactionStatusUseCase import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.PAYMENT_ORDER_REFERENCE_ID -import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SCREEN_TYPE import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.TRANSACTION_REFERENCE_ID import com.navi.payment.nativepayment.dataprovider.getMpinSetAction import com.navi.payment.nativepayment.db.model.BankEntity @@ -413,26 +412,18 @@ constructor( paymentAmount } val finalList = mutableListOf() - pmsLinkedAccountUseCase - .execute( - pmsConnectedAccounts = accountList, - requireDisabledAccountUpdate = - (paymentDataProvider.get(SCREEN_TYPE) as? String) == - NaviPaymentScreenType.FULL_PAYMENT_SCREEN.name - ) - .first() - .let { - it.filter { account -> account.accountId.isAccountIdOfTypeUpiLite() } - .forEach { - it.eligibilityState = - getEligibilityStateForUpiLiteAccount( - discountAdjustedAmount, - resourceProvider, - it - ) - } - finalList.addAll(updateUpiAccountsRanking(it)) - } + pmsLinkedAccountUseCase.execute(pmsConnectedAccounts = accountList).first().let { + it.filter { account -> account.accountId.isAccountIdOfTypeUpiLite() } + .forEach { + it.eligibilityState = + getEligibilityStateForUpiLiteAccount( + discountAdjustedAmount, + resourceProvider, + it + ) + } + finalList.addAll(updateUpiAccountsRanking(it)) + } finalList.forEach { accountListCheckBalanceUseCase.updateCheckBalanceStateForLinkedAccount( linkedAccountEntity = it, diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NaviPaymentViewModel.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NaviPaymentViewModel.kt index ee5803a94e..ada34b2153 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NaviPaymentViewModel.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NaviPaymentViewModel.kt @@ -112,10 +112,4 @@ constructor( ) } } - - override fun onCleared() { - super.onCleared() - paymentDataProvider.clear() - pmsLinkedAccountUseCase.clear() - } }