From ab9f21dd1d81b163095f07804d740fe4d0146957 Mon Sep 17 00:00:00 2001 From: Anmol Agrawal Date: Tue, 27 May 2025 18:53:08 +0530 Subject: [PATCH] NTP-66601 | Anmol Agrawal | Adding events for old turbocheckout (#16326) --- .../custom_payments/CustomPaymentActivity.kt | 2 +- .../home/compose/activity/HomePageActivity.kt | 5 +- .../investmentTab/InvestmentsScreenHelper.kt | 10 + .../payment/fragments/PaymentBaseFragment.kt | 21 +- .../naviapp/payment/viewmodel/PaymentVM.kt | 7 +- .../PaymentBehaviourActivity.kt | 2 +- .../common/fragment/OrderStatusFragment.kt | 2 +- .../fragments/PaymentSummaryFragment.kt | 2 +- .../fundbuy/helpers/PaymentScreenHelper.kt | 11 + .../com/navi/gold/ui/BasePaymentActivity.kt | 4 +- .../navi/gold/ui/DigitalGoldHomeActivity.kt | 1 + .../gold/ui/DigitalGoldSetupSipFragment.kt | 1 + .../gold/ui/DigitalGoldSipDetailsFragment.kt | 1 + .../health/activity/PaymentActivity.kt | 11 +- .../ui/NaviPaymentScreenActivity.kt | 3 +- .../paymentscreen/ui/PaymentMethodFragment.kt | 10 + .../ui/PaymentSearchBankFragment.kt | 2 + .../paymentscreen/utils/PaymentNavigator.kt | 34 +- .../main/java/com/navi/payment/utils/Utils.kt | 8 + .../ui/lending/LEPaymentHandlerActivity.kt | 3 +- .../viewmodel/base/PaymentManager.kt | 298 +++++------------- 21 files changed, 187 insertions(+), 251 deletions(-) diff --git a/android/app/src/main/java/com/naviapp/custom_payments/CustomPaymentActivity.kt b/android/app/src/main/java/com/naviapp/custom_payments/CustomPaymentActivity.kt index 50e12d7980..14d18c1582 100644 --- a/android/app/src/main/java/com/naviapp/custom_payments/CustomPaymentActivity.kt +++ b/android/app/src/main/java/com/naviapp/custom_payments/CustomPaymentActivity.kt @@ -182,7 +182,7 @@ class CustomPaymentActivity : otherSourceOfFunds, partPrePaymentRescheduleType, ) - paymentVM.initiatePayment(data) + paymentVM.initiatePayment(data, screenName) } private fun observePaymentListener() { diff --git a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt index 1495a8e3f1..02ae053521 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt @@ -1205,7 +1205,8 @@ class HomePageActivity : description = data.description, provider = data.provider, status = data.status, - ) + ), + source = screenName, ) apiPollInit() } else { @@ -1571,7 +1572,7 @@ class HomePageActivity : partPrePaymentRescheduleType, ) this.amount = amount - paymentVM.initiatePayment(data) + paymentVM.initiatePayment(data, screenName) } override fun onPaymentMethodSuccess(paymentMethodResponse: PaymentMethodResponse?) { diff --git a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreenHelper.kt b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreenHelper.kt index b629e9453a..33405f3515 100644 --- a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreenHelper.kt +++ b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreenHelper.kt @@ -49,6 +49,7 @@ import com.navi.common.utils.toCtaData import com.navi.naviwidgets.models.FooterButtonState import com.navi.payment.model.initiatesdk.PaymentPrefetchMethodRequest import com.navi.payment.utils.PaymentAnalytics +import com.navi.payment.utils.sendNaviPMTEvent import com.navi.paymentclients.viewmodel.base.PaymentManager import com.naviapp.dashboard.viewmodels.DashboardSharedVM import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper @@ -519,6 +520,14 @@ class InvestmentsScreenHelper { investmentsTabVm.autopayPaymentInitiateData = response dashboardSharedVM.isAmcPayment = true if (response?.syncFlow.orFalse()) { + sendNaviPMTEvent( + "InvestmentsScreenHelper_oldPaymentFlow", + mapOf( + "token" to response?.tokenDetails?.naviSdkToken.orEmpty(), + "sourceActivity" to activity.javaClass.simpleName, + "ctaData" to ctaData.toString(), + ), + ) dashboardSharedVM.isSyncFlow = true if (response?.tokenDetails?.naviSdkToken.isNotNullAndNotEmpty()) { dashboardSharedVM.syncFlowPaymentInitStartTime = System.currentTimeMillis() @@ -528,6 +537,7 @@ class InvestmentsScreenHelper { paymentManager.getPaymentMethodsV2( response?.tokenDetails?.naviSdkToken!!, PaymentPrefetchMethodRequest(), + source = "InvestmentsScreenHelper", ) } } diff --git a/android/app/src/main/java/com/naviapp/payment/fragments/PaymentBaseFragment.kt b/android/app/src/main/java/com/naviapp/payment/fragments/PaymentBaseFragment.kt index d57c70e910..5103af4190 100644 --- a/android/app/src/main/java/com/naviapp/payment/fragments/PaymentBaseFragment.kt +++ b/android/app/src/main/java/com/naviapp/payment/fragments/PaymentBaseFragment.kt @@ -66,6 +66,7 @@ import com.navi.payment.utils.Constants.PAYMENT_METHOD_REQUEST_CODE import com.navi.payment.utils.Constants.PAYMENT_STATUS import com.navi.payment.utils.PaymentAnalytics import com.navi.payment.utils.PaymentSource +import com.navi.payment.utils.sendNaviPMTEvent import com.navi.paymentclients.model.Amount as PMSAmount import com.navi.paymentclients.model.InitiatePaymentRequest as PMSInitiatePaymentRequest import com.navi.paymentclients.viewmodel.base.PaymentManager @@ -194,6 +195,7 @@ abstract class PaymentBaseFragment : BaseFragment(), PaymentClickListener, Payme return showLoader() NaviAnalytics.naviAnalytics.Payment().onPlPaymentInitiatePaymentCalled(loanType) + sendNaviPMTEvent("PaymentBaseFragment_initiatePayment") paymentVM.setIsPaymentLoaderShowing(true) val data = PMSInitiatePaymentRequest( @@ -206,7 +208,7 @@ abstract class PaymentBaseFragment : BaseFragment(), PaymentClickListener, Payme partPrePaymentRescheduleType, ) this.amount = amount - paymentVM.initiatePayment(data) + paymentVM.initiatePayment(data, screenName) } fun fetchPaymentFailureBottomSheetData( @@ -245,6 +247,7 @@ abstract class PaymentBaseFragment : BaseFragment(), PaymentClickListener, Payme sharedVM = ViewModelProvider(it).get(DashboardSharedVM::class.java) sharedVM?.let { sharedVM -> observePgRepaymentStatus(sharedVM) } } + triggerDevLandEvent() } private fun observePgRepaymentStatus(sharedVm: DashboardSharedVM) { @@ -266,7 +269,8 @@ abstract class PaymentBaseFragment : BaseFragment(), PaymentClickListener, Payme description = data.description, provider = data.provider, status = data.status, - ) + ), + screenName, ) apiPollInit() } else { @@ -384,6 +388,15 @@ abstract class PaymentBaseFragment : BaseFragment(), PaymentClickListener, Payme ) ) } else { + sendNaviPMTEvent( + "PaymentBaseFragment_observeInitPaymentRequestData", + mapOf( + "sourceActivity" to it::class.java.simpleName, + "token" to data?.tokenDetails?.token.orEmpty(), + "initiatePaymentRequest" to + paymentVM.paymentInitiateRequest.toString(), + ), + ) this.repaymentType = data?.repaymentType.orEmpty() paymentManager.init( token = data?.tokenDetails?.token.orEmpty(), @@ -790,6 +803,10 @@ abstract class PaymentBaseFragment : BaseFragment(), PaymentClickListener, Payme ) safelyShowDialogFragment(paymentSuccessFragment, PaymentMethodSuccessFragment.TAG) } + + private fun triggerDevLandEvent() { + NaviTrackEvent.trackEventOnClickStream(eventName = "Dev_${screenName}_Landed") + } } enum class PaymentType { diff --git a/android/app/src/main/java/com/naviapp/payment/viewmodel/PaymentVM.kt b/android/app/src/main/java/com/naviapp/payment/viewmodel/PaymentVM.kt index ef9a6c20e0..8faf801af7 100644 --- a/android/app/src/main/java/com/naviapp/payment/viewmodel/PaymentVM.kt +++ b/android/app/src/main/java/com/naviapp/payment/viewmodel/PaymentVM.kt @@ -30,6 +30,7 @@ import com.navi.payment.paymenthandler.model.PaymentStatusData import com.navi.payment.paymenthandler.model.Prefill import com.navi.payment.paymenthandler.model.SyncPaymentResponse import com.navi.payment.utils.PaymentAnalytics +import com.navi.payment.utils.sendNaviPMTEvent import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.models.request.ForecloseLoanRequest import com.naviapp.models.response.PartPrePaymentItemsResponse @@ -115,7 +116,11 @@ class PaymentVM : BaseVM() { isPaymentLoaderShowing = boolean } - fun initiatePayment(data: com.navi.paymentclients.model.InitiatePaymentRequest) { + fun initiatePayment( + data: com.navi.paymentclients.model.InitiatePaymentRequest, + source: String, + ) { + sendNaviPMTEvent("PaymentVM_initiatePayment", mapOf("source" to source)) coroutineScope.launch { paymentInitiateRequest = data val response = repository.initiatePayment(data) diff --git a/android/app/src/main/java/com/naviapp/payment_behaviour/PaymentBehaviourActivity.kt b/android/app/src/main/java/com/naviapp/payment_behaviour/PaymentBehaviourActivity.kt index 9609b19304..5592b22f45 100644 --- a/android/app/src/main/java/com/naviapp/payment_behaviour/PaymentBehaviourActivity.kt +++ b/android/app/src/main/java/com/naviapp/payment_behaviour/PaymentBehaviourActivity.kt @@ -167,7 +167,7 @@ class PaymentBehaviourActivity : otherSourceOfFunds, partPrePaymentRescheduleType, ) - paymentVM.initiatePayment(data) + paymentVM.initiatePayment(data, screenName) } private fun observePaymentListener() { diff --git a/android/navi-amc/src/main/java/com/navi/amc/common/fragment/OrderStatusFragment.kt b/android/navi-amc/src/main/java/com/navi/amc/common/fragment/OrderStatusFragment.kt index 8d42c8807c..964fd3572a 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/common/fragment/OrderStatusFragment.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/common/fragment/OrderStatusFragment.kt @@ -499,7 +499,7 @@ class OrderStatusFragment : paymentSharedVM.postPaymentStatus.observe(viewLifecycleOwner) { data -> data?.let { - paymentVM.postPaymentStatus(it) + paymentVM.postPaymentStatus(it, screenName) val url = getPaymentSyncFlowStatusCta(CheckerActivity.PAYMENT_CALLBACK_SYNC) val bundle = paymentScreenHelper.createBundleForPostPayment( diff --git a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/fragments/PaymentSummaryFragment.kt b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/fragments/PaymentSummaryFragment.kt index d3082f7747..853aa3b0a9 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/fragments/PaymentSummaryFragment.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/fragments/PaymentSummaryFragment.kt @@ -387,7 +387,7 @@ class PaymentSummaryFragment : AmcBaseFragment() { paymentSharedVM.postPaymentStatus.observe(viewLifecycleOwner) { data -> data?.let { - paymentVM.postPaymentStatus(it) + paymentVM.postPaymentStatus(it, screenName) val url = getPaymentSyncFlowStatusCta(CheckerActivity.PAYMENT_CALLBACK_SYNC) val bundle = paymentScreenHelper.createBundleForPostPayment( diff --git a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/helpers/PaymentScreenHelper.kt b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/helpers/PaymentScreenHelper.kt index 8b8b7c179c..464af15e96 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/helpers/PaymentScreenHelper.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/helpers/PaymentScreenHelper.kt @@ -40,6 +40,7 @@ import com.navi.payment.model.initiatesdk.PaymentPrefetchMethodRequest import com.navi.payment.nativepayment.sharedviewmodel.NaviCheckoutViewModel import com.navi.payment.utils.PaymentAnalytics import com.navi.payment.utils.PaymentSource +import com.navi.payment.utils.sendNaviPMTEvent import com.navi.paymentclients.viewmodel.base.PaymentManager import javax.inject.Inject @@ -117,6 +118,15 @@ class PaymentScreenHelper @Inject constructor(owner: ViewModelStoreOwner) { } } } else if (it.syncFlow.orFalse()) { + sendNaviPMTEvent( + "PaymentScreenHelper_oldPaymentFlow", + mapOf( + "token" to it.tokenDetails?.naviSdkToken.orEmpty(), + "source" to screenName, + "sourceActivity" to activity?.javaClass?.simpleName.orEmpty(), + "arguments" to args.toString(), + ), + ) paymentSharedVM.isSyncFlow = true if (it.tokenDetails?.naviSdkToken.isNotNullAndNotEmpty()) { paymentSharedVM.syncFlowPaymentInitStartTime = System.currentTimeMillis() @@ -126,6 +136,7 @@ class PaymentScreenHelper @Inject constructor(owner: ViewModelStoreOwner) { paymentVM.getPaymentMethodsV2( it.tokenDetails?.naviSdkToken!!, PaymentPrefetchMethodRequest(), + source = "PaymentScreenHelper", ) } } diff --git a/android/navi-gold/src/main/java/com/navi/gold/ui/BasePaymentActivity.kt b/android/navi-gold/src/main/java/com/navi/gold/ui/BasePaymentActivity.kt index 0891360f52..35750901fd 100644 --- a/android/navi-gold/src/main/java/com/navi/gold/ui/BasePaymentActivity.kt +++ b/android/navi-gold/src/main/java/com/navi/gold/ui/BasePaymentActivity.kt @@ -137,7 +137,7 @@ abstract class BasePaymentActivity : ) paymentSharedVM.triggerOnPaymentSdkExitEvent() - paymentManager.postPaymentStatusV2(statusData, true) + paymentManager.postPaymentStatusV2(statusData, screenName, true) } private fun onPaymentFailure( @@ -169,7 +169,7 @@ abstract class BasePaymentActivity : ) paymentSharedVM.triggerOnPaymentSdkExitEvent() - paymentManager.postPaymentStatusV2(statusData, true) + paymentManager.postPaymentStatusV2(statusData, screenName, true) } private fun sendPaymentCompletionEvent( diff --git a/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldHomeActivity.kt b/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldHomeActivity.kt index 1c3180febe..20e7a180ce 100644 --- a/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldHomeActivity.kt +++ b/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldHomeActivity.kt @@ -754,6 +754,7 @@ class DigitalGoldHomeActivity : paymentManager.getPaymentMethodsV2( sipCreationResponse.token!!, PaymentPrefetchMethodRequest(), + source = screenName, ) } } diff --git a/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldSetupSipFragment.kt b/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldSetupSipFragment.kt index da0f812f26..27e5ca326e 100644 --- a/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldSetupSipFragment.kt +++ b/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldSetupSipFragment.kt @@ -241,6 +241,7 @@ class DigitalGoldSetupSipFragment : paymentManager.getPaymentMethodsV2( sipCreationResponse.token!!, PaymentPrefetchMethodRequest(), + source = screenName, ) } } diff --git a/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldSipDetailsFragment.kt b/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldSipDetailsFragment.kt index f29d10bcad..3dbb884f3f 100644 --- a/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldSipDetailsFragment.kt +++ b/android/navi-gold/src/main/java/com/navi/gold/ui/DigitalGoldSipDetailsFragment.kt @@ -231,6 +231,7 @@ class DigitalGoldSipDetailsFragment : paymentManager.getPaymentMethodsV2( sipCreationResponse.token!!, PaymentPrefetchMethodRequest(), + source = screenName, ) } } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/health/activity/PaymentActivity.kt b/android/navi-insurance/src/main/java/com/navi/insurance/health/activity/PaymentActivity.kt index 3d2905a8cd..1033e8a2d2 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/health/activity/PaymentActivity.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/health/activity/PaymentActivity.kt @@ -495,6 +495,7 @@ class PaymentActivity : paymentManager.getPaymentMethodsV2( token, PaymentPrefetchMethodRequest(), + source = screenName, ) } ?: run { @@ -943,7 +944,10 @@ class PaymentActivity : } } PolicyPaymentType.AUTO_PAY_V2 -> { - paymentManager.postPaymentStatusV2(PostPaymentData(orderId = payment.orderId)) + paymentManager.postPaymentStatusV2( + PostPaymentData(orderId = payment.orderId), + screenName, + ) openNextPage((paymentVM.paymentDetailV2.value as? ResponseState.Success)?.value) } else -> { @@ -1070,7 +1074,10 @@ class PaymentActivity : policyId, ) } else if (paymentType == PolicyPaymentType.AUTO_PAY_V2) { - paymentManager.postPaymentStatusV2(PostPaymentData(orderId = payment?.orderId)) + paymentManager.postPaymentStatusV2( + PostPaymentData(orderId = payment?.orderId), + screenName, + ) if (isUserCancelled) { super.onBackPressed() } else { diff --git a/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/NaviPaymentScreenActivity.kt b/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/NaviPaymentScreenActivity.kt index a4159d5beb..b23f6c2383 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/NaviPaymentScreenActivity.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/NaviPaymentScreenActivity.kt @@ -246,7 +246,8 @@ class NaviPaymentScreenActivity : description = description, provider = provider, status = clientStatus, - ) + ), + screenName, ) } diff --git a/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/PaymentMethodFragment.kt b/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/PaymentMethodFragment.kt index d80cb678f5..48f09f20aa 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/PaymentMethodFragment.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/PaymentMethodFragment.kt @@ -129,6 +129,7 @@ import com.navi.payment.utils.Constants.PAYMENT_SDK_INIT_DATA import com.navi.payment.utils.Constants.PL_PAYMENT_RESULT_PAYLOAD import com.navi.payment.utils.Constants.SOURCE import com.navi.payment.utils.Constants.UPI_LITE_ENABLE +import com.navi.payment.utils.sendNaviPMTEvent import com.navi.payment.utils.validateUpiProcessPayload import com.navi.paymentclients.model.InitiatePaymentRequest import com.navi.paymentclients.model.thirdparty.SendMoneyResultData @@ -178,6 +179,13 @@ class PaymentMethodFragment : private var upiAction: UpiAction? = null private val upiResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + sendNaviPMTEvent( + "PaymentMethodFragment_UpiResultCallback", + mapOf( + "resultCode" to result.resultCode.toString(), + "resultData" to result.data.toString(), + ), + ) val resultResponse = result.data?.extras?.getString("NAVI_PAY_RESPONSE") sendEventWithOrderId( "navi_pmt_redirection_from_upi", @@ -264,6 +272,7 @@ class PaymentMethodFragment : } } } + sendNaviPMTEvent("PaymentMethodFragment_Landed") } private fun handleUpiAction(it: UpiAction) { @@ -635,6 +644,7 @@ class PaymentMethodFragment : viewModel.paymentsToken.orEmpty(), viewModel.paymentMethodRequest, true, + source = screenName, ) } diff --git a/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/PaymentSearchBankFragment.kt b/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/PaymentSearchBankFragment.kt index 4702c18a00..ddc1e8fbb6 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/PaymentSearchBankFragment.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/ui/PaymentSearchBankFragment.kt @@ -64,6 +64,7 @@ import com.navi.payment.paymentscreen.viewmodel.PaymentScreenSharedViewModel import com.navi.payment.paymentscreen.viewmodel.PaymentSearchBankViewModel import com.navi.payment.utils.Constants import com.navi.payment.utils.Constants.EVENT_PROPERTIES_KEY +import com.navi.payment.utils.sendNaviPMTEvent import com.navi.uitron.model.UiTronResponse import com.navi.uitron.render.UiTronRenderer import com.navi.uitron.utils.orVal @@ -89,6 +90,7 @@ class PaymentSearchBankFragment : container: ViewGroup?, savedInstanceState: Bundle?, ): View { + sendNaviPMTEvent("PaymentSearchBankFragment_Landed") return ComposeView(requireContext()).apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { Surface(modifier = Modifier.fillMaxSize()) { RenderUiTronData() } } diff --git a/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/utils/PaymentNavigator.kt b/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/utils/PaymentNavigator.kt index e892322460..406079ec75 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/utils/PaymentNavigator.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/paymentscreen/utils/PaymentNavigator.kt @@ -9,7 +9,6 @@ package com.navi.payment.paymentscreen.utils import android.app.Activity import android.os.Bundle -import android.util.Log import com.google.gson.Gson import com.navi.common.utils.TemporaryStorageHelper import com.navi.payment.model.common.PaymentSdkInitParams @@ -27,6 +26,7 @@ import com.navi.payment.utils.Constants.MINI_PAYMENT_SCREEN import com.navi.payment.utils.Constants.PAYMENTS import com.navi.payment.utils.Constants.SOURCE import com.navi.payment.utils.getNaviPaymentScreenCtaWithFragmentUrl +import com.navi.payment.utils.sendNaviPMTEvent import com.navi.paymentclients.model.InitiatePaymentRequest import com.navi.uitron.model.UiTronResponse import com.navi.uitron.utils.isNull @@ -73,6 +73,14 @@ constructor( this?.content = screenContent this?.content?.paymentLoaderConfig = null } + sendNaviPMTEvent( + "PaymentNavigator_openPaymentScreen", + mapOf( + "source" to paymentSdkInitParams.paymentSource, + "sourceActivity" to activityRef?.get()?.javaClass?.simpleName.orEmpty(), + "paymentSdkInitParams" to paymentSdkInitParams.toString(), + ), + ) NaviPaymentDeeplinkNavigator.navigate( activity = activityRef?.get(), ctaData = getNaviPaymentScreenCtaWithFragmentUrl(), @@ -108,24 +116,24 @@ constructor( clientScreenOwner: ClientScreenOwner? = null, ) { if (paymentSdkInitParams?.token.isNullOrEmpty() || payload.isNull()) { - Log.d( - "PAYMENT_SDK-->", - "Payment token ${paymentSdkInitParams?.token} payload null: ${payload}", - ) Timber.e("PAYMENT_SDK", "Couldn't load payment sdk due to incorrect screen definition") return } - Log.d( - "PAYMENT_SDK-->", - "Payment token ${paymentSdkInitParams?.token} payload null: ${payload}", + sendNaviPMTEvent( + "PaymentNavigator_launchOrNavigateFromPaymentSdk", + mapOf( + "source" to paymentSdkInitParams?.paymentSource.orEmpty(), + "sourceActivity" to + clientScreenOwner?.getActivity()?.javaClass?.simpleName.orEmpty(), + "sourceFragment" to + clientScreenOwner?.getFragment()?.javaClass?.simpleName.orEmpty(), + "targetScreen" to paymentPayloadProcessor.getScreenType(payload), + "paymentSdkInitParams" to paymentSdkInitParams.toString(), + ), ) - Log.d("PAYMENT_SDK-->", "Screen type ${paymentPayloadProcessor.getScreenType(payload)}") + when (paymentPayloadProcessor.getScreenType(payload)) { MINI_PAYMENT_SCREEN -> { - Log.d( - "PAYMENT_SDK-->", - "SDK params ${paymentSdkInitParams} ${paymentPayloadProcessor.getResultPayloadBasedOnType(payload)}", - ) paymentScreenController.openBottomSheet( paymentSdkInitParams, payload = diff --git a/android/navi-payment/src/main/java/com/navi/payment/utils/Utils.kt b/android/navi-payment/src/main/java/com/navi/payment/utils/Utils.kt index 631172ead8..8e3f504df4 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/utils/Utils.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/utils/Utils.kt @@ -8,6 +8,7 @@ package com.navi.payment.utils import com.cashfree.pg.ui.api.CFPaymentComponent +import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.AppServiceManager import com.navi.base.model.CtaData import com.navi.base.utils.BaseUtils @@ -201,3 +202,10 @@ fun getArcNudgeBottomSheetCampaignTitle(paymentSource: String?, thresholdInDays: context.getString(NaviPayR.string.np_arc_info_bottom_sheet_campaign_title, thresholdInDays) } } + +fun sendNaviPMTEvent(eventNameSuffix: String, eventAttributes: Map = emptyMap()) { + NaviTrackEvent.trackEventOnClickStream( + eventName = "NaviPMT_${eventNameSuffix}", + eventValues = eventAttributes, + ) +} diff --git a/android/navi-payment/src/main/java/com/navi/paymentclients/ui/lending/LEPaymentHandlerActivity.kt b/android/navi-payment/src/main/java/com/navi/paymentclients/ui/lending/LEPaymentHandlerActivity.kt index eea8ce6158..1ac9f93dc2 100644 --- a/android/navi-payment/src/main/java/com/navi/paymentclients/ui/lending/LEPaymentHandlerActivity.kt +++ b/android/navi-payment/src/main/java/com/navi/paymentclients/ui/lending/LEPaymentHandlerActivity.kt @@ -540,7 +540,8 @@ class LEPaymentHandlerActivity : description = description, status = status, provider = provider, - ) + ), + screenName, ) initApiPollingAndFirebase() } else { diff --git a/android/navi-payment/src/main/java/com/navi/paymentclients/viewmodel/base/PaymentManager.kt b/android/navi-payment/src/main/java/com/navi/paymentclients/viewmodel/base/PaymentManager.kt index cd9b66f6e8..11903dab89 100644 --- a/android/navi-payment/src/main/java/com/navi/paymentclients/viewmodel/base/PaymentManager.kt +++ b/android/navi-payment/src/main/java/com/navi/paymentclients/viewmodel/base/PaymentManager.kt @@ -9,12 +9,7 @@ package com.navi.paymentclients.viewmodel.base import android.app.Activity import android.content.Intent -import android.net.Uri -import android.util.Log import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData @@ -35,7 +30,6 @@ import com.navi.payment.cashfree.CashFreeHelper import com.navi.payment.listener.PaymentListener import com.navi.payment.listener.PaymentResultListener import com.navi.payment.listener.RPDListener -import com.navi.payment.model.RpdPaymentDetails import com.navi.payment.model.clientmodels.PaymentEvent import com.navi.payment.model.clientmodels.PostPaymentData import com.navi.payment.model.clientmodels.juspay.JuspayUPIFetchAction @@ -63,8 +57,6 @@ import com.navi.payment.repository.PaymentRepository import com.navi.payment.repository.thirdparty.ThirdPartyRepo import com.navi.payment.utils.Constants import com.navi.payment.utils.Constants.CLIENT_POLLING_REQUIRED -import com.navi.payment.utils.Constants.PAYMENT_SDK_INIT_TAG -import com.navi.payment.utils.Constants.UPILINK import com.navi.payment.utils.PaymentAnalytics import com.navi.payment.utils.PaymentAnalytics.EMPTY import com.navi.payment.utils.PaymentAnalytics.FAILURE @@ -72,17 +64,14 @@ import com.navi.payment.utils.PaymentAnalytics.PAYMENT_ID import com.navi.payment.utils.PaymentAnalytics.PAYMENT_METHOD_FETCH import com.navi.payment.utils.PaymentAnalytics.PAYMENT_SDK_INIT import com.navi.payment.utils.PaymentAnalytics.PAYMENT_SDK_LOAD -import com.navi.payment.utils.PaymentAnalytics.PREPARE_RPD_FAILED import com.navi.payment.utils.PaymentAnalytics.PROVIDER -import com.navi.payment.utils.PaymentAnalytics.REASON import com.navi.payment.utils.PaymentAnalytics.STATUS import com.navi.payment.utils.PaymentAnalytics.SUCCESS import com.navi.payment.utils.PaymentAnalytics.SYNC import com.navi.payment.utils.PaymentAnalytics.TRUE -import com.navi.payment.utils.PaymentSdkActionType.PAYMENTS_SDK_INIT import com.navi.payment.utils.getErrorData import com.navi.payment.utils.getInstalledUpiApps -import com.navi.payment.utils.postTokenInitFailureError +import com.navi.payment.utils.sendNaviPMTEvent import com.navi.payment.utils.toCashFreeConfig import com.navi.payment.utils.toDigioResponseData import com.navi.payment.utils.toRazorpayMandateData @@ -115,11 +104,7 @@ class PaymentManager( private var actionType: String? = null private var paymentProvider: Any? = null private var paymentMethodResponse: PaymentMethodResponse? = null - private var rpdPaymentDetails: RpdPaymentDetails? = null private var naviSdkToken: String? = null - private var rpdSdkToken: String? = null - private var rpdMethodId: String? = null - private var rpdUpiIntent: ActivityResultLauncher? = null private var clientRequestId: String? = null private var disableUpiCollectFlow: Boolean? = null private val paymentScreenAnalytics by lazy { @@ -173,24 +158,24 @@ class PaymentManager( this.initiatePaymentRequest = initiatePaymentRequest this.paymentProvider = razorPaySDK this.optimisationDisable = optimisationDisable + sendNaviPMTEvent( + "PaymentManager_init", + mapOf( + "activity" to activity::class.java.simpleName, + "paymentInitiateConfig" to paymentInitiateConfig.name, + "token" to token, + "optimisationDisable" to optimisationDisable.toString(), + ), + ) fetchPaymentsToken(token, paymentInitiateConfig) } - fun initPaymentsSdk( - paymentSdkInitParams: PaymentSdkInitParams?, - paymentResultListener: PaymentResultListener, - activityResultLauncher: ActivityResultLauncher? = null, - ) { - this.paymentResultListener = paymentResultListener - this.activityResultLauncher = activityResultLauncher - this.clientRequestId = paymentSdkInitParams?.requestId - if (paymentSdkInitParams?.requestId.isNotNullAndNotEmpty()) { - _clientRequestIdCache.value = paymentSdkInitParams?.requestId - } - handlePaymentSDKWithToken(paymentSdkInitParams) - } - private fun fetchPaymentsToken(token: String, paymentInitiateConfig: PaymentInitiateConfig) { + sendNaviPMTEvent( + "PaymentManager_fetchPaymentsToken", + mapOf("paymentInitiateConfig" to paymentInitiateConfig.name, "token" to token), + ) + when (paymentInitiateConfig) { PaymentInitiateConfig.S2S_INTEGRATION -> { prefetchPaymentMethodDetails(token) @@ -204,22 +189,6 @@ class PaymentManager( } } - private fun handlePaymentSDKWithToken(paymentSdkInitParams: PaymentSdkInitParams?) { - if (paymentSdkInitParams?.token.isNullOrEmpty()) { - paymentResultListener?.onResultFailed(postTokenInitFailureError()) - return - } - - // initiate Payment SDK - paymentSdkInit(paymentSdkInitParams) - } - - fun initRPD(token: String, methodId: String, activity: Activity, listener: RPDListener?) { - this.activityRef = WeakReference(activity) - this.rpdListener = listener - fetchRPDTokenDetails(token, methodId) - } - fun initActivity(activity: Activity) { this.activityRef = WeakReference(activity) } @@ -228,22 +197,8 @@ class PaymentManager( this.enachHelper = enachHelper } - fun prepareForRpd(fragment: Fragment?, activity: Activity?) { - try { - registerUpiIntentCallBack(fragment, activity) - } catch (e: Exception) { - sendEvent( - PaymentAnalyticsEvent( - eventName = PREPARE_RPD_FAILED, - extraAttributes = - mapOf(STATUS to FAILURE, SYNC to TRUE, REASON to e.message.toString()), - ) - ) - e.log() - } - } - private fun fetchTokenDetails(token: String, optimisationDisable: Boolean) { + sendNaviPMTEvent("PaymentManager_fetchTokenDetails") viewModelScope.launch(Dispatchers.IO) { setNaviSdkToken(token) val response = repository.fetchTokenDetails(token) @@ -289,50 +244,13 @@ class PaymentManager( } } - private fun fetchRPDTokenDetails(token: String, methodId: String) { - viewModelScope.launch(Dispatchers.IO) { - rpdSdkToken = token - rpdMethodId = methodId - val response = repository.fetchPaymentMethodDetails(token, methodId) - launch(Dispatchers.Main) { - if (response.isNotNull() && response.data.isNotNull()) { - rpdPaymentDetails = response.data - sendEvent( - PaymentAnalyticsEvent( - eventName = PAYMENT_METHOD_FETCH, - extraAttributes = - mapOf( - STATUS to SUCCESS, - PAYMENT_ID to - rpdPaymentDetails?.tokenDetails?.requestId.orEmpty(), - SYNC to TRUE, - ), - ) - ) - rpdListener?.onRpdPaymentMethodSuccess(rpdPaymentDetails) - onStartRpd() - } else { - sendEvent( - PaymentAnalyticsEvent( - eventName = PAYMENT_METHOD_FETCH, - extraAttributes = - mapOf( - STATUS to FAILURE, - PAYMENT_ID to - rpdPaymentDetails?.tokenDetails?.requestId.orEmpty(), - SYNC to TRUE, - ), - ) - ) - rpdListener?.onRpdPaymentMethodFailure(response.errors) - clear() - } - } - } - } - - fun postPaymentStatus(data: PostPaymentData) { + fun postPaymentStatus(data: PostPaymentData, source: String) { clear() + sendNaviPMTEvent( + "PaymentManager_postPaymentStatus", + mapOf("source" to source, "data" to data.toString()), + ) + viewModelScope.launch(Dispatchers.IO) { getNaviSdkToken()?.let { repository.postPaymentDetails(getSignalPaymentData(data), it) } } @@ -360,14 +278,30 @@ class PaymentManager( } } - fun postPaymentStatusV2(data: PostPaymentData, useDataForSignalName: Boolean = false) { + fun postPaymentStatusV2( + data: PostPaymentData, + source: String, + useDataForSignalName: Boolean = false, + ) { clear() + sendNaviPMTEvent( + "PaymentManager_postPaymentStatusV2", + mapOf("source" to source, "data" to data.toString()), + ) viewModelScope.launch(Dispatchers.IO) { postPaymentStatusV2(naviSdkToken, data, useDataForSignalName) } } private fun initializePayment(response: PaymentMethodResponse, optimisationDisable: Boolean) { + sendNaviPMTEvent( + "PaymentManager_initializePayment", + mapOf( + "provider" to response.methodDetails?.provider.orEmpty(), + "optimisationDisable" to optimisationDisable.toString(), + "paymentMethodResponse" to response.toString(), + ), + ) actionType = response.actionType if (paymentProvider == null || optimisationDisable) { sendEvent( @@ -432,6 +366,13 @@ class PaymentManager( sdkIntegrationConfig: SDKIntegrationConfig, activityReference: WeakReference, ) { + sendNaviPMTEvent( + "PaymentManager_startSDKPayment", + mapOf( + "activityReference" to activityReference.get()?.javaClass?.simpleName.orEmpty(), + "sdkIntegrationConfig" to sdkIntegrationConfig.toString(), + ), + ) setNaviSdkToken(sdkIntegrationConfig.naviSdkToken) setPaymentMethodResponse(sdkIntegrationConfig.paymentMethodResponse) setActivityReference(activityReference) @@ -439,6 +380,7 @@ class PaymentManager( } private fun onStartPayment(optimisationDisable: Boolean) { + sendNaviPMTEvent("PaymentManager_onStartPayment") paymentMethodResponse?.let { data -> initializePayment(data, optimisationDisable) sendEvent( @@ -513,57 +455,6 @@ class PaymentManager( } } - private fun onStartRpd() { - rpdPaymentDetails?.let { it.methodDetails?.get(UPILINK)?.let { launchUpiIntent(it) } } - } - - private fun registerUpiIntentCallBack(fragment: Fragment?, activity: Activity?) { - fragment?.let { - rpdUpiIntent = - it.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == Activity.RESULT_OK) { - rpdListener?.onRpdSuccess(rpdPaymentDetails?.tokenDetails?.requestId) - postRpdPaymentMethodStatus() - } else { - rpdListener?.onRpdFailure() - } - } - } - ?: (activity as? AppCompatActivity)?.let { - rpdUpiIntent = - it.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == Activity.RESULT_OK) { - rpdListener?.onRpdSuccess(rpdPaymentDetails?.tokenDetails?.requestId) - postRpdPaymentMethodStatus() - } else { - rpdListener?.onRpdFailure() - } - } - } - clear() - } - - private fun launchUpiIntent(upiLink: String) { - try { - val intent = - Intent().apply { - action = Intent.ACTION_VIEW - data = Uri.parse(upiLink) - } - rpdUpiIntent?.launch(intent) - } catch (e: Exception) { - rpdListener?.onRpdFailure() - e.log() - clear() - } - } - - private fun postRpdPaymentMethodStatus() { - viewModelScope.launch(Dispatchers.IO) { - rpdSdkToken?.let { token -> repository.postPaymentMethodStatus(token, rpdMethodId) } - } - } - fun updateClientRequestIdCache(requestId: String?) { this._clientRequestIdCache.value = requestId } @@ -612,6 +503,7 @@ class PaymentManager( } private fun prefetchPaymentMethodDetails(token: String, mintToken: Boolean = false) { + sendNaviPMTEvent("PaymentManager_prefetchPaymentMethodDetails") viewModelScope.launch(Dispatchers.IO) { setNaviSdkToken(token) val response = repository.prefetchPaymentMethodDetails(token) @@ -624,33 +516,6 @@ class PaymentManager( } } - private fun paymentSdkInit(paymentSdkInitParams: PaymentSdkInitParams?) { - viewModelScope.launch(Dispatchers.IO) { - setNaviSdkToken(paymentSdkInitParams?.token!!) - Log.d("PAYMENT_SDK-->", "Entered paymentSdkInit") - paymentResultListener?.onResultLoading() - val response = repository.prefetchPaymentMethodDetails(paymentSdkInitParams.token) - Log.d("PAYMENT_SDK-->", " paymentSdkInit response ${response}") - if (response.isNotNull() && response.data.isNotNull()) { - paymentResultListener?.onResultSuccess( - convertToResultJsonObject( - type = PAYMENTS_SDK_INIT, - data = response.data, - tag = PAYMENT_SDK_INIT_TAG, - ) - ) - } else { - paymentResultListener?.onResultFailed( - response.errors?.get(0) - ?: GenericErrorResponse( - message = response.error?.message, - code = response.error?.statusCode.toString(), - ) - ) - } - } - } - private fun handlePrefetchPaymentResponse( token: String, data: PaymentPrefetchMethodDetailsResponse?, @@ -702,6 +567,7 @@ class PaymentManager( action: JuspayUPIFetchAction, mintToken: Boolean, ) { + sendNaviPMTEvent("PaymentManager_fetchUpiAppsAndGetPaymentMethods") getPaymentMethodsV2(token, constructPaymentPrefetchRequest(), mintToken) } @@ -751,7 +617,17 @@ class PaymentManager( token: String, request: PaymentPrefetchMethodRequest?, mintToken: Boolean = false, + source: String = EMPTY, ) { + sendNaviPMTEvent( + "PaymentManager_getPaymentMethodsV2", + mapOf( + "source" to source, + "token" to token, + "request" to request.toString(), + "mintToken" to mintToken.toString(), + ), + ) val paymentMethodRequest = PaymentPrefetchMethodRequest(previousScreenName = HOME) viewModelScope.launch(Dispatchers.IO) { naviSdkToken = token @@ -811,6 +687,10 @@ class PaymentManager( private fun handleSDKIntegration(data: GenericPaymentMethodResponse, mintToken: Boolean) { val response = data as? SDKIntegrationMethodDetailResponse + sendNaviPMTEvent( + "PaymentManager_handleSDKIntegration", + mapOf("data" to data.toString(), "mintToken" to mintToken.toString()), + ) viewModelScope.launch(Dispatchers.IO) { launch(Dispatchers.Main) { response?.let { @@ -842,6 +722,10 @@ class PaymentManager( request: PaymentPrefetchMethodRequest?, shouldProcessPayload: Boolean? = true, ) { + sendNaviPMTEvent( + "PaymentManager_handleOrListenS2SIntegration", + mapOf("data" to data.toString(), "request" to request.toString()), + ) val response = data as? PaymentScreenIntegrationMethodDetailResponse response?.let { if (shouldProcessPayload != null && !shouldProcessPayload) { @@ -859,42 +743,15 @@ class PaymentManager( } ?: run { handlePaymentMethodFailure(null) } } - fun fetchPaymentMethodDataV2ForComposeFlow(paymentSdkInitParams: PaymentSdkInitParams) { - if (paymentSdkInitParams.token.isEmpty()) { - // TODO: add logging here - return - } - viewModelScope.launch(Dispatchers.IO) { - setNaviSdkToken(paymentSdkInitParams.token) - _paymentIntegrationResponseFlow.emit(NaviPaymentScreenUiState.Loading) - addUpiAccountsAndOtherUpiApps(paymentSdkInitParams) - val response = - repository.getPaymentMethodsV2( - paymentSdkInitParams.token, - paymentSdkInitParams.paymentPreFetchMethodRequest - ?: PaymentPrefetchMethodRequest(previousScreenName = HOME), - ) - if (response.isNotNull() && response.data.isNotNull()) { - handlePaymentMethodV2Response( - response.data, - paymentSdkInitParams.token, - paymentSdkInitParams.paymentPreFetchMethodRequest, - paymentSdkInitParams.mintToken, - processPayload = false, - ) - } else { - handlePaymentMethodFailure(response) - } - } - } - - private fun addUpiAccountsAndOtherUpiApps(paymentSdkInitParams: PaymentSdkInitParams) {} - fun fetchPaymentMethodDataV2(paymentSdkInitParams: PaymentSdkInitParams) { if (paymentSdkInitParams.token.isEmpty()) { // TODO: add logging here return } + sendNaviPMTEvent( + "PaymentManager_fetchPaymentMethodDataV2", + mapOf("paymentSdkInitParams" to paymentSdkInitParams.toString()), + ) viewModelScope.launch(Dispatchers.IO) { setNaviSdkToken(paymentSdkInitParams.token) _paymentIntegrationResponseFlow.emit(NaviPaymentScreenUiState.Loading) @@ -923,6 +780,7 @@ class PaymentManager( token: String, request: PaymentPrefetchMethodRequest?, ) { + sendNaviPMTEvent("PaymentManager_onStartS2SPayment", mapOf("request" to request.toString())) moveToPaymentMethodScreen(response, token, request) } @@ -961,12 +819,6 @@ class PaymentManager( this.paymentListener = paymentListener } - fun setPaymentResultListener(paymentResultListener: PaymentResultListener?) { - if (paymentResultListener != null) { - this.paymentResultListener = paymentResultListener - } - } - fun setDisableUpiCollectFlowValue(disableUpiCollectFlow: Boolean?) { this.disableUpiCollectFlow = disableUpiCollectFlow } @@ -986,9 +838,9 @@ class PaymentManager( } fun setPaymentResultSuccessData(type: String, data: Any?, tag: String) { - Log.d( - "PAYMENT_SDK-->", - "payment result data: ${convertToResultJsonObject(type, data, tag)}", + sendNaviPMTEvent( + "PaymentManager_setPaymentResultSuccessData", + mapOf("type" to type, "data" to data.toString(), "tag" to tag), ) paymentResultListener?.onResultSuccess(convertToResultJsonObject(type, data, tag)) }