From e91f5fe84d5c6c15ad96d994d6a0ac5ddf9a4e7e Mon Sep 17 00:00:00 2001 From: Ararat Mnatsakanyan Date: Tue, 17 Dec 2024 17:24:57 +0100 Subject: [PATCH] Track error event when `/payments` call failed COAND-1007 --- .../ACHDirectDebitComponentProvider.kt | 1 + .../BacsDirectDebitComponentProvider.kt | 1 + .../provider/BcmcComponentProvider.kt | 1 + .../provider/BlikComponentProvider.kt | 2 ++ .../provider/BoletoComponentProvider.kt | 1 + .../provider/CardComponentProvider.kt | 2 ++ .../provider/CashAppPayComponentProvider.kt | 1 + drop-in/api/drop-in.api | 2 +- .../checkout/dropin/SessionDropInService.kt | 5 ++- .../service/BaseDropInServiceInterfaces.kt | 4 ++- .../dropin/internal/ui/DropInActivity.kt | 1 + .../dropin/internal/ui/DropInViewModel.kt | 1 + .../internal/ui/model/DropInActivityEvent.kt | 2 ++ .../provider/EContextComponentProvider.kt | 1 + .../provider/GiftCardComponentProvider.kt | 1 + .../provider/GooglePayComponentProvider.kt | 1 + .../provider/IdealComponentProvider.kt | 1 + .../InstantPaymentComponentProvider.kt | 1 + .../provider/IssuerListComponentProvider.kt | 1 + .../provider/MBWayComponentProvider.kt | 1 + .../MealVoucherFRComponentProvider.kt | 1 + .../OnlineBankingComponentProvider.kt | 1 + .../provider/PayByBankUSComponentProvider.kt | 2 ++ .../provider/PayByBankComponentProvider.kt | 1 + .../provider/SepaComponentProvider.kt | 1 + sessions-core/build.gradle | 1 + .../core/internal/SessionInteractor.kt | 15 +++++++- .../core/internal/SessionInteractorTest.kt | 36 +++++++++++++++++-- .../provider/TwintComponentProvider.kt | 1 + .../internal/provider/UPIComponentProvider.kt | 1 + 30 files changed, 85 insertions(+), 6 deletions(-) diff --git a/ach/src/main/java/com/adyen/checkout/ach/internal/provider/ACHDirectDebitComponentProvider.kt b/ach/src/main/java/com/adyen/checkout/ach/internal/provider/ACHDirectDebitComponentProvider.kt index f4ea620536..c781d60ac7 100644 --- a/ach/src/main/java/com/adyen/checkout/ach/internal/provider/ACHDirectDebitComponentProvider.kt +++ b/ach/src/main/java/com/adyen/checkout/ach/internal/provider/ACHDirectDebitComponentProvider.kt @@ -516,6 +516,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) return SessionComponentEventHandler( diff --git a/bacs/src/main/java/com/adyen/checkout/bacs/internal/provider/BacsDirectDebitComponentProvider.kt b/bacs/src/main/java/com/adyen/checkout/bacs/internal/provider/BacsDirectDebitComponentProvider.kt index 02ee7debd1..b8eaf9c493 100644 --- a/bacs/src/main/java/com/adyen/checkout/bacs/internal/provider/BacsDirectDebitComponentProvider.kt +++ b/bacs/src/main/java/com/adyen/checkout/bacs/internal/provider/BacsDirectDebitComponentProvider.kt @@ -215,6 +215,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/bcmc/src/main/java/com/adyen/checkout/bcmc/internal/provider/BcmcComponentProvider.kt b/bcmc/src/main/java/com/adyen/checkout/bcmc/internal/provider/BcmcComponentProvider.kt index 972fa7ba9a..e87684708a 100644 --- a/bcmc/src/main/java/com/adyen/checkout/bcmc/internal/provider/BcmcComponentProvider.kt +++ b/bcmc/src/main/java/com/adyen/checkout/bcmc/internal/provider/BcmcComponentProvider.kt @@ -267,6 +267,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( diff --git a/blik/src/main/java/com/adyen/checkout/blik/internal/provider/BlikComponentProvider.kt b/blik/src/main/java/com/adyen/checkout/blik/internal/provider/BlikComponentProvider.kt index 562e2fc2a2..ebdb49ccd3 100644 --- a/blik/src/main/java/com/adyen/checkout/blik/internal/provider/BlikComponentProvider.kt +++ b/blik/src/main/java/com/adyen/checkout/blik/internal/provider/BlikComponentProvider.kt @@ -318,6 +318,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( @@ -425,6 +426,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = diff --git a/boleto/src/main/java/com/adyen/checkout/boleto/internal/provider/BoletoComponentProvider.kt b/boleto/src/main/java/com/adyen/checkout/boleto/internal/provider/BoletoComponentProvider.kt index e1d2261e2e..adb7a53d3a 100644 --- a/boleto/src/main/java/com/adyen/checkout/boleto/internal/provider/BoletoComponentProvider.kt +++ b/boleto/src/main/java/com/adyen/checkout/boleto/internal/provider/BoletoComponentProvider.kt @@ -224,6 +224,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = diff --git a/card/src/main/java/com/adyen/checkout/card/internal/provider/CardComponentProvider.kt b/card/src/main/java/com/adyen/checkout/card/internal/provider/CardComponentProvider.kt index 0fdf3da6c1..b2a8e88bfa 100644 --- a/card/src/main/java/com/adyen/checkout/card/internal/provider/CardComponentProvider.kt +++ b/card/src/main/java/com/adyen/checkout/card/internal/provider/CardComponentProvider.kt @@ -291,6 +291,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, @@ -504,6 +505,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/provider/CashAppPayComponentProvider.kt b/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/provider/CashAppPayComponentProvider.kt index d076d24dce..8b61f996fb 100644 --- a/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/provider/CashAppPayComponentProvider.kt +++ b/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/provider/CashAppPayComponentProvider.kt @@ -472,6 +472,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) return SessionComponentEventHandler( diff --git a/drop-in/api/drop-in.api b/drop-in/api/drop-in.api index f303b01736..ff04806cfd 100644 --- a/drop-in/api/drop-in.api +++ b/drop-in/api/drop-in.api @@ -338,7 +338,7 @@ public final class com/adyen/checkout/dropin/SessionDropInResultContract : andro public class com/adyen/checkout/dropin/SessionDropInService : com/adyen/checkout/dropin/internal/service/BaseDropInService, com/adyen/checkout/dropin/SessionDropInServiceContract, com/adyen/checkout/dropin/internal/service/SessionDropInServiceInterface { public fun ()V - public final fun initialize (Lcom/adyen/checkout/sessions/core/SessionModel;Ljava/lang/String;Lcom/adyen/checkout/core/Environment;Z)V + public final fun initialize (Lcom/adyen/checkout/sessions/core/SessionModel;Ljava/lang/String;Lcom/adyen/checkout/core/Environment;ZLcom/adyen/checkout/components/core/internal/analytics/AnalyticsManager;)V public final fun isFlowTakenOver ()Z public fun onAdditionalDetails (Lcom/adyen/checkout/components/core/ActionComponentData;)Z public fun onBalanceCheck (Lcom/adyen/checkout/components/core/PaymentComponentState;)Z diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/SessionDropInService.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/SessionDropInService.kt index a3e438a23d..ed32883e0f 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/SessionDropInService.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/SessionDropInService.kt @@ -13,6 +13,7 @@ import com.adyen.checkout.components.core.OrderRequest import com.adyen.checkout.components.core.OrderResponse import com.adyen.checkout.components.core.PaymentComponentState import com.adyen.checkout.components.core.StoredPaymentMethod +import com.adyen.checkout.components.core.internal.analytics.AnalyticsManager import com.adyen.checkout.core.AdyenLogLevel import com.adyen.checkout.core.Environment import com.adyen.checkout.core.internal.data.api.HttpClientFactory @@ -50,7 +51,8 @@ open class SessionDropInService : BaseDropInService(), SessionDropInServiceInter sessionModel: SessionModel, clientKey: String, environment: Environment, - isFlowTakenOver: Boolean + isFlowTakenOver: Boolean, + analyticsManager: AnalyticsManager, ) { val httpClient = HttpClientFactory.getHttpClient(environment) val sessionService = SessionService(httpClient) @@ -61,6 +63,7 @@ open class SessionDropInService : BaseDropInService(), SessionDropInServiceInter ), sessionModel = sessionModel, isFlowTakenOver = isFlowTakenOver, + analyticsManager = analyticsManager, ) this.isFlowTakenOver = isFlowTakenOver diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/internal/service/BaseDropInServiceInterfaces.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/internal/service/BaseDropInServiceInterfaces.kt index c464076a6e..f65d0f9d56 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/internal/service/BaseDropInServiceInterfaces.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/internal/service/BaseDropInServiceInterfaces.kt @@ -14,6 +14,7 @@ import com.adyen.checkout.components.core.LookupAddress import com.adyen.checkout.components.core.OrderRequest import com.adyen.checkout.components.core.PaymentComponentState import com.adyen.checkout.components.core.StoredPaymentMethod +import com.adyen.checkout.components.core.internal.analytics.AnalyticsManager import com.adyen.checkout.core.Environment import com.adyen.checkout.dropin.BaseDropInServiceResult import com.adyen.checkout.sessions.core.SessionModel @@ -39,6 +40,7 @@ internal interface SessionDropInServiceInterface : BaseDropInServiceInterface { sessionModel: SessionModel, clientKey: String, environment: Environment, - isFlowTakenOver: Boolean + isFlowTakenOver: Boolean, + analyticsManager: AnalyticsManager, ) } diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/DropInActivity.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/DropInActivity.kt index 370c0dde13..4d5bbea290 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/DropInActivity.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/DropInActivity.kt @@ -585,6 +585,7 @@ internal class DropInActivity : clientKey = event.clientKey, environment = event.environment, isFlowTakenOver = event.isFlowTakenOver, + analyticsManager = event.analyticsManager, ) } diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/DropInViewModel.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/DropInViewModel.kt index 2e22d9d93a..d7f5264870 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/DropInViewModel.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/DropInViewModel.kt @@ -203,6 +203,7 @@ internal class DropInViewModel( clientKey = dropInParams.clientKey, environment = dropInParams.environment, isFlowTakenOver = isSessionsFlowTakenOver, + analyticsManager = analyticsManager, ) sendEvent(event) } diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/model/DropInActivityEvent.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/model/DropInActivityEvent.kt index 3ad3d52952..5b5eeca3d0 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/model/DropInActivityEvent.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/internal/ui/model/DropInActivityEvent.kt @@ -11,6 +11,7 @@ package com.adyen.checkout.dropin.internal.ui.model import com.adyen.checkout.components.core.OrderRequest import com.adyen.checkout.components.core.PaymentComponentState import com.adyen.checkout.components.core.PaymentMethod +import com.adyen.checkout.components.core.internal.analytics.AnalyticsManager import com.adyen.checkout.core.Environment import com.adyen.checkout.sessions.core.SessionModel @@ -25,6 +26,7 @@ internal sealed class DropInActivityEvent { val clientKey: String, val environment: Environment, val isFlowTakenOver: Boolean, + val analyticsManager: AnalyticsManager, ) : DropInActivityEvent() } diff --git a/econtext/src/main/java/com/adyen/checkout/econtext/internal/provider/EContextComponentProvider.kt b/econtext/src/main/java/com/adyen/checkout/econtext/internal/provider/EContextComponentProvider.kt index cd384bb5d7..48edac41ac 100644 --- a/econtext/src/main/java/com/adyen/checkout/econtext/internal/provider/EContextComponentProvider.kt +++ b/econtext/src/main/java/com/adyen/checkout/econtext/internal/provider/EContextComponentProvider.kt @@ -223,6 +223,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/giftcard/src/main/java/com/adyen/checkout/giftcard/internal/provider/GiftCardComponentProvider.kt b/giftcard/src/main/java/com/adyen/checkout/giftcard/internal/provider/GiftCardComponentProvider.kt index 7471f9ceb9..ce2086c22c 100644 --- a/giftcard/src/main/java/com/adyen/checkout/giftcard/internal/provider/GiftCardComponentProvider.kt +++ b/giftcard/src/main/java/com/adyen/checkout/giftcard/internal/provider/GiftCardComponentProvider.kt @@ -232,6 +232,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionsGiftCardComponentEventHandler = SessionsGiftCardComponentEventHandler( diff --git a/googlepay/src/main/java/com/adyen/checkout/googlepay/internal/provider/GooglePayComponentProvider.kt b/googlepay/src/main/java/com/adyen/checkout/googlepay/internal/provider/GooglePayComponentProvider.kt index 89d484ec28..5ff0f2953a 100644 --- a/googlepay/src/main/java/com/adyen/checkout/googlepay/internal/provider/GooglePayComponentProvider.kt +++ b/googlepay/src/main/java/com/adyen/checkout/googlepay/internal/provider/GooglePayComponentProvider.kt @@ -231,6 +231,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( diff --git a/ideal/src/main/java/com/adyen/checkout/ideal/internal/provider/IdealComponentProvider.kt b/ideal/src/main/java/com/adyen/checkout/ideal/internal/provider/IdealComponentProvider.kt index c7decf421f..90eb7ab0ae 100644 --- a/ideal/src/main/java/com/adyen/checkout/ideal/internal/provider/IdealComponentProvider.kt +++ b/ideal/src/main/java/com/adyen/checkout/ideal/internal/provider/IdealComponentProvider.kt @@ -209,6 +209,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/instant/src/main/java/com/adyen/checkout/instant/internal/provider/InstantPaymentComponentProvider.kt b/instant/src/main/java/com/adyen/checkout/instant/internal/provider/InstantPaymentComponentProvider.kt index 5c4a9973df..5a8b955bc3 100644 --- a/instant/src/main/java/com/adyen/checkout/instant/internal/provider/InstantPaymentComponentProvider.kt +++ b/instant/src/main/java/com/adyen/checkout/instant/internal/provider/InstantPaymentComponentProvider.kt @@ -213,6 +213,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/issuer-list/src/main/java/com/adyen/checkout/issuerlist/internal/provider/IssuerListComponentProvider.kt b/issuer-list/src/main/java/com/adyen/checkout/issuerlist/internal/provider/IssuerListComponentProvider.kt index 56e1ea09fe..0024da6209 100644 --- a/issuer-list/src/main/java/com/adyen/checkout/issuerlist/internal/provider/IssuerListComponentProvider.kt +++ b/issuer-list/src/main/java/com/adyen/checkout/issuerlist/internal/provider/IssuerListComponentProvider.kt @@ -222,6 +222,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/mbway/src/main/java/com/adyen/checkout/mbway/internal/provider/MBWayComponentProvider.kt b/mbway/src/main/java/com/adyen/checkout/mbway/internal/provider/MBWayComponentProvider.kt index 74e0e524b9..8d570d9a22 100644 --- a/mbway/src/main/java/com/adyen/checkout/mbway/internal/provider/MBWayComponentProvider.kt +++ b/mbway/src/main/java/com/adyen/checkout/mbway/internal/provider/MBWayComponentProvider.kt @@ -216,6 +216,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( diff --git a/meal-voucher-fr/src/main/java/com/adyen/checkout/mealvoucherfr/internal/provider/MealVoucherFRComponentProvider.kt b/meal-voucher-fr/src/main/java/com/adyen/checkout/mealvoucherfr/internal/provider/MealVoucherFRComponentProvider.kt index 5b5abf7e91..741d3d8c79 100644 --- a/meal-voucher-fr/src/main/java/com/adyen/checkout/mealvoucherfr/internal/provider/MealVoucherFRComponentProvider.kt +++ b/meal-voucher-fr/src/main/java/com/adyen/checkout/mealvoucherfr/internal/provider/MealVoucherFRComponentProvider.kt @@ -232,6 +232,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionsGiftCardComponentEventHandler = SessionsGiftCardComponentEventHandler( diff --git a/online-banking-core/src/main/java/com/adyen/checkout/onlinebankingcore/internal/provider/OnlineBankingComponentProvider.kt b/online-banking-core/src/main/java/com/adyen/checkout/onlinebankingcore/internal/provider/OnlineBankingComponentProvider.kt index 5d4db5912f..be6eeaca76 100644 --- a/online-banking-core/src/main/java/com/adyen/checkout/onlinebankingcore/internal/provider/OnlineBankingComponentProvider.kt +++ b/online-banking-core/src/main/java/com/adyen/checkout/onlinebankingcore/internal/provider/OnlineBankingComponentProvider.kt @@ -231,6 +231,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/paybybank-us/src/main/java/com/adyen/checkout/paybybankus/internal/provider/PayByBankUSComponentProvider.kt b/paybybank-us/src/main/java/com/adyen/checkout/paybybankus/internal/provider/PayByBankUSComponentProvider.kt index c3dae00c7d..7f34fcbcc3 100644 --- a/paybybank-us/src/main/java/com/adyen/checkout/paybybankus/internal/provider/PayByBankUSComponentProvider.kt +++ b/paybybank-us/src/main/java/com/adyen/checkout/paybybankus/internal/provider/PayByBankUSComponentProvider.kt @@ -320,6 +320,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, @@ -425,6 +426,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = diff --git a/paybybank/src/main/java/com/adyen/checkout/paybybank/internal/provider/PayByBankComponentProvider.kt b/paybybank/src/main/java/com/adyen/checkout/paybybank/internal/provider/PayByBankComponentProvider.kt index 30efc33ebe..695327d899 100644 --- a/paybybank/src/main/java/com/adyen/checkout/paybybank/internal/provider/PayByBankComponentProvider.kt +++ b/paybybank/src/main/java/com/adyen/checkout/paybybank/internal/provider/PayByBankComponentProvider.kt @@ -212,6 +212,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/sepa/src/main/java/com/adyen/checkout/sepa/internal/provider/SepaComponentProvider.kt b/sepa/src/main/java/com/adyen/checkout/sepa/internal/provider/SepaComponentProvider.kt index 4c03c9b607..1b57c854e9 100644 --- a/sepa/src/main/java/com/adyen/checkout/sepa/internal/provider/SepaComponentProvider.kt +++ b/sepa/src/main/java/com/adyen/checkout/sepa/internal/provider/SepaComponentProvider.kt @@ -216,6 +216,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler = SessionComponentEventHandler( sessionInteractor = sessionInteractor, diff --git a/sessions-core/build.gradle b/sessions-core/build.gradle index e0d2ad81e7..ad2db094bd 100644 --- a/sessions-core/build.gradle +++ b/sessions-core/build.gradle @@ -37,6 +37,7 @@ dependencies { //Tests testImplementation testFixtures(project(':test-core')) + testImplementation testFixtures(project(':components-core')) testImplementation libs.androidx.test.lifecycle testImplementation libs.bundles.junit testImplementation libs.bundles.kotlin.coroutines.test diff --git a/sessions-core/src/main/java/com/adyen/checkout/sessions/core/internal/SessionInteractor.kt b/sessions-core/src/main/java/com/adyen/checkout/sessions/core/internal/SessionInteractor.kt index 9cff52c7be..29000ce03b 100644 --- a/sessions-core/src/main/java/com/adyen/checkout/sessions/core/internal/SessionInteractor.kt +++ b/sessions-core/src/main/java/com/adyen/checkout/sessions/core/internal/SessionInteractor.kt @@ -15,6 +15,9 @@ import com.adyen.checkout.components.core.BalanceResult import com.adyen.checkout.components.core.OrderRequest import com.adyen.checkout.components.core.OrderResponse import com.adyen.checkout.components.core.PaymentComponentState +import com.adyen.checkout.components.core.internal.analytics.AnalyticsManager +import com.adyen.checkout.components.core.internal.analytics.ErrorEvent +import com.adyen.checkout.components.core.internal.analytics.GenericEvents import com.adyen.checkout.components.core.internal.util.StatusResponseUtils import com.adyen.checkout.core.exception.CheckoutException import com.adyen.checkout.core.exception.MethodNotImplementedException @@ -33,6 +36,7 @@ class SessionInteractor( private val sessionRepository: SessionRepository, sessionModel: SessionModel, isFlowTakenOver: Boolean, + private val analyticsManager: AnalyticsManager?, ) { @VisibleForTesting @@ -76,6 +80,14 @@ class SessionInteractor( } }, onFailure = { + paymentComponentState.data.paymentMethod?.type?.let { paymentMethodType -> + val event = GenericEvents.error( + component = paymentMethodType, + event = ErrorEvent.API_PAYMENTS, + ) + analyticsManager?.trackEvent(event) + } + return SessionCallResult.Payments.Error(throwable = it) }, ) @@ -260,7 +272,8 @@ class SessionInteractor( return if (!callWasHandled) { if (isFlowTakenOver) { throw MethodNotImplementedException( - "Sessions flow was already taken over in a previous call, $merchantMethodName should be implemented" + "Sessions flow was already taken over in a previous call, " + + "$merchantMethodName should be implemented", ) } else { internalCall() diff --git a/sessions-core/src/test/java/com/adyen/checkout/sessions/core/internal/SessionInteractorTest.kt b/sessions-core/src/test/java/com/adyen/checkout/sessions/core/internal/SessionInteractorTest.kt index 9cc6683837..c74c124848 100644 --- a/sessions-core/src/test/java/com/adyen/checkout/sessions/core/internal/SessionInteractorTest.kt +++ b/sessions-core/src/test/java/com/adyen/checkout/sessions/core/internal/SessionInteractorTest.kt @@ -18,6 +18,9 @@ import com.adyen.checkout.components.core.PaymentComponentData import com.adyen.checkout.components.core.PaymentMethodsApiResponse import com.adyen.checkout.components.core.action.Action import com.adyen.checkout.components.core.action.RedirectAction +import com.adyen.checkout.components.core.internal.analytics.ErrorEvent +import com.adyen.checkout.components.core.internal.analytics.GenericEvents +import com.adyen.checkout.components.core.internal.analytics.TestAnalyticsManager import com.adyen.checkout.components.core.internal.util.StatusResponseUtils import com.adyen.checkout.core.exception.CheckoutException import com.adyen.checkout.sessions.core.SessionModel @@ -35,7 +38,6 @@ import com.adyen.checkout.sessions.core.internal.data.model.SessionOrderResponse import com.adyen.checkout.sessions.core.internal.data.model.SessionPaymentsResponse import com.adyen.checkout.test.LoggingExtension import com.adyen.checkout.test.TestDispatcherExtension -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue @@ -51,16 +53,17 @@ import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.whenever -@OptIn(ExperimentalCoroutinesApi::class) @ExtendWith(MockitoExtension::class, TestDispatcherExtension::class, LoggingExtension::class) internal class SessionInteractorTest( @Mock private val sessionRepository: SessionRepository, ) { private lateinit var sessionInteractor: SessionInteractor + private lateinit var analyticsManager: TestAnalyticsManager @BeforeEach fun before() { + analyticsManager = TestAnalyticsManager() sessionInteractor = createSessionInteractor() } @@ -715,6 +718,34 @@ internal class SessionInteractorTest( } } + @Nested + inner class AnalyticsTest { + + @Test + fun `when payment calls returns an error then error event is tracked`() = runTest { + val exception = Exception("failed for testing") + val paymentMethodType = "scheme" + val componentState = TestComponentState( + data = PaymentComponentData( + TestPaymentMethod(type = paymentMethodType), + TEST_ORDER_REQUEST, + TEST_AMOUNT, + ), + isInputValid = true, + isReady = true, + ) + whenever(sessionRepository.submitPayment(any(), any())) doReturn Result.failure(exception) + + sessionInteractor.onPaymentsCallRequested(componentState, { false }, "") + + val expectedEvent = GenericEvents.error( + component = paymentMethodType, + event = ErrorEvent.API_PAYMENTS, + ) + analyticsManager.assertLastEventEquals(expectedEvent) + } + } + private fun createSessionInteractor( sessionModel: SessionModel = TEST_SESSION_MODEL, isFlowTakenOver: Boolean = false @@ -723,6 +754,7 @@ internal class SessionInteractorTest( sessionRepository = sessionRepository, sessionModel = sessionModel, isFlowTakenOver = isFlowTakenOver, + analyticsManager = analyticsManager, ) } diff --git a/twint/src/main/java/com/adyen/checkout/twint/internal/provider/TwintComponentProvider.kt b/twint/src/main/java/com/adyen/checkout/twint/internal/provider/TwintComponentProvider.kt index 873a476983..d43d6cb0ad 100644 --- a/twint/src/main/java/com/adyen/checkout/twint/internal/provider/TwintComponentProvider.kt +++ b/twint/src/main/java/com/adyen/checkout/twint/internal/provider/TwintComponentProvider.kt @@ -459,6 +459,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) return SessionComponentEventHandler( diff --git a/upi/src/main/java/com/adyen/checkout/upi/internal/provider/UPIComponentProvider.kt b/upi/src/main/java/com/adyen/checkout/upi/internal/provider/UPIComponentProvider.kt index 6f9acdc20b..f25ddfce22 100644 --- a/upi/src/main/java/com/adyen/checkout/upi/internal/provider/UPIComponentProvider.kt +++ b/upi/src/main/java/com/adyen/checkout/upi/internal/provider/UPIComponentProvider.kt @@ -211,6 +211,7 @@ constructor( ), sessionModel = sessionSavedStateHandleContainer.getSessionModel(), isFlowTakenOver = sessionSavedStateHandleContainer.isFlowTakenOver ?: false, + analyticsManager = analyticsManager, ) val sessionComponentEventHandler =