Disable current tier from being selected.

This commit is contained in:
Alex Hart
2025-08-01 14:15:11 -03:00
committed by Cody Henthorne
parent 5e0aa830bf
commit a60f3a26fb
2 changed files with 40 additions and 6 deletions

View File

@@ -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
}
}

View File

@@ -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,