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 290bf4affc..2d41fd863d 100644 --- a/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalLauncher.kt +++ b/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalLauncher.kt @@ -7,13 +7,18 @@ 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.AnalyticsEventParams import com.braintreepayments.api.core.BraintreeException +import com.braintreepayments.api.core.GetReturnLinkUseCase +import com.braintreepayments.api.core.MerchantRepository /** * Responsible for launching PayPal user authentication in a web browser */ class PayPalLauncher internal constructor( private val browserSwitchClient: BrowserSwitchClient, + private val merchantRepository: MerchantRepository = MerchantRepository.instance, + private val getReturnLinkUseCase: GetReturnLinkUseCase = GetReturnLinkUseCase(merchantRepository), lazyAnalyticsClient: Lazy ) { /** @@ -82,7 +87,20 @@ class PayPalLauncher internal constructor( pendingRequest: PayPalPendingRequest.Started, intent: Intent ): PayPalPaymentAuthResult { - analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_STARTED) + analyticsClient.sendEvent( + PayPalAnalytics.HANDLE_RETURN_STARTED, + AnalyticsEventParams( + appSwitchUrl = when (val returnLinkResult = getReturnLinkUseCase()) { + is GetReturnLinkUseCase.ReturnLinkResult.AppLink -> { + returnLinkResult.appLinkReturnUri.toString() + } + is GetReturnLinkUseCase.ReturnLinkResult.DeepLink -> { + returnLinkResult.deepLinkFallbackUrlScheme + } + else -> null + } + ) + ) return when (val browserSwitchResult = browserSwitchClient.completeRequest(intent, pendingRequest.pendingRequestString)) { is BrowserSwitchFinalResult.Success -> { 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 57b004db00..b1d329cd25 100644 --- a/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalLauncherUnitTest.kt +++ b/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalLauncherUnitTest.kt @@ -1,6 +1,7 @@ package com.braintreepayments.api.paypal import android.content.Intent +import android.net.Uri import androidx.activity.ComponentActivity import com.braintreepayments.api.BrowserSwitchClient import com.braintreepayments.api.BrowserSwitchException @@ -8,6 +9,9 @@ import com.braintreepayments.api.BrowserSwitchFinalResult import com.braintreepayments.api.BrowserSwitchOptions import com.braintreepayments.api.BrowserSwitchStartResult import com.braintreepayments.api.core.AnalyticsClient +import com.braintreepayments.api.core.AnalyticsEventParams +import com.braintreepayments.api.core.GetReturnLinkUseCase +import com.braintreepayments.api.core.MerchantRepository import io.mockk.every import io.mockk.mockk import io.mockk.verify @@ -29,13 +33,26 @@ class PayPalLauncherUnitTest { private val options: BrowserSwitchOptions = mockk(relaxed = true) private val pendingRequestString = "pending_request_string" private val analyticsClient: AnalyticsClient = mockk(relaxed = true) + private val merchantRepository = mockk(relaxed = true) + private val getReturnLinkUseCase = mockk() + private val returnUrl = "https://return.url" + private val deepLinkScheme = "deepLinkScheme" private lateinit var sut: PayPalLauncher @Before fun setup() { every { paymentAuthRequestParams.browserSwitchOptions } returns options - sut = PayPalLauncher(browserSwitchClient, lazy { analyticsClient }) + + val appSwitchReturnUrl = Uri.parse(returnUrl) + every { getReturnLinkUseCase() } returns GetReturnLinkUseCase.ReturnLinkResult.AppLink( + appSwitchReturnUrl + ) + sut = PayPalLauncher( + browserSwitchClient, + merchantRepository, + getReturnLinkUseCase, + lazy { analyticsClient }) } @Test @@ -100,7 +117,48 @@ class PayPalLauncherUnitTest { PayPalPendingRequest.Started(pendingRequestString), intent ) - verify { analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_STARTED) } + verify { + analyticsClient.sendEvent( + PayPalAnalytics.HANDLE_RETURN_STARTED, + AnalyticsEventParams(appSwitchUrl = returnUrl) + ) + } + } + + @Test + @Throws(JSONException::class) + fun `handleReturnToApp with deeplinkScheme sends handle started event with deeplink scheme`() { + every { getReturnLinkUseCase() } returns GetReturnLinkUseCase.ReturnLinkResult.DeepLink( + deepLinkScheme + ) + sut.handleReturnToApp( + PayPalPendingRequest.Started(pendingRequestString), + intent + ) + verify { + analyticsClient.sendEvent( + PayPalAnalytics.HANDLE_RETURN_STARTED, + AnalyticsEventParams(appSwitchUrl = deepLinkScheme) + ) + } + } + + @Test + @Throws(JSONException::class) + fun `handleReturnToApp with ReturnLinkResult Failure sends handle started event with null appSwitchUrl`() { + every { getReturnLinkUseCase() } returns GetReturnLinkUseCase.ReturnLinkResult.Failure( + Exception("handle return start failed") + ) + sut.handleReturnToApp( + PayPalPendingRequest.Started(pendingRequestString), + intent + ) + verify { + analyticsClient.sendEvent( + PayPalAnalytics.HANDLE_RETURN_STARTED, + AnalyticsEventParams() + ) + } } @Test