diff --git a/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalAnalytics.kt b/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalAnalytics.kt index d8abc15df8..279d934292 100644 --- a/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalAnalytics.kt +++ b/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalAnalytics.kt @@ -10,6 +10,9 @@ internal object PayPalAnalytics { // Additional Conversion events const val HANDLE_RETURN_STARTED = "paypal:tokenize:handle-return:started" + const val HANDLE_RETURN_SUCCEEDED = "paypal:tokenize:handle-return:succeeded" + const val HANDLE_RETURN_FAILED = "paypal:tokenize:handle-return:failed" + const val HANDLE_RETURN_NO_RESULT = "paypal:tokenize:handle-return:no-result" // App Switch events const val APP_SWITCH_STARTED = "paypal:tokenize:app-switch:started" diff --git a/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalClient.kt b/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalClient.kt index 6e0b14072c..9958c67bbd 100644 --- a/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalClient.kt +++ b/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalClient.kt @@ -219,10 +219,6 @@ class PayPalClient internal constructor( if (isAppSwitchFlow) { appSwitchUrlString = approvalUrl - braintreeClient.sendAnalyticsEvent( - PayPalAnalytics.HANDLE_RETURN_STARTED, - analyticsParams - ) } approvalUrl?.let { diff --git a/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalLauncher.kt b/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalLauncher.kt index a169f12f43..290bf4affc 100644 --- a/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalLauncher.kt +++ b/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalLauncher.kt @@ -6,16 +6,25 @@ import com.braintreepayments.api.BrowserSwitchClient import com.braintreepayments.api.BrowserSwitchException import com.braintreepayments.api.BrowserSwitchFinalResult import com.braintreepayments.api.BrowserSwitchStartResult +import com.braintreepayments.api.core.AnalyticsClient import com.braintreepayments.api.core.BraintreeException /** * Responsible for launching PayPal user authentication in a web browser */ -class PayPalLauncher internal constructor(private val browserSwitchClient: BrowserSwitchClient) { +class PayPalLauncher internal constructor( + private val browserSwitchClient: BrowserSwitchClient, + lazyAnalyticsClient: Lazy +) { /** * Used to launch the PayPal flow in a web browser and deliver results to your Activity */ - constructor() : this(BrowserSwitchClient()) + constructor() : this( + browserSwitchClient = BrowserSwitchClient(), + lazyAnalyticsClient = AnalyticsClient.lazyInstance + ) + + private val analyticsClient: AnalyticsClient by lazyAnalyticsClient /** * Launches the PayPal flow by switching to a web browser for user authentication @@ -73,17 +82,27 @@ class PayPalLauncher internal constructor(private val browserSwitchClient: Brows pendingRequest: PayPalPendingRequest.Started, intent: Intent ): PayPalPaymentAuthResult { + analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_STARTED) return when (val browserSwitchResult = browserSwitchClient.completeRequest(intent, pendingRequest.pendingRequestString)) { - is BrowserSwitchFinalResult.Success -> PayPalPaymentAuthResult.Success( - browserSwitchResult - ) + is BrowserSwitchFinalResult.Success -> { + analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_SUCCEEDED) + PayPalPaymentAuthResult.Success( + browserSwitchResult + ) + } - is BrowserSwitchFinalResult.Failure -> PayPalPaymentAuthResult.Failure( - browserSwitchResult.error - ) + is BrowserSwitchFinalResult.Failure -> { + analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_FAILED) + PayPalPaymentAuthResult.Failure( + browserSwitchResult.error + ) + } - is BrowserSwitchFinalResult.NoResult -> PayPalPaymentAuthResult.NoResult + is BrowserSwitchFinalResult.NoResult -> { + analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_NO_RESULT) + PayPalPaymentAuthResult.NoResult + } } } diff --git a/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalClientUnitTest.java b/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalClientUnitTest.java index 9721d1d5fb..07f0418064 100644 --- a/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalClientUnitTest.java +++ b/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalClientUnitTest.java @@ -625,7 +625,6 @@ public void tokenize_whenPayPalInternalClientTokenizeResult_sendsAppSwitchSuccee assertEquals(payPalAccountNonce, ((PayPalResult.Success) result).getNonce()); AnalyticsEventParams params = new AnalyticsEventParams(); - verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.HANDLE_RETURN_STARTED, params); params.setPayPalContextId("EC-HERMES-SANDBOX-EC-TOKEN"); verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.TOKENIZATION_SUCCEEDED, params); AnalyticsEventParams appSwitchParams = new AnalyticsEventParams( diff --git a/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalLauncherUnitTest.kt b/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalLauncherUnitTest.kt index 247627ca3d..57b004db00 100644 --- a/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalLauncherUnitTest.kt +++ b/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalLauncherUnitTest.kt @@ -7,8 +7,10 @@ import com.braintreepayments.api.BrowserSwitchException import com.braintreepayments.api.BrowserSwitchFinalResult import com.braintreepayments.api.BrowserSwitchOptions import com.braintreepayments.api.BrowserSwitchStartResult +import com.braintreepayments.api.core.AnalyticsClient import io.mockk.every import io.mockk.mockk +import io.mockk.verify import org.json.JSONException import org.junit.Assert.assertEquals import org.junit.Assert.assertSame @@ -26,13 +28,14 @@ class PayPalLauncherUnitTest { private val intent: Intent = mockk(relaxed = true) private val options: BrowserSwitchOptions = mockk(relaxed = true) private val pendingRequestString = "pending_request_string" + private val analyticsClient: AnalyticsClient = mockk(relaxed = true) private lateinit var sut: PayPalLauncher @Before fun setup() { every { paymentAuthRequestParams.browserSwitchOptions } returns options - sut = PayPalLauncher(browserSwitchClient) + sut = PayPalLauncher(browserSwitchClient, lazy { analyticsClient }) } @Test @@ -90,6 +93,16 @@ class PayPalLauncherUnitTest { ) } + @Test + @Throws(JSONException::class) + fun `handleReturnToApp sends started event`() { + sut.handleReturnToApp( + PayPalPendingRequest.Started(pendingRequestString), + intent + ) + verify { analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_STARTED) } + } + @Test @Throws(JSONException::class) fun `handleReturnToApp when result exists returns result`() { @@ -102,7 +115,8 @@ class PayPalLauncherUnitTest { } returns browserSwitchFinalResult val paymentAuthResult = sut.handleReturnToApp( - PayPalPendingRequest.Started(pendingRequestString), intent + PayPalPendingRequest.Started(pendingRequestString), + intent ) assertTrue(paymentAuthResult is PayPalPaymentAuthResult.Success) @@ -110,6 +124,31 @@ class PayPalLauncherUnitTest { browserSwitchFinalResult, (paymentAuthResult as PayPalPaymentAuthResult.Success).browserSwitchSuccess ) + verify { analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_SUCCEEDED) } + } + + @Test + @Throws(JSONException::class) + fun `handleReturnToApp when result fails returns failed result`() { + val browserSwitchFinalResult = mockk() + every { + browserSwitchClient.completeRequest(intent, pendingRequestString) + } returns browserSwitchFinalResult + + val exception = BrowserSwitchException("BrowserSwitchException") + every { browserSwitchFinalResult.error } returns exception + + val paymentAuthResult = sut.handleReturnToApp( + PayPalPendingRequest.Started(pendingRequestString), + intent + ) + + assertTrue(paymentAuthResult is PayPalPaymentAuthResult.Failure) + assertSame( + exception, + (paymentAuthResult as PayPalPaymentAuthResult.Failure).error + ) + verify { analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_FAILED) } } @Test @@ -120,9 +159,11 @@ class PayPalLauncherUnitTest { } returns BrowserSwitchFinalResult.NoResult val paymentAuthResult = sut.handleReturnToApp( - PayPalPendingRequest.Started(pendingRequestString), intent + PayPalPendingRequest.Started(pendingRequestString), + intent ) assertTrue(paymentAuthResult is PayPalPaymentAuthResult.NoResult) + verify { analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_NO_RESULT) } } }