Allow free tier to be enabled when Google Play Billing isn't available.

This commit is contained in:
Alex Hart
2024-09-20 11:08:22 -03:00
committed by Greyson Parrelli
parent 12e25b0f40
commit e14078d2ec
3 changed files with 16 additions and 9 deletions

View File

@@ -16,6 +16,7 @@ import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
import org.thoughtcrime.securesms.compose.ComposeFragment
import org.thoughtcrime.securesms.compose.Nav
import org.thoughtcrime.securesms.dependencies.AppDependencies
@@ -84,7 +85,7 @@ class MessageBackupsFlowFragment : ComposeFragment() {
MessageBackupsTypeSelectionScreen(
currentBackupTier = state.currentMessageBackupTier,
selectedBackupTier = state.selectedMessageBackupTier,
availableBackupTypes = state.availableBackupTypes,
availableBackupTypes = state.availableBackupTypes.filter { it.tier == MessageBackupTier.FREE || state.hasBackupSubscriberAvailable },
onMessageBackupsTierSelected = { tier ->
val type = state.availableBackupTypes.first { it.tier == tier }
val label = when (type) {

View File

@@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.whispersystems.signalservice.api.backup.BackupKey
data class MessageBackupsFlowState(
val hasBackupSubscriberAvailable: Boolean = false,
val selectedMessageBackupTierLabel: String? = null,
val selectedMessageBackupTier: MessageBackupTier? = SignalStore.backup.backupTier,
val currentMessageBackupTier: MessageBackupTier? = SignalStore.backup.backupTier,

View File

@@ -20,7 +20,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.reactive.asFlow
import kotlinx.coroutines.withContext
import org.signal.core.util.billing.BillingPurchaseResult
import org.signal.core.util.money.FiatMoney
import org.signal.core.util.logging.Log
import org.signal.donations.InAppPaymentType
import org.thoughtcrime.securesms.backup.v2.BackupRepository
import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
@@ -38,11 +38,14 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.RemoteConfig
import org.whispersystems.signalservice.internal.push.SubscriptionsConfiguration
import java.math.BigDecimal
import kotlin.time.Duration.Companion.seconds
class MessageBackupsFlowViewModel : ViewModel() {
companion object {
private val TAG = Log.tag(MessageBackupsFlowViewModel::class)
}
private val internalStateFlow = MutableStateFlow(
MessageBackupsFlowState(
availableBackupTypes = emptyList(),
@@ -59,13 +62,13 @@ class MessageBackupsFlowViewModel : ViewModel() {
viewModelScope.launch {
try {
ensureSubscriberIdForBackups()
} catch (e: Exception) {
internalStateFlow.update {
it.copy(
stage = MessageBackupsStage.FAILURE,
failure = e
hasBackupSubscriberAvailable = true
)
}
} catch (e: Exception) {
Log.w(TAG, "Failed to ensure a subscriber id exists.", e)
}
internalStateFlow.update {
@@ -168,7 +171,7 @@ class MessageBackupsFlowViewModel : ViewModel() {
SignalStore.backup.areBackupsEnabled = true
SignalStore.backup.backupTier = MessageBackupTier.FREE
state.copy(stage = MessageBackupsStage.PROCESS_FREE)
state.copy(stage = MessageBackupsStage.COMPLETED)
}
MessageBackupTier.PAID -> state.copy(stage = MessageBackupsStage.CHECKOUT_SHEET)
@@ -176,7 +179,9 @@ class MessageBackupsFlowViewModel : ViewModel() {
}
private fun validateGatewayAndUpdateState(state: MessageBackupsFlowState): MessageBackupsFlowState {
val backupsType = state.availableBackupTypes.first { it.tier == state.selectedMessageBackupTier }
check(state.selectedMessageBackupTier == MessageBackupTier.PAID)
check(state.availableBackupTypes.any { it.tier == state.selectedMessageBackupTier })
check(state.hasBackupSubscriberAvailable)
viewModelScope.launch(Dispatchers.IO) {
withContext(Dispatchers.Main) {
@@ -194,7 +199,7 @@ class MessageBackupsFlowViewModel : ViewModel() {
inAppPaymentData = InAppPaymentData(
badge = null,
label = state.selectedMessageBackupTierLabel!!,
amount = if (backupsType is MessageBackupsType.Paid) paidFiat.toFiatValue() else FiatMoney(BigDecimal.ZERO, paidFiat.currency).toFiatValue(),
amount = paidFiat.toFiatValue(),
level = SubscriptionsConfiguration.BACKUPS_LEVEL.toLong(),
recipientId = Recipient.self().id.serialize(),
paymentMethodType = InAppPaymentData.PaymentMethodType.GOOGLE_PLAY_BILLING,