Update payment failure ux.

This commit is contained in:
Alex Hart
2021-11-19 17:01:34 -04:00
committed by Cody Henthorne
parent 8a00caabd7
commit f260633c9d
8 changed files with 81 additions and 22 deletions

View File

@@ -21,7 +21,6 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter
import org.thoughtcrime.securesms.components.settings.DSLSettingsBottomSheetFragment
import org.thoughtcrime.securesms.components.settings.DSLSettingsIcon
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity
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.DonationPaymentComponent
@@ -31,7 +30,6 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.models.Ne
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.components.settings.models.Progress
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.help.HelpFragment
import org.thoughtcrime.securesms.keyboard.findListener
import org.thoughtcrime.securesms.util.BottomSheetUtil.requireCoordinatorLayout
import org.thoughtcrime.securesms.util.CommunicationActions
@@ -251,7 +249,7 @@ class BoostFragment : DSLSettingsBottomSheetFragment(
} else if (throwable is DonationExceptions.SetupFailed) {
Log.w(TAG, "Error occurred while processing payment", throwable, true)
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.DonationsErrors__payment_failed)
.setTitle(R.string.DonationsErrors__error_processing_payment)
.setMessage(R.string.DonationsErrors__your_payment)
.setPositiveButton(android.R.string.ok) { dialog, _ ->
dialog.dismiss()
@@ -265,8 +263,7 @@ class BoostFragment : DSLSettingsBottomSheetFragment(
.setMessage(R.string.DonationsErrors__your_badge_could_not)
.setPositiveButton(R.string.Subscription__contact_support) { dialog, _ ->
dialog.dismiss()
requireActivity().finish()
requireActivity().startActivity(AppSettingsActivity.help(requireContext(), HelpFragment.DONATION_INDEX))
findNavController().popBackStack()
}
.show()
}

View File

@@ -1,6 +1,5 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.manage
import android.text.SpannableStringBuilder
import android.text.method.LinkMovementMethod
import android.view.View
import android.widget.ProgressBar
@@ -11,6 +10,7 @@ import org.signal.core.util.money.FiatMoney
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.badges.BadgeImageView
import org.thoughtcrime.securesms.components.settings.PreferenceModel
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.payments.FiatMoneyUtil
import org.thoughtcrime.securesms.subscription.Subscription
import org.thoughtcrime.securesms.util.DateUtils
@@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.util.MappingAdapter
import org.thoughtcrime.securesms.util.MappingViewHolder
import org.thoughtcrime.securesms.util.SpanUtil
import org.thoughtcrime.securesms.util.visible
import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription
import java.util.Locale
/**
@@ -32,6 +33,7 @@ object ActiveSubscriptionPreference {
val onAddBoostClick: () -> Unit,
val renewalTimestamp: Long = -1L,
val redemptionState: ManageDonationsState.SubscriptionRedemptionState,
val activeSubscription: ActiveSubscription.Subscription,
val onContactSupport: () -> Unit
) : PreferenceModel<Model>() {
override fun areItemsTheSame(newItem: Model): Boolean {
@@ -42,7 +44,9 @@ object ActiveSubscriptionPreference {
return super.areContentsTheSame(newItem) &&
subscription == newItem.subscription &&
renewalTimestamp == newItem.renewalTimestamp &&
redemptionState == newItem.redemptionState
redemptionState == newItem.redemptionState &&
FiatMoney.equals(price, newItem.price) &&
activeSubscription == newItem.activeSubscription
}
}
@@ -99,14 +103,35 @@ object ActiveSubscriptionPreference {
}
private fun presentFailureState(model: Model) {
expiry.text = SpannableStringBuilder(context.getString(R.string.MySupportPreference__couldnt_add_badge))
.append(" ")
.append(
SpanUtil.clickable(
context.getString(R.string.MySupportPreference__please_contact_support),
ContextCompat.getColor(context, R.color.signal_accent_primary)
) { model.onContactSupport() }
)
if (model.activeSubscription.isFailedPayment || SignalStore.donationsValues().shouldCancelSubscriptionBeforeNextSubscribeAttempt) {
presentPaymentFailureState(model)
} else {
presentRedemptionFailureState(model)
}
}
private fun presentPaymentFailureState(model: Model) {
expiry.text = SpanUtil.clickSubstring(
context.getString(R.string.DonationsErrors__error_processing_payment_s),
context.getString(R.string.MySupportPreference__please_contact_support),
{
model.onContactSupport()
},
ContextCompat.getColor(context, R.color.signal_accent_primary)
)
badge.alpha = 0.2f
progress.visible = false
}
private fun presentRedemptionFailureState(model: Model) {
expiry.text = SpanUtil.clickSubstring(
context.getString(R.string.MySupportPreference__couldnt_add_badge_s),
context.getString(R.string.MySupportPreference__please_contact_support),
{
model.onContactSupport()
},
ContextCompat.getColor(context, R.color.signal_accent_primary)
)
badge.alpha = 0.2f
progress.visible = false
}

View File

@@ -108,7 +108,8 @@ class ManageDonationsFragment : DSLSettingsFragment() {
onContactSupport = {
requireActivity().finish()
requireActivity().startActivity(AppSettingsActivity.help(requireContext(), HelpFragment.DONATION_INDEX))
}
},
activeSubscription = activeSubscription
)
)

View File

@@ -31,6 +31,7 @@ import org.thoughtcrime.securesms.components.settings.models.Progress
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.help.HelpFragment
import org.thoughtcrime.securesms.keyboard.findListener
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.payments.FiatMoneyUtil
import org.thoughtcrime.securesms.subscription.Subscription
import org.thoughtcrime.securesms.util.LifecycleDisposable
@@ -181,7 +182,7 @@ class SubscribeFragment : DSLSettingsFragment(
customPref(
Subscription.Model(
activePrice = if (isActive) { activePrice } else null,
activePrice = if (isActive) activePrice else null,
subscription = it,
isSelected = state.selectedSubscription == it,
isEnabled = areFieldsEnabled,
@@ -289,12 +290,23 @@ class SubscribeFragment : DSLSettingsFragment(
} else if (throwable is DonationExceptions.SetupFailed) {
Log.w(TAG, "Error occurred while processing payment", throwable, true)
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.DonationsErrors__payment_failed)
.setTitle(R.string.DonationsErrors__error_processing_payment)
.setMessage(R.string.DonationsErrors__your_payment)
.setPositiveButton(android.R.string.ok) { dialog, _ ->
dialog.dismiss()
}
.show()
} else if (SignalStore.donationsValues().shouldCancelSubscriptionBeforeNextSubscribeAttempt) {
Log.w(TAG, "Stripe failed to process payment", throwable, true)
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.DonationsErrors__error_processing_payment)
.setMessage(R.string.DonationsErrors__your_badge_could_not_be_added)
.setPositiveButton(R.string.Subscription__contact_support) { dialog, _ ->
dialog.dismiss()
requireActivity().finish()
requireActivity().startActivity(AppSettingsActivity.help(requireContext(), HelpFragment.DONATION_INDEX))
}
.show()
} else {
Log.w(TAG, "Error occurred while trying to redeem token", throwable, true)
MaterialAlertDialogBuilder(requireContext())