From 6c7d8379648f735d2116683b5e7bcb6b4aa1fb21 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 28 Oct 2021 15:49:25 -0300 Subject: [PATCH] Update badge copy with new strings. --- .../securesms/badges/models/Badge.kt | 2 +- .../ExpiredBadgeBottomSheetDialogFragment.kt | 12 +- .../components/settings/DSLSettingsText.kt | 1 - .../settings/app/AppSettingsFragment.kt | 12 +- .../subscription/SubscriptionsRepository.kt | 1 - .../settings/app/subscription/boost/Boost.kt | 2 +- .../manage/ActiveSubscriptionPreference.kt | 2 +- .../subscribe/SubscribeFragment.kt | 19 ++- .../subscribe/SubscribeViewModel.kt | 5 +- ...ForYourSupportBottomSheetDialogFragment.kt | 25 ++++ .../ConversationSettingsFragment.kt | 6 + .../securesms/megaphone/Megaphones.java | 2 +- .../securesms/subscription/Subscription.kt | 13 +- .../thoughtcrime/securesms/util/SpanUtil.java | 15 +++ .../main/res/drawable-night/ic_boost_24.xml | 15 +++ app/src/main/res/drawable/ic_boost_24.xml | 12 ++ .../main/res/drawable/ic_sustainer_heart.xml | 125 ++++++++++++++++++ ...earn_more_bottom_sheet_dialog_fragment.xml | 6 +- ...r_support_bottom_sheet_dialog_fragment.xml | 2 +- app/src/main/res/values/strings.xml | 35 +++-- .../boost/BoostTest__MoneyFilter.kt | 4 +- 21 files changed, 273 insertions(+), 43 deletions(-) create mode 100644 app/src/main/res/drawable-night/ic_boost_24.xml create mode 100644 app/src/main/res/drawable/ic_boost_24.xml create mode 100644 app/src/main/res/drawable/ic_sustainer_heart.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/models/Badge.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/models/Badge.kt index 0c7315a6c..e0b8d26d9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/models/Badge.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/models/Badge.kt @@ -36,7 +36,7 @@ data class Badge( val visible: Boolean, ) : Parcelable, Key { - fun isExpired(): Boolean = expirationTimestamp < System.currentTimeMillis() + fun isExpired(): Boolean = expirationTimestamp < System.currentTimeMillis() && expirationTimestamp > 0 fun isBoost(): Boolean = id == BOOST_BADGE_ID override fun updateDiskCacheKey(messageDigest: MessageDigest) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/self/expired/ExpiredBadgeBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/self/expired/ExpiredBadgeBottomSheetDialogFragment.kt index 2e4f24887..7d5491c72 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/self/expired/ExpiredBadgeBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/self/expired/ExpiredBadgeBottomSheetDialogFragment.kt @@ -35,7 +35,7 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( if (badge.isBoost()) { R.string.ExpiredBadgeBottomSheetDialogFragment__your_badge_has_expired } else { - R.string.ExpiredBadgeBottomSheetDialogFragment__your_subscription_was_cancelled + R.string.ExpiredBadgeBottomSheetDialogFragment__subscription_cancelled } ) @@ -44,9 +44,9 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( noPadTextPref( DSLSettingsText.from( if (badge.isBoost()) { - getString(R.string.ExpiredBadgeBottomSheetDialogFragment__your_s_badge_has_expired, badge.name) + R.string.ExpiredBadgeBottomSheetDialogFragment__your_boost_badge_has_expired } else { - getString(R.string.ExpiredBadgeBottomSheetDialogFragment__because) + R.string.ExpiredBadgeBottomSheetDialogFragment__your_sustainer }, DSLSettingsText.CenterModifier ) @@ -57,9 +57,9 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( noPadTextPref( DSLSettingsText.from( if (badge.isBoost()) { - R.string.ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting + R.string.ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting_technology } else { - R.string.ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting_signal + R.string.ExpiredBadgeBottomSheetDialogFragment__you_can }, DSLSettingsText.CenterModifier ) @@ -70,7 +70,7 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( primaryButton( text = DSLSettingsText.from( if (badge.isBoost()) { - R.string.ExpiredBadgeBottomSheetDialogFragment__become_a_subscriber + R.string.ExpiredBadgeBottomSheetDialogFragment__become_a_sustainer } else { R.string.ExpiredBadgeBottomSheetDialogFragment__renew_subscription } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsText.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsText.kt index f707975ed..6a11aa999 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsText.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsText.kt @@ -62,7 +62,6 @@ sealed class DSLSettingsText { } 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) open class TextAppearanceModifier(@StyleRes private val textAppearance: Int) : Modifier { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt index e4439b21a..4aa37526d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt @@ -147,7 +147,13 @@ class AppSettingsFragment : DSLSettingsFragment(R.string.text_secure_normal__men if (FeatureFlags.donorBadges() && PlayServicesUtil.getPlayServicesStatus(requireContext()) == PlayServicesUtil.PlayServicesStatus.SUCCESS) { customPref( 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), isActive = state.hasActiveSubscription, onClick = { isActive -> @@ -159,10 +165,9 @@ class AppSettingsFragment : DSLSettingsFragment(R.string.text_secure_normal__men } ) ) - // TODO [alex] -- clap clickPref( 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 = { 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 { return true } + override fun areContentsTheSame(newItem: SubscriptionPreference): Boolean { return super.areContentsTheSame(newItem) && isActive == newItem.isActive } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/SubscriptionsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/SubscriptionsRepository.kt index a73671b14..17b743434 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/SubscriptionsRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/SubscriptionsRepository.kt @@ -31,7 +31,6 @@ class SubscriptionsRepository(private val donationsService: DonationsService) { subscriptionLevels.levels.map { (code, level) -> Subscription( id = code, - title = level.badge.name, badge = Badges.fromServiceBadge(level.badge), price = FiatMoney(level.currencies[currency.currencyCode]!!, currency), level = code.toInt() diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/Boost.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/Boost.kt index a2127d583..dc7ae260d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/Boost.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/Boost.kt @@ -139,7 +139,7 @@ data class Boost( class MoneyFilter(val currency: Currency, private val onCustomAmountChanged: (String) -> Unit = {}) : DigitsKeyListener(), TextWatcher { 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() override fun filter( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ActiveSubscriptionPreference.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ActiveSubscriptionPreference.kt index e2c9b6ea6..26019b32b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ActiveSubscriptionPreference.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ActiveSubscriptionPreference.kt @@ -45,7 +45,7 @@ object ActiveSubscriptionPreference { override fun bind(model: Model) { badge.setBadge(model.subscription.badge) - title.text = model.subscription.title + title.text = model.subscription.getTitle(context) price.text = context.getString( R.string.MySupportPreference__s_per_month, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeFragment.kt index 26cdb1649..d25493bad 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeFragment.kt @@ -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.GooglePayButton import org.thoughtcrime.securesms.components.settings.configure +import org.thoughtcrime.securesms.payments.FiatMoneyUtil import org.thoughtcrime.securesms.subscription.Subscription -import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.LifecycleDisposable import org.thoughtcrime.securesms.util.SpanUtil import java.util.Calendar -import java.util.Locale import java.util.concurrent.TimeUnit /** @@ -44,10 +43,10 @@ class SubscribeFragment : DSLSettingsFragment( private val lifecycleDisposable = LifecycleDisposable() 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( - 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()) } ) @@ -152,14 +151,20 @@ class SubscribeFragment : DSLSettingsFragment( text = DSLSettingsText.from(R.string.SubscribeFragment__update_subscription), isEnabled = areFieldsEnabled && (!activeAndSameLevel || isExpiring), onClick = { + val price = viewModel.state.value?.selectedSubscription?.price ?: return@primaryButton val calendar = Calendar.getInstance() + calendar.add(Calendar.MONTH, 1) MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.SubscribeFragment__update_subscription_question) .setMessage( getString( - R.string.SubscribeFragment__you_will_be_charged_the_full_amount, - DateUtils.formatDateWithYear(Locale.getDefault(), calendar.timeInMillis) + R.string.SubscribeFragment__you_will_be_charged_the_full_amount_s_of, + FiatMoneyUtil.format( + requireContext().resources, + price, + FiatMoneyUtil.formatOptions().trimZerosAfterDecimal() + ) ) ) .setPositiveButton(R.string.SubscribeFragment__update) { dialog, _ -> @@ -214,7 +219,7 @@ class SubscribeFragment : DSLSettingsFragment( } private fun onGooglePayButtonClicked() { - viewModel.requestTokenFromGooglePay() + viewModel.requestTokenFromGooglePay(requireContext()) } private fun onPaymentConfirmed(badge: Badge) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeViewModel.kt index 9e0cada20..8b62f5915 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/subscribe/SubscribeViewModel.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.subscribe +import android.content.Context import android.content.Intent import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel @@ -170,7 +171,7 @@ class SubscribeViewModel( ) } - fun requestTokenFromGooglePay() { + fun requestTokenFromGooglePay(context: Context) { val snapshot = store.state if (snapshot.selectedSubscription == null) { return @@ -179,7 +180,7 @@ class SubscribeViewModel( store.update { it.copy(stage = SubscribeState.Stage.TOKEN_REQUEST) } 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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/thanks/ThanksForYourSupportBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/thanks/ThanksForYourSupportBottomSheetDialogFragment.kt index 8657b5781..51e01c99d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/thanks/ThanksForYourSupportBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/thanks/ThanksForYourSupportBottomSheetDialogFragment.kt @@ -3,10 +3,12 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.thanks import android.animation.Animator import android.content.DialogInterface import android.os.Bundle +import android.text.SpannableStringBuilder import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.navigation.fragment.findNavController import com.airbnb.lottie.LottieAnimationView 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.settings.app.AppSettingsActivity import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.visible class ThanksForYourSupportBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogFragment() { @@ -49,6 +52,7 @@ class ThanksForYourSupportBottomSheetDialogFragment : FixedRoundedCornerBottomSh val done: MaterialButton = view.findViewById(R.id.thanks_bottom_sheet_done) 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 subhead: TextView = view.findViewById(R.id.thanks_bottom_sheet_subhead) heading = view.findViewById(R.id.thanks_bottom_sheet_heading) switch = view.findViewById(R.id.thanks_bottom_sheet_switch) @@ -58,6 +62,27 @@ class ThanksForYourSupportBottomSheetDialogFragment : FixedRoundedCornerBottomSh badgeView.setBadge(args.badge) 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 hasOtherBadges = otherBadges.isNotEmpty() val displayingBadges = otherBadges.all { it.visible } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index f80bcfb57..4a9541d66 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -488,6 +488,12 @@ class ConversationSettingsFragment : DSLSettingsFragment( sectionHeaderPref(R.string.ManageProfileFragment_badges) displayBadges(requireContext(), state.recipient.badges) + + textPref( + summary = DSLSettingsText.from( + R.string.ConversationSettingsFragment__get_badges + ) + ) } if (recipientSettingsState.selfHasGroups) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java index b7ab17291..42a46c895 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -348,7 +348,7 @@ public final class Megaphones { .setTitle(R.string.BecomeASustainerMegaphone__become_a_sustainer) .setImage(R.drawable.ic_become_a_sustainer_megaphone) .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.onMegaphoneCompleted(Event.BECOME_A_SUSTAINER); }) diff --git a/app/src/main/java/org/thoughtcrime/securesms/subscription/Subscription.kt b/app/src/main/java/org/thoughtcrime/securesms/subscription/Subscription.kt index ec398e961..4fe92b81e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/subscription/Subscription.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/subscription/Subscription.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.subscription +import android.content.Context import android.view.View import android.widget.ImageView import android.widget.TextView @@ -20,12 +21,20 @@ import java.util.Locale */ data class Subscription( val id: String, - val title: String, val badge: Badge, val price: FiatMoney, 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 { fun register(adapter: MappingAdapter) { 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) } - 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) val formattedPrice = FiatMoneyUtil.format( diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java index 5473948f1..2a6287eb4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java @@ -136,6 +136,21 @@ public final class SpanUtil { 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: * - one resource that has a single string placeholder diff --git a/app/src/main/res/drawable-night/ic_boost_24.xml b/app/src/main/res/drawable-night/ic_boost_24.xml new file mode 100644 index 000000000..21e78125c --- /dev/null +++ b/app/src/main/res/drawable-night/ic_boost_24.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_boost_24.xml b/app/src/main/res/drawable/ic_boost_24.xml new file mode 100644 index 000000000..9b8ebea31 --- /dev/null +++ b/app/src/main/res/drawable/ic_boost_24.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_sustainer_heart.xml b/app/src/main/res/drawable/ic_sustainer_heart.xml new file mode 100644 index 000000000..206221260 --- /dev/null +++ b/app/src/main/res/drawable/ic_sustainer_heart.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/subscribe_learn_more_bottom_sheet_dialog_fragment.xml b/app/src/main/res/layout/subscribe_learn_more_bottom_sheet_dialog_fragment.xml index ab4367fc7..d12a1a880 100644 --- a/app/src/main/res/layout/subscribe_learn_more_bottom_sheet_dialog_fragment.xml +++ b/app/src/main/res/layout/subscribe_learn_more_bottom_sheet_dialog_fragment.xml @@ -15,13 +15,13 @@ app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/bottom_sheet_handle" /> - @@ -72,7 +72,7 @@ android:layout_marginStart="@dimen/dsl_settings_gutter" android:layout_marginTop="16dp" 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" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -86,7 +86,7 @@ android:layout_marginTop="24dp" android:layout_marginEnd="@dimen/dsl_settings_gutter" android:paddingBottom="36dp" - android:text="@string/SubscribeLearnMoreBottomSheetDialogFragment__your_contribution_helps_pay" + android:text="@string/SubscribeLearnMoreBottomSheetDialogFragment__your_contribution" android:textAppearance="@style/Signal.Text.Body" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/thanks_for_your_support_bottom_sheet_dialog_fragment.xml b/app/src/main/res/layout/thanks_for_your_support_bottom_sheet_dialog_fragment.xml index d18c8f209..24c1be294 100644 --- a/app/src/main/res/layout/thanks_for_your_support_bottom_sheet_dialog_fragment.xml +++ b/app/src/main/res/layout/thanks_for_your_support_bottom_sheet_dialog_fragment.xml @@ -42,7 +42,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" 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" /> Learn more + Read more + Unable to find message Message from %1$s @@ -2404,6 +2406,7 @@ Advanced Donate to Signal Subscription + Become a Signal Sustainer Signal Boost Privacy MMS User Agent @@ -3724,9 +3727,9 @@ Become a Sustainer - Signal is powered by people like you. Donate and receive a profile badge. + Signal is powered by people like you. Contribute and receive a profile badge. No thanks - Donate + Contribute Emoji @@ -3779,6 +3782,7 @@ Conversation muted forever Copied phone number to clipboard. Phone number + Get badges for your profile by supporting Signal. Tap on a badge to learn more. Add members @@ -3927,6 +3931,7 @@ Signal is powered by people like you. Support technology that is built for you—not for your data—by joining the community of people that sustain it. + Support technology that is built for you, not for your data, by joining the community that sustains Signal. Donation amount More Payment Options Cancel Subscription @@ -3939,6 +3944,10 @@ Update subscription? Update You will be charged the full amount of the new subscription price today. Your subscription will renew %1$s. + You will be charged the full amount (%1$s) of the new subscription price today. Your subscription will renew monthly. + Sustainer I + Sustainer II + Sustainer III %s/month %1$s/month · Renews %2$s @@ -3946,12 +3955,15 @@ 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. Why Contribute? - 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. - Your contribution helps pay for the development, servers, and bandwidth of an app used by millions around the world for private and instantaneous communication. + Signal is committed to developing open source privacy technology that protects free expression and enables secure global communication. + 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. Thanks for your Support! Thanks for the Boost! - You\'ve earned a %s badge! Displaying your badge will show people you chat with that you support Signal. + You\'ve earned %s badge! Help Signal build awareness by displaying this badge on your profile. + You\'ve earned a Boost badge! Help Signal build awareness by displaying this badge on your profile. + You can also + become a monthly Sustainer. Display on Profile Make featured badge Done @@ -3974,13 +3986,14 @@ Renews %1$s Your Badge has Expired - Your %1$s badge has expired, and is no longer visible to others on your profile. - To continue supporting technology that is built for you—not for your data—please consider becoming a monthly subscriber. - Become a subscriber + Badge expired + Subscription cancelled + Your Boost badge has expired, and is no longer visible to others on your profile. + To continue supporting technology that is built for you, please consider becoming a monthly Sustainer. + Become a sustainer Not now - Your subscription was cancelled. - Because you were inactive for more than 45 days, your subscription to Signal has been automatically cancelled. - To continue supporting Signal and to reactivate your badge, renew now. + Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %1$s badge is no longer visible on your profile. + You can keep using Signal but to support the app and reactivate your badge, renew now. Renew subscription Subscription Verification Failed diff --git a/app/src/test/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostTest__MoneyFilter.kt b/app/src/test/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostTest__MoneyFilter.kt index d3258543a..218b9afe5 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostTest__MoneyFilter.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostTest__MoneyFilter.kt @@ -33,7 +33,7 @@ class BoostTest__MoneyFilter { testSubject.afterTextChanged(editable) - assertEquals("$ 5", editable.toString()) + assertEquals("$5", editable.toString()) } @Test @@ -92,7 +92,7 @@ class BoostTest__MoneyFilter { testSubject.afterTextChanged(editable) - assertEquals("¥ 5", editable.toString()) + assertEquals("¥5", editable.toString()) } @Test