Migrate ideal icon and copy.

This commit is contained in:
Alex Hart
2026-04-22 15:05:40 -03:00
parent 51bd2d51c6
commit 7658f6c36c
12 changed files with 280 additions and 34 deletions
@@ -348,7 +348,7 @@ class DonateToSignalFragment :
if (state.oneTimeDonationState.isOneTimeDonationLongRunning) {
R.string.DonateToSignalFragment__bank_transfers_usually_take_1_business_day_to_process_onetime
} else if (state.oneTimeDonationState.isNonVerifiedIdeal) {
R.string.DonateToSignalFragment__your_ideal_payment_is_still_processing
R.string.DonateToSignalFragment__your_ideal_wero_payment_is_still_processing
} else {
R.string.DonateToSignalFragment__your_payment_is_still_being_processed_onetime
}
@@ -356,7 +356,7 @@ class DonateToSignalFragment :
if (state.monthlyDonationState.activeSubscription?.paymentMethod == ActiveSubscription.PaymentMethod.SEPA_DEBIT) {
R.string.DonateToSignalFragment__bank_transfers_usually_take_1_business_day_to_process_monthly
} else if (state.monthlyDonationState.nonVerifiedMonthlyDonation != null) {
R.string.DonateToSignalFragment__your_ideal_payment_is_still_processing
R.string.DonateToSignalFragment__your_ideal_wero_payment_is_still_processing
} else {
R.string.DonateToSignalFragment__your_payment_is_still_being_processed_monthly
}
@@ -18,10 +18,10 @@ 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.NO_TINT
import org.thoughtcrime.securesms.components.settings.app.subscription.DonationSerializationHelper.toFiatMoney
import org.thoughtcrime.securesms.components.settings.app.subscription.GooglePayComponent
import org.thoughtcrime.securesms.components.settings.app.subscription.models.GooglePayButton
import org.thoughtcrime.securesms.components.settings.app.subscription.models.IdealWeroButton
import org.thoughtcrime.securesms.components.settings.app.subscription.models.PayPalButton
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.components.settings.models.IndeterminateLoadingCircle
@@ -51,6 +51,7 @@ class GatewaySelectorBottomSheet : DSLSettingsBottomSheetFragment() {
GooglePayButton.register(adapter)
PayPalButton.register(adapter)
IndeterminateLoadingCircle.register(adapter)
IdealWeroButton.register(adapter)
lifecycleDisposable.bindTo(viewLifecycleOwner)
@@ -190,17 +191,16 @@ class GatewaySelectorBottomSheet : DSLSettingsBottomSheetFragment() {
if (state.isIDEALAvailable) {
space(16.dp)
tonalButton(
text = DSLSettingsText.from(R.string.GatewaySelectorBottomSheet__ideal),
icon = DSLSettingsIcon.from(R.drawable.logo_ideal, NO_TINT),
disableOnClick = true,
onClick = {
lifecycleDisposable += viewModel.updateInAppPaymentMethod(InAppPaymentData.PaymentMethodType.IDEAL)
.subscribeBy {
findNavController().popBackStack()
setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to it))
}
}
customPref(
IdealWeroButton.Model(
onClick = {
lifecycleDisposable += viewModel.updateInAppPaymentMethod(InAppPaymentData.PaymentMethodType.IDEAL)
.subscribeBy {
findNavController().popBackStack()
setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to it))
}
}
)
)
}
}
@@ -153,7 +153,7 @@ class IdealTransferDetailsFragment : ComposeFragment(), InAppPaymentCheckoutDele
if (state.inAppPayment!!.type.recurring) { // TODO [message-requests] -- handle backup
val formattedMoney = FiatMoneyUtil.format(requireContext().resources, state.inAppPayment.data.amount!!.toFiatMoney(), FiatMoneyUtil.formatOptions().trimZerosAfterDecimal())
MaterialAlertDialogBuilder(requireContext())
.setTitle(getString(R.string.IdealTransferDetailsFragment__confirm_your_donation_with_ideal))
.setTitle(getString(R.string.IdealTransferDetailsFragment__confirm_your_donation_with_ideal_wero))
.setMessage(getString(R.string.IdealTransferDetailsFragment__to_setup_your_recurring_donation, formattedMoney))
.setPositiveButton(R.string.IdealTransferDetailsFragment__continue) { _, _ ->
continueTransfer()
@@ -218,7 +218,7 @@ private fun IdealTransferDetailsContent(
onDonateClick: () -> Unit
) {
Scaffolds.Settings(
title = stringResource(id = R.string.GatewaySelectorBottomSheet__ideal),
title = stringResource(id = R.string.GatewaySelectorBottomSheet__ideal_wero),
onNavigationClick = onNavigationClick,
navigationIcon = SignalIcons.ArrowStart.imageVector
) {
@@ -130,7 +130,7 @@ class ManageDonationsFragment :
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.ManageDonationsFragment__couldnt_confirm_donation)
.setMessage(getString(R.string.ManageDonationsFragment__your_monthly_s_donation_couldnt_be_confirmed, amount))
.setMessage(getString(R.string.ManageDonationsFragment__your_monthly_s_donation_couldnt_be_confirmed_ideal_wero, amount))
.setPositiveButton(android.R.string.ok, null)
.show()
} else if (state.pendingOneTimeDonation?.pendingVerification == true &&
@@ -143,7 +143,7 @@ class ManageDonationsFragment :
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.ManageDonationsFragment__couldnt_confirm_donation)
.setMessage(getString(R.string.ManageDonationsFragment__your_one_time_s_donation_couldnt_be_confirmed, amount))
.setMessage(getString(R.string.ManageDonationsFragment__your_one_time_s_donation_couldnt_be_confirmed_ideal_wero, amount))
.setPositiveButton(android.R.string.ok, null)
.show()
}
@@ -440,7 +440,7 @@ class ManageDonationsFragment :
else -> {
val message = if (isIdeal) {
R.string.DonationsErrors__your_ideal_couldnt_be_processed
R.string.DonationsErrors__your_ideal_wero_couldnt_be_processed
} else {
R.string.DonationsErrors__try_another_payment_method
}
@@ -0,0 +1,87 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.models
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.material3.ButtonColors
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import org.signal.core.ui.compose.Buttons
import org.signal.core.ui.compose.DayNightPreviews
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.horizontalGutters
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.PreferenceModel
import org.thoughtcrime.securesms.components.settings.models.DSLComposePreference
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
/**
* DSL Ideal | Wero button for the payments gateway.
*/
object IdealWeroButton {
@Stable
class Model(val onClick: () -> Unit) : PreferenceModel<Model>() {
override fun areItemsTheSame(newItem: Model): Boolean = true
}
class ViewHolder(itemView: ComposeView) : DSLComposePreference.ViewHolder<Model>(itemView) {
@Composable
override fun Content(model: Model) {
IdealWeroButton(model)
}
}
fun register(adapter: MappingAdapter) {
DSLComposePreference.register(adapter) { ViewHolder(it) }
}
}
@Composable
private fun IdealWeroButton(model: IdealWeroButton.Model) {
var enabled by remember { mutableStateOf(true) }
Buttons.LargeTonal(
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp),
onClick = {
enabled = false
model.onClick()
},
enabled = enabled,
modifier = Modifier
.height(44.dp)
.horizontalGutters()
.fillMaxWidth(),
colors = ButtonColors(
containerColor = colorResource(org.signal.core.ui.R.color.signal_light_colorPrimaryContainer),
contentColor = colorResource(org.signal.core.ui.R.color.signal_light_colorOnPrimaryContainer),
disabledContainerColor = colorResource(org.signal.core.ui.R.color.signal_light_colorPrimaryContainer),
disabledContentColor = colorResource(org.signal.core.ui.R.color.signal_light_colorOnPrimaryContainer)
)
) {
Image(
imageVector = ImageVector.vectorResource(R.drawable.logo_ideal_wero),
contentDescription = stringResource(R.string.GatewaySelectorBottomSheet__ideal_wero)
)
}
}
@DayNightPreviews
@Composable
private fun IdealWeroButtonPreview() {
Previews.Preview {
IdealWeroButton(model = remember { IdealWeroButton.Model(onClick = {}) })
}
}
@@ -0,0 +1,68 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.components.settings.models
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import org.signal.core.ui.compose.theme.SignalTheme
import org.thoughtcrime.securesms.util.adapter.mapping.Factory
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel
import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder
/**
* Allows hosting compose code in a DSL adapter.
*/
object DSLComposePreference {
/**
* Initializes the ComposeView to play nice with RecyclerView and manages the Model in a State.
*/
abstract class ViewHolder<T : MappingModel<T>>(composeView: ComposeView) : MappingViewHolder<T>(composeView) {
private var model: T? by mutableStateOf(null)
init {
composeView.setViewCompositionStrategy(
ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool
)
composeView.setContent {
val model = this.model ?: return@setContent
SignalTheme {
Content(model)
}
}
}
override fun bind(model: T) {
this.model = model
}
@Composable
abstract fun Content(model: T)
}
/**
* Does not need to be used directly, but does need to be non-private so that the inline register method can see it.
*/
class ComposeFactory<T : MappingModel<T>>(
private val create: (ComposeView) -> MappingViewHolder<T>
) : Factory<T> {
override fun createViewHolder(parent: ViewGroup): MappingViewHolder<T> {
return create(ComposeView(parent.context))
}
}
inline fun <reified T : MappingModel<T>> register(adapter: MappingAdapter, noinline create: (ComposeView) -> MappingViewHolder<T>) {
adapter.registerFactory(T::class.java, ComposeFactory(create))
}
}
@@ -0,0 +1,95 @@
<!--
~ Copyright (C) 2026 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="80dp"
android:height="28dp"
android:viewportWidth="80"
android:viewportHeight="28">
<path
android:pathData="M1.002,2.075V25.925C1.002,27.066 1.941,28 3.088,28H17.406C28.231,28 32.922,21.969 32.922,13.969C32.922,5.968 28.229,0 17.404,0H3.086C1.939,0 1,0.934 1,2.075H1.002Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M10.585,5.854V23.477H18.291C25.288,23.477 28.322,19.543 28.322,13.981C28.322,8.419 25.286,4.527 18.291,4.527H11.919C11.18,4.527 10.585,5.128 10.585,5.856V5.854Z"
android:fillColor="#CC0066"/>
<path
android:pathData="M4.953,26.101H17.404C26.153,26.101 30.981,21.795 30.981,13.979C30.981,9.475 29.219,1.909 17.404,1.909H4.953C3.848,1.909 2.951,2.801 2.951,3.903V24.11C2.951,25.209 3.848,26.103 4.953,26.103V26.101ZM3.617,3.903C3.617,3.166 4.212,2.574 4.952,2.574H17.402C22.219,2.574 30.311,4.058 30.311,13.979C30.311,21.368 25.723,25.437 17.402,25.437H4.953C4.214,25.437 3.619,24.846 3.619,24.108V3.903H3.617Z"
android:fillColor="#232323"
android:fillType="evenOdd"/>
<path
android:pathData="M14.376,11.417C14.142,11.334 13.897,11.292 13.631,11.292V11.281H11.867V15.537H13.652C13.968,15.537 14.243,15.474 14.479,15.369C14.713,15.254 14.907,15.107 15.061,14.918C15.215,14.729 15.327,14.498 15.407,14.236C15.479,13.974 15.519,13.691 15.519,13.376C15.519,13.019 15.469,12.715 15.376,12.453C15.274,12.201 15.142,11.981 14.979,11.802C14.806,11.634 14.612,11.498 14.377,11.414L14.376,11.417ZM13.958,14.699C13.825,14.741 13.703,14.762 13.57,14.762V14.773H12.764V12.089H13.416C13.64,12.089 13.823,12.12 13.977,12.183C14.131,12.246 14.253,12.351 14.344,12.467C14.435,12.582 14.507,12.739 14.549,12.907C14.589,13.075 14.61,13.274 14.61,13.484C14.61,13.726 14.579,13.914 14.519,14.082C14.458,14.25 14.376,14.376 14.285,14.481C14.194,14.586 14.08,14.659 13.958,14.701V14.699Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M19.202,11.293V12.08H17.018V12.993H19.027V13.717H17.018V14.755H19.252V15.542H16.11V11.286H19.202V11.297V11.293Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M23.873,15.549L22.323,11.293H21.375L19.813,15.549H20.731L21.058,14.605H22.609L22.926,15.549H23.875H23.873ZM21.852,12.341L22.373,13.902H21.303L21.844,12.341H21.854H21.852Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M25.353,11.292V14.762H27.372V15.549H24.445V11.293H25.353V11.292Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M7.004,15.612C8.109,15.612 9.005,14.717 9.005,13.61C9.005,12.503 8.109,11.608 7.004,11.608C5.899,11.608 5.004,12.503 5.004,13.61C5.004,14.717 5.899,15.612 7.004,15.612Z"
android:fillColor="#232323"/>
<path
android:pathData="M8.195,23.618C6.646,23.618 5.404,22.281 5.404,20.637V18.31C5.404,17.488 6.025,16.813 6.805,16.813C7.585,16.813 8.205,17.478 8.205,18.31V23.618H8.195Z"
android:fillColor="#232323"/>
<path
android:pathData="M69.993,14.096C69.993,11.757 71.657,9.625 74.532,9.625C77.406,9.625 79.083,11.758 79.083,14.096C79.083,16.434 77.419,18.567 74.532,18.567C71.657,18.567 69.993,16.434 69.993,14.096ZM76.557,14.096C76.557,12.968 75.813,11.928 74.532,11.928C73.25,11.928 72.507,12.97 72.507,14.096C72.507,15.222 73.262,16.266 74.532,16.266C75.801,16.266 76.557,15.224 76.557,14.096Z"
android:fillColor="#1D1C1C"/>
<path
android:pathData="M68.225,15.757C69.183,15.212 69.759,14.17 69.759,13.019C69.759,11.311 68.524,9.856 66.608,9.856H62.585V18.338H65.076V16.17H65.543L66.968,18.338H69.902L68.225,15.757ZM66.106,14.217H65.076V11.818H66.118C66.79,11.818 67.22,12.363 67.22,13.017C67.22,13.671 66.776,14.217 66.106,14.217Z"
android:fillColor="#1D1C1C"/>
<path
android:pathData="M51.211,9.845L49.716,14.9L48.258,9.845H46.273L44.803,14.9L43.32,9.845H40.69L43.703,18.312H45.866L47.264,13.703L48.651,18.312H50.826L53.839,9.845H51.209H51.211Z"
android:fillColor="#1D1C1C"/>
<path
android:pathData="M57.61,16.245H57.605C56.673,16.245 56.019,15.682 55.739,14.937H62.071C62.121,14.658 62.147,14.371 62.147,14.08C62.147,11.748 60.488,9.62 57.61,9.618V11.916C58.547,11.918 59.194,12.481 59.472,13.224H53.15C53.099,13.503 53.073,13.79 53.073,14.08C53.073,16.415 54.734,18.544 57.603,18.544H57.609V16.245H57.61Z"
android:fillColor="#1D1C1C"/>
<path
android:pathData="M57.605,18.542C57.703,18.542 57.799,18.539 57.894,18.535C58.476,18.506 59.006,18.387 59.478,18.196C59.95,18.006 60.364,17.742 60.715,17.423C61.069,17.105 61.359,16.733 61.584,16.322C61.789,15.948 61.939,15.544 62.034,15.122H59.395C59.341,15.234 59.278,15.343 59.207,15.442C59.109,15.58 58.993,15.705 58.862,15.811C58.731,15.92 58.584,16.011 58.423,16.081C58.262,16.15 58.086,16.199 57.895,16.226C57.803,16.238 57.706,16.245 57.607,16.245C57.014,16.245 56.533,16.016 56.189,15.658L54.473,17.392C55.236,18.097 56.294,18.541 57.605,18.541V18.542Z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="60.747"
android:startY="13.585"
android:endX="56.809"
android:endY="18.406"
android:type="linear">
<item android:offset="0.02" android:color="#001D1C1C"/>
<item android:offset="0.68" android:color="#FF1D1C1C"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M57.605,9.616C55.171,9.616 53.606,11.148 53.188,13.036H55.818C56.133,12.386 56.752,11.914 57.605,11.914C58.285,11.914 58.813,12.208 59.158,12.652L60.889,10.902C60.116,10.118 59.004,9.616 57.607,9.616H57.605Z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="53.879"
android:startY="14.608"
android:endX="57.914"
android:endY="10.62"
android:type="linear">
<item android:offset="0.02" android:color="#001D1C1C"/>
<item android:offset="0.68" android:color="#FF1D1C1C"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M36.774,23.43C36.581,23.43 36.424,23.272 36.424,23.08V4.896C36.424,4.703 36.581,4.546 36.774,4.546C36.966,4.546 37.123,4.703 37.123,4.896V23.08C37.123,23.272 36.966,23.43 36.774,23.43Z"
android:fillColor="#1D1C1C"/>
</vector>
@@ -8,8 +8,6 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dsl_settings_gutter"
android:layout_marginEnd="@dimen/dsl_settings_gutter"
android:insetTop="2dp"
android:insetBottom="2dp"
app:iconGravity="textStart"
app:iconSize="24dp"
app:iconTint="@null"
+2 -2
View File
@@ -8,8 +8,8 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dsl_settings_gutter"
android:layout_marginEnd="@dimen/dsl_settings_gutter"
android:insetTop="2dp"
android:insetBottom="2dp"
android:insetTop="0dp"
android:insetBottom="0dp"
app:iconGravity="textStart"
app:iconSize="24dp"
app:iconTint="@null"
+3 -3
View File
@@ -7,12 +7,12 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/paypal_button"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_height="44dp"
android:layout_gravity="center_horizontal"
android:layout_marginStart="@dimen/dsl_settings_gutter"
android:layout_marginEnd="@dimen/dsl_settings_gutter"
android:insetTop="2dp"
android:insetBottom="2dp"
android:insetTop="0dp"
android:insetBottom="0dp"
app:cornerRadius="59dp"
app:icon="@drawable/paypal"
app:iconGravity="textStart"
+6 -6
View File
@@ -6519,9 +6519,9 @@
<!-- Dialog title shown when a donation requires verifying/confirmation outside of the app and the user hasn\'t done that yet -->
<string name="ManageDonationsFragment__couldnt_confirm_donation">Couldn\'t confirm donation</string>
<!-- Dialog message shown when a monthly donation requires verifying/confirmation outside of the app and the user hasn\'t done that yet, placeholder is money amount -->
<string name="ManageDonationsFragment__your_monthly_s_donation_couldnt_be_confirmed">Your %1$s/month donation couldn\'t be confirmed. Check your banking app to approve your iDEAL payment.</string>
<string name="ManageDonationsFragment__your_monthly_s_donation_couldnt_be_confirmed_ideal_wero">Your %1$s/month donation couldn\'t be confirmed. Check your banking app to approve your iDEAL | Wero payment.</string>
<!-- Dialog message shown when a one-time donation requires verifying/confirmation outside of the app and the user hasn\'t done that yet, placeholder is money amount -->
<string name="ManageDonationsFragment__your_one_time_s_donation_couldnt_be_confirmed">Your one-time %1$s donation couldn\'t be confirmed. Check your banking app to approve your iDEAL payment.</string>
<string name="ManageDonationsFragment__your_one_time_s_donation_couldnt_be_confirmed_ideal_wero">Your one-time %1$s donation couldn\'t be confirmed. Check your banking app to approve your iDEAL | Wero payment.</string>
<string name="Boost__enter_custom_amount">Enter Custom Amount</string>
<!-- Error label when the amount is smaller than what we can accept -->
@@ -6650,7 +6650,7 @@
<!-- Displayed as a dialog message when the user\'s profile could not be fetched, likely due to lack of internet -->
<string name="DonationsErrors__your_donation_could_not_be_sent">Your donation could not be sent because of a network error. Check your connection and try again.</string>
<!-- Displayed as a dialog message when the user encounters an error during an iDEAL donation -->
<string name="DonationsErrors__your_ideal_couldnt_be_processed">Your iDEAL donation couldn\'t be processed. Try another payment method or contact your bank for more information.</string>
<string name="DonationsErrors__your_ideal_wero_couldnt_be_processed">Your iDEAL | Wero donation couldn\'t be processed. Try another payment method or contact your bank for more information.</string>
<!-- Gift message view title -->
<string name="GiftMessageView__donation_on_behalf_of_s">Donation on behalf of %1$s</string>
@@ -7575,7 +7575,7 @@
<!-- Dialog body when a user tries to donate while they already have a pending one time donation. -->
<string name="DonateToSignalFragment__your_payment_is_still_being_processed_onetime">Your donation is still being processed. This can take a few minutes depending on your connection. Please wait until this payment completes before making another donation.</string>
<!-- Dialog body when a user opens the manage donations main screen and they have a pending iDEAL donation -->
<string name="DonateToSignalFragment__your_ideal_payment_is_still_processing">Your iDEAL donation is still processing. Check your banking app to approve your payment before making another donation.</string>
<string name="DonateToSignalFragment__your_ideal_wero_payment_is_still_processing">Your iDEAL | Wero donation is still processing. Check your banking app to approve your payment before making another donation.</string>
<!-- Dialog title shown when a user tries to donate an amount higher than is allowed for a given payment method. -->
<string name="DonateToSignal__donation_amount_too_high">Donation amount too high</string>
<!-- Dialog body shown when a user tries to donate an amount higher than is allowed for a given payment method, place holder is the maximum -->
@@ -7605,7 +7605,7 @@
<!-- Sheet summary when giving donating for a friend -->
<string name="GatewaySelectorBottomSheet__donate_for_a_friend">Donate for a friend</string>
<!-- Button label for paying with iDEAL -->
<string name="GatewaySelectorBottomSheet__ideal">iDEAL</string>
<string name="GatewaySelectorBottomSheet__ideal_wero">iDEAL | Wero</string>
<!-- Dialog title for launching external intent -->
<string name="ExternalNavigationHelper__leave_signal_to_confirm_payment">Leave Signal to confirm donation?</string>
@@ -7673,7 +7673,7 @@
<!-- Default label for bank selection -->
<string name="IdealTransferDetailsFragment__choose_your_bank">Choose your bank</string>
<!-- Dialog title shown when using iDEAL payment for setting up a monthly donation -->
<string name="IdealTransferDetailsFragment__confirm_your_donation_with_ideal">Confirm your donation with iDEAL</string>
<string name="IdealTransferDetailsFragment__confirm_your_donation_with_ideal_wero">Confirm your donation with iDEAL | Wero</string>
<!-- Dialog warning shown when using iDEAL payment for setting up a monthly donation. Placeholder is donation amount.Z -->
<string name="IdealTransferDetailsFragment__to_setup_your_recurring_donation">To setup your recurring donation tap continue to confirm a €0,01 charge with your bank. This will be automatically refunded and allows your %1$s/month donation to debited from your account.</string>
<!-- Dialog button shown when using iDEAL payment for setting up a monthly donation to continue with the donation -->
@@ -3,8 +3,6 @@
android:layout_width="match_parent"
android:layout_height="44sp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_marginTop="2sp"
android:layout_marginBottom="2sp"
android:background="@drawable/donate_with_google_pay_rounded_background"
android:clickable="true"
android:contentDescription="@string/donate_with_googlepay_button_content_description"