diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt index da7bafa894..e5939c62eb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt @@ -1615,29 +1615,44 @@ object BackupRepository { } suspend fun getBackupsType(tier: MessageBackupTier): MessageBackupsType? { - return when (tier) { + val result = when (tier) { MessageBackupTier.FREE -> getFreeType() MessageBackupTier.PAID -> getPaidType() } + + return if (result is NetworkResult.Success) { + result.result + } else { + null + } } @WorkerThread - fun getBackupLevelConfiguration(): SubscriptionsConfiguration.BackupLevelConfiguration? { - val config = getSubscriptionsConfiguration() - - return config.backupConfiguration.backupLevelConfigurationMap[SubscriptionsConfiguration.BACKUPS_LEVEL] + fun getBackupLevelConfiguration(): NetworkResult { + return AppDependencies.donationsApi + .getDonationsConfiguration(Locale.getDefault()) + .then { + val config = it.backupConfiguration.backupLevelConfigurationMap[SubscriptionsConfiguration.BACKUPS_LEVEL] + if (config != null) { + NetworkResult.Success(config) + } else { + NetworkResult.StatusCodeError(NonSuccessfulResponseCodeException(404)) + } + } } @WorkerThread - private fun getFreeType(): MessageBackupsType.Free { - val config = getSubscriptionsConfiguration() - - return MessageBackupsType.Free( - mediaRetentionDays = config.backupConfiguration.freeTierMediaDays - ) + private fun getFreeType(): NetworkResult { + return AppDependencies.donationsApi + .getDonationsConfiguration(Locale.getDefault()) + .map { + MessageBackupsType.Free( + mediaRetentionDays = it.backupConfiguration.freeTierMediaDays + ) + } } - suspend fun getPaidType(): MessageBackupsType.Paid? { + suspend fun getPaidType(): NetworkResult { val productPrice: FiatMoney? = if (SignalStore.backup.backupTierInternalOverride == MessageBackupTier.PAID) { Log.d(TAG, "Accessing price via mock subscription.") RecurringInAppPaymentRepository.getActiveSubscriptionSync(InAppPaymentSubscriberRecord.Type.BACKUP).getOrNull()?.activeSubscription?.let { @@ -1650,37 +1665,17 @@ object BackupRepository { if (productPrice == null) { Log.w(TAG, "No pricing available. Exiting.") - return null + return NetworkResult.StatusCodeError(NonSuccessfulResponseCodeException(404)) } - val backupLevelConfiguration = getBackupLevelConfiguration() ?: return null - - return MessageBackupsType.Paid( - pricePerMonth = productPrice, - storageAllowanceBytes = backupLevelConfiguration.storageAllowanceBytes, - mediaTtl = backupLevelConfiguration.mediaTtlDays.days - ) - } - - @WorkerThread - private fun getSubscriptionsConfiguration(): SubscriptionsConfiguration { - val serviceResponse = AppDependencies - .donationsService - .getDonationsConfiguration(Locale.getDefault()) - - if (serviceResponse.result.isEmpty) { - if (serviceResponse.applicationError.isPresent) { - throw serviceResponse.applicationError.get() + return getBackupLevelConfiguration() + .map { + MessageBackupsType.Paid( + pricePerMonth = productPrice, + storageAllowanceBytes = it.storageAllowanceBytes, + mediaTtl = it.mediaTtlDays.days + ) } - - if (serviceResponse.executionError.isPresent) { - throw serviceResponse.executionError.get() - } - - error("Unhandled error occurred while downloading configuration.") - } - - return serviceResponse.result.get() } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/BackupStateRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/BackupStateRepository.kt index 9b70178064..720598b8f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/BackupStateRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/BackupStateRepository.kt @@ -194,7 +194,12 @@ object BackupStateRepository { private suspend fun getFreeBackupState(): BackupState { val type = withContext(Dispatchers.IO) { - BackupRepository.getBackupsType(MessageBackupTier.FREE) as MessageBackupsType.Free + BackupRepository.getBackupsType(MessageBackupTier.FREE) as MessageBackupsType.Free? + } + + if (type == null) { + Log.w(TAG, "Failed to load FREE type. Possible network error.") + return BackupState.Error } val backupState = if (SignalStore.backup.areBackupsEnabled) { @@ -213,7 +218,7 @@ object BackupStateRepository { * @return A paid type, or null if we were unable to get the backup level configuration. */ private fun buildPaidTypeFromSubscription(subscription: ActiveSubscription.Subscription): MessageBackupsType.Paid? { - val config = BackupRepository.getBackupLevelConfiguration() ?: return null + val config = BackupRepository.getBackupLevelConfiguration().successOrThrow() val price = FiatMoney.fromSignalNetworkAmount(subscription.amount, Currency.getInstance(subscription.currency)) return MessageBackupsType.Paid( @@ -229,7 +234,7 @@ object BackupStateRepository { * @return A paid type, or null if we were unable to get the backup level configuration. */ private fun buildPaidTypeFromInAppPayment(inAppPayment: InAppPaymentTable.InAppPayment): MessageBackupsType.Paid? { - val config = BackupRepository.getBackupLevelConfiguration() ?: return null + val config = BackupRepository.getBackupLevelConfiguration().successOrThrow() val price = inAppPayment.data.amount!!.toFiatMoney() return MessageBackupsType.Paid( @@ -246,7 +251,7 @@ object BackupStateRepository { * @return A paid type, or null if we were unable to get the backup level configuration. */ private fun buildPaidTypeWithoutPricing(): MessageBackupsType? { - val config = BackupRepository.getBackupLevelConfiguration() ?: return null + val config = BackupRepository.getBackupLevelConfiguration().successOrThrow() return MessageBackupsType.Paid( pricePerMonth = FiatMoney(BigDecimal.ZERO, Currency.getInstance(Locale.getDefault())), diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/CopyAttachmentToArchiveJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/CopyAttachmentToArchiveJob.kt index 1a6dcb9c5e..9782947858 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/CopyAttachmentToArchiveJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/CopyAttachmentToArchiveJob.kt @@ -176,7 +176,7 @@ class CopyAttachmentToArchiveJob private constructor(private val attachmentId: A private fun getServerQuota(): ByteSize? { return runBlocking { - BackupRepository.getPaidType()?.storageAllowanceBytes?.bytes + BackupRepository.getPaidType().successOrThrow()?.storageAllowanceBytes?.bytes } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RemoteRestoreViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RemoteRestoreViewModel.kt index 3e915d3216..ddb6c0fbbd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RemoteRestoreViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RemoteRestoreViewModel.kt @@ -27,6 +27,7 @@ import org.thoughtcrime.securesms.keyvalue.Completed import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.keyvalue.Skipped import org.thoughtcrime.securesms.registrationv3.data.QuickRegistrationRepository +import org.whispersystems.signalservice.api.NetworkResult import org.whispersystems.signalservice.api.provisioning.RestoreMethod import kotlin.time.Duration import kotlin.time.Duration.Companion.days @@ -84,9 +85,9 @@ class RemoteRestoreViewModel(isOnlyRestoreOption: Boolean) : ViewModel() { viewModelScope.launch(Dispatchers.IO) { val config = BackupRepository.getBackupLevelConfiguration() - if (config != null) { + if (config is NetworkResult.Success) { store.update { - it.copy(backupMediaTTL = config.mediaTtlDays.days) + it.copy(backupMediaTTL = config.result.mediaTtlDays.days) } } }