diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt index 48daec68c4..0745ddc897 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt @@ -29,7 +29,6 @@ import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.onFocusChanged -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -53,7 +52,6 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.donate.Do import org.thoughtcrime.securesms.components.settings.app.subscription.donate.stripe.StripePaymentInProgressViewModel import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.payments.FiatMoneyUtil -import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.fragments.requireListener import org.thoughtcrime.securesms.util.navigation.safeNavigate @@ -97,7 +95,8 @@ class BankTransferDetailsFragment : ComposeFragment() { onNameChanged = viewModel::onNameChanged, onIBANChanged = viewModel::onIBANChanged, onEmailChanged = viewModel::onEmailChanged, - onFindAccountNumbersClicked = this::onFindAccountNumbersClicked, + setDisplayFindAccountInfoSheet = viewModel::setDisplayFindAccountInfoSheet, + onLearnMoreClick = this::onLearnMoreClick, onDonateClick = this::onDonateClick, onIBANFocusChanged = viewModel::onIBANFocusChanged, donateLabel = donateLabel @@ -108,8 +107,10 @@ class BankTransferDetailsFragment : ComposeFragment() { findNavController().popBackStack() } - private fun onFindAccountNumbersClicked() { - // TODO [sepa] -- FindAccountNumbersBottomSheet + private fun onLearnMoreClick() { + findNavController().safeNavigate( + BankTransferDetailsFragmentDirections.actionBankTransferDetailsFragmentToYourInformationIsPrivateBottomSheet() + ) } private fun onDonateClick() { @@ -129,13 +130,15 @@ private fun BankTransferDetailsContentPreview() { SignalTheme { BankTransferDetailsContent( state = BankTransferDetailsState( - name = "Miles Morales" + name = "Miles Morales", + displayFindAccountInfoSheet = true ), onNavigationClick = {}, onNameChanged = {}, onIBANChanged = {}, onEmailChanged = {}, - onFindAccountNumbersClicked = {}, + setDisplayFindAccountInfoSheet = {}, + onLearnMoreClick = {}, onDonateClick = {}, onIBANFocusChanged = {}, donateLabel = "Donate $5/month" @@ -150,7 +153,8 @@ private fun BankTransferDetailsContent( onNameChanged: (String) -> Unit, onIBANChanged: (String) -> Unit, onEmailChanged: (String) -> Unit, - onFindAccountNumbersClicked: () -> Unit, + setDisplayFindAccountInfoSheet: (Boolean) -> Unit, + onLearnMoreClick: () -> Unit, onDonateClick: () -> Unit, onIBANFocusChanged: (Boolean) -> Unit, donateLabel: String @@ -178,12 +182,11 @@ private fun BankTransferDetailsContent( item { val learnMore = stringResource(id = R.string.BankTransferDetailsFragment__learn_more) val fullString = stringResource(id = R.string.BankTransferDetailsFragment__enter_your_bank_details, learnMore) - val context = LocalContext.current Texts.LinkifiedText( textWithUrlSpans = SpanUtil.urlSubsequence(fullString, learnMore, stringResource(id = R.string.donate_url)), // TODO [alex] -- final URL onUrlClick = { - CommunicationActions.openBrowserLink(context, it) + onLearnMoreClick() }, style = MaterialTheme.typography.bodyLarge.copy( color = MaterialTheme.colorScheme.onSurfaceVariant @@ -276,9 +279,9 @@ private fun BankTransferDetailsContent( modifier = Modifier.fillMaxWidth() ) { TextButton( - onClick = onFindAccountNumbersClicked + onClick = { setDisplayFindAccountInfoSheet(true) } ) { - Text(text = stringResource(id = R.string.BankTransferDetailsFragment__find_account_numbers)) + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__find_account_info)) } } } @@ -294,6 +297,10 @@ private fun BankTransferDetailsContent( Text(text = donateLabel) } + if (state.displayFindAccountInfoSheet) { + FindAccountInfoSheet { setDisplayFindAccountInfoSheet(false) } + } + LaunchedEffect(Unit) { focusRequester.requestFocus() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsState.kt index df83741177..0c8f3491fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsState.kt @@ -11,7 +11,8 @@ data class BankTransferDetailsState( val name: String = "", val iban: String = "", val email: String = "", - val ibanValidity: IBANValidator.Validity = IBANValidator.Validity.POTENTIALLY_VALID + val ibanValidity: IBANValidator.Validity = IBANValidator.Validity.POTENTIALLY_VALID, + val displayFindAccountInfoSheet: Boolean = false ) { val canProceed = name.isNotEmpty() && email.isNotEmpty() && ibanValidity == IBANValidator.Validity.COMPLETELY_VALID diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsViewModel.kt index c58ae449e9..c0153e911e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsViewModel.kt @@ -18,6 +18,12 @@ class BankTransferDetailsViewModel : ViewModel() { private val internalState = mutableStateOf(BankTransferDetailsState()) val state: State = internalState + fun setDisplayFindAccountInfoSheet(displayFindAccountInfoSheet: Boolean) { + internalState.value = internalState.value.copy( + displayFindAccountInfoSheet = displayFindAccountInfoSheet + ) + } + fun onNameChanged(name: String) { internalState.value = internalState.value.copy( name = name diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/FindAccountInfoSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/FindAccountInfoSheet.kt new file mode 100644 index 0000000000..07725beb28 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/FindAccountInfoSheet.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.components.settings.app.subscription.donate.transfer.details + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment.Companion.CenterHorizontally +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import org.signal.core.ui.BottomSheets +import org.thoughtcrime.securesms.R + +/** + * Displays a modal bottom sheet that explains where to find the information necessary to perform + * a bank transfer. + */ +@Composable +@OptIn(ExperimentalMaterial3Api::class) +fun FindAccountInfoSheet( + onDismissRequest: () -> Unit +) { + ModalBottomSheet( + onDismissRequest = onDismissRequest, + dragHandle = { BottomSheets.Handle() } + ) { + Image( + painter = painterResource(id = R.drawable.find_account_info), + contentDescription = null, + modifier = Modifier + .align(CenterHorizontally) + .padding(vertical = 32.dp) + ) + + Text( + text = stringResource(id = R.string.FindAccountInfoSheet__find_your_account_information), + style = MaterialTheme.typography.titleLarge, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 60.dp) + .align(CenterHorizontally) + ) + + Text( + text = stringResource(id = R.string.FindAccountInfoSheet__look_for_your_iban), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp, bottom = 48.dp, start = 60.dp, end = 60.dp) + .align(CenterHorizontally) + ) + } +} 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 65f48c1b00..e7ca49c4cb 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 @@ -7,7 +7,6 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.donate.t import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth @@ -24,7 +23,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource @@ -40,7 +38,6 @@ import org.signal.core.ui.Texts import org.signal.core.ui.theme.SignalTheme import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.compose.ComposeFragment -import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.navigation.safeNavigate @@ -59,7 +56,14 @@ class BankTransferMandateFragment : ComposeFragment() { BankTransferScreen( bankMandate = mandate, onNavigationClick = this::onNavigationClick, - onContinueClick = this::onContinueClick + onContinueClick = this::onContinueClick, + onLearnMoreClick = this::onLearnMoreClick + ) + } + + private fun onLearnMoreClick() { + findNavController().safeNavigate( + BankTransferMandateFragmentDirections.actionBankTransferMandateFragmentToYourInformationIsPrivateBottomSheet() ) } @@ -81,7 +85,8 @@ fun BankTransferScreenPreview() { BankTransferScreen( bankMandate = "Test ".repeat(500), onNavigationClick = {}, - onContinueClick = {} + onContinueClick = {}, + onLearnMoreClick = {} ) } } @@ -90,85 +95,80 @@ fun BankTransferScreenPreview() { fun BankTransferScreen( bankMandate: String, onNavigationClick: () -> Unit, - onContinueClick: () -> Unit + onContinueClick: () -> Unit, + onLearnMoreClick: () -> Unit ) { Scaffolds.Settings( title = "", onNavigationClick = onNavigationClick, navigationIconPainter = rememberVectorPainter(ImageVector.vectorResource(id = R.drawable.symbol_arrow_left_24)) ) { - Column( + LazyColumn( horizontalAlignment = CenterHorizontally, modifier = Modifier .fillMaxWidth() .fillMaxHeight() + .padding(top = 64.dp) ) { - LazyColumn( - horizontalAlignment = CenterHorizontally, - modifier = Modifier - .fillMaxWidth() - .weight(1f) - .padding(top = 64.dp) - ) { - item { - Image( - painter = painterResource(id = R.drawable.credit_card), // TODO [alex] -- final asset - contentScale = ContentScale.Inside, - contentDescription = null, - modifier = Modifier - .size(72.dp) - .background( - SignalTheme.colors.colorSurface2, - CircleShape - ) - ) - } - - item { - Text( - text = stringResource(id = R.string.BankTransferMandateFragment__bank_transfer), - style = MaterialTheme.typography.headlineMedium, - modifier = Modifier.padding(top = 12.dp, bottom = 15.dp) - ) - } - - item { - val learnMore = stringResource(id = R.string.BankTransferMandateFragment__learn_more) - val fullString = stringResource(id = R.string.BankTransferMandateFragment__stripe_processes_donations, learnMore) - val context = LocalContext.current - - Texts.LinkifiedText( - textWithUrlSpans = SpanUtil.urlSubsequence(fullString, learnMore, stringResource(id = R.string.donate_url)), // TODO [alex] -- final URL - onUrlClick = { - CommunicationActions.openBrowserLink(context, it) - }, - style = MaterialTheme.typography.bodyLarge.copy( - color = MaterialTheme.colorScheme.onSurfaceVariant - ), - modifier = Modifier.padding(bottom = 12.dp, start = 32.dp, end = 32.dp) - ) - } - - item { - Dividers.Default() - } - - item { - Text( - text = bankMandate, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(horizontal = 32.dp, vertical = 16.dp) - ) - } + item { + Image( + painter = painterResource(id = R.drawable.credit_card), // TODO [alex] -- final asset + contentScale = ContentScale.Inside, + contentDescription = null, + modifier = Modifier + .size(72.dp) + .background( + SignalTheme.colors.colorSurface2, + CircleShape + ) + ) } - 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)) + item { + Text( + text = stringResource(id = R.string.BankTransferMandateFragment__bank_transfer), + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.padding(top = 12.dp, bottom = 15.dp) + ) + } + + item { + val learnMore = stringResource(id = R.string.BankTransferMandateFragment__learn_more) + val fullString = stringResource(id = R.string.BankTransferMandateFragment__stripe_processes_donations, learnMore) + + Texts.LinkifiedText( + textWithUrlSpans = SpanUtil.urlSubsequence(fullString, learnMore, stringResource(id = R.string.donate_url)), // TODO [alex] -- final URL + onUrlClick = { + onLearnMoreClick() + }, + style = MaterialTheme.typography.bodyLarge.copy( + color = MaterialTheme.colorScheme.onSurfaceVariant + ), + modifier = Modifier.padding(bottom = 12.dp, start = 32.dp, end = 32.dp) + ) + } + + item { + Dividers.Default() + } + + item { + Text( + text = bankMandate, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(horizontal = 32.dp, 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)) + } } } } diff --git a/app/src/main/res/drawable/find_account_info.xml b/app/src/main/res/drawable/find_account_info.xml new file mode 100644 index 0000000000..ec13de63bf --- /dev/null +++ b/app/src/main/res/drawable/find_account_info.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/navigation/donate_to_signal.xml b/app/src/main/res/navigation/donate_to_signal.xml index 0d340e5791..8a5ba34355 100644 --- a/app/src/main/res/navigation/donate_to_signal.xml +++ b/app/src/main/res/navigation/donate_to_signal.xml @@ -221,6 +221,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/navigation/gift_flow.xml b/app/src/main/res/navigation/gift_flow.xml index c30eab59c7..e71499876f 100644 --- a/app/src/main/res/navigation/gift_flow.xml +++ b/app/src/main/res/navigation/gift_flow.xml @@ -202,6 +202,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 267531f37f..89d6a441b2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5840,7 +5840,7 @@ Email - Find account numbers + Find account info Donate %1$s/month @@ -5854,6 +5854,11 @@ Invalid IBAN number + + Find your account information + + Look for your IBAN number at the top of your bank statement. IBAN numbers contain up to 32 characters. The name you enter should match your full name on your bank account. Contact your bank for more information. + Cancelling…