mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-05-08 17:29:02 +01:00
Pipe in bank mandate parameter.
This commit is contained in:
committed by
Cody Henthorne
parent
95d68e09da
commit
dddd0e7b71
+21
-11
@@ -35,7 +35,6 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.compose.ui.res.vectorResource
|
import androidx.compose.ui.res.vectorResource
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.fragment.app.viewModels
|
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import org.signal.core.ui.Buttons
|
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.Scaffolds
|
||||||
import org.signal.core.ui.Texts
|
import org.signal.core.ui.Texts
|
||||||
import org.signal.core.ui.theme.SignalTheme
|
import org.signal.core.ui.theme.SignalTheme
|
||||||
|
import org.signal.donations.PaymentSourceType
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.settings.app.subscription.donate.gateway.GatewayResponse
|
import org.thoughtcrime.securesms.components.settings.app.subscription.donate.gateway.GatewayResponse
|
||||||
import org.thoughtcrime.securesms.compose.ComposeFragment
|
import org.thoughtcrime.securesms.compose.ComposeFragment
|
||||||
import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection
|
import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection
|
||||||
import org.thoughtcrime.securesms.util.SpanUtil
|
import org.thoughtcrime.securesms.util.SpanUtil
|
||||||
import org.thoughtcrime.securesms.util.navigation.safeNavigate
|
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.
|
* 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() {
|
class BankTransferMandateFragment : ComposeFragment() {
|
||||||
|
|
||||||
private val args: BankTransferMandateFragmentArgs by navArgs()
|
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
|
private lateinit var statusBarColorNestedScrollConnection: StatusBarColorNestedScrollConnection
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
@@ -71,9 +75,11 @@ class BankTransferMandateFragment : ComposeFragment() {
|
|||||||
@Composable
|
@Composable
|
||||||
override fun FragmentContent() {
|
override fun FragmentContent() {
|
||||||
val mandate by viewModel.mandate
|
val mandate by viewModel.mandate
|
||||||
|
val failedToLoadMandate by viewModel.failedToLoadMandate
|
||||||
|
|
||||||
BankTransferScreen(
|
BankTransferScreen(
|
||||||
bankMandate = mandate,
|
bankMandate = mandate,
|
||||||
|
failedToLoadMandate = failedToLoadMandate,
|
||||||
onNavigationClick = this::onNavigationClick,
|
onNavigationClick = this::onNavigationClick,
|
||||||
onContinueClick = this::onContinueClick,
|
onContinueClick = this::onContinueClick,
|
||||||
onLearnMoreClick = this::onLearnMoreClick,
|
onLearnMoreClick = this::onLearnMoreClick,
|
||||||
@@ -110,6 +116,7 @@ fun BankTransferScreenPreview() {
|
|||||||
SignalTheme {
|
SignalTheme {
|
||||||
BankTransferScreen(
|
BankTransferScreen(
|
||||||
bankMandate = "Test ".repeat(500),
|
bankMandate = "Test ".repeat(500),
|
||||||
|
failedToLoadMandate = false,
|
||||||
onNavigationClick = {},
|
onNavigationClick = {},
|
||||||
onContinueClick = {},
|
onContinueClick = {},
|
||||||
onLearnMoreClick = {}
|
onLearnMoreClick = {}
|
||||||
@@ -120,6 +127,7 @@ fun BankTransferScreenPreview() {
|
|||||||
@Composable
|
@Composable
|
||||||
fun BankTransferScreen(
|
fun BankTransferScreen(
|
||||||
bankMandate: String,
|
bankMandate: String,
|
||||||
|
failedToLoadMandate: Boolean,
|
||||||
onNavigationClick: () -> Unit,
|
onNavigationClick: () -> Unit,
|
||||||
onContinueClick: () -> Unit,
|
onContinueClick: () -> Unit,
|
||||||
onLearnMoreClick: () -> Unit,
|
onLearnMoreClick: () -> Unit,
|
||||||
@@ -193,20 +201,22 @@ fun BankTransferScreen(
|
|||||||
|
|
||||||
item {
|
item {
|
||||||
Text(
|
Text(
|
||||||
text = bankMandate,
|
text = if (failedToLoadMandate) stringResource(id = R.string.BankTransferMandateFragment__failed_to_load_mandate) else bankMandate,
|
||||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter), vertical = 16.dp)
|
modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter), vertical = 16.dp)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
item {
|
if (!failedToLoadMandate) {
|
||||||
Buttons.LargeTonal(
|
item {
|
||||||
onClick = onContinueClick,
|
Buttons.LargeTonal(
|
||||||
modifier = Modifier
|
onClick = onContinueClick,
|
||||||
.padding(top = 16.dp, bottom = 46.dp)
|
modifier = Modifier
|
||||||
.defaultMinSize(minWidth = 220.dp)
|
.padding(top = 16.dp, bottom = 46.dp)
|
||||||
) {
|
.defaultMinSize(minWidth = 220.dp)
|
||||||
Text(text = stringResource(id = R.string.BankTransferMandateFragment__continue))
|
) {
|
||||||
|
Text(text = stringResource(id = R.string.BankTransferMandateFragment__continue))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -7,14 +7,15 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.donate.t
|
|||||||
|
|
||||||
import io.reactivex.rxjava3.core.Single
|
import io.reactivex.rxjava3.core.Single
|
||||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
|
import org.signal.donations.PaymentSourceType
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
class BankTransferMandateRepository {
|
class BankTransferMandateRepository {
|
||||||
|
|
||||||
fun getMandate(): Single<String> {
|
fun getMandate(paymentSourceType: PaymentSourceType.Stripe): Single<String> {
|
||||||
return Single
|
return Single
|
||||||
.fromCallable { ApplicationDependencies.getDonationsService().getBankMandate(Locale.getDefault()) }
|
.fromCallable { ApplicationDependencies.getDonationsService().getBankMandate(Locale.getDefault(), paymentSourceType.paymentMethod) }
|
||||||
.flatMap { it.flattenResult() }
|
.flatMap { it.flattenResult() }
|
||||||
.map { it.mandate }
|
.map { it.mandate }
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
|
|||||||
+11
-2
@@ -12,21 +12,30 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
|||||||
import io.reactivex.rxjava3.disposables.CompositeDisposable
|
import io.reactivex.rxjava3.disposables.CompositeDisposable
|
||||||
import io.reactivex.rxjava3.kotlin.plusAssign
|
import io.reactivex.rxjava3.kotlin.plusAssign
|
||||||
import io.reactivex.rxjava3.kotlin.subscribeBy
|
import io.reactivex.rxjava3.kotlin.subscribeBy
|
||||||
|
import org.signal.donations.PaymentSourceType
|
||||||
|
|
||||||
class BankTransferMandateViewModel(
|
class BankTransferMandateViewModel(
|
||||||
|
paymentSourceType: PaymentSourceType,
|
||||||
repository: BankTransferMandateRepository = BankTransferMandateRepository()
|
repository: BankTransferMandateRepository = BankTransferMandateRepository()
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
private val disposables = CompositeDisposable()
|
private val disposables = CompositeDisposable()
|
||||||
private val internalMandate = mutableStateOf("")
|
private val internalMandate = mutableStateOf("")
|
||||||
|
private val internalFailedToLoadMandate = mutableStateOf(false)
|
||||||
|
|
||||||
val mandate: State<String> = internalMandate
|
val mandate: State<String> = internalMandate
|
||||||
|
val failedToLoadMandate: State<Boolean> = internalFailedToLoadMandate
|
||||||
|
|
||||||
init {
|
init {
|
||||||
disposables += repository.getMandate()
|
disposables += repository.getMandate(paymentSourceType as PaymentSourceType.Stripe)
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribeBy(
|
.subscribeBy(
|
||||||
onSuccess = { internalMandate.value = it },
|
onSuccess = { internalMandate.value = it },
|
||||||
onError = { internalMandate.value = "Failed to load mandate." }
|
onError = { internalFailedToLoadMandate.value = true }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onCleared() {
|
||||||
|
disposables.clear()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5889,6 +5889,8 @@
|
|||||||
<string name="BankTransferMandateFragment__learn_more">Learn more</string>
|
<string name="BankTransferMandateFragment__learn_more">Learn more</string>
|
||||||
<!-- Button label to continue with transfer -->
|
<!-- Button label to continue with transfer -->
|
||||||
<string name="BankTransferMandateFragment__continue">Continue</string>
|
<string name="BankTransferMandateFragment__continue">Continue</string>
|
||||||
|
<!-- Text displayed when mandate load fails -->
|
||||||
|
<string name="BankTransferMandateFragment__failed_to_load_mandate">Failed to load mandate</string>
|
||||||
|
|
||||||
<!-- BankTransferDetailsFragment -->
|
<!-- BankTransferDetailsFragment -->
|
||||||
<!-- Subtext explaining how email is used. Placeholder is \'Learn more\' -->
|
<!-- Subtext explaining how email is used. Placeholder is \'Learn more\' -->
|
||||||
|
|||||||
+2
-2
@@ -120,11 +120,11 @@ public class DonationsService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServiceResponse<BankMandate> getBankMandate(Locale locale) {
|
public ServiceResponse<BankMandate> getBankMandate(Locale locale, String bankTransferType) {
|
||||||
return getCachedValue(
|
return getCachedValue(
|
||||||
locale,
|
locale,
|
||||||
sepaBankMandateCache,
|
sepaBankMandateCache,
|
||||||
l -> pushServiceSocket.getBankMandate(l, "SEPA_DEBIT"),
|
l -> pushServiceSocket.getBankMandate(l, bankTransferType),
|
||||||
SEPA_DEBIT_MANDATE_TTL
|
SEPA_DEBIT_MANDATE_TTL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user