diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt index 42ba2b0e2d..82045f81e6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt @@ -46,23 +46,26 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.storage.StorageSyncHelper import org.thoughtcrime.securesms.util.RemoteConfig +import org.thoughtcrime.securesms.util.next import org.whispersystems.signalservice.api.storage.IAPSubscriptionId import org.whispersystems.signalservice.internal.push.SubscriptionsConfiguration import kotlin.time.Duration.Companion.seconds class MessageBackupsFlowViewModel( - initialTierSelection: MessageBackupTier?, + private val initialTierSelection: MessageBackupTier?, startScreen: MessageBackupsStage = if (SignalStore.backup.backupTier == null) MessageBackupsStage.EDUCATION else MessageBackupsStage.TYPE_SELECTION ) : ViewModel(), BackupKeyCredentialManagerHandler { companion object { private val TAG = Log.tag(MessageBackupsFlowViewModel::class) + private val DEFAULT_BACKUP_TIER: MessageBackupTier = MessageBackupTier.FREE } private val internalStateFlow = MutableStateFlow( MessageBackupsFlowState( availableBackupTypes = emptyList(), - selectedMessageBackupTier = initialTierSelection ?: SignalStore.backup.backupTier ?: MessageBackupTier.FREE, + currentMessageBackupTier = SignalStore.backup.backupTier, + selectedMessageBackupTier = resolveSelectedTier(initialTierSelection, SignalStore.backup.backupTier), startScreen = startScreen ) ) @@ -166,19 +169,49 @@ class MessageBackupsFlowViewModel( activeSubscription.onSuccess { subscription -> if (subscription.isCanceled) { Log.d(TAG, "Active subscription is cancelled. Clearing tier.") - internalStateFlow.update { it.copy(currentMessageBackupTier = null) } + internalStateFlow.update { + it.copy( + currentMessageBackupTier = null, + selectedMessageBackupTier = resolveSelectedTier(initialTierSelection, null) + ) + } } else if (subscription.isActive) { Log.d(TAG, "Active subscription is active. Setting tier.") - internalStateFlow.update { it.copy(currentMessageBackupTier = SignalStore.backup.backupTier) } + internalStateFlow.update { + it.copy( + currentMessageBackupTier = SignalStore.backup.backupTier, + selectedMessageBackupTier = resolveSelectedTier(initialTierSelection, SignalStore.backup.backupTier) + ) + } } else { Log.w(TAG, "Subscription is inactive. Clearing tier.") - internalStateFlow.update { it.copy(currentMessageBackupTier = null) } + internalStateFlow.update { + it.copy( + currentMessageBackupTier = null, + selectedMessageBackupTier = resolveSelectedTier(initialTierSelection, null) + ) + } } } } } else { Log.d(TAG, "User is on tier: $tier") - internalStateFlow.update { it.copy(currentMessageBackupTier = tier) } + internalStateFlow.update { + it.copy( + currentMessageBackupTier = tier, + selectedMessageBackupTier = resolveSelectedTier(initialTierSelection, SignalStore.backup.backupTier) + ) + } + } + } + + private fun resolveSelectedTier(desiredTier: MessageBackupTier?, currentTier: MessageBackupTier?): MessageBackupTier { + return when { + desiredTier == null && currentTier == null -> DEFAULT_BACKUP_TIER + desiredTier == null && currentTier != null -> currentTier.next() + desiredTier != null && currentTier == null -> desiredTier + desiredTier != null && currentTier == desiredTier -> currentTier.next() + else -> desiredTier ?: DEFAULT_BACKUP_TIER } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsTypeSelectionScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsTypeSelectionScreen.kt index 5cfa45be80..e208d3cbc7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsTypeSelectionScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsTypeSelectionScreen.kt @@ -148,6 +148,7 @@ fun MessageBackupsTypeSelectionScreen( { _, item -> item.tier } ) { index, item -> MessageBackupsTypeBlock( + enabled = selectedBackupTier != item.tier, messageBackupsType = item, isCurrent = item.tier == currentBackupTier, isSelected = item.tier == selectedBackupTier,