From 83c34dd4cc6fcdfe018d1aad49dfe73477c3c01b Mon Sep 17 00:00:00 2001 From: Clark Date: Tue, 7 May 2024 17:00:05 -0400 Subject: [PATCH] Integrate swapping backup tiers from backup settings. --- .../MessageBackupsFlowActivity.kt | 2 +- .../subscription/MessageBackupsFlowState.kt | 1 + .../MessageBackupsFlowViewModel.kt | 3 +- .../backups/RemoteBackupsSettingsViewModel.kt | 11 +------ .../type/BackupsTypeSettingsFragment.kt | 29 ++++++++----------- .../backups/type/BackupsTypeSettingsState.kt | 4 +-- .../type/BackupsTypeSettingsViewModel.kt | 7 ++++- .../securesms/keyvalue/BackupValues.kt | 11 +++++++ 8 files changed, 36 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowActivity.kt index 9f334eb919..0a5517d787 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowActivity.kt @@ -57,7 +57,7 @@ class MessageBackupsFlowActivity : PassphraseRequiredActivity() { NavHost( navController = navController, - startDestination = MessageBackupsScreen.EDUCATION.name, + startDestination = if (state.currentMessageBackupTier == null) MessageBackupsScreen.EDUCATION.name else MessageBackupsScreen.TYPE_SELECTION.name, enterTransition = { slideInHorizontally(initialOffsetX = { it }) }, exitTransition = { slideOutHorizontally(targetOffsetX = { -it }) }, popEnterTransition = { slideInHorizontally(initialOffsetX = { -it }) }, diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowState.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowState.kt index 2065ad380d..63ccb5c761 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowState.kt @@ -12,6 +12,7 @@ import org.thoughtcrime.securesms.lock.v2.PinKeyboardType data class MessageBackupsFlowState( val selectedMessageBackupTier: MessageBackupTier? = null, + val currentMessageBackupTier: MessageBackupTier? = null, val availableBackupTiers: List = emptyList(), val selectedPaymentGateway: GatewayResponse.Gateway? = null, val availablePaymentGateways: List = emptyList(), 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 dc085c6c59..98103b3f85 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 @@ -24,7 +24,8 @@ class MessageBackupsFlowViewModel : ViewModel() { emptyList() } else { listOf(MessageBackupTier.FREE, MessageBackupTier.PAID) - } + }, + selectedMessageBackupTier = SignalStore.backup().backupTier ) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/RemoteBackupsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/RemoteBackupsSettingsViewModel.kt index 713249f229..277349d260 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/RemoteBackupsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/RemoteBackupsSettingsViewModel.kt @@ -10,7 +10,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import org.thoughtcrime.securesms.backup.v2.BackupFrequency import org.thoughtcrime.securesms.backup.v2.BackupV2Event -import org.thoughtcrime.securesms.backup.v2.MessageBackupTier import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.jobs.BackupMessagesJob import org.thoughtcrime.securesms.keyvalue.SignalStore @@ -22,15 +21,7 @@ import org.thoughtcrime.securesms.service.MessageBackupListener class RemoteBackupsSettingsViewModel : ViewModel() { private val internalState = mutableStateOf( RemoteBackupsSettingsState( - messageBackupsTier = if (SignalStore.backup().areBackupsEnabled) { - if (SignalStore.backup().canReadWriteToArchiveCdn) { - MessageBackupTier.PAID - } else { - MessageBackupTier.FREE - } - } else { - null - }, + messageBackupsTier = SignalStore.backup().backupTier, lastBackupTimestamp = SignalStore.backup().lastBackupTime, backupSize = SignalStore.backup().totalBackupSize, backupsFrequency = SignalStore.backup().backupFrequency diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsFragment.kt index 007c5d4e4e..6a007f4a9b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsFragment.kt @@ -19,23 +19,19 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.navigation.fragment.findNavController -import kotlinx.collections.immutable.persistentListOf import org.signal.core.ui.Previews import org.signal.core.ui.Rows import org.signal.core.ui.Scaffolds import org.signal.core.ui.SignalPreview -import org.signal.core.util.money.FiatMoney import org.signal.donations.PaymentSourceType import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.backup.v2.MessageBackupTier import org.thoughtcrime.securesms.backup.v2.ui.subscription.MessageBackupsFlowActivity -import org.thoughtcrime.securesms.backup.v2.ui.subscription.MessageBackupsType +import org.thoughtcrime.securesms.backup.v2.ui.subscription.getTierDetails import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.payments.FiatMoneyUtil import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.viewModel -import java.math.BigDecimal -import java.util.Currency import java.util.Locale /** @@ -87,7 +83,7 @@ private fun BackupsTypeSettingsContent( state: BackupsTypeSettingsState, contentCallbacks: ContentCallbacks ) { - if (state.backupsType == null) { + if (state.backupsTier == null) { return } @@ -101,7 +97,7 @@ private fun BackupsTypeSettingsContent( ) { item { BackupsTypeRow( - backupsType = state.backupsType, + backupsTier = state.backupsTier, nextRenewalTimestamp = state.nextRenewalTimestamp ) } @@ -131,12 +127,16 @@ private fun BackupsTypeSettingsContent( @Composable private fun BackupsTypeRow( - backupsType: MessageBackupsType, + backupsTier: MessageBackupTier, nextRenewalTimestamp: Long ) { + val messageBackupsType = remember { + getTierDetails(backupsTier) + } + val resources = LocalContext.current.resources - val formattedAmount = remember(backupsType.pricePerMonth) { - FiatMoneyUtil.format(resources, backupsType.pricePerMonth, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) + val formattedAmount = remember(messageBackupsType.pricePerMonth) { + FiatMoneyUtil.format(resources, messageBackupsType.pricePerMonth, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) } val renewal = remember(nextRenewalTimestamp) { @@ -145,7 +145,7 @@ private fun BackupsTypeRow( Rows.TextRow(text = { Column { - Text(text = backupsType.title) + Text(text = messageBackupsType.title) Text( text = "$formattedAmount/month . Renews $renewal", // TODO [message-backups] final copy style = MaterialTheme.typography.bodyMedium, @@ -186,12 +186,7 @@ private fun BackupsTypeSettingsContentPreview() { Previews.Preview { BackupsTypeSettingsContent( state = BackupsTypeSettingsState( - backupsType = MessageBackupsType( - tier = MessageBackupTier.PAID, - pricePerMonth = FiatMoney(BigDecimal.valueOf(3), Currency.getInstance("USD")), - title = "Text + all media", - features = persistentListOf() - ) + backupsTier = MessageBackupTier.PAID ), contentCallbacks = object : ContentCallbacks {} ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsState.kt index 5449a81a04..d1c3ccbb29 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsState.kt @@ -7,11 +7,11 @@ package org.thoughtcrime.securesms.components.settings.app.chats.backups.type import androidx.compose.runtime.Stable import org.signal.donations.PaymentSourceType -import org.thoughtcrime.securesms.backup.v2.ui.subscription.MessageBackupsType +import org.thoughtcrime.securesms.backup.v2.MessageBackupTier @Stable data class BackupsTypeSettingsState( - val backupsType: MessageBackupsType? = null, + val backupsTier: MessageBackupTier? = null, val paymentSourceType: PaymentSourceType = PaymentSourceType.Unknown, val nextRenewalTimestamp: Long = 0 ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsViewModel.kt index c8ddcf34ea..1f69fa6ad5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/type/BackupsTypeSettingsViewModel.kt @@ -8,9 +8,14 @@ package org.thoughtcrime.securesms.components.settings.app.chats.backups.type import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel +import org.thoughtcrime.securesms.keyvalue.SignalStore class BackupsTypeSettingsViewModel : ViewModel() { - private val internalState = mutableStateOf(BackupsTypeSettingsState()) + private val internalState = mutableStateOf( + BackupsTypeSettingsState( + backupsTier = SignalStore.backup().backupTier + ) + ) val state: State = internalState } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt index cd0dda6db2..3462852494 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.backup.RestoreState import org.thoughtcrime.securesms.backup.v2.BackupFrequency +import org.thoughtcrime.securesms.backup.v2.MessageBackupTier import org.whispersystems.signalservice.api.archive.ArchiveServiceCredential import org.whispersystems.signalservice.api.archive.GetArchiveCdnCredentialsResponse import org.whispersystems.signalservice.internal.util.JsonUtil @@ -74,6 +75,16 @@ internal class BackupValues(store: KeyValueStore) : SignalStoreValues(store) { .apply() } + val backupTier: MessageBackupTier? = if (areBackupsEnabled) { + if (canReadWriteToArchiveCdn) { + MessageBackupTier.PAID + } else { + MessageBackupTier.FREE + } + } else { + null + } + var backupsInitialized: Boolean by booleanValue(KEY_BACKUPS_INITIALIZED, false) /**