kopia lustrzana https://github.com/ryukoposting/Signal-Android
Improve boost expiration UI when you're also a sustainer.
rodzic
6ed797c031
commit
ae7a03bc8f
|
@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsBottomSheetFrag
|
||||||
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
|
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
|
||||||
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity
|
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity
|
||||||
import org.thoughtcrime.securesms.components.settings.configure
|
import org.thoughtcrime.securesms.components.settings.configure
|
||||||
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,6 +28,7 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment(
|
||||||
|
|
||||||
private fun getConfiguration(): DSLConfiguration {
|
private fun getConfiguration(): DSLConfiguration {
|
||||||
val badge: Badge = ExpiredBadgeBottomSheetDialogFragmentArgs.fromBundle(requireArguments()).badge
|
val badge: Badge = ExpiredBadgeBottomSheetDialogFragmentArgs.fromBundle(requireArguments()).badge
|
||||||
|
val isLikelyASustainer = SignalStore.donationsValues().isLikelyASustainer()
|
||||||
|
|
||||||
return configure {
|
return configure {
|
||||||
customPref(ExpiredBadge.Model(badge))
|
customPref(ExpiredBadge.Model(badge))
|
||||||
|
@ -60,7 +62,11 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment(
|
||||||
noPadTextPref(
|
noPadTextPref(
|
||||||
DSLSettingsText.from(
|
DSLSettingsText.from(
|
||||||
if (badge.isBoost()) {
|
if (badge.isBoost()) {
|
||||||
R.string.ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting_technology
|
if (isLikelyASustainer) {
|
||||||
|
R.string.ExpiredBadgeBottomSheetDialogFragment__you_can_reactivate
|
||||||
|
} else {
|
||||||
|
R.string.ExpiredBadgeBottomSheetDialogFragment__to_continue_supporting_technology
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
R.string.ExpiredBadgeBottomSheetDialogFragment__you_can
|
R.string.ExpiredBadgeBottomSheetDialogFragment__you_can
|
||||||
},
|
},
|
||||||
|
@ -73,14 +79,22 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment(
|
||||||
primaryButton(
|
primaryButton(
|
||||||
text = DSLSettingsText.from(
|
text = DSLSettingsText.from(
|
||||||
if (badge.isBoost()) {
|
if (badge.isBoost()) {
|
||||||
R.string.ExpiredBadgeBottomSheetDialogFragment__become_a_sustainer
|
if (isLikelyASustainer) {
|
||||||
|
R.string.ExpiredBadgeBottomSheetDialogFragment__add_a_boost
|
||||||
|
} else {
|
||||||
|
R.string.ExpiredBadgeBottomSheetDialogFragment__become_a_sustainer
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
R.string.ExpiredBadgeBottomSheetDialogFragment__renew_subscription
|
R.string.ExpiredBadgeBottomSheetDialogFragment__renew_subscription
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
onClick = {
|
onClick = {
|
||||||
dismiss()
|
dismiss()
|
||||||
requireActivity().startActivity(AppSettingsActivity.subscriptions(requireContext()))
|
if (isLikelyASustainer) {
|
||||||
|
requireActivity().startActivity(AppSettingsActivity.boost(requireContext()))
|
||||||
|
} else {
|
||||||
|
requireActivity().startActivity(AppSettingsActivity.subscriptions(requireContext()))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ class AppSettingsActivity : DSLSettingsActivity(), DonationPaymentComponent {
|
||||||
StartLocation.NOTIFICATIONS -> AppSettingsFragmentDirections.actionDirectToNotificationsSettingsFragment()
|
StartLocation.NOTIFICATIONS -> AppSettingsFragmentDirections.actionDirectToNotificationsSettingsFragment()
|
||||||
StartLocation.CHANGE_NUMBER -> AppSettingsFragmentDirections.actionDirectToChangeNumberFragment()
|
StartLocation.CHANGE_NUMBER -> AppSettingsFragmentDirections.actionDirectToChangeNumberFragment()
|
||||||
StartLocation.SUBSCRIPTIONS -> AppSettingsFragmentDirections.actionDirectToSubscriptions()
|
StartLocation.SUBSCRIPTIONS -> AppSettingsFragmentDirections.actionDirectToSubscriptions()
|
||||||
|
StartLocation.BOOST -> AppSettingsFragmentDirections.actionAppSettingsFragmentToBoostsFragment()
|
||||||
StartLocation.MANAGE_SUBSCRIPTIONS -> AppSettingsFragmentDirections.actionDirectToManageDonations()
|
StartLocation.MANAGE_SUBSCRIPTIONS -> AppSettingsFragmentDirections.actionDirectToManageDonations()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -124,6 +125,9 @@ class AppSettingsActivity : DSLSettingsActivity(), DonationPaymentComponent {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun subscriptions(context: Context): Intent = getIntentForStartLocation(context, StartLocation.SUBSCRIPTIONS)
|
fun subscriptions(context: Context): Intent = getIntentForStartLocation(context, StartLocation.SUBSCRIPTIONS)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun boost(context: Context): Intent = getIntentForStartLocation(context, StartLocation.BOOST)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun manageSubscriptions(context: Context): Intent = getIntentForStartLocation(context, StartLocation.MANAGE_SUBSCRIPTIONS)
|
fun manageSubscriptions(context: Context): Intent = getIntentForStartLocation(context, StartLocation.MANAGE_SUBSCRIPTIONS)
|
||||||
|
|
||||||
|
@ -142,7 +146,8 @@ class AppSettingsActivity : DSLSettingsActivity(), DonationPaymentComponent {
|
||||||
NOTIFICATIONS(4),
|
NOTIFICATIONS(4),
|
||||||
CHANGE_NUMBER(5),
|
CHANGE_NUMBER(5),
|
||||||
SUBSCRIPTIONS(6),
|
SUBSCRIPTIONS(6),
|
||||||
MANAGE_SUBSCRIPTIONS(7);
|
BOOST(7),
|
||||||
|
MANAGE_SUBSCRIPTIONS(8);
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun fromCode(code: Int?): StartLocation {
|
fun fromCode(code: Int?): StartLocation {
|
||||||
|
|
|
@ -15,6 +15,7 @@ import org.whispersystems.signalservice.api.subscriptions.IdempotencyKey
|
||||||
import org.whispersystems.signalservice.api.subscriptions.SubscriberId
|
import org.whispersystems.signalservice.api.subscriptions.SubscriberId
|
||||||
import java.util.Currency
|
import java.util.Currency
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
internal class DonationsValues internal constructor(store: KeyValueStore) : SignalStoreValues(store) {
|
internal class DonationsValues internal constructor(store: KeyValueStore) : SignalStoreValues(store) {
|
||||||
|
|
||||||
|
@ -25,7 +26,7 @@ internal class DonationsValues internal constructor(store: KeyValueStore) : Sign
|
||||||
private const val KEY_CURRENCY_CODE_BOOST = "donation.currency.code.boost"
|
private const val KEY_CURRENCY_CODE_BOOST = "donation.currency.code.boost"
|
||||||
private const val KEY_SUBSCRIBER_ID_PREFIX = "donation.subscriber.id."
|
private const val KEY_SUBSCRIBER_ID_PREFIX = "donation.subscriber.id."
|
||||||
private const val KEY_LAST_KEEP_ALIVE_LAUNCH = "donation.last.successful.ping"
|
private const val KEY_LAST_KEEP_ALIVE_LAUNCH = "donation.last.successful.ping"
|
||||||
private const val KEY_LAST_END_OF_PERIOD = "donation.last.end.of.period"
|
private const val KEY_LAST_END_OF_PERIOD_SECONDS = "donation.last.end.of.period"
|
||||||
private const val EXPIRED_BADGE = "donation.expired.badge"
|
private const val EXPIRED_BADGE = "donation.expired.badge"
|
||||||
private const val USER_MANUALLY_CANCELLED = "donation.user.manually.cancelled"
|
private const val USER_MANUALLY_CANCELLED = "donation.user.manually.cancelled"
|
||||||
private const val KEY_LEVEL_OPERATION_PREFIX = "donation.level.operation."
|
private const val KEY_LEVEL_OPERATION_PREFIX = "donation.level.operation."
|
||||||
|
@ -40,7 +41,7 @@ internal class DonationsValues internal constructor(store: KeyValueStore) : Sign
|
||||||
override fun getKeysToIncludeInBackup(): MutableList<String> = mutableListOf(
|
override fun getKeysToIncludeInBackup(): MutableList<String> = mutableListOf(
|
||||||
KEY_CURRENCY_CODE_BOOST,
|
KEY_CURRENCY_CODE_BOOST,
|
||||||
KEY_LAST_KEEP_ALIVE_LAUNCH,
|
KEY_LAST_KEEP_ALIVE_LAUNCH,
|
||||||
KEY_LAST_END_OF_PERIOD,
|
KEY_LAST_END_OF_PERIOD_SECONDS,
|
||||||
SHOULD_CANCEL_SUBSCRIPTION_BEFORE_NEXT_SUBSCRIBE_ATTEMPT
|
SHOULD_CANCEL_SUBSCRIPTION_BEFORE_NEXT_SUBSCRIBE_ATTEMPT
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -175,11 +176,19 @@ internal class DonationsValues internal constructor(store: KeyValueStore) : Sign
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getLastEndOfPeriod(): Long {
|
fun getLastEndOfPeriod(): Long {
|
||||||
return getLong(KEY_LAST_END_OF_PERIOD, 0L)
|
return getLong(KEY_LAST_END_OF_PERIOD_SECONDS, 0L)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setLastEndOfPeriod(timestamp: Long) {
|
fun setLastEndOfPeriod(timestamp: Long) {
|
||||||
putLong(KEY_LAST_END_OF_PERIOD, timestamp)
|
putLong(KEY_LAST_END_OF_PERIOD_SECONDS, timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True if the local user is likely a sustainer, otherwise false. Note the term 'likely', because this is based on cached data. Any serious decisions that
|
||||||
|
* rely on this should make a network request to determine subscription status.
|
||||||
|
*/
|
||||||
|
fun isLikelyASustainer(): Boolean {
|
||||||
|
return TimeUnit.SECONDS.toMillis(getLastEndOfPeriod()) > System.currentTimeMillis()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isUserManuallyCancelled(): Boolean {
|
fun isUserManuallyCancelled(): Boolean {
|
||||||
|
|
|
@ -3990,9 +3990,11 @@
|
||||||
<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__badge_expired">Badge expired</string>
|
<string name="ExpiredBadgeBottomSheetDialogFragment__badge_expired">Badge expired</string>
|
||||||
<string name="ExpiredBadgeBottomSheetDialogFragment__subscription_cancelled">Subscription cancelled</string>
|
<string name="ExpiredBadgeBottomSheetDialogFragment__subscription_cancelled">Subscription cancelled</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__your_boost_badge_has_expired">Your Boost badge has expired and is no longer visible to others on your profile.</string>
|
||||||
|
<string name="ExpiredBadgeBottomSheetDialogFragment__you_can_reactivate">You can reactivate your Boost badge for another 30 days with a one-time contribution.</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__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__become_a_sustainer">Become a Sustainer</string>
|
||||||
|
<string name="ExpiredBadgeBottomSheetDialogFragment__add_a_boost">Add a Boost</string>
|
||||||
<string name="ExpiredBadgeBottomSheetDialogFragment__not_now">Not now</string>
|
<string name="ExpiredBadgeBottomSheetDialogFragment__not_now">Not now</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__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__you_can">You can keep using Signal but to support the app and reactivate your badge, renew now.</string>
|
<string name="ExpiredBadgeBottomSheetDialogFragment__you_can">You can keep using Signal but to support the app and reactivate your badge, renew now.</string>
|
||||||
|
|
Ładowanie…
Reference in New Issue