Implement small screen support for BankTransferMandateFragment.

This commit is contained in:
Alex Hart
2023-10-12 17:17:11 -03:00
committed by Cody Henthorne
parent 7001cedbc7
commit ebc6665224
8 changed files with 70 additions and 43 deletions

View File

@@ -65,13 +65,13 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) {
} }
} }
binding.title.text = if (args.request.donateToSignalType == DonateToSignalType.MONTHLY) { binding.continueButton.text = if (args.request.donateToSignalType == DonateToSignalType.MONTHLY) {
getString( getString(
R.string.CreditCardFragment__donation_amount_s_per_month, R.string.CreditCardFragment__donate_s_month,
FiatMoneyUtil.format(resources, args.request.fiat, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) FiatMoneyUtil.format(resources, args.request.fiat, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal())
) )
} else { } else {
getString(R.string.CreditCardFragment__donation_amount_s, FiatMoneyUtil.format(resources, args.request.fiat)) getString(R.string.CreditCardFragment__donate_s, FiatMoneyUtil.format(resources, args.request.fiat))
} }
binding.description.setLinkColor(ContextCompat.getColor(requireContext(), R.color.signal_colorPrimary)) binding.description.setLinkColor(ContextCompat.getColor(requireContext(), R.color.signal_colorPrimary))

View File

