From d0e0e6f8248bfeb5441abc4c219f48c79be30ed1 Mon Sep 17 00:00:00 2001 From: Jax DesMarais-Leder Date: Thu, 5 Dec 2024 09:17:45 -0600 Subject: [PATCH] Add URL to PayPal App Switch Events (#1226) * send analytics with app switch URL * update unit tests * add CHANGELOG entry * PR feedback: update to use copy * PR feedback: update appSwitchUrl to immutable property --- CHANGELOG.md | 2 ++ .../api/paypal/PayPalClient.kt | 16 +++++++++-- .../api/paypal/PayPalClientUnitTest.java | 28 +++++++++++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc38ca05bb..adb0ce3dbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ * Add `deepLinkFallbackUrlScheme` to `PayPalClient` constructor params for supporting deep link fallback * LocalPayment * Make LocalPaymentAuthRequestParams public (fixes #1207) +* PayPal + * Send `url` in `event_params` for App Switch events to PayPal's analytics service (FPTI) ## 5.2.0 (2024-10-30) 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 5d00d97370..6e0b14072c 100644 --- a/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalClient.kt +++ b/PayPal/src/main/java/com/braintreepayments/api/paypal/PayPalClient.kt @@ -44,6 +44,11 @@ class PayPalClient internal constructor( */ private var isVaultRequest = false + /** + * The final URL string used to open the app switch flow + */ + private var appSwitchUrlString: String? = null + /** * Initializes a new [PayPalClient] instance * @@ -213,6 +218,7 @@ class PayPalClient internal constructor( val isAppSwitchFlow = !switchInitiatedTime.isNullOrEmpty() if (isAppSwitchFlow) { + appSwitchUrlString = approvalUrl braintreeClient.sendAnalyticsEvent( PayPalAnalytics.HANDLE_RETURN_STARTED, analyticsParams @@ -330,7 +336,10 @@ class PayPalClient internal constructor( braintreeClient.sendAnalyticsEvent(PayPalAnalytics.TOKENIZATION_FAILED, analyticsParams) if (isAppSwitchFlow) { - braintreeClient.sendAnalyticsEvent(PayPalAnalytics.APP_SWITCH_FAILED, analyticsParams) + braintreeClient.sendAnalyticsEvent( + PayPalAnalytics.APP_SWITCH_FAILED, + analyticsParams.copy(appSwitchUrl = appSwitchUrlString) + ) } callback.onPayPalResult(failure) @@ -344,7 +353,10 @@ class PayPalClient internal constructor( braintreeClient.sendAnalyticsEvent(PayPalAnalytics.TOKENIZATION_SUCCEEDED, analyticsParams) if (isAppSwitchFlow) { - braintreeClient.sendAnalyticsEvent(PayPalAnalytics.APP_SWITCH_SUCCEEDED, analyticsParams) + braintreeClient.sendAnalyticsEvent( + PayPalAnalytics.APP_SWITCH_SUCCEEDED, + analyticsParams.copy(appSwitchUrl = appSwitchUrlString) + ) } callback.onPayPalResult(success) 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 3bb81af02a..9721d1d5fb 100644 --- a/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalClientUnitTest.java +++ b/PayPal/src/test/java/com/braintreepayments/api/paypal/PayPalClientUnitTest.java @@ -9,6 +9,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static java.util.Collections.emptyList; + import android.net.Uri; import androidx.fragment.app.FragmentActivity; @@ -626,7 +628,18 @@ public void tokenize_whenPayPalInternalClientTokenizeResult_sendsAppSwitchSuccee verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.HANDLE_RETURN_STARTED, params); params.setPayPalContextId("EC-HERMES-SANDBOX-EC-TOKEN"); verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.TOKENIZATION_SUCCEEDED, params); - verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.APP_SWITCH_SUCCEEDED, params); + AnalyticsEventParams appSwitchParams = new AnalyticsEventParams( + "EC-HERMES-SANDBOX-EC-TOKEN", + null, + false, + null, + null, + null, + null, + emptyList(), + "sample-scheme://onetouch/v1/success?PayerID=HERMES-SANDBOX-PAYER-ID&paymentId=HERMES-SANDBOX-PAYMENT-ID&token=EC-HERMES-SANDBOX-EC-TOKEN&switch_initiated_time=17166111926211" + ); + verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.APP_SWITCH_SUCCEEDED, appSwitchParams); } @Test @@ -657,7 +670,18 @@ public void tokenize_whenPayPalNotEnabled_sendsAppSwitchFailedEvents() throws JS AnalyticsEventParams params = new AnalyticsEventParams(); params.setPayPalContextId("SOME-BA"); verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.TOKENIZATION_FAILED, params); - verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.APP_SWITCH_FAILED, params); + AnalyticsEventParams appSwitchParams = new AnalyticsEventParams( + "SOME-BA", + null, + false, + null, + null, + null, + null, + emptyList(), + "https://some-scheme/onetouch/v1/cancel?token=SOME-BA&switch_initiated_time=17166111926211" + ); + verify(braintreeClient).sendAnalyticsEvent(PayPalAnalytics.APP_SWITCH_FAILED, appSwitchParams); } @Test