diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt index f68c3d86e5..ec1de0ac3d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt @@ -35,7 +35,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import org.signal.core.ui.Buttons @@ -43,12 +42,14 @@ import org.signal.core.ui.Dividers import org.signal.core.ui.Scaffolds import org.signal.core.ui.Texts import org.signal.core.ui.theme.SignalTheme +import org.signal.donations.PaymentSourceType import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.app.subscription.donate.gateway.GatewayResponse import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.navigation.safeNavigate +import org.thoughtcrime.securesms.util.viewModel /** * Displays Bank Transfer legal mandate users must agree to to move forward. @@ -56,7 +57,10 @@ import org.thoughtcrime.securesms.util.navigation.safeNavigate class BankTransferMandateFragment : ComposeFragment() { private val args: BankTransferMandateFragmentArgs by navArgs() - private val viewModel: BankTransferMandateViewModel by viewModels() + private val viewModel: BankTransferMandateViewModel by viewModel { + BankTransferMandateViewModel(PaymentSourceType.Stripe.SEPADebit) + } + private lateinit var statusBarColorNestedScrollConnection: StatusBarColorNestedScrollConnection override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -71,9 +75,11 @@ class BankTransferMandateFragment : ComposeFragment() { @Composable override fun FragmentContent() { val mandate by viewModel.mandate + val failedToLoadMandate by viewModel.failedToLoadMandate BankTransferScreen( bankMandate = mandate, + failedToLoadMandate = failedToLoadMandate, onNavigationClick = this::onNavigationClick, onContinueClick = this::onContinueClick, onLearnMoreClick = this::onLearnMoreClick, @@ -110,6 +116,7 @@ fun BankTransferScreenPreview() { SignalTheme { BankTransferScreen( bankMandate = "Test ".repeat(500), + failedToLoadMandate = false, onNavigationClick = {}, onContinueClick = {}, onLearnMoreClick = {} @@ -120,6 +127,7 @@ fun BankTransferScreenPreview() { @Composable fun BankTransferScreen( bankMandate: String, + failedToLoadMandate: Boolean, onNavigationClick: () -> Unit, onContinueClick: () -> Unit, onLearnMoreClick: () -> Unit, @@ -193,20 +201,22 @@ fun BankTransferScreen( item { Text( - text = bankMandate, + text = if (failedToLoadMandate) stringResource(id = R.string.BankTransferMandateFragment__failed_to_load_mandate) else bankMandate, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter), vertical = 16.dp) ) } - item { - Buttons.LargeTonal( - onClick = onContinueClick, - modifier = Modifier - .padding(top = 16.dp, bottom = 46.dp) - .defaultMinSize(minWidth = 220.dp) - ) { - Text(text = stringResource(id = R.string.BankTransferMandateFragment__continue)) + if (!failedToLoadMandate) { + item { + Buttons.LargeTonal( + onClick = onContinueClick, + modifier = Modifier + .padding(top = 16.dp, bottom = 46.dp) + .defaultMinSize(minWidth = 220.dp) + ) { + Text(text = stringResource(id = R.string.BankTransferMandateFragment__continue)) + } } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateRepository.kt index 3080b89b34..16495a83a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateRepository.kt @@ -7,14 +7,15 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.donate.t import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.donations.PaymentSourceType import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import java.util.Locale class BankTransferMandateRepository { - fun getMandate(): Single { + fun getMandate(paymentSourceType: PaymentSourceType.Stripe): Single { return Single - .fromCallable { ApplicationDependencies.getDonationsService().getBankMandate(Locale.getDefault()) } + .fromCallable { ApplicationDependencies.getDonationsService().getBankMandate(Locale.getDefault(), paymentSourceType.paymentMethod) } .flatMap { it.flattenResult() } .map { it.mandate } .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateViewModel.kt index 1363c4b3c8..2d9e5efe57 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateViewModel.kt @@ -12,21 +12,30 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.donations.PaymentSourceType class BankTransferMandateViewModel( + paymentSourceType: PaymentSourceType, repository: BankTransferMandateRepository = BankTransferMandateRepository() ) : ViewModel() { private val disposables = CompositeDisposable() private val internalMandate = mutableStateOf("") + private val internalFailedToLoadMandate = mutableStateOf(false) + val mandate: State = internalMandate + val failedToLoadMandate: State = internalFailedToLoadMandate init { - disposables += repository.getMandate() + disposables += repository.getMandate(paymentSourceType as PaymentSourceType.Stripe) .observeOn(AndroidSchedulers.mainThread()) .subscribeBy( onSuccess = { internalMandate.value = it }, - onError = { internalMandate.value = "Failed to load mandate." } + onError = { internalFailedToLoadMandate.value = true } ) } + + override fun onCleared() { + disposables.clear() + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72ce2c4a32..8f4299e80a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5889,6 +5889,8 @@ Learn more Continue + + Failed to load mandate diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/DonationsService.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/DonationsService.java index ab10e6be67..922c168dac 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/DonationsService.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/DonationsService.java @@ -120,11 +120,11 @@ public class DonationsService { ); } - public ServiceResponse getBankMandate(Locale locale) { + public ServiceResponse getBankMandate(Locale locale, String bankTransferType) { return getCachedValue( locale, sepaBankMandateCache, - l -> pushServiceSocket.getBankMandate(l, "SEPA_DEBIT"), + l -> pushServiceSocket.getBankMandate(l, bankTransferType), SEPA_DEBIT_MANDATE_TTL ); }