From 5d71352100d0f63603df1e74f599708fd04d2a00 Mon Sep 17 00:00:00 2001 From: Jay Newstrom Date: Thu, 25 Jan 2024 08:21:38 -0700 Subject: [PATCH] Fix a bug where cashapp wouldn't launch without the redirect trampoline. (#7822) --- payments-core/detekt-baseline.xml | 2 +- .../payments/StripeBrowserLauncherActivity.kt | 5 +++-- .../payments/StripeBrowserLauncherViewModel.kt | 12 ++---------- .../payments/StripeBrowserLauncherViewModelTest.kt | 13 ++----------- 4 files changed, 8 insertions(+), 24 deletions(-) diff --git a/payments-core/detekt-baseline.xml b/payments-core/detekt-baseline.xml index 40f9364152a..133209825ec 100644 --- a/payments-core/detekt-baseline.xml +++ b/payments-core/detekt-baseline.xml @@ -48,7 +48,6 @@ LongMethod:PaymentFlowResultProcessor.kt$PaymentFlowResultProcessor$suspend fun processResult( unvalidatedResult: PaymentFlowResult.Unvalidated ): Result<S> LongMethod:PaymentIntentJsonParser.kt$PaymentIntentJsonParser$override fun parse(json: JSONObject): PaymentIntent? LongMethod:PaymentMethodJsonParser.kt$PaymentMethodJsonParser$override fun parse(json: JSONObject): PaymentMethod - LongMethod:PaymentMethodsActivity.kt$PaymentMethodsActivity$override fun onCreate(savedInstanceState: Bundle?) LongMethod:SourceParamsTest.kt$SourceParamsTest$@Test fun `createKlarna() should create expected params`() LongMethod:StaticCardAccountRangeSourceTest.kt$StaticCardAccountRangeSourceTest$@Test fun `getAccountRange() should return expected AccountRange`() LongMethod:Stripe3ds2ChallengeResultProcessor.kt$DefaultStripe3ds2ChallengeResultProcessor$override suspend fun process( challengeResult: ChallengeResult ): PaymentFlowResult.Unvalidated @@ -206,6 +205,7 @@ SwallowedException:ActivityUtils.kt$e: IllegalArgumentException SwallowedException:DefaultPaymentAuthenticatorRegistry.kt$e: Exception SwallowedException:PaymentUtils.kt$PaymentUtils$e: ClassCastException + SwallowedException:StripeBrowserLauncherActivity.kt$StripeBrowserLauncherActivity$e: ActivityNotFoundException ThrowsCount:StripeApiRepository.kt$StripeApiRepository$@Throws( InvalidRequestException::class, AuthenticationException::class, CardException::class, APIException::class ) private fun handleApiError(response: StripeResponse<String>) TooGenericExceptionCaught:DefaultPaymentAuthenticatorRegistry.kt$e: Exception TooGenericExceptionThrown:DefaultAlipayRepository.kt$DefaultAlipayRepository$throw RuntimeException("Unable to authenticate Payment Intent with Alipay SDK") diff --git a/payments-core/src/main/java/com/stripe/android/payments/StripeBrowserLauncherActivity.kt b/payments-core/src/main/java/com/stripe/android/payments/StripeBrowserLauncherActivity.kt index 7eef16f8ba6..10d7a942b92 100644 --- a/payments-core/src/main/java/com/stripe/android/payments/StripeBrowserLauncherActivity.kt +++ b/payments-core/src/main/java/com/stripe/android/payments/StripeBrowserLauncherActivity.kt @@ -1,6 +1,7 @@ package com.stripe.android.payments import android.app.Activity +import android.content.ActivityNotFoundException import android.os.Bundle import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels @@ -50,10 +51,10 @@ internal class StripeBrowserLauncherActivity : AppCompatActivity() { val intent = viewModel.createLaunchIntent(args) - if (intent != null) { + try { launcher.launch(intent) viewModel.hasLaunched = true - } else { + } catch (e: ActivityNotFoundException) { finishWithFailure(args) } } diff --git a/payments-core/src/main/java/com/stripe/android/payments/StripeBrowserLauncherViewModel.kt b/payments-core/src/main/java/com/stripe/android/payments/StripeBrowserLauncherViewModel.kt index 60e181d5d39..2d74efe3936 100644 --- a/payments-core/src/main/java/com/stripe/android/payments/StripeBrowserLauncherViewModel.kt +++ b/payments-core/src/main/java/com/stripe/android/payments/StripeBrowserLauncherViewModel.kt @@ -29,7 +29,6 @@ internal class StripeBrowserLauncherViewModel( private val intentChooserTitle: String, private val resolveErrorMessage: String, private val savedStateHandle: SavedStateHandle, - private val intentResolver: (Intent) -> Boolean, ) : ViewModel() { var hasLaunched: Boolean @@ -40,7 +39,7 @@ internal class StripeBrowserLauncherViewModel( fun createLaunchIntent( args: PaymentBrowserAuthContract.Args - ): Intent? { + ): Intent { val url = Uri.parse(args.url) logBrowserCapabilities() @@ -54,13 +53,7 @@ internal class StripeBrowserLauncherViewModel( } } - val canResolve = intentResolver(intent) - - return if (canResolve) { - Intent.createChooser(intent, intentChooserTitle) - } else { - null - } + return Intent.createChooser(intent, intentChooserTitle) } private fun createCustomTabsIntent( @@ -147,7 +140,6 @@ internal class StripeBrowserLauncherViewModel( intentChooserTitle = application.getString(R.string.stripe_verify_your_payment), resolveErrorMessage = application.getString(R.string.stripe_failure_reason_authentication), savedStateHandle = savedStateHandle, - intentResolver = { it.resolveActivity(application.packageManager) != null }, ) as T } } diff --git a/payments-core/src/test/java/com/stripe/android/payments/StripeBrowserLauncherViewModelTest.kt b/payments-core/src/test/java/com/stripe/android/payments/StripeBrowserLauncherViewModelTest.kt index b403c3cc46c..52c8540c927 100644 --- a/payments-core/src/test/java/com/stripe/android/payments/StripeBrowserLauncherViewModelTest.kt +++ b/payments-core/src/test/java/com/stripe/android/payments/StripeBrowserLauncherViewModelTest.kt @@ -36,18 +36,11 @@ class StripeBrowserLauncherViewModelTest { val viewModel = createViewModel() val launchIntent = viewModel.createLaunchIntent(ARGS) - val browserIntent = requireNotNull(launchIntent?.getParcelableExtra(Intent.EXTRA_INTENT)) + val browserIntent = requireNotNull(launchIntent.getParcelableExtra(Intent.EXTRA_INTENT)) assertThat(browserIntent.action).isEqualTo(Intent.ACTION_VIEW) assertThat(browserIntent.data).isEqualTo(Uri.parse("https://bank.com")) - assertThat(launchIntent?.getStringExtra(Intent.EXTRA_TITLE)).isEqualTo("Verify your payment") - } - - @Test - fun `createLaunchIntent() returns null if intent can't be resolved`() { - val viewModel = createViewModel(canResolveIntent = false) - val launchIntent = viewModel.createLaunchIntent(ARGS) - assertThat(launchIntent).isNull() + assertThat(launchIntent.getStringExtra(Intent.EXTRA_TITLE)).isEqualTo("Verify your payment") } @Test @@ -105,7 +98,6 @@ class StripeBrowserLauncherViewModelTest { private fun createViewModel( browserCapabilities: BrowserCapabilities = BrowserCapabilities.CustomTabs, - canResolveIntent: Boolean = true, ): StripeBrowserLauncherViewModel { return StripeBrowserLauncherViewModel( analyticsRequestExecutor = analyticsRequestExecutor, @@ -114,7 +106,6 @@ class StripeBrowserLauncherViewModelTest { intentChooserTitle = "Verify your payment", resolveErrorMessage = "Unable to resolve things", savedStateHandle = savedStateHandle, - intentResolver = { canResolveIntent }, ) }