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 0c7315a6cc..e0b8d26d93 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 2e4f248875..7d5491c72d 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 f707975edb..6a11aa9990 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 e4439b21ab..4aa37526d5 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 a73671b14a..17b743434e 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 a2127d5831..dc7ae260d7 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 e2c9b6ea6c..26019b32bf 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 26cdb1649d..d25493bad5 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 9e0cada203..8b62f59152 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 8657b57815..51e01c99d7 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 f80bcfb57c..4a9541d661 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 b7ab172912..42a46c8958 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 ec398e9617..4fe92b81ed 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 5473948f1c..2a6287eb47 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 0000000000..21e78125c8
--- /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 0000000000..9b8ebea31b
--- /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 0000000000..206221260a
--- /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 ab4367fc78..d12a1a8801 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 d18c8f2092..24c1be294f 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 d3258543a0..218b9afe59 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