From 37780e010a274a992d26ed5cc7eb479bee62ad11 Mon Sep 17 00:00:00 2001 From: Aditya Narayan Malik Date: Mon, 16 Jun 2025 16:48:15 +0530 Subject: [PATCH] NTP-71120 | Crash fix in RSMS flow and NaviPayActivityDataProvider in release 499 (#16596) --- .../navi/pay/common/setup/NaviPayRouter.kt | 5 ++- .../pay/entry/NaviPayActivityDataProvider.kt | 2 +- .../common/sendmoney/util/SendMoneyUtils.kt | 4 ++- .../viewmodel/NaviPayOnboardingViewModel.kt | 31 +++++++++---------- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/setup/NaviPayRouter.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/setup/NaviPayRouter.kt index 691fd5bd4d..79f583cc63 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/setup/NaviPayRouter.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/common/setup/NaviPayRouter.kt @@ -51,6 +51,7 @@ import com.navi.pay.destinations.UpiGlobalScreenDestination import com.navi.pay.destinations.UpiNumberScreenDestination import com.navi.pay.entry.NaviPayActivity import com.navi.pay.entry.NaviPayActivityDataProvider +import com.navi.pay.management.common.sendmoney.model.view.SendMoneyScreenSource import com.navi.pay.management.common.sendmoney.model.view.UpiTransactionType import com.navi.pay.management.moneytransfer.scanpay.util.getPayeeEntity import com.navi.pay.onboarding.account.linked.model.view.LinkedAccountsScreenSource @@ -149,7 +150,9 @@ object NaviPayRouter { type = bundle.getString(TRANSACTION_TYPE).orEmpty(), defaultType = UpiTransactionType.INTENT_PAY, ), - sendMoneyScreenSource = bundle.getParcelable(SEND_MONEY_SCREEN_SOURCE), + sendMoneyScreenSource = + bundle.getParcelable(SEND_MONEY_SCREEN_SOURCE) + ?: SendMoneyScreenSource.Default, ) SendMoneyScreenDestination() } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayActivityDataProvider.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayActivityDataProvider.kt index 688cc7ff08..02d26986ce 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayActivityDataProvider.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/entry/NaviPayActivityDataProvider.kt @@ -59,7 +59,7 @@ class NaviPayActivityDataProvider @Inject constructor() { fun setSendMoneyScreenData( payeeEntity: PayeeEntity?, transactionType: UpiTransactionType = UpiTransactionType.P2P_PAY, - sendMoneyScreenSource: SendMoneyScreenSource? = SendMoneyScreenSource.Default, + sendMoneyScreenSource: SendMoneyScreenSource = SendMoneyScreenSource.Default, ) { putValue(TRANSACTION_TYPE, transactionType.name) putValue(PAYEE_ENTITY, payeeEntity) diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/common/sendmoney/util/SendMoneyUtils.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/common/sendmoney/util/SendMoneyUtils.kt index 79b96a1b0d..52394091d9 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/common/sendmoney/util/SendMoneyUtils.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/common/sendmoney/util/SendMoneyUtils.kt @@ -21,6 +21,7 @@ import com.navi.pay.entry.NaviPayActivityDataProvider import com.navi.pay.management.common.sendmoney.model.view.PayeeEntity import com.navi.pay.management.common.sendmoney.model.view.SendMoneyRegexValidationFailureType import com.navi.pay.management.common.sendmoney.model.view.SendMoneyRegexValidationRule +import com.navi.pay.management.common.sendmoney.model.view.SendMoneyScreenSource import com.navi.pay.management.common.sendmoney.model.view.UpiTransactionType import com.navi.pay.utils.isAsciiDigit import com.navi.rr.common.models.OfferData @@ -88,7 +89,8 @@ object SendMoneyUtils { type = bundle.getString(TRANSACTION_TYPE).orEmpty(), defaultType = UpiTransactionType.INTENT_PAY, ), - sendMoneyScreenSource = bundle.getParcelable(SEND_MONEY_SCREEN_SOURCE), + sendMoneyScreenSource = + bundle.getParcelable(SEND_MONEY_SCREEN_SOURCE) ?: SendMoneyScreenSource.Default, ) } } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/onboarding/binding/viewmodel/NaviPayOnboardingViewModel.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/onboarding/binding/viewmodel/NaviPayOnboardingViewModel.kt index c123d5c475..e4febec73c 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/onboarding/binding/viewmodel/NaviPayOnboardingViewModel.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/onboarding/binding/viewmodel/NaviPayOnboardingViewModel.kt @@ -359,9 +359,7 @@ constructor( private var generatedOtpToken: String = EMPTY - private var isBindingEligibleForSmv = false - - private var isBindingEligibleForRsms = false + private var bindingType: BindingType = BindingType.SMS private val locationPermissionRequestResult = Channel(capacity = 1) @@ -696,9 +694,9 @@ constructor( viewModelScope.safeLaunch(coroutineDispatcherProvider.io) { handleDropOffFunnel(funnelStep = FunnelStep.BINDING_STARTED) updateShowButtonLoader(true) - isBindingEligibleForRsms = getRsmsEligibilityStatus() - + val isBindingEligibleForRsms = getRsmsEligibilityStatus() if (isBindingEligibleForRsms) { + bindingType = BindingType.RSMS() startSimBinding() return@safeLaunch } @@ -710,7 +708,7 @@ constructor( return@safeLaunch } - isBindingEligibleForSmv = true + bindingType = BindingType.SMV // SMV is eligible cases if (!smvEligibilityStatus.isSmsPermissionEnabled) { @@ -931,7 +929,7 @@ constructor( onBindingError(bindDeviceAPIResponse) } - if (isBindingEligibleForRsms) { + if (bindingType is BindingType.RSMS) { markRsmsTriggeredAndFailed() } @@ -961,9 +959,9 @@ constructor( merchantCustomerId = merchantCustomerId, ) - if (isBindingEligibleForRsms) { + if (bindingType is BindingType.RSMS) { processBindDeviceResponseForRsms() - } else if (isBindingEligibleForSmv) { + } else if (bindingType is BindingType.SMV) { processBindDeviceResponseForSmv() } else { processBindDeviceResponseForSms(provider = provider) @@ -984,15 +982,11 @@ constructor( version = Build.VERSION.SDK_INT.toString(), ) - val bindingType = - if (isBindingEligibleForRsms) BindingType.RSMS().name() - else if (isBindingEligibleForSmv) BindingType.SMV.name() else BindingType.SMS.name() - naviPayAnalytics.onBindDeviceCallForBinding( deviceAttributes = deviceAttributes, onboardingSource = onboardingSource.value, naviPaySessionAttributes = getNaviPaySessionAttributes(), - bindingType = bindingType, + bindingType = bindingType.name(), ) return BindDeviceRequest( @@ -1007,9 +1001,9 @@ constructor( .getCustomerOnboardingEntity(onboardingPsp) ?.merchantCustomerId .takeIf { it?.isNotBlank() == true }, - bindingType = bindingType, + bindingType = bindingType.name(), rsmsBindingRequestData = - if (bindingType != BindingType.RSMS().name()) null + if (bindingType !is BindingType.RSMS) null else RsmsBindingRequestData( integrityToken = @@ -1022,7 +1016,7 @@ constructor( ) ), isAutoOtpPermitted = - if (bindingType == BindingType.RSMS().name()) true else isConsentGivenForOtpAutoRead, + if (bindingType is BindingType.RSMS) true else isConsentGivenForOtpAutoRead, ) } @@ -2086,6 +2080,9 @@ constructor( fun onRsmsAutoReadOtpReceived(otp: String, senderAddress: String?) { viewModelScope.launch(Dispatchers.IO) { + if (bindingType !is BindingType.RSMS) { + return@launch + } updateGeneratedOtp(otp = otp) updateAutoReadOtpVerificationState(AutoReadOtpVerificationState.VERIFYING) otpTimerJob?.cancel()