From c3063b721dba0bce3988e5adebeb2ca18bebe277 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 10 Nov 2022 16:25:25 -0400 Subject: [PATCH] Allow restricted users to update or cancel their subscription. --- .../settings/app/AppSettingsFragment.kt | 3 +- .../settings/app/AppSettingsState.kt | 3 +- .../settings/app/AppSettingsViewModel.kt | 32 +++++++++++++++++-- .../donate/DonateToSignalFragment.kt | 2 +- .../donate/DonateToSignalState.kt | 9 +++++- 5 files changed, 42 insertions(+), 7 deletions(-) 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 96edc7926..1c80b8297 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 @@ -14,7 +14,6 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsIcon import org.thoughtcrime.securesms.components.settings.DSLSettingsText import org.thoughtcrime.securesms.components.settings.PreferenceModel import org.thoughtcrime.securesms.components.settings.PreferenceViewHolder -import org.thoughtcrime.securesms.components.settings.app.subscription.InAppDonations import org.thoughtcrime.securesms.components.settings.configure import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter @@ -70,7 +69,7 @@ class AppSettingsFragment : DSLSettingsFragment(R.string.text_secure_normal__men } ) - if (InAppDonations.hasAtLeastOnePaymentMethodAvailable()) { + if (state.allowUserToGoToDonationManagementScreen) { clickPref( title = DSLSettingsText.from(R.string.preferences__donate_to_signal), icon = DSLSettingsIcon.from(R.drawable.ic_heart_24), diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsState.kt index 2f6f881ca..ac77c422a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsState.kt @@ -5,5 +5,6 @@ import org.thoughtcrime.securesms.recipients.Recipient data class AppSettingsState( val self: Recipient, val unreadPaymentsCount: Int, - val hasExpiredGiftBadge: Boolean + val hasExpiredGiftBadge: Boolean, + val allowUserToGoToDonationManagementScreen: Boolean ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsViewModel.kt index 949e2fb23..6698ad3cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsViewModel.kt @@ -2,23 +2,51 @@ package org.thoughtcrime.securesms.components.settings.app import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.kotlin.subscribeBy +import org.thoughtcrime.securesms.components.settings.app.subscription.InAppDonations +import org.thoughtcrime.securesms.components.settings.app.subscription.MonthlyDonationRepository import org.thoughtcrime.securesms.conversationlist.model.UnreadPaymentsLiveData +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.livedata.Store -class AppSettingsViewModel : ViewModel() { +class AppSettingsViewModel( + monthlyDonationRepository: MonthlyDonationRepository = MonthlyDonationRepository(ApplicationDependencies.getDonationsService()) +) : ViewModel() { - private val store = Store(AppSettingsState(Recipient.self(), 0, SignalStore.donationsValues().getExpiredGiftBadge() != null)) + private val store = Store( + AppSettingsState( + Recipient.self(), + 0, + SignalStore.donationsValues().getExpiredGiftBadge() != null, + SignalStore.donationsValues().isLikelyASustainer() || InAppDonations.hasAtLeastOnePaymentMethodAvailable() + ) + ) private val unreadPaymentsLiveData = UnreadPaymentsLiveData() private val selfLiveData: LiveData = Recipient.self().live().liveData + private val disposables = CompositeDisposable() val state: LiveData = store.stateLiveData init { store.update(unreadPaymentsLiveData) { payments, state -> state.copy(unreadPaymentsCount = payments.map { it.unreadCount }.orElse(0)) } store.update(selfLiveData) { self, state -> state.copy(self = self) } + + disposables += monthlyDonationRepository.getActiveSubscription().subscribeBy( + onSuccess = { activeSubscription -> + store.update { state -> + state.copy(allowUserToGoToDonationManagementScreen = activeSubscription.isActive || InAppDonations.hasAtLeastOnePaymentMethodAvailable()) + } + } + ) + } + + override fun onCleared() { + disposables.clear() } fun refreshExpiredGiftBadge() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt index 43e5785dd..a3ac52a64 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt @@ -300,7 +300,7 @@ class DonateToSignalFragment : DSLSettingsFragment( if (state.donateToSignalType == DonateToSignalType.MONTHLY && state.monthlyDonationState.isSubscriptionActive) { primaryButton( text = DSLSettingsText.from(R.string.SubscribeFragment__update_subscription), - isEnabled = state.canContinue, + isEnabled = state.canUpdate, onClick = { MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.SubscribeFragment__update_subscription_question) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalState.kt index 9f5a581a5..c9d0c00c8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalState.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.donate import org.signal.core.util.money.FiatMoney import org.thoughtcrime.securesms.badges.models.Badge +import org.thoughtcrime.securesms.components.settings.app.subscription.InAppDonations import org.thoughtcrime.securesms.components.settings.app.subscription.boost.Boost import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.subscription.Subscription @@ -54,7 +55,13 @@ data class DonateToSignalState( val canContinue: Boolean get() = when (donateToSignalType) { - DonateToSignalType.ONE_TIME -> areFieldsEnabled && oneTimeDonationState.isSelectionValid + DonateToSignalType.ONE_TIME -> areFieldsEnabled && oneTimeDonationState.isSelectionValid && InAppDonations.hasAtLeastOnePaymentMethodAvailable() + DonateToSignalType.MONTHLY -> areFieldsEnabled && monthlyDonationState.isSelectionValid && InAppDonations.hasAtLeastOnePaymentMethodAvailable() + } + + val canUpdate: Boolean + get() = when (donateToSignalType) { + DonateToSignalType.ONE_TIME -> false DonateToSignalType.MONTHLY -> areFieldsEnabled && monthlyDonationState.isSelectionValid }