@@ -195,7 +195,7 @@ private fun BankTransferDetailsContent(
onUrlClick = { onUrlClick = {
onLearnMoreClick() onLearnMoreClick()
}, },
style = MaterialTheme.typography.bodyLarge.copy( style = MaterialTheme.typography.bodyMedium.copy(
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
), ),
modifier = Modifier.padding(vertical = 12.dp) modifier = Modifier.padding(vertical = 12.dp)

View File

@@ -5,6 +5,11 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.donate.transfer.mandate package org.thoughtcrime.securesms.components.settings.app.subscription.donate.transfer.mandate
import android.os.Bundle
import android.view.View
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.defaultMinSize
@@ -22,7 +27,9 @@ import androidx.compose.ui.Alignment.Companion.CenterHorizontally
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource import androidx.compose.ui.res.vectorResource
@@ -38,6 +45,7 @@ import org.signal.core.ui.Texts
import org.signal.core.ui.theme.SignalTheme import org.signal.core.ui.theme.SignalTheme
import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.compose.ComposeFragment
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
@@ -48,6 +56,16 @@ 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 viewModels()
private lateinit var statusBarColorNestedScrollConnection: StatusBarColorNestedScrollConnection
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
statusBarColorNestedScrollConnection = StatusBarColorNestedScrollConnection(requireActivity())
}
override fun onResume() {
super.onResume()
statusBarColorNestedScrollConnection.setColorImmediate()
}
@Composable @Composable
override fun FragmentContent() { override fun FragmentContent() {
@@ -57,7 +75,8 @@ class BankTransferMandateFragment : ComposeFragment() {
bankMandate = mandate, bankMandate = mandate,
onNavigationClick = this::onNavigationClick, onNavigationClick = this::onNavigationClick,
onContinueClick = this::onContinueClick, onContinueClick = this::onContinueClick,
onLearnMoreClick = this::onLearnMoreClick onLearnMoreClick = this::onLearnMoreClick,
modifier = Modifier.nestedScroll(statusBarColorNestedScrollConnection)
) )
} }
@@ -96,12 +115,23 @@ fun BankTransferScreen(
bankMandate: String, bankMandate: String,
onNavigationClick: () -> Unit, onNavigationClick: () -> Unit,
onContinueClick: () -> Unit, onContinueClick: () -> Unit,
onLearnMoreClick: () -> Unit onLearnMoreClick: () -> Unit,
modifier: Modifier = Modifier
) { ) {
Scaffolds.Settings( Scaffolds.Settings(
title = "", title = stringResource(id = R.string.BankTransferMandateFragment__bank_transfer),
onNavigationClick = onNavigationClick, onNavigationClick = onNavigationClick,
navigationIconPainter = rememberVectorPainter(ImageVector.vectorResource(id = R.drawable.symbol_arrow_left_24)) navigationIconPainter = rememberVectorPainter(ImageVector.vectorResource(id = R.drawable.symbol_arrow_left_24)),
titleContent = { contentOffset, title ->
AnimatedVisibility(
visible = contentOffset < 0f,
enter = fadeIn(),
exit = fadeOut()
) {
Text(text = title, style = MaterialTheme.typography.titleLarge)
}
},
modifier = modifier
) { ) {
LazyColumn( LazyColumn(
horizontalAlignment = CenterHorizontally, horizontalAlignment = CenterHorizontally,
@@ -112,7 +142,7 @@ fun BankTransferScreen(
) { ) {
item { item {
Image( Image(
painter = painterResource(id = R.drawable.credit_card), // TODO [alex] -- final asset painter = painterResource(id = R.drawable.bank_transfer),
contentScale = ContentScale.Inside, contentScale = ContentScale.Inside,
contentDescription = null, contentDescription = null,
modifier = Modifier modifier = Modifier
@@ -144,7 +174,9 @@ fun BankTransferScreen(
style = MaterialTheme.typography.bodyLarge.copy( style = MaterialTheme.typography.bodyLarge.copy(
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
), ),
modifier = Modifier.padding(bottom = 12.dp, start = 32.dp, end = 32.dp) modifier = Modifier
.padding(bottom = 12.dp)
.padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter))
) )
} }
@@ -156,7 +188,7 @@ fun BankTransferScreen(
Text( Text(
text = bankMandate, text = bankMandate,
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(horizontal = 32.dp, vertical = 16.dp) modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter), vertical = 16.dp)
) )
} }

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@@ -17,35 +16,26 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:navigationContentDescription="@string/DSLSettingsToolbar__navigate_up" app:navigationContentDescription="@string/DSLSettingsToolbar__navigate_up"
app:navigationIcon="@drawable/ic_arrow_left_24" app:navigationIcon="@drawable/ic_arrow_left_24"
app:title="@string/CreditCardFragment__credit_or_debit_card"
app:titleTextAppearance="@style/Signal.Text.TitleLarge" /> app:titleTextAppearance="@style/Signal.Text.TitleLarge" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingHorizontal="32dp"
android:textAppearance="@style/Signal.Text.TitleLarge"
app:layout_constraintTop_toBottomOf="@id/toolbar"
tools:text="Donation amount: $20" />
<org.thoughtcrime.securesms.util.views.LearnMoreTextView <org.thoughtcrime.securesms.util.views.LearnMoreTextView
android:id="@+id/description" android:id="@+id/description"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="12dp"
android:gravity="center" android:paddingHorizontal="@dimen/core_ui__gutter"
android:paddingHorizontal="32dp"
android:text="@string/CreditCardFragment__enter_your_card_details" android:text="@string/CreditCardFragment__enter_your_card_details"
android:textAppearance="@style/Signal.Text.BodyMedium"
android:textColor="@color/signal_colorOnSurfaceVariant" android:textColor="@color/signal_colorOnSurfaceVariant"
app:layout_constraintTop_toBottomOf="@id/title" /> app:layout_constraintTop_toBottomOf="@id/toolbar" />
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/card_number_wrapper" android:id="@+id/card_number_wrapper"
style="@style/Widget.Signal.TextInputLayout.FilledBox.ContactNameEditor" style="@style/Widget.Signal.TextInputLayout.FilledBox.ContactNameEditor"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="36dp" android:layout_marginTop="24dp"
android:hint="@string/CreditCardFragment__card_number" android:hint="@string/CreditCardFragment__card_number"
app:boxStrokeColor="@color/signal_colorPrimary" app:boxStrokeColor="@color/signal_colorPrimary"
app:boxStrokeErrorColor="@color/signal_colorError" app:boxStrokeErrorColor="@color/signal_colorError"
@@ -72,7 +62,7 @@
style="@style/Widget.Signal.TextInputLayout.FilledBox.ContactNameEditor" style="@style/Widget.Signal.TextInputLayout.FilledBox.ContactNameEditor"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="18dp" android:layout_marginTop="12dp"
android:hint="@string/CreditCardFragment__mm_yy" android:hint="@string/CreditCardFragment__mm_yy"
android:paddingEnd="18dp" android:paddingEnd="18dp"
app:boxStrokeColor="@color/signal_colorPrimary" app:boxStrokeColor="@color/signal_colorPrimary"
@@ -103,7 +93,7 @@
style="@style/Widget.Signal.TextInputLayout.FilledBox.ContactNameEditor" style="@style/Widget.Signal.TextInputLayout.FilledBox.ContactNameEditor"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="18dp" android:layout_marginTop="12dp"
android:hint="@string/CreditCardFragment__cvv" android:hint="@string/CreditCardFragment__cvv"
android:paddingStart="18dp" android:paddingStart="18dp"
app:boxStrokeColor="@color/signal_colorPrimary" app:boxStrokeColor="@color/signal_colorPrimary"
@@ -130,12 +120,13 @@
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/continue_button" android:id="@+id/continue_button"
style="@style/Signal.Widget.Button.Large.Primary" style="@style/Signal.Widget.Button.Large.Primary"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/dsl_settings_gutter" android:layout_marginHorizontal="@dimen/dsl_settings_gutter"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
android:enabled="false" android:enabled="false"
android:text="@string/CreditCardFragment__continue" android:minWidth="220dp"
android:text="@string/CreditCardFragment__donate_s"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />

View File

@@ -15,6 +15,7 @@
<dimen name="payment_recovery_phrase_adapter_margin">92dp</dimen> <dimen name="payment_recovery_phrase_adapter_margin">92dp</dimen>
<dimen name="payment_recovery_phrase_outline_margin">48dp</dimen> <dimen name="payment_recovery_phrase_outline_margin">48dp</dimen>
<dimen name="bank_transfer_mandate_gutter">32dp</dimen>
<dimen name="media_bubble_gif_width">260dp</dimen> <dimen name="media_bubble_gif_width">260dp</dimen>
<dimen name="dsl_settings_gutter">24dp</dimen> <dimen name="dsl_settings_gutter">24dp</dimen>
<dimen name="active_subscription_gutter_start">22dp</dimen> <dimen name="active_subscription_gutter_start">22dp</dimen>

View File

@@ -170,6 +170,7 @@
<dimen name="payment_recovery_phrase_adapter_margin">49dp</dimen> <dimen name="payment_recovery_phrase_adapter_margin">49dp</dimen>
<dimen name="payment_recovery_phrase_outline_margin">32dp</dimen> <dimen name="payment_recovery_phrase_outline_margin">32dp</dimen>
<dimen name="bank_transfer_mandate_gutter">16dp</dimen>
<dimen name="dsl_settings_gutter">16dp</dimen> <dimen name="dsl_settings_gutter">16dp</dimen>
<dimen name="active_subscription_gutter_start">14dp</dimen> <dimen name="active_subscription_gutter_start">14dp</dimen>
<dimen name="media_overview_toggle_gutter">2dp</dimen> <dimen name="media_overview_toggle_gutter">2dp</dimen>

View File

@@ -120,11 +120,8 @@
<string name="BlockedUsersActivity__block">Block</string> <string name="BlockedUsersActivity__block">Block</string>
<!-- CreditCardFragment --> <!-- CreditCardFragment -->
<!-- Title of fragment detailing the donation amount for one-time donation, displayed above the credit card text fields --> <!-- Title of fragment -->
<string name="CreditCardFragment__donation_amount_s">Donation amount: %1$s</string> <string name="CreditCardFragment__credit_or_debit_card">Credit or debit card</string>
<!-- Title of fragment detailing the donation amount for monthly donation, displayed above the credit card text fields -->
<string name="CreditCardFragment__donation_amount_s_per_month">Donation amount: %1$s/month</string>
<!-- Explanation of how to fill in the form, displayed above the credit card text fields -->
<!-- Explanation of how to fill in the form and a note about pii, displayed above the credit card text fields --> <!-- Explanation of how to fill in the form and a note about pii, displayed above the credit card text fields -->
<string name="CreditCardFragment__enter_your_card_details">Enter your card details. Signal does not collect or store your personal information.</string> <string name="CreditCardFragment__enter_your_card_details">Enter your card details. Signal does not collect or store your personal information.</string>
<!-- Displayed as a hint in the card number text field --> <!-- Displayed as a hint in the card number text field -->
@@ -149,8 +146,10 @@
<string name="CreditCardFragment__year_required">Year required</string> <string name="CreditCardFragment__year_required">Year required</string>
<!-- Error displayed under the card expiry text field when the expiry year is invalid --> <!-- Error displayed under the card expiry text field when the expiry year is invalid -->
<string name="CreditCardFragment__invalid_year">Invalid year</string> <string name="CreditCardFragment__invalid_year">Invalid year</string>
<!-- Button label to confirm credit card input and proceed with payment --> <!-- Button label to confirm credit card input and proceed with one-time payment -->
<string name="CreditCardFragment__continue">Continue</string> <string name="CreditCardFragment__donate_s">Donate %1$s</string>
<!-- Button label to confirm credit card input and proceed with subscription payment -->
<string name="CreditCardFragment__donate_s_month">Donate %1$s/month</string>
<!-- BlockUnblockDialog --> <!-- BlockUnblockDialog -->
<string name="BlockUnblockDialog_block_and_leave_s">Block and leave %1$s?</string> <string name="BlockUnblockDialog_block_and_leave_s">Block and leave %1$s?</string>

View File

@@ -25,6 +25,9 @@ import org.signal.core.ui.theme.SignalTheme
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
object Scaffolds { object Scaffolds {
/**
* @param titleContent The title area content. First parameter is the contentOffset.
*/
@Composable @Composable
fun Settings( fun Settings(
title: String, title: String,
@@ -32,6 +35,9 @@ object Scaffolds {
navigationIconPainter: Painter, navigationIconPainter: Painter,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
navigationContentDescription: String? = null, navigationContentDescription: String? = null,
titleContent: @Composable (Float, String) -> Unit = { _, title ->
Text(text = title, style = MaterialTheme.typography.titleLarge)
},
content: @Composable (PaddingValues) -> Unit content: @Composable (PaddingValues) -> Unit
) { ) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
@@ -40,10 +46,7 @@ object Scaffolds {
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { title = {
Text( titleContent(scrollBehavior.state.contentOffset, title)
text = title,
style = MaterialTheme.typography.titleLarge
)
}, },
navigationIcon = { navigationIcon = {
IconButton( IconButton(
@@ -57,7 +60,7 @@ object Scaffolds {
} }
}, },
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
colors = TopAppBarDefaults.smallTopAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
scrolledContainerColor = SignalTheme.colors.colorSurface2 scrolledContainerColor = SignalTheme.colors.colorSurface2
) )
) )