Update badge copy with new strings.

This commit is contained in:
Alex Hart 2021-10-28 15:49:25 -03:00 committed by Greyson Parrelli
parent 755ec672c0
commit 6c7d837964
21 changed files with 273 additions and 43 deletions

View file

@ -36,7 +36,7 @@ data class Badge(
val visible: Boolean, val visible: Boolean,
) : Parcelable, Key { ) : Parcelable, Key {
fun isExpired(): Boolean = expirationTimestamp < System.currentTimeMillis() fun isExpired(): Boolean = expirationTimestamp < System.currentTimeMillis() && expirationTimestamp > 0
fun isBoost(): Boolean = id == BOOST_BADGE_ID fun isBoost(): Boolean = id == BOOST_BADGE_ID
override fun updateDiskCacheKey(messageDigest: MessageDigest) { override fun updateDiskCacheKey(messageDigest: MessageDigest) {

View file

@ -35,7 +35,7 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment(
if (badge.isBoost()) { if (badge.isBoost()) {
R.string.ExpiredBadgeBottomSheetDialogFragment__your_badge_has_expired R.string.ExpiredBadgeBottomSheetDialogFragment__your_badge_has_expired
} else { } else {
R.string.ExpiredBadgeBottomSheetDialogFragment__your_subscription_was_cancelled R.string.ExpiredBadgeBottomSheetDialogFragment__subscription_cancelled
} }
) )
@ -44,9 +44,9 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment(
noPadTextPref( noPadTextPref(
DSLSettingsText.from( DSLSettingsText.from(
if (badge.isBoost()) { if (badge.isBoost()) {
getString(R.string.ExpiredBadgeBottomSheetDialogFragment__your_s_badge_has_expired, badge.name) R.string.ExpiredBadgeBottomSheetDialogFragment__your_boost_badge_has_expired
} else { } else {
getString(R.string.ExpiredBadgeBottomSheetDialogFragment__because) R.string.ExpiredBadgeBottomSheetDialogFragment__your_sustainer
}, },
DSLSettingsText.CenterModifier DSLSettingsText.CenterModifier
) )
@ -57,9 +57,9 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment(
noPadTextPref( noPadTextPref(
DSLSettingsText.from( DSLSettingsText.from(
if (badge.isBoost()) { if (badge.isBoost()) {
R.string.ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting R.string.ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting_technology
} else { } else {
R.string.ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting_signal R.string.ExpiredBadgeBottomSheetDialogFragment__you_can
}, },
DSLSettingsText.CenterModifier DSLSettingsText.CenterModifier
) )
@ -70,7 +70,7 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment(
primaryButton( primaryButton(
text = DSLSettingsText.from( text = DSLSettingsText.from(
if (badge.isBoost()) { if (badge.isBoost()) {
R.string.ExpiredBadgeBottomSheetDialogFragment__become_a_subscriber R.string.ExpiredBadgeBottomSheetDialogFragment__become_a_sustainer
} else { } else {
R.string.ExpiredBadgeBottomSheetDialogFragment__renew_subscription R.string.ExpiredBadgeBottomSheetDialogFragment__renew_subscription
} }

View file

@ -62,7 +62,6 @@ sealed class DSLSettingsText {
} }
object Title2BoldModifier : TextAppearanceModifier(R.style.TextAppearance_Signal_Title2_Bold) object Title2BoldModifier : TextAppearanceModifier(R.style.TextAppearance_Signal_Title2_Bold)
object Body1Modifier : TextAppearanceModifier(R.style.Signal_Text_Body)
object Body1BoldModifier : TextAppearanceModifier(R.style.TextAppearance_Signal_Body1_Bold) object Body1BoldModifier : TextAppearanceModifier(R.style.TextAppearance_Signal_Body1_Bold)
open class TextAppearanceModifier(@StyleRes private val textAppearance: Int) : Modifier { open class TextAppearanceModifier(@StyleRes private val textAppearance: Int) : Modifier {

View file

@ -147,7 +147,13 @@ class AppSettingsFragment : DSLSettingsFragment(R.string.text_secure_normal__men
if (FeatureFlags.donorBadges() && PlayServicesUtil.getPlayServicesStatus(requireContext()) == PlayServicesUtil.PlayServicesStatus.SUCCESS) { if (FeatureFlags.donorBadges() && PlayServicesUtil.getPlayServicesStatus(requireContext()) == PlayServicesUtil.PlayServicesStatus.SUCCESS) {
customPref( customPref(
SubscriptionPreference( SubscriptionPreference(
title = DSLSettingsText.from(R.string.preferences__subscription), title = DSLSettingsText.from(
if (state.hasActiveSubscription) {
R.string.preferences__subscription
} else {
R.string.preferences__become_a_signal_sustainer
}
),
icon = DSLSettingsIcon.from(R.drawable.ic_heart_24), icon = DSLSettingsIcon.from(R.drawable.ic_heart_24),
isActive = state.hasActiveSubscription, isActive = state.hasActiveSubscription,
onClick = { isActive -> onClick = { isActive ->
@ -159,10 +165,9 @@ class AppSettingsFragment : DSLSettingsFragment(R.string.text_secure_normal__men
} }
) )
) )
// TODO [alex] -- clap
clickPref( clickPref(
title = DSLSettingsText.from(R.string.preferences__signal_boost), title = DSLSettingsText.from(R.string.preferences__signal_boost),
icon = DSLSettingsIcon.from(R.drawable.ic_heart_24), icon = DSLSettingsIcon.from(R.drawable.ic_boost_24),
onClick = { onClick = {
findNavController().navigate(R.id.action_appSettingsFragment_to_boostsFragment) findNavController().navigate(R.id.action_appSettingsFragment_to_boostsFragment)
} }
@ -199,6 +204,7 @@ class AppSettingsFragment : DSLSettingsFragment(R.string.text_secure_normal__men
override fun areItemsTheSame(newItem: SubscriptionPreference): Boolean { override fun areItemsTheSame(newItem: SubscriptionPreference): Boolean {
return true return true
} }
override fun areContentsTheSame(newItem: SubscriptionPreference): Boolean { override fun areContentsTheSame(newItem: SubscriptionPreference): Boolean {
return super.areContentsTheSame(newItem) && isActive == newItem.isActive return super.areContentsTheSame(newItem) && isActive == newItem.isActive
} }

View file

@ -31,7 +31,6 @@ class SubscriptionsRepository(private val donationsService: DonationsService) {
subscriptionLevels.levels.map { (code, level) -> subscriptionLevels.levels.map { (code, level) ->
Subscription( Subscription(
id = code, id = code,
title = level.badge.name,
badge = Badges.fromServiceBadge(level.badge), badge = Badges.fromServiceBadge(level.badge),
price = FiatMoney(level.currencies[currency.currencyCode]!!, currency), price = FiatMoney(level.currencies[currency.currencyCode]!!, currency),
level = code.toInt() level = code.toInt()

View file

@ -139,7 +139,7 @@ data class Boost(
class MoneyFilter(val currency: Currency, private val onCustomAmountChanged: (String) -> Unit = {}) : DigitsKeyListener(), TextWatcher { class MoneyFilter(val currency: Currency, private val onCustomAmountChanged: (String) -> Unit = {}) : DigitsKeyListener(), TextWatcher {
val separatorCount = min(1, currency.defaultFractionDigits) val separatorCount = min(1, currency.defaultFractionDigits)
val prefix: String = "${currency.getSymbol(Locale.getDefault())} " val prefix: String = currency.getSymbol(Locale.getDefault())
val pattern: Pattern = "[0-9]*([.,]){0,$separatorCount}[0-9]{0,${currency.defaultFractionDigits}}".toPattern() val pattern: Pattern = "[0-9]*([.,]){0,$separatorCount}[0-9]{0,${currency.defaultFractionDigits}}".toPattern()
override fun filter( override fun filter(

View file

@ -45,7 +45,7 @@ object ActiveSubscriptionPreference {
override fun bind(model: Model) { override fun bind(model: Model) {
badge.setBadge(model.subscription.badge) badge.setBadge(model.subscription.badge)
title.text = model.subscription.title title.text = model.subscription.getTitle(context)
price.text = context.getString( price.text = context.getString(
R.string.MySupportPreference__s_per_month, R.string.MySupportPreference__s_per_month,

View file

@ -24,12 +24,11 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.DonationE
import org.thoughtcrime.securesms.components.settings.app.subscription.models.CurrencySelection import org.thoughtcrime.securesms.components.settings.app.subscription.models.CurrencySelection
import org.thoughtcrime.securesms.components.settings.app.subscription.models.GooglePayButton import org.thoughtcrime.securesms.components.settings.app.subscription.models.GooglePayButton
import org.thoughtcrime.securesms.components.settings.configure import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.payments.FiatMoneyUtil
import org.thoughtcrime.securesms.subscription.Subscription import org.thoughtcrime.securesms.subscription.Subscription
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.LifecycleDisposable import org.thoughtcrime.securesms.util.LifecycleDisposable
import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.SpanUtil
import java.util.Calendar import java.util.Calendar
import java.util.Locale
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
/** /**
@ -44,10 +43,10 @@ class SubscribeFragment : DSLSettingsFragment(
private val lifecycleDisposable = LifecycleDisposable() private val lifecycleDisposable = LifecycleDisposable()
private val supportTechSummary: CharSequence by lazy { private val supportTechSummary: CharSequence by lazy {
SpannableStringBuilder(requireContext().getString(R.string.SubscribeFragment__support_technology_that_is_built_for_you)) SpannableStringBuilder(requireContext().getString(R.string.SubscribeFragment__support_technology_that_is_built_for_you_not))
.append(" ") .append(" ")
.append( .append(
SpanUtil.learnMore(requireContext(), ContextCompat.getColor(requireContext(), R.color.signal_accent_primary)) { SpanUtil.readMore(requireContext(), ContextCompat.getColor(requireContext(), R.color.signal_accent_primary)) {
findNavController().navigate(SubscribeFragmentDirections.actionSubscribeFragmentToSubscribeLearnMoreBottomSheetDialog()) findNavController().navigate(SubscribeFragmentDirections.actionSubscribeFragmentToSubscribeLearnMoreBottomSheetDialog())
} }
) )
@ -152,14 +151,20 @@ class SubscribeFragment : DSLSettingsFragment(
text = DSLSettingsText.from(R.string.SubscribeFragment__update_subscription), text = DSLSettingsText.from(R.string.SubscribeFragment__update_subscription),
isEnabled = areFieldsEnabled && (!activeAndSameLevel || isExpiring), isEnabled = areFieldsEnabled && (!activeAndSameLevel || isExpiring),
onClick = { onClick = {
val price = viewModel.state.value?.selectedSubscription?.price ?: return@primaryButton
val calendar = Calendar.getInstance() val calendar = Calendar.getInstance()
calendar.add(Calendar.MONTH, 1) calendar.add(Calendar.MONTH, 1)
MaterialAlertDialogBuilder(requireContext()) MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.SubscribeFragment__update_subscription_question) .setTitle(R.string.SubscribeFragment__update_subscription_question)
.setMessage( .setMessage(
getString( getString(
R.string.SubscribeFragment__you_will_be_charged_the_full_amount, R.string.SubscribeFragment__you_will_be_charged_the_full_amount_s_of,
DateUtils.formatDateWithYear(Locale.getDefault(), calendar.timeInMillis) FiatMoneyUtil.format(
requireContext().resources,
price,
FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()
)
) )
) )
.setPositiveButton(R.string.SubscribeFragment__update) { dialog, _ -> .setPositiveButton(R.string.SubscribeFragment__update) { dialog, _ ->
@ -214,7 +219,7 @@ class SubscribeFragment : DSLSettingsFragment(
} }
private fun onGooglePayButtonClicked() { private fun onGooglePayButtonClicked() {
viewModel.requestTokenFromGooglePay() viewModel.requestTokenFromGooglePay(requireContext())
} }
private fun onPaymentConfirmed(badge: Badge) { private fun onPaymentConfirmed(badge: Badge) {

View file

@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.subscribe package org.thoughtcrime.securesms.components.settings.app.subscription.subscribe
import android.content.Context
import android.content.Intent import android.content.Intent
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
@ -170,7 +171,7 @@ class SubscribeViewModel(
) )
} }
fun requestTokenFromGooglePay() { fun requestTokenFromGooglePay(context: Context) {
val snapshot = store.state val snapshot = store.state
if (snapshot.selectedSubscription == null) { if (snapshot.selectedSubscription == null) {
return return
@ -179,7 +180,7 @@ class SubscribeViewModel(
store.update { it.copy(stage = SubscribeState.Stage.TOKEN_REQUEST) } store.update { it.copy(stage = SubscribeState.Stage.TOKEN_REQUEST) }
subscriptionToPurchase = snapshot.selectedSubscription subscriptionToPurchase = snapshot.selectedSubscription
donationPaymentRepository.requestTokenFromGooglePay(snapshot.selectedSubscription.price, snapshot.selectedSubscription.title, fetchTokenRequestCode) donationPaymentRepository.requestTokenFromGooglePay(snapshot.selectedSubscription.price, snapshot.selectedSubscription.getTitle(context), fetchTokenRequestCode)
} }
fun setSelectedSubscription(subscription: Subscription) { fun setSelectedSubscription(subscription: Subscription) {

View file

@ -3,10 +3,12 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.thanks
import android.animation.Animator import android.animation.Animator
import android.content.DialogInterface import android.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.text.SpannableStringBuilder
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieDrawable import com.airbnb.lottie.LottieDrawable
@ -19,6 +21,7 @@ import org.thoughtcrime.securesms.badges.BadgeRepository
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity
import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.SpanUtil
import org.thoughtcrime.securesms.util.visible import org.thoughtcrime.securesms.util.visible
class ThanksForYourSupportBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogFragment() { class ThanksForYourSupportBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogFragment() {
@ -49,6 +52,7 @@ class ThanksForYourSupportBottomSheetDialogFragment : FixedRoundedCornerBottomSh
val done: MaterialButton = view.findViewById(R.id.thanks_bottom_sheet_done) val done: MaterialButton = view.findViewById(R.id.thanks_bottom_sheet_done)
val controlText: TextView = view.findViewById(R.id.thanks_bottom_sheet_control_text) val controlText: TextView = view.findViewById(R.id.thanks_bottom_sheet_control_text)
val controlNote: View = view.findViewById(R.id.thanks_bottom_sheet_featured_note) val controlNote: View = view.findViewById(R.id.thanks_bottom_sheet_featured_note)
val subhead: TextView = view.findViewById(R.id.thanks_bottom_sheet_subhead)
heading = view.findViewById(R.id.thanks_bottom_sheet_heading) heading = view.findViewById(R.id.thanks_bottom_sheet_heading)
switch = view.findViewById(R.id.thanks_bottom_sheet_switch) switch = view.findViewById(R.id.thanks_bottom_sheet_switch)
@ -58,6 +62,27 @@ class ThanksForYourSupportBottomSheetDialogFragment : FixedRoundedCornerBottomSh
badgeView.setBadge(args.badge) badgeView.setBadge(args.badge)
badgeName.text = args.badge.name badgeName.text = args.badge.name
if (args.badge.isBoost()) {
if (Recipient.self().badges.any { !it.isBoost() }) {
subhead.setText(R.string.SubscribeThanksForYourSupportBottomSheetDialogFragment__youve_earned_a_boost_badge_help_signal)
} else {
subhead.text = SpannableStringBuilder(getString(R.string.SubscribeThanksForYourSupportBottomSheetDialogFragment__youve_earned_a_boost_badge_help_signal))
.append(" ")
.append(getString(R.string.SubscribeThanksForYourSupportBottomSheetDialogFragment__you_can_also))
.append(
SpanUtil.clickable(
getString(R.string.SubscribeThanksForYourSupportBottomSheetDialogFragment__become_a_montly_sustainer),
ContextCompat.getColor(requireContext(), R.color.signal_accent_primary),
) {
requireActivity().finish()
requireActivity().startActivity(AppSettingsActivity.subscriptions(requireContext()))
}
)
}
} else {
subhead.text = getString(R.string.SubscribeThanksForYourSupportBottomSheetDialogFragment__youve_earned_s_badge_help_signal, args.badge.name)
}
val otherBadges = Recipient.self().badges.filterNot { it.id == args.badge.id } val otherBadges = Recipient.self().badges.filterNot { it.id == args.badge.id }
val hasOtherBadges = otherBadges.isNotEmpty() val hasOtherBadges = otherBadges.isNotEmpty()
val displayingBadges = otherBadges.all { it.visible } val displayingBadges = otherBadges.all { it.visible }

View file

@ -488,6 +488,12 @@ class ConversationSettingsFragment : DSLSettingsFragment(
sectionHeaderPref(R.string.ManageProfileFragment_badges) sectionHeaderPref(R.string.ManageProfileFragment_badges)
displayBadges(requireContext(), state.recipient.badges) displayBadges(requireContext(), state.recipient.badges)
textPref(
summary = DSLSettingsText.from(
R.string.ConversationSettingsFragment__get_badges
)
)
} }
if (recipientSettingsState.selfHasGroups) { if (recipientSettingsState.selfHasGroups) {

View file

@ -348,7 +348,7 @@ public final class Megaphones {
.setTitle(R.string.BecomeASustainerMegaphone__become_a_sustainer) .setTitle(R.string.BecomeASustainerMegaphone__become_a_sustainer)
.setImage(R.drawable.ic_become_a_sustainer_megaphone) .setImage(R.drawable.ic_become_a_sustainer_megaphone)
.setBody(R.string.BecomeASustainerMegaphone__signal_is_powered) .setBody(R.string.BecomeASustainerMegaphone__signal_is_powered)
.setActionButton(R.string.BecomeASustainerMegaphone__donate, (megaphone, listener) -> { .setActionButton(R.string.BecomeASustainerMegaphone__contribute, (megaphone, listener) -> {
listener.onMegaphoneNavigationRequested(AppSettingsActivity.subscriptions(context)); listener.onMegaphoneNavigationRequested(AppSettingsActivity.subscriptions(context));
listener.onMegaphoneCompleted(Event.BECOME_A_SUSTAINER); listener.onMegaphoneCompleted(Event.BECOME_A_SUSTAINER);
}) })

View file

@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.subscription package org.thoughtcrime.securesms.subscription
import android.content.Context
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
@ -20,12 +21,20 @@ import java.util.Locale
*/ */
data class Subscription( data class Subscription(
val id: String, val id: String,
val title: String,
val badge: Badge, val badge: Badge,
val price: FiatMoney, val price: FiatMoney,
val level: Int, val level: Int,
) { ) {
fun getTitle(context: Context): String {
return when (level) {
500 -> context.getString(R.string.SubscribeFragment__sustainer_i)
1000 -> context.getString(R.string.SubscribeFragment__sustainer_ii)
2000 -> context.getString(R.string.SubscribeFragment__sustainer_iii)
else -> ""
}
}
companion object { companion object {
fun register(adapter: MappingAdapter) { fun register(adapter: MappingAdapter) {
adapter.registerFactory(Model::class.java, MappingAdapter.LayoutFactory({ ViewHolder(it) }, R.layout.subscription_preference)) adapter.registerFactory(Model::class.java, MappingAdapter.LayoutFactory({ ViewHolder(it) }, R.layout.subscription_preference))
@ -81,7 +90,7 @@ data class Subscription(
badge.setBadge(model.subscription.badge) badge.setBadge(model.subscription.badge)
} }
title.text = model.subscription.title title.text = model.subscription.getTitle(context)
tagline.text = context.getString(R.string.Subscription__earn_a_s_badge, model.subscription.badge.name) tagline.text = context.getString(R.string.Subscription__earn_a_s_badge, model.subscription.badge.name)
val formattedPrice = FiatMoneyUtil.format( val formattedPrice = FiatMoneyUtil.format(

View file

@ -136,6 +136,21 @@ public final class SpanUtil {
return clickSubstring(learnMore, learnMore, onLearnMoreClicked, color); return clickSubstring(learnMore, learnMore, onLearnMoreClicked, color);
} }
public static CharSequence readMore(@NonNull Context context,
@ColorInt int color,
@NonNull View.OnClickListener onLearnMoreClicked)
{
String readMore = context.getString(R.string.SpanUtil__read_more);
return clickSubstring(readMore, readMore, onLearnMoreClicked, color);
}
public static CharSequence clickable(@NonNull CharSequence text,
@ColorInt int color,
@NonNull View.OnClickListener onLearnMoreClicked)
{
return clickSubstring(text, text, onLearnMoreClicked, color);
}
/** /**
* Takes two resources: * Takes two resources:
* - one resource that has a single string placeholder * - one resource that has a single string placeholder

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M17.87,15.92c-0.09,0.07 -0.17,0.15 -0.26,0.21 -3.23,2.34 -4.86,3.08 -6.21,3.14l0.34,2.2a1.16,1.16 0,0 0,2 0.7c1.39,-1.68 3.23,-3.91 3.9,-4.79a1.59,1.59 0,0 0,0.27 -1.31C17.9,16 17.88,16 17.87,15.92Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M8.06,6.27 L8,6.24a1.59,1.59 0,0 0,-1.31 0.27c-0.88,0.67 -3.11,2.51 -4.79,3.9a1.17,1.17 0,0 0,0.7 2l2.2,0.33c0,-1.36 0.74,-3 3.13,-6.3Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M20.9,3.15a10.37,10.37 0,0 0,-2.7 -0.35A11.52,11.52 0,0 0,9.31 7.11h0c-0.06,0.08 -0.14,0.15 -0.2,0.24l-0.65,0.92 -0.17,0.25 -0.41,0.62 -0.13,0.2c-0.16,0.24 -0.3,0.48 -0.43,0.7l0,0.05c-0.12,0.2 -0.22,0.38 -0.31,0.56a0.61,0.61 0,0 0,-0.07 0.14c-0.08,0.15 -0.15,0.29 -0.21,0.43a0.2,0.2 0,0 0,0 0.08q-0.11,0.24 -0.18,0.45v0a3.42,3.42 0,0 0,-0.11 0.35v0.07a1.88,1.88 0,0 0,-0.06 0.31h0a2.41,2.41 0,0 0,0.06 1,5 5,0 0,0 1.54,2.7 5,5 0,0 0,2.69 1.53,2.42 2.42,0 0,0 1.1,0h0a4.31,4.31 0,0 0,0.74 -0.21l0.06,0a3.89,3.89 0,0 0,0.38 -0.16l0.11,-0.05 0.45,-0.23 0.07,0 0.61,-0.34 0.13,-0.08 0.55,-0.34 0.23,-0.15 0.56,-0.38 0.25,-0.17c0.29,-0.19 0.58,-0.4 0.9,-0.63A11.36,11.36 0,0 0,20.9 3.15ZM16.72,10.68a2.75,2.75 0,0 1,-5 0.61,2.75 2.75,0 0,1 2.4,-4.1 2.64,2.64 0,0 1,0.74 0.1A2.76,2.76 0,0 1,16.72 10.68Z"/>
</vector>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M18.3,14.77a1.77,1.77 0,0 1,-0.06 -0.17,12 12,0 0,0 3.26,-12 10.87,10.87 0,0 0,-3.3 -0.5A12.27,12.27 0,0 0,9.38 5.89l-0.1,0c-0.34,-0.11 -0.76,-0.25 -1.13,-0.34a2.35,2.35 0,0 0,-1.93 0.41c-0.89,0.66 -3.11,2.5 -4.82,3.92a1.8,1.8 0,0 0,-0.57 1.89,2 2,0 0,0 1.64,1.43l1.33,0.2c0.73,0.11 1.35,0.2 1.81,0.25h0A5.77,5.77 0,0 0,7.35 16.7a5.77,5.77 0,0 0,3.08 1.74l0.11,0c0.05,0.46 0.14,1.07 0.25,1.79 0.07,0.43 0.14,0.88 0.2,1.33a2,2 0,0 0,1.43 1.64,1.86 1.86,0 0,0 0.52,0.07 1.8,1.8 0,0 0,1.37 -0.64c1.42,-1.71 3.26,-3.93 3.93,-4.82a2.38,2.38 0,0 0,0.4 -1.93C18.55,15.53 18.41,15.11 18.3,14.77ZM2.68,11.67a0.48,0.48 0,0 1,-0.41 -0.35A0.29,0.29 0,0 1,2.36 11c1.7,-1.41 3.9,-3.23 4.76,-3.88A0.85,0.85 0,0 1,7.82 7a3.87,3.87 0,0 1,0.53 0.15c-1.82,2.53 -2.53,4 -2.75,5L4,11.88ZM8.42,15.67a4.26,4.26 0,0 1,-1.34 -2.32c-0.13,-0.66 -0.3,-1.47 2.63,-5.52A10.87,10.87 0,0 1,18.2 3.55a10.27,10.27 0,0 1,2.08 0.22,10.62 10.62,0 0,1 -4,10.55C13.72,16.17 12.12,17 11.23,17a2.67,2.67 0,0 1,-0.5 -0.06A4.24,4.24 0,0 1,8.42 15.64ZM17,16.93c-0.65,0.86 -2.47,3.06 -3.88,4.76a0.29,0.29 0,0 1,-0.33 0.09,0.49 0.49,0 0,1 -0.35,-0.41c-0.07,-0.46 -0.14,-0.92 -0.2,-1.35 -0.1,-0.61 -0.19,-1.18 -0.23,-1.6 1,-0.24 2.45,-1 5,-2.78 0.06,0.2 0.12,0.4 0.16,0.59A0.85,0.85 0,0 1,17 16.93Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M13.13,13.31a3.38,3.38 0,0 0,0.94 0.13,3.51 3.51,0 1,0 -0.94,-0.13ZM12.13,9.4A2,2 0,0 1,14.61 8,2 2,0 0,1 16,10.48a2,2 0,0 1,-1.93 1.46,2.5 2.5,0 0,1 -0.54,-0.07 2,2 0,0 1,-1.2 -0.95A2,2 0,0 1,12.14 9.4Z"/>
</vector>

View file

@ -0,0 +1,125 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="76dp"
android:height="74dp"
android:viewportWidth="76"
android:viewportHeight="74">
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M22.361,3.639c2.035,-0.029 4.062,0.263 6.004,0.866l1.545,-3.329c-2.431,-0.813 -4.984,-1.21 -7.55,-1.173c-1.479,0.005 -2.954,0.173 -4.396,0.499l0.798,3.539C19.942,3.779 21.15,3.644 22.361,3.639z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M6.363,12.943l-3.136,-1.877C1.239,14.33 0.128,18.043 0,21.852L3.678,21.9C3.8,18.739 4.723,15.658 6.363,12.943z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M15.7,4.989l-1.148,-3.437c-3.608,1.444 -6.8,3.745 -9.296,6.699l2.955,2.138C10.24,8.027 12.807,6.177 15.7,4.989z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M38.001,10.859l2.394,-2.028c1.312,-1.148 2.737,-2.163 4.254,-3.03l-1.847,-3.151c-1.709,0.981 -3.317,2.125 -4.801,3.416c-1.484,-1.291 -3.092,-2.436 -4.802,-3.418l-1.849,3.151c1.516,0.867 2.941,1.883 4.254,3.03L38.001,10.859z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M14.59,47.645l-3.025,2.089c2.12,2.662 4.385,5.187 6.666,7.531l2.882,-2.288C18.963,52.782 16.723,50.314 14.59,47.645z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M20.742,59.773c2.624,2.545 5.202,4.824 7.538,6.778l2.648,-2.556c-2.315,-1.929 -4.891,-4.2 -7.508,-6.73L20.742,59.773z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M3.785,25.157l-3.674,0.236c0.38,3.482 1.286,6.888 2.688,10.104l3.394,-1.419C4.951,31.238 4.14,28.232 3.785,25.157z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M7.579,37.031l-3.27,1.683c1.488,2.858 3.195,5.599 5.105,8.2l3.197,-1.854C10.724,42.518 9.041,39.833 7.579,37.031z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M53.639,3.639c1.211,0.004 2.417,0.138 3.599,0.399l0.798,-3.539C56.593,0.173 55.119,0.006 53.639,0c-2.566,-0.036 -5.119,0.36 -7.55,1.173l1.546,3.332C49.577,3.903 51.604,3.611 53.639,3.639z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M72.322,21.9L76,21.852c-0.128,-3.809 -1.239,-7.522 -3.227,-10.787l-3.136,1.877C71.277,15.658 72.2,18.739 72.322,21.9z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M67.788,10.39l2.955,-2.138c-2.496,-2.955 -5.689,-5.256 -9.298,-6.7l-1.148,3.437C63.192,6.177 65.76,8.028 67.788,10.39z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M53.179,7.278c-5.977,0 -12.726,4.641 -15.178,9.705c-2.454,-5.067 -9.2,-9.702 -15.179,-9.702c-8.739,0 -15.485,7.176 -15.485,15.468c-0.001,20.47 30.664,42.153 30.664,42.153s30.664,-21.684 30.664,-42.153C68.664,14.455 61.918,7.278 53.179,7.278z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M38.001,69.525c-1.145,-0.834 -2.711,-2.011 -4.539,-3.465l-2.417,2.753C35.165,72.098 38.001,74 38.001,74s2.836,-1.902 6.956,-5.187l-2.417,-2.753C40.711,67.515 39.144,68.692 38.001,69.525z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M54.89,54.977l2.882,2.288c2.281,-2.344 4.545,-4.869 6.666,-7.531l-3.027,-2.089C59.278,50.314 57.037,52.782 54.89,54.977z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M45.076,63.996l2.648,2.556c2.332,-1.953 4.91,-4.234 7.538,-6.778l-2.675,-2.508C49.967,59.796 47.391,62.067 45.076,63.996z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M69.808,34.079l3.394,1.419c1.402,-3.216 2.308,-6.622 2.688,-10.104l-3.674,-0.236C71.86,28.232 71.049,31.238 69.808,34.079z"
android:fillColor="#CC1F3F"/>
</group>
<group>
<clip-path
android:pathData="M0,0h76v74h-76z"/>
<path
android:pathData="M63.391,45.06l3.197,1.854c1.91,-2.601 3.617,-5.342 5.104,-8.2l-3.27,-1.683C66.961,39.833 65.278,42.518 63.391,45.06z"
android:fillColor="#CC1F3F"/>
</group>
</vector>

View file

@ -15,13 +15,13 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/bottom_sheet_handle" /> app:srcCompat="@drawable/bottom_sheet_handle" />
<!-- TODO [alex] - need final asset -->
<ImageView <ImageView
android:id="@+id/subscribe_bottom_sheet_heart" android:id="@+id/subscribe_bottom_sheet_heart"
android:layout_width="76dp" android:layout_width="76dp"
android:layout_height="74dp" android:layout_height="74dp"
android:layout_marginTop="36dp" android:layout_marginTop="36dp"
android:importantForAccessibility="no" android:importantForAccessibility="no"
app:srcCompat="@drawable/ic_sustainer_heart"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/subscribe_bottom_sheet_handle" /> app:layout_constraintTop_toBottomOf="@id/subscribe_bottom_sheet_handle" />
@ -72,7 +72,7 @@
android:layout_marginStart="@dimen/dsl_settings_gutter" android:layout_marginStart="@dimen/dsl_settings_gutter"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginEnd="@dimen/dsl_settings_gutter" android:layout_marginEnd="@dimen/dsl_settings_gutter"
android:text="@string/SubscribeLearnMoreBottomSheetDialogFragment__the_team_at_signal_is_committed" android:text="@string/SubscribeLearnMoreBottomSheetDialogFragment__signal_is_a_non_profit_with_no"
android:textAppearance="@style/Signal.Text.Body" android:textAppearance="@style/Signal.Text.Body"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -86,7 +86,7 @@
android:layout_marginTop="24dp" android:layout_marginTop="24dp"
android:layout_marginEnd="@dimen/dsl_settings_gutter" android:layout_marginEnd="@dimen/dsl_settings_gutter"
android:paddingBottom="36dp" android:paddingBottom="36dp"
android:text="@string/SubscribeLearnMoreBottomSheetDialogFragment__your_contribution_helps_pay" android:text="@string/SubscribeLearnMoreBottomSheetDialogFragment__your_contribution"
android:textAppearance="@style/Signal.Text.Body" android:textAppearance="@style/Signal.Text.Body"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View file

@ -42,7 +42,7 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/thanks_bottom_sheet_heading" app:layout_constraintTop_toBottomOf="@id/thanks_bottom_sheet_heading"
tools:text="@string/SubscribeThanksForYourSupportBottomSheetDialogFragment__youve_earned_a_s_badge" /> tools:text="@string/SubscribeThanksForYourSupportBottomSheetDialogFragment__youve_earned_a_s_badge_help_signal" />
<org.thoughtcrime.securesms.badges.BadgeImageView <org.thoughtcrime.securesms.badges.BadgeImageView
android:id="@+id/thanks_bottom_sheet_badge" android:id="@+id/thanks_bottom_sheet_badge"

View file

@ -934,6 +934,8 @@
<!-- LearnMoreTextView --> <!-- LearnMoreTextView -->
<string name="LearnMoreTextView_learn_more">Learn more</string> <string name="LearnMoreTextView_learn_more">Learn more</string>
<string name="SpanUtil__read_more">Read more</string>
<!-- LongMessageActivity --> <!-- LongMessageActivity -->
<string name="LongMessageActivity_unable_to_find_message">Unable to find message</string> <string name="LongMessageActivity_unable_to_find_message">Unable to find message</string>
<string name="LongMessageActivity_message_from_s">Message from %1$s</string> <string name="LongMessageActivity_message_from_s">Message from %1$s</string>
@ -2404,6 +2406,7 @@
<string name="preferences__advanced">Advanced</string> <string name="preferences__advanced">Advanced</string>
<string name="preferences__donate_to_signal">Donate to Signal</string> <string name="preferences__donate_to_signal">Donate to Signal</string>
<string name="preferences__subscription">Subscription</string> <string name="preferences__subscription">Subscription</string>
<string name="preferences__become_a_signal_sustainer">Become a Signal Sustainer</string>
<string name="preferences__signal_boost">Signal Boost</string> <string name="preferences__signal_boost">Signal Boost</string>
<string name="preferences__privacy">Privacy</string> <string name="preferences__privacy">Privacy</string>
<string name="preferences__mms_user_agent">MMS User Agent</string> <string name="preferences__mms_user_agent">MMS User Agent</string>
@ -3724,9 +3727,9 @@
<!-- BecomeASustainerMegaphone --> <!-- BecomeASustainerMegaphone -->
<string name="BecomeASustainerMegaphone__become_a_sustainer">Become a Sustainer</string> <string name="BecomeASustainerMegaphone__become_a_sustainer">Become a Sustainer</string>
<string name="BecomeASustainerMegaphone__signal_is_powered">Signal is powered by people like you. Donate and receive a profile badge.</string> <string name="BecomeASustainerMegaphone__signal_is_powered">Signal is powered by people like you. Contribute and receive a profile badge.</string>
<string name="BecomeASustainerMegaphone__no_thanks">No thanks</string> <string name="BecomeASustainerMegaphone__no_thanks">No thanks</string>
<string name="BecomeASustainerMegaphone__donate">Donate</string> <string name="BecomeASustainerMegaphone__contribute">Contribute</string>
<!-- KeyboardPagerFragment --> <!-- KeyboardPagerFragment -->
<string name="KeyboardPagerFragment_emoji">Emoji</string> <string name="KeyboardPagerFragment_emoji">Emoji</string>
@ -3779,6 +3782,7 @@
<string name="ConversationSettingsFragment__conversation_muted_forever">Conversation muted forever</string> <string name="ConversationSettingsFragment__conversation_muted_forever">Conversation muted forever</string>
<string name="ConversationSettingsFragment__copied_phone_number_to_clipboard">Copied phone number to clipboard.</string> <string name="ConversationSettingsFragment__copied_phone_number_to_clipboard">Copied phone number to clipboard.</string>
<string name="ConversationSettingsFragment__phone_number">Phone number</string> <string name="ConversationSettingsFragment__phone_number">Phone number</string>
<string name="ConversationSettingsFragment__get_badges">Get badges for your profile by supporting Signal. Tap on a badge to learn more.</string>
<!-- PermissionsSettingsFragment --> <!-- PermissionsSettingsFragment -->
<string name="PermissionsSettingsFragment__add_members">Add members</string> <string name="PermissionsSettingsFragment__add_members">Add members</string>
@ -3927,6 +3931,7 @@
<string name="SubscribeFragment__signal_is_powered_by_people_like_you">Signal is powered by people like you.</string> <string name="SubscribeFragment__signal_is_powered_by_people_like_you">Signal is powered by people like you.</string>
<string name="SubscribeFragment__support_technology_that_is_built_for_you">Support technology that is built for you—not for your data—by joining the community of people that sustain it.</string> <string name="SubscribeFragment__support_technology_that_is_built_for_you">Support technology that is built for you—not for your data—by joining the community of people that sustain it.</string>
<string name="SubscribeFragment__support_technology_that_is_built_for_you_not">Support technology that is built for you, not for your data, by joining the community that sustains Signal.</string>
<string name="SubscribeFragment__donation_amount">Donation amount</string> <string name="SubscribeFragment__donation_amount">Donation amount</string>
<string name="SubscribeFragment__more_payment_options">More Payment Options</string> <string name="SubscribeFragment__more_payment_options">More Payment Options</string>
<string name="SubscribeFragment__cancel_subscription">Cancel Subscription</string> <string name="SubscribeFragment__cancel_subscription">Cancel Subscription</string>
@ -3939,6 +3944,10 @@
<string name="SubscribeFragment__update_subscription_question">Update subscription?</string> <string name="SubscribeFragment__update_subscription_question">Update subscription?</string>
<string name="SubscribeFragment__update">Update</string> <string name="SubscribeFragment__update">Update</string>
<string name="SubscribeFragment__you_will_be_charged_the_full_amount">You will be charged the full amount of the new subscription price today. Your subscription will renew %1$s.</string> <string name="SubscribeFragment__you_will_be_charged_the_full_amount">You will be charged the full amount of the new subscription price today. Your subscription will renew %1$s.</string>
<string name="SubscribeFragment__you_will_be_charged_the_full_amount_s_of">You will be charged the full amount (%1$s) of the new subscription price today. Your subscription will renew monthly.</string>
<string name="SubscribeFragment__sustainer_i">Sustainer I</string>
<string name="SubscribeFragment__sustainer_ii">Sustainer II</string>
<string name="SubscribeFragment__sustainer_iii">Sustainer III</string>
<string name="Subscription__s_per_month">%s/month</string> <string name="Subscription__s_per_month">%s/month</string>
<string name="Subscription__s_per_month_dot_renews_s">%1$s/month · Renews %2$s</string> <string name="Subscription__s_per_month_dot_renews_s">%1$s/month · Renews %2$s</string>
@ -3946,12 +3955,15 @@
<string name="SubscribeLearnMoreBottomSheetDialogFragment__signal_is_a_non_profit_with_no">Signal is a non-profit with no advertisers or investors, sustained only by the people who use and value it. Make a recurring monthly contribution and receive a profile badge to share your support.</string> <string name="SubscribeLearnMoreBottomSheetDialogFragment__signal_is_a_non_profit_with_no">Signal is a non-profit with no advertisers or investors, sustained only by the people who use and value it. Make a recurring monthly contribution and receive a profile badge to share your support.</string>
<string name="SubscribeLearnMoreBottomSheetDialogFragment__why_contribute">Why Contribute?</string> <string name="SubscribeLearnMoreBottomSheetDialogFragment__why_contribute">Why Contribute?</string>
<string name="SubscribeLearnMoreBottomSheetDialogFragment__the_team_at_signal_is_committed">The team at Signal is committed to the mission of developing open source privacy technology that protects free expression and enables secure global communication. Your contribution fuels this cause. No ads. No trackers. No kidding.</string> <string name="SubscribeLearnMoreBottomSheetDialogFragment__signal_is">Signal is committed to developing open source privacy technology that protects free expression and enables secure global communication.</string>
<string name="SubscribeLearnMoreBottomSheetDialogFragment__your_contribution_helps_pay">Your contribution helps pay for the development, servers, and bandwidth of an app used by millions around the world for private and instantaneous communication.</string> <string name="SubscribeLearnMoreBottomSheetDialogFragment__your_contribution">Your contribution fuels this cause and pays for the development and operations of an app used by millions for private communication. No ads. No trackers. No kidding.</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__thanks_for_your_support">Thanks for your Support!</string> <string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__thanks_for_your_support">Thanks for your Support!</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__thanks_for_the_boost">Thanks for the Boost!</string> <string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__thanks_for_the_boost">Thanks for the Boost!</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__youve_earned_a_s_badge">You\'ve earned a %s badge! Displaying your badge will show people you chat with that you support Signal.</string> <string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__youve_earned_s_badge_help_signal">You\'ve earned %s badge! Help Signal build awareness by displaying this badge on your profile.</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__youve_earned_a_boost_badge_help_signal">You\'ve earned a Boost badge! Help Signal build awareness by displaying this badge on your profile.</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__you_can_also">You can also</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__become_a_montly_sustainer">become a monthly Sustainer.</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__display_on_profile">Display on Profile</string> <string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__display_on_profile">Display on Profile</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__make_featured_badge">Make featured badge</string> <string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__make_featured_badge">Make featured badge</string>
<string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__done">Done</string> <string name="SubscribeThanksForYourSupportBottomSheetDialogFragment__done">Done</string>
@ -3974,13 +3986,14 @@
<string name="MySupportPreference__renews_s">Renews %1$s</string> <string name="MySupportPreference__renews_s">Renews %1$s</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__your_badge_has_expired">Your Badge has Expired</string> <string name="ExpiredBadgeBottomSheetDialogFragment__your_badge_has_expired">Your Badge has Expired</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__your_s_badge_has_expired">Your %1$s badge has expired, and is no longer visible to others on your profile.</string> <string name="ExpiredBadgeBottomSheetDialogFragment__badge_expired">Badge expired</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting">To continue supporting technology that is built for you—not for your data—please consider becoming a monthly subscriber.</string> <string name="ExpiredBadgeBottomSheetDialogFragment__subscription_cancelled">Subscription cancelled</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__become_a_subscriber">Become a subscriber</string> <string name="ExpiredBadgeBottomSheetDialogFragment__your_boost_badge_has_expired">Your Boost badge has expired, and is no longer visible to others on your profile.</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting_technology">To continue supporting technology that is built for you, please consider becoming a monthly Sustainer.</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__become_a_sustainer">Become a sustainer</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__not_now">Not now</string> <string name="ExpiredBadgeBottomSheetDialogFragment__not_now">Not now</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__your_subscription_was_cancelled">Your subscription was cancelled.</string> <string name="ExpiredBadgeBottomSheetDialogFragment__your_sustainer">Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %1$s badge is no longer visible on your profile.</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__because">Because you were inactive for more than 45 days, your subscription to Signal has been automatically cancelled.</string> <string name="ExpiredBadgeBottomSheetDialogFragment__you_can">You can keep using Signal but to support the app and reactivate your badge, renew now.</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting_signal">To continue supporting Signal and to reactivate your badge, renew now.</string>
<string name="ExpiredBadgeBottomSheetDialogFragment__renew_subscription">Renew subscription</string> <string name="ExpiredBadgeBottomSheetDialogFragment__renew_subscription">Renew subscription</string>
<string name="Subscription__verification_failed">Subscription Verification Failed</string> <string name="Subscription__verification_failed">Subscription Verification Failed</string>

View file

@ -33,7 +33,7 @@ class BoostTest__MoneyFilter {
testSubject.afterTextChanged(editable) testSubject.afterTextChanged(editable)
assertEquals("$ 5", editable.toString()) assertEquals("$5", editable.toString())
} }
@Test @Test
@ -92,7 +92,7 @@ class BoostTest__MoneyFilter {
testSubject.afterTextChanged(editable) testSubject.afterTextChanged(editable)
assertEquals("¥ 5", editable.toString()) assertEquals("¥5", editable.toString())
} }
@Test @Test