diff --git a/CardPayments/src/main/java/com/paypal/android/cardpayments/CardAnalytics.kt b/CardPayments/src/main/java/com/paypal/android/cardpayments/CardAnalytics.kt deleted file mode 100644 index 3be4d2792..000000000 --- a/CardPayments/src/main/java/com/paypal/android/cardpayments/CardAnalytics.kt +++ /dev/null @@ -1,101 +0,0 @@ -package com.paypal.android.cardpayments - -import com.paypal.android.corepayments.analytics.AnalyticsService - -@Suppress("TooManyFunctions") -internal class CardAnalytics(private val analyticsService: AnalyticsService) { - - // region Approve Order - fun notifyApproveOrderStarted(orderId: String) { - val eventName = "card-payments:approve-order:started" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyApproveOrderSucceeded(orderId: String) { - val eventName = "card-payments:approve-order:succeeded" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyApproveOrderFailed(orderId: String) { - val eventName = "card-payments:approve-order:failed" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyApproveOrderAuthChallengeReceived(orderId: String) { - val eventName = "card-payments:approve-order:auth-challenge-received" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyApproveOrderAuthChallengeStarted(orderId: String?) { - val eventName = "card-payments:approve-order:auth-challenge-started" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyApproveOrderAuthChallengeSucceeded(orderId: String) { - val eventName = "card-payments:approve-order:auth-challenge-succeeded" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyApproveOrderAuthChallengeCanceled(orderId: String?) { - val eventName = "card-payments:approve-order:auth-challenge-canceled" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyApproveOrderAuthChallengeFailed(orderId: String?) { - val eventName = "card-payments:approve-order:auth-challenge-failed" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyApproveOrderUnknownError(orderId: String?) { - val eventName = "card-payments:approve-order:unknown-error" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - // endregion - - // region Vault - fun notifyVaultStarted(setupTokenId: String) { - val eventName = "card-payments:vault:started" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultSucceeded(setupTokenId: String) { - val eventName = "card-payments:vault:succeeded" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultFailed(setupTokenId: String?) { - val eventName = "card-payments:vault:failed" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeReceived(setupTokenId: String) { - val eventName = "card-payments:vault:auth-challenge-received" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeStarted(setupTokenId: String?) { - val eventName = "card-payments:vault:auth-challenge-started" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeSucceeded(setupTokenId: String) { - val eventName = "card-payments:vault:auth-challenge-succeeded" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeCanceled(setupTokenId: String?) { - val eventName = "card-payments:vault:auth-challenge-canceled" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeFailed(setupTokenId: String?) { - val eventName = "card-payments:vault:auth-challenge-failed" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultUnknownError(setupTokenId: String?) { - val eventName = "card-payments:vault:unknown-error" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - // endregion -} diff --git a/CardPayments/src/main/java/com/paypal/android/cardpayments/CardClient.kt b/CardPayments/src/main/java/com/paypal/android/cardpayments/CardClient.kt index 07a364f49..20f3e1e8a 100644 --- a/CardPayments/src/main/java/com/paypal/android/cardpayments/CardClient.kt +++ b/CardPayments/src/main/java/com/paypal/android/cardpayments/CardClient.kt @@ -4,6 +4,9 @@ import android.content.Context import android.content.Intent import android.net.Uri import androidx.activity.ComponentActivity +import com.paypal.android.cardpayments.analytics.ApproveOrderEvent +import com.paypal.android.cardpayments.analytics.CardAnalytics +import com.paypal.android.cardpayments.analytics.VaultEvent import com.paypal.android.cardpayments.api.CheckoutOrdersAPI import com.paypal.android.cardpayments.api.ConfirmPaymentSourceResult import com.paypal.android.corepayments.CoreConfig @@ -25,7 +28,9 @@ class CardClient internal constructor( private val dispatcher: CoroutineDispatcher ) { + // for analytics tracking private var approveOrderId: String? = null + private var vaultSetupTokenId: String? = null /** * CardClient constructor @@ -50,15 +55,14 @@ class CardClient internal constructor( * @param callback [CardApproveOrderCallback] callback for receiving result asynchronously */ fun approveOrder(cardRequest: CardRequest, callback: CardApproveOrderCallback) { - // TODO: deprecate this method and offer auth challenge integration pattern (similar to vault) approveOrderId = cardRequest.orderId - analytics.notifyApproveOrderStarted(cardRequest.orderId) + analytics.notify(ApproveOrderEvent.STARTED, approveOrderId) CoroutineScope(dispatcher).launch { when (val response = checkoutOrdersAPI.confirmPaymentSource(cardRequest)) { is ConfirmPaymentSourceResult.Success -> { if (response.payerActionHref == null) { - analytics.notifyApproveOrderSucceeded(response.orderId) + analytics.notify(ApproveOrderEvent.SUCCEEDED, approveOrderId) val result = response.run { CardApproveOrderResult.Success( orderId = orderId, @@ -67,7 +71,7 @@ class CardClient internal constructor( } callback.onCardApproveOrderResult(result) } else { - analytics.notifyApproveOrderAuthChallengeReceived(cardRequest.orderId) + analytics.notify(ApproveOrderEvent.AUTH_CHALLENGE_REQUIRED, approveOrderId) val url = Uri.parse(response.payerActionHref) val authChallenge = CardAuthChallenge.ApproveOrder(url, cardRequest) @@ -77,7 +81,7 @@ class CardClient internal constructor( } is ConfirmPaymentSourceResult.Failure -> { - analytics.notifyApproveOrderFailed(cardRequest.orderId) + analytics.notify(ApproveOrderEvent.FAILED, approveOrderId) val result = CardApproveOrderResult.Failure(response.error) callback.onCardApproveOrderResult(result) } @@ -95,7 +99,8 @@ class CardClient internal constructor( * @param callback [CardVaultCallback] callback for receiving a [CardVaultResult] asynchronously */ fun vault(cardVaultRequest: CardVaultRequest, callback: CardVaultCallback) { - analytics.notifyVaultStarted(cardVaultRequest.setupTokenId) + vaultSetupTokenId = cardVaultRequest.setupTokenId + analytics.notify(VaultEvent.STARTED, vaultSetupTokenId) CoroutineScope(dispatcher).launch { val updateSetupTokenResult = cardVaultRequest.run { @@ -105,10 +110,10 @@ class CardClient internal constructor( is UpdateSetupTokenResult.Success -> { val approveHref = updateSetupTokenResult.approveHref if (approveHref == null) { - analytics.notifyVaultSucceeded(updateSetupTokenResult.setupTokenId) + analytics.notify(VaultEvent.SUCCEEDED, vaultSetupTokenId) updateSetupTokenResult.run { CardVaultResult.Success(setupTokenId, status) } } else { - analytics.notifyVaultAuthChallengeReceived(updateSetupTokenResult.setupTokenId) + analytics.notify(VaultEvent.AUTH_CHALLENGE_REQUIRED, vaultSetupTokenId) val url = Uri.parse(approveHref) val authChallenge = CardAuthChallenge.Vault(url = url, request = cardVaultRequest) @@ -117,7 +122,7 @@ class CardClient internal constructor( } is UpdateSetupTokenResult.Failure -> { - analytics.notifyVaultFailed(cardVaultRequest.setupTokenId) + analytics.notify(VaultEvent.FAILED, vaultSetupTokenId) CardVaultResult.Failure(updateSetupTokenResult.error) } } @@ -146,25 +151,29 @@ class CardClient internal constructor( ) = when (result) { is CardPresentAuthChallengeResult.Success -> { when (authChallenge) { - // TODO: see if we can get order id from somewhere - is CardAuthChallenge.ApproveOrder -> - analytics.notifyApproveOrderAuthChallengeStarted(null) - - // TODO: see if we can get setup token from somewhere - is CardAuthChallenge.Vault -> - analytics.notifyVaultAuthChallengeStarted(null) + is CardAuthChallenge.ApproveOrder -> analytics.notify( + ApproveOrderEvent.AUTH_CHALLENGE_PRESENTATION_SUCCEEDED, + approveOrderId + ) + + is CardAuthChallenge.Vault -> analytics.notify( + VaultEvent.AUTH_CHALLENGE_PRESENTATION_SUCCEEDED, + vaultSetupTokenId + ) } } is CardPresentAuthChallengeResult.Failure -> { when (authChallenge) { - // TODO: see if we can get order id from somewhere - is CardAuthChallenge.ApproveOrder -> - analytics.notifyApproveOrderAuthChallengeFailed(null) - - // TODO: see if we can get setup token id from somewhere - is CardAuthChallenge.Vault -> - analytics.notifyVaultAuthChallengeFailed(null) + is CardAuthChallenge.ApproveOrder -> analytics.notify( + ApproveOrderEvent.AUTH_CHALLENGE_PRESENTATION_FAILED, + approveOrderId + ) + + is CardAuthChallenge.Vault -> analytics.notify( + VaultEvent.AUTH_CHALLENGE_PRESENTATION_FAILED, + vaultSetupTokenId + ) } } } @@ -173,13 +182,13 @@ class CardClient internal constructor( val result = authChallengeLauncher.completeApproveOrderAuthRequest(intent, authState) when (result) { is CardFinishApproveOrderResult.Success -> - analytics.notifyApproveOrderAuthChallengeSucceeded(result.orderId) + analytics.notify(ApproveOrderEvent.AUTH_CHALLENGE_SUCCEEDED, approveOrderId) is CardFinishApproveOrderResult.Failure -> - analytics.notifyApproveOrderAuthChallengeFailed(null) + analytics.notify(ApproveOrderEvent.AUTH_CHALLENGE_FAILED, approveOrderId) CardFinishApproveOrderResult.Canceled -> - analytics.notifyApproveOrderAuthChallengeCanceled(null) + analytics.notify(ApproveOrderEvent.AUTH_CHALLENGE_CANCELED, approveOrderId) else -> { // no analytics tracking required at the moment @@ -192,15 +201,13 @@ class CardClient internal constructor( val result = authChallengeLauncher.completeVaultAuthRequest(intent, authState) when (result) { is CardFinishVaultResult.Success -> - analytics.notifyVaultAuthChallengeSucceeded(result.setupTokenId) + analytics.notify(VaultEvent.AUTH_CHALLENGE_SUCCEEDED, vaultSetupTokenId) - // TODO: see if we can access setup token id for analytics tracking is CardFinishVaultResult.Failure -> - analytics.notifyVaultAuthChallengeFailed(null) + analytics.notify(VaultEvent.AUTH_CHALLENGE_FAILED, vaultSetupTokenId) - // TODO: see if we can access setup token id for analytics tracking CardFinishVaultResult.Canceled -> - analytics.notifyVaultAuthChallengeCanceled(null) + analytics.notify(VaultEvent.AUTH_CHALLENGE_CANCELED, vaultSetupTokenId) else -> { // no analytics tracking required at the moment diff --git a/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/ApproveOrderEvent.kt b/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/ApproveOrderEvent.kt new file mode 100644 index 000000000..993c7ff1f --- /dev/null +++ b/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/ApproveOrderEvent.kt @@ -0,0 +1,20 @@ +@file:Suppress("SpacingAroundParens", "NoMultipleSpaces", "MaxLineLength") + +package com.paypal.android.cardpayments.analytics + +internal enum class ApproveOrderEvent(val value: String) { + // @formatter:off + STARTED( "card-payments:approve-order:started"), + SUCCEEDED("card-payments:approve-order:succeeded"), + FAILED( "card-payments:approve-order:failed"), + + AUTH_CHALLENGE_REQUIRED("card-payments:approve-order:auth-challenge-required"), + + AUTH_CHALLENGE_PRESENTATION_SUCCEEDED("card-payments:approve-order:auth-challenge-presentation:succeeded"), + AUTH_CHALLENGE_PRESENTATION_FAILED( "card-payments:approve-order:auth-challenge-presentation:failed"), + + AUTH_CHALLENGE_SUCCEEDED("card-payments:approve-order:auth-challenge:succeeded"), + AUTH_CHALLENGE_FAILED( "card-payments:approve-order:auth-challenge:failed"), + AUTH_CHALLENGE_CANCELED( "card-payments:approve-order:auth-challenge:canceled"), + // @formatter:on +} diff --git a/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/CardAnalytics.kt b/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/CardAnalytics.kt new file mode 100644 index 000000000..3f071c7a8 --- /dev/null +++ b/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/CardAnalytics.kt @@ -0,0 +1,14 @@ +package com.paypal.android.cardpayments.analytics + +import com.paypal.android.corepayments.analytics.AnalyticsService + +internal class CardAnalytics(private val analyticsService: AnalyticsService) { + + fun notify(event: ApproveOrderEvent, orderId: String?) { + analyticsService.sendAnalyticsEvent(event.value, orderId) + } + + fun notify(event: VaultEvent, setupTokenId: String?) { + analyticsService.sendAnalyticsEvent(event.value, setupTokenId) + } +} diff --git a/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/VaultEvent.kt b/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/VaultEvent.kt new file mode 100644 index 000000000..4b8a26d21 --- /dev/null +++ b/CardPayments/src/main/java/com/paypal/android/cardpayments/analytics/VaultEvent.kt @@ -0,0 +1,20 @@ +@file:Suppress("SpacingAroundParens", "NoMultipleSpaces", "MaxLineLength") + +package com.paypal.android.cardpayments.analytics + +internal enum class VaultEvent(val value: String) { + // @formatter:off + STARTED( "card-payments:vault-wo-purchase:started"), + SUCCEEDED("card-payments:vault-wo-purchase:succeeded"), + FAILED( "card-payments:vault-wo-purchase:failed"), + + AUTH_CHALLENGE_REQUIRED("card-payments:vault-wo-purchase:auth-challenge-required"), + + AUTH_CHALLENGE_PRESENTATION_SUCCEEDED("card-payments:vault-wo-purchase:auth-challenge-presentation:succeeded"), + AUTH_CHALLENGE_PRESENTATION_FAILED( "card-payments:vault-wo-purchase:auth-challenge-presentation:failed"), + + AUTH_CHALLENGE_SUCCEEDED("card-payments:vault-wo-purchase:auth-challenge:succeeded"), + AUTH_CHALLENGE_FAILED( "card-payments:vault-wo-purchase:auth-challenge:failed"), + AUTH_CHALLENGE_CANCELED( "card-payments:vault-wo-purchase:auth-challenge:canceled"), + // @formatter:on +} diff --git a/CardPayments/src/test/java/com/paypal/android/cardpayments/CardClientUnitTest.kt b/CardPayments/src/test/java/com/paypal/android/cardpayments/CardClientUnitTest.kt index 024e6156a..dfcc3372f 100644 --- a/CardPayments/src/test/java/com/paypal/android/cardpayments/CardClientUnitTest.kt +++ b/CardPayments/src/test/java/com/paypal/android/cardpayments/CardClientUnitTest.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.net.Uri import androidx.fragment.app.FragmentActivity import androidx.test.core.app.ApplicationProvider +import com.paypal.android.cardpayments.analytics.CardAnalytics import com.paypal.android.cardpayments.api.CheckoutOrdersAPI import com.paypal.android.cardpayments.api.ConfirmPaymentSourceResult import com.paypal.android.corepayments.OrderStatus diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebAnalytics.kt b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebAnalytics.kt deleted file mode 100644 index 332868afe..000000000 --- a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebAnalytics.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.paypal.android.paypalwebpayments - -import com.paypal.android.corepayments.analytics.AnalyticsService - -@Suppress("TooManyFunctions") -internal class PayPalWebAnalytics(private val analyticsService: AnalyticsService) { - - fun notifyCheckoutStarted(orderId: String) { - val eventName = "paypal-web-payments:checkout:started" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyCheckoutAuthChallengeStarted(orderId: String) { - val eventName = "paypal-web-payments:checkout:auth-challenge-started" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyCheckoutAuthChallengeSucceeded(orderId: String?) { - val eventName = "paypal-web-payments:checkout:auth-challenge-succeeded" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyCheckoutAuthChallengeFailed(orderId: String?) { - val eventName = "paypal-web-payments:checkout:auth-challenge-failed" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyCheckoutAuthChallengeCanceled(orderId: String?) { - val eventName = "paypal-web-payments:checkout:auth-challenge-canceled" - analyticsService.sendAnalyticsEvent(eventName, orderId) - } - - fun notifyVaultStarted(setupTokenId: String) { - val eventName = "paypal-web-payments:vault:started" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeStarted(setupTokenId: String) { - val eventName = "paypal-web-payments:vault:auth-challenge-started" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeSucceeded(setupTokenId: String?) { - val eventName = "paypal-web-payments:vault:auth-challenge-succeeded" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeFailed(setupTokenId: String?) { - val eventName = "paypal-web-payments:vault:auth-challenge-failed" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } - - fun notifyVaultAuthChallengeCanceled(setupTokenId: String?) { - val eventName = "paypal-web-payments:vault:auth-challenge-canceled" - analyticsService.sendAnalyticsEvent(eventName, setupTokenId) - } -} diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient.kt b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient.kt index 339b0d7c8..adaa99798 100644 --- a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient.kt +++ b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient.kt @@ -5,6 +5,9 @@ import android.content.Intent import androidx.activity.ComponentActivity import com.paypal.android.corepayments.CoreConfig import com.paypal.android.corepayments.analytics.AnalyticsService +import com.paypal.android.paypalwebpayments.analytics.CheckoutEvent +import com.paypal.android.paypalwebpayments.analytics.PayPalWebAnalytics +import com.paypal.android.paypalwebpayments.analytics.VaultEvent // NEXT MAJOR VERSION: consider renaming this module to PayPalWebClient since // it now offers both checkout and vaulting @@ -17,6 +20,10 @@ class PayPalWebCheckoutClient internal constructor( private val payPalWebLauncher: PayPalWebLauncher ) { + // for analytics tracking + private var checkoutOrderId: String? = null + private var vaultSetupTokenId: String? = null + /** * Create a new instance of [PayPalWebCheckoutClient]. * @@ -38,14 +45,18 @@ class PayPalWebCheckoutClient internal constructor( activity: ComponentActivity, request: PayPalWebCheckoutRequest ): PayPalPresentAuthChallengeResult { - analytics.notifyCheckoutStarted(request.orderId) + checkoutOrderId = request.orderId + analytics.notify(CheckoutEvent.STARTED, checkoutOrderId) + val result = payPalWebLauncher.launchPayPalWebCheckout(activity, request) when (result) { - is PayPalPresentAuthChallengeResult.Success -> - analytics.notifyCheckoutAuthChallengeStarted(request.orderId) + is PayPalPresentAuthChallengeResult.Success -> analytics.notify( + CheckoutEvent.AUTH_CHALLENGE_PRESENTATION_SUCCEEDED, + checkoutOrderId + ) is PayPalPresentAuthChallengeResult.Failure -> - analytics.notifyCheckoutAuthChallengeFailed(request.orderId) + analytics.notify(CheckoutEvent.AUTH_CHALLENGE_PRESENTATION_FAILED, checkoutOrderId) } return result } @@ -59,14 +70,18 @@ class PayPalWebCheckoutClient internal constructor( activity: ComponentActivity, request: PayPalWebVaultRequest ): PayPalPresentAuthChallengeResult { - analytics.notifyVaultStarted(request.setupTokenId) + vaultSetupTokenId = request.setupTokenId + analytics.notify(VaultEvent.STARTED, vaultSetupTokenId) + val result = payPalWebLauncher.launchPayPalWebVault(activity, request) when (result) { - is PayPalPresentAuthChallengeResult.Success -> - analytics.notifyVaultAuthChallengeStarted(request.setupTokenId) + is PayPalPresentAuthChallengeResult.Success -> analytics.notify( + VaultEvent.AUTH_CHALLENGE_PRESENTATION_SUCCEEDED, + vaultSetupTokenId + ) is PayPalPresentAuthChallengeResult.Failure -> - analytics.notifyVaultAuthChallengeFailed(request.setupTokenId) + analytics.notify(VaultEvent.AUTH_CHALLENGE_PRESENTATION_FAILED, vaultSetupTokenId) } return result } @@ -86,13 +101,13 @@ class PayPalWebCheckoutClient internal constructor( val result = payPalWebLauncher.completeCheckoutAuthRequest(intent, authState) when (result) { is PayPalWebCheckoutFinishStartResult.Success -> - analytics.notifyCheckoutAuthChallengeSucceeded(result.orderId) + analytics.notify(CheckoutEvent.SUCCEEDED, checkoutOrderId) is PayPalWebCheckoutFinishStartResult.Canceled -> - analytics.notifyCheckoutAuthChallengeCanceled(result.orderId) + analytics.notify(CheckoutEvent.CANCELED, checkoutOrderId) is PayPalWebCheckoutFinishStartResult.Failure -> - analytics.notifyCheckoutAuthChallengeFailed(result.orderId) + analytics.notify(CheckoutEvent.FAILED, checkoutOrderId) PayPalWebCheckoutFinishStartResult.NoResult -> { // no analytics tracking required at the moment @@ -117,13 +132,13 @@ class PayPalWebCheckoutClient internal constructor( // TODO: see if we can get setup token id from somewhere for tracking when (result) { is PayPalWebCheckoutFinishVaultResult.Success -> - analytics.notifyVaultAuthChallengeSucceeded(null) + analytics.notify(VaultEvent.SUCCEEDED, vaultSetupTokenId) is PayPalWebCheckoutFinishVaultResult.Failure -> - analytics.notifyVaultAuthChallengeFailed(null) + analytics.notify(VaultEvent.FAILED, vaultSetupTokenId) PayPalWebCheckoutFinishVaultResult.Canceled -> - analytics.notifyVaultAuthChallengeCanceled(null) + analytics.notify(VaultEvent.CANCELED, vaultSetupTokenId) PayPalWebCheckoutFinishVaultResult.NoResult -> { // no analytics tracking required at the moment diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/CheckoutEvent.kt b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/CheckoutEvent.kt new file mode 100644 index 000000000..ca3fe2c1f --- /dev/null +++ b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/CheckoutEvent.kt @@ -0,0 +1,15 @@ +@file:Suppress("SpacingAroundParens", "NoMultipleSpaces", "MaxLineLength") + +package com.paypal.android.paypalwebpayments.analytics + +internal enum class CheckoutEvent(val value: String) { + // @formatter:off + STARTED( "paypal-web-payments:checkout:started"), + SUCCEEDED("paypal-web-payments:checkout:succeeded"), + FAILED( "paypal-web-payments:checkout:failed"), + CANCELED( "paypal-web-payments:checkout:canceled"), + + AUTH_CHALLENGE_PRESENTATION_SUCCEEDED("paypal-web-payments:checkout:auth-challenge-presentation:succeeded"), + AUTH_CHALLENGE_PRESENTATION_FAILED( "paypal-web-payments:checkout:auth-challenge-presentation:failed"), + // @formatter:on +} diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/PayPalWebAnalytics.kt b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/PayPalWebAnalytics.kt new file mode 100644 index 000000000..05615d0d7 --- /dev/null +++ b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/PayPalWebAnalytics.kt @@ -0,0 +1,14 @@ +package com.paypal.android.paypalwebpayments.analytics + +import com.paypal.android.corepayments.analytics.AnalyticsService + +internal class PayPalWebAnalytics(private val analyticsService: AnalyticsService) { + + fun notify(event: CheckoutEvent, orderId: String?) { + analyticsService.sendAnalyticsEvent(event.value, orderId) + } + + fun notify(event: VaultEvent, setupTokenId: String?) { + analyticsService.sendAnalyticsEvent(event.value, setupTokenId) + } +} diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/VaultEvent.kt b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/VaultEvent.kt new file mode 100644 index 000000000..e9a791330 --- /dev/null +++ b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/analytics/VaultEvent.kt @@ -0,0 +1,15 @@ +@file:Suppress("SpacingAroundParens", "NoMultipleSpaces", "MaxLineLength") + +package com.paypal.android.paypalwebpayments.analytics + +internal enum class VaultEvent(val value: String) { + // @formatter:off + STARTED( "paypal-web-payments:vault-wo-purchase:started"), + SUCCEEDED("paypal-web-payments:vault-wo-purchase:succeeded"), + FAILED( "paypal-web-payments:vault-wo-purchase:failed"), + CANCELED( "paypal-web-payments:vault-wo-purchase:canceled"), + + AUTH_CHALLENGE_PRESENTATION_SUCCEEDED("paypal-web-payments:vault-wo-purchase:auth-challenge-presentation:succeeded"), + AUTH_CHALLENGE_PRESENTATION_FAILED( "paypal-web-payments:vault-wo-purchase:auth-challenge-presentation:failed"), + // @formatter:on +} diff --git a/PayPalWebPayments/src/test/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClientUnitTest.kt b/PayPalWebPayments/src/test/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClientUnitTest.kt index ac0623453..6157f79a9 100644 --- a/PayPalWebPayments/src/test/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClientUnitTest.kt +++ b/PayPalWebPayments/src/test/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClientUnitTest.kt @@ -3,6 +3,7 @@ package com.paypal.android.paypalwebpayments import android.content.Intent import androidx.fragment.app.FragmentActivity import com.paypal.android.corepayments.PayPalSDKError +import com.paypal.android.paypalwebpayments.analytics.PayPalWebAnalytics import io.mockk.every import io.mockk.mockk import io.mockk.verify