From 16ae2c870f882c2bf26e171b28251871fa6d5b24 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 15 Nov 2021 13:21:30 -0400 Subject: [PATCH] Modify boost and subscribe error dialog logic. --- .../app/subscription/DonationExceptions.kt | 1 + .../subscription/DonationPaymentRepository.kt | 19 +++++++++++----- .../app/subscription/boost/BoostFragment.kt | 22 +++++++++---------- .../subscribe/SubscribeFragment.kt | 20 ++++++++--------- .../subscribe/SubscribeViewModel.kt | 6 ++++- 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationExceptions.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationExceptions.kt index 4ff4882b96..ed11cb9816 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationExceptions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationExceptions.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.components.settings.app.subscription class DonationExceptions { + class SetupFailed(reason: Throwable) : Exception(reason) object TimedOutWaitingForTokenRedemption : Exception() object RedemptionFailed : Exception() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationPaymentRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationPaymentRepository.kt index e73cde219e..127632e56d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationPaymentRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationPaymentRepository.kt @@ -69,7 +69,7 @@ class DonationPaymentRepository(activity: Activity) : StripeApi.PaymentIntentFet } } - fun scheduleSyncForAccountRecordChangeSync() { + private fun scheduleSyncForAccountRecordChangeSync() { DatabaseFactory.getRecipientDatabase(application).markNeedsSync(Recipient.self().id) StorageSyncHelper.scheduleSyncForDataChange() } @@ -102,12 +102,15 @@ class DonationPaymentRepository(activity: Activity) : StripeApi.PaymentIntentFet } fun continuePayment(price: FiatMoney, paymentData: PaymentData): Completable { + Log.d(TAG, "Creating payment intent...", true) return stripeApi.createPaymentIntent(price) + .onErrorResumeNext { Single.error(DonationExceptions.SetupFailed(it)) } .flatMapCompletable { result -> + Log.d(TAG, "Created payment intent.", true) when (result) { - is StripeApi.CreatePaymentIntentResult.AmountIsTooSmall -> Completable.error(Exception("Boost amount is too small")) - is StripeApi.CreatePaymentIntentResult.AmountIsTooLarge -> Completable.error(Exception("Boost amount is too large")) - is StripeApi.CreatePaymentIntentResult.CurrencyIsNotSupported -> Completable.error(Exception("Boost currency is not supported")) + is StripeApi.CreatePaymentIntentResult.AmountIsTooSmall -> Completable.error(DonationExceptions.SetupFailed(Exception("Boost amount is too small"))) + is StripeApi.CreatePaymentIntentResult.AmountIsTooLarge -> Completable.error(DonationExceptions.SetupFailed(Exception("Boost amount is too large"))) + is StripeApi.CreatePaymentIntentResult.CurrencyIsNotSupported -> Completable.error(DonationExceptions.SetupFailed(Exception("Boost currency is not supported"))) is StripeApi.CreatePaymentIntentResult.Success -> confirmPayment(paymentData, result.paymentIntent) } } @@ -143,8 +146,10 @@ class DonationPaymentRepository(activity: Activity) : StripeApi.PaymentIntentFet } private fun confirmPayment(paymentData: PaymentData, paymentIntent: StripeApi.PaymentIntent): Completable { - return Completable.create { - stripeApi.confirmPaymentIntent(GooglePayPaymentSource(paymentData), paymentIntent).blockingSubscribe() + Log.d(TAG, "Confirming payment intent...", true) + val confirmPayment = stripeApi.confirmPaymentIntent(GooglePayPaymentSource(paymentData), paymentIntent) + val waitOnRedemption = Completable.create { + Log.d(TAG, "Confirmed payment intent.", true) val countDownLatch = CountDownLatch(1) var finalJobState: JobTracker.JobState? = null @@ -179,6 +184,8 @@ class DonationPaymentRepository(activity: Activity) : StripeApi.PaymentIntentFet it.onError(DonationExceptions.TimedOutWaitingForTokenRedemption) } } + + return confirmPayment.andThen(waitOnRedemption) } fun setSubscriptionLevel(subscriptionLevel: String): Completable { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt index b582722a02..f8a7ab13c7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt @@ -248,7 +248,17 @@ class BoostFragment : DSLSettingsBottomSheetFragment( findNavController().popBackStack() } .show() - } else if (throwable is DonationExceptions.RedemptionFailed) { + } else if (throwable is DonationExceptions.SetupFailed) { + Log.w(TAG, "Error occurred while processing payment", throwable, true) + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.DonationsErrors__payment_failed) + .setMessage(R.string.DonationsErrors__your_payment) + .setPositiveButton(android.R.string.ok) { dialog, _ -> + dialog.dismiss() + findNavController().popBackStack() + } + .show() + } else { Log.w(TAG, "Error occurred while trying to redeem token", throwable, true) MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.DonationsErrors__redemption_failed) @@ -259,16 +269,6 @@ class BoostFragment : DSLSettingsBottomSheetFragment( requireActivity().startActivity(AppSettingsActivity.help(requireContext(), HelpFragment.DONATION_INDEX)) } .show() - } else { - Log.w(TAG, "Error occurred while processing payment", throwable, true) - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.DonationsErrors__payment_failed) - .setMessage(R.string.DonationsErrors__your_payment) - .setPositiveButton(android.R.string.ok) { dialog, _ -> - dialog.dismiss() - findNavController().popBackStack() - } - .show() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeFragment.kt index cf784facd6..891858ac31 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeFragment.kt @@ -283,7 +283,16 @@ class SubscribeFragment : DSLSettingsFragment( requireActivity().startActivity(AppSettingsActivity.subscriptions(requireContext())) } .show() - } else if (throwable is DonationExceptions.RedemptionFailed) { + } else if (throwable is DonationExceptions.SetupFailed) { + Log.w(TAG, "Error occurred while processing payment", throwable, true) + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.DonationsErrors__payment_failed) + .setMessage(R.string.DonationsErrors__your_payment) + .setPositiveButton(android.R.string.ok) { dialog, _ -> + dialog.dismiss() + } + .show() + } else { Log.w(TAG, "Error occurred while trying to redeem token", throwable, true) MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.DonationsErrors__redemption_failed) @@ -294,15 +303,6 @@ class SubscribeFragment : DSLSettingsFragment( requireActivity().startActivity(AppSettingsActivity.help(requireContext(), HelpFragment.DONATION_INDEX)) } .show() - } else { - Log.w(TAG, "Error occurred while processing payment", throwable, true) - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.DonationsErrors__payment_failed) - .setMessage(R.string.DonationsErrors__your_payment) - .setPositiveButton(android.R.string.ok) { dialog, _ -> - dialog.dismiss() - } - .show() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeViewModel.kt index 5d250145a4..cf5e026b67 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.google.android.gms.wallet.PaymentData import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable @@ -17,6 +18,7 @@ import org.signal.core.util.logging.Log import org.signal.core.util.money.FiatMoney import org.signal.donations.GooglePayApi import org.thoughtcrime.securesms.components.settings.app.subscription.DonationEvent +import org.thoughtcrime.securesms.components.settings.app.subscription.DonationExceptions import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentRepository import org.thoughtcrime.securesms.components.settings.app.subscription.SubscriptionsRepository import org.thoughtcrime.securesms.keyvalue.SignalStore @@ -198,7 +200,9 @@ class SubscribeViewModel( store.update { it.copy(stage = SubscribeState.Stage.PAYMENT_PIPELINE) } - ensureSubscriberId.andThen(continueSetup).andThen(setLevel).subscribeBy( + val setup = ensureSubscriberId.andThen(continueSetup).onErrorResumeNext { Completable.error(DonationExceptions.SetupFailed(it)) } + + setup.andThen(setLevel).subscribeBy( onError = { throwable -> refreshActiveSubscription() store.update { it.copy(stage = SubscribeState.Stage.READY) }