Pop the "Create backup now" sheet after different instances of subscribing to backups.

This commit is contained in:
Alex Hart
2024-08-08 15:35:47 -03:00
committed by mtang-signal
parent 3bdbd69a7d
commit 1d6917476e
19 changed files with 245 additions and 86 deletions

View File

@@ -5,6 +5,7 @@
package org.thoughtcrime.securesms.backup.v2.ui
import android.content.DialogInterface
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -24,26 +25,38 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.core.os.bundleOf
import androidx.fragment.app.setFragmentResult
import org.signal.core.ui.BottomSheets
import org.signal.core.ui.Buttons
import org.signal.core.ui.Icons
import org.signal.core.ui.Previews
import org.signal.core.ui.SignalPreview
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity
import org.thoughtcrime.securesms.compose.ComposeBottomSheetDialogFragment
import org.thoughtcrime.securesms.jobs.BackupMessagesJob
/**
* Bottom sheet allowing the user to immediately start a backup or delay.
*
* If the result key is true, then the user has enqueued a backup and should be directed to the
* remote backup settings screen.
*/
class CreateBackupBottomSheet : ComposeBottomSheetDialogFragment() {
companion object {
const val REQUEST_KEY = "CreateBackupBottomSheet"
}
private var isResultSet = false
@Composable
override fun SheetContent() {
CreateBackupBottomSheetContent(
onBackupNowClick = {
BackupMessagesJob.enqueue()
startActivity(AppSettingsActivity.remoteBackups(requireContext()))
setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to Result.BACKUP_STARTED))
isResultSet = true
dismissAllowingStateLoss()
},
onBackupLaterClick = {
@@ -51,6 +64,19 @@ class CreateBackupBottomSheet : ComposeBottomSheetDialogFragment() {
}
)
}
enum class Result {
BACKUP_STARTED,
BACKUP_DELAYED
}
override fun onDismiss(dialog: DialogInterface) {
if (!isResultSet) {
setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to Result.BACKUP_DELAYED))
}
super.onDismiss(dialog)
}
}
@Composable

View File

@@ -187,6 +187,12 @@ class MessageBackupsFlowFragment : ComposeFragment(), InAppPaymentCheckoutDelega
return@LaunchedEffect
}
if (state.screen == MessageBackupsScreen.PROCESS_FREE) {
checkoutDelegate.setActivityResult(InAppPaymentProcessorAction.UPDATE_SUBSCRIPTION, InAppPaymentType.RECURRING_BACKUP)
viewModel.goToNextScreen()
return@LaunchedEffect
}
val routeScreen = MessageBackupsScreen.valueOf(route)
if (routeScreen.isAfter(state.screen)) {
navController.popBackStack()

View File

@@ -76,6 +76,7 @@ class MessageBackupsFlowViewModel : ViewModel() {
MessageBackupsScreen.CANCELLATION_DIALOG -> it.copy(screen = MessageBackupsScreen.PROCESS_CANCELLATION)
MessageBackupsScreen.PROCESS_PAYMENT -> it.copy(screen = MessageBackupsScreen.COMPLETED)
MessageBackupsScreen.PROCESS_CANCELLATION -> it.copy(screen = MessageBackupsScreen.COMPLETED)
MessageBackupsScreen.PROCESS_FREE -> it.copy(screen = MessageBackupsScreen.COMPLETED)
MessageBackupsScreen.COMPLETED -> error("Unsupported state transition from terminal state COMPLETED")
}
}
@@ -95,6 +96,7 @@ class MessageBackupsFlowViewModel : ViewModel() {
MessageBackupsScreen.CREATING_IN_APP_PAYMENT -> MessageBackupsScreen.TYPE_SELECTION
MessageBackupsScreen.PROCESS_PAYMENT -> MessageBackupsScreen.TYPE_SELECTION
MessageBackupsScreen.PROCESS_CANCELLATION -> MessageBackupsScreen.TYPE_SELECTION
MessageBackupsScreen.PROCESS_FREE -> MessageBackupsScreen.TYPE_SELECTION
MessageBackupsScreen.CANCELLATION_DIALOG -> MessageBackupsScreen.TYPE_SELECTION
MessageBackupsScreen.COMPLETED -> error("Unsupported state transition from terminal state COMPLETED")
}
@@ -170,8 +172,7 @@ class MessageBackupsFlowViewModel : ViewModel() {
SignalStore.backup.areBackupsEnabled = true
SignalStore.backup.backupTier = MessageBackupTier.FREE
// TODO [message-backups] -- Trigger backup now?
state.copy(screen = MessageBackupsScreen.COMPLETED)
state.copy(screen = MessageBackupsScreen.PROCESS_FREE)
}
}
MessageBackupTier.PAID -> state.copy(screen = MessageBackupsScreen.CHECKOUT_SHEET)

View File

@@ -15,6 +15,7 @@ enum class MessageBackupsScreen {
CREATING_IN_APP_PAYMENT,
PROCESS_PAYMENT,
PROCESS_CANCELLATION,
PROCESS_FREE,
COMPLETED;
fun isAfter(other: MessageBackupsScreen): Boolean = ordinal > other.ordinal