Add support for cancelling an in-progress archive upload.

Co-authored-by: Jeffrey Starke <jeffrey@signal.org>
This commit is contained in:
Alex Hart
2025-05-20 15:46:24 -03:00
committed by GitHub
parent 3751052697
commit 09e47dba3a
9 changed files with 82 additions and 48 deletions

View File

@@ -639,7 +639,7 @@ private fun LazyListScope.appendBackupDetailsItems(
}
}
if (backupProgress == null || backupProgress.state == ArchiveUploadProgressState.State.None) {
if (backupProgress == null || backupProgress.state == ArchiveUploadProgressState.State.None || backupProgress.state == ArchiveUploadProgressState.State.UserCanceled) {
item {
LastBackupRow(
lastBackupTimestamp = lastBackupTimestamp,
@@ -1074,16 +1074,19 @@ private fun InProgressBackupRow(
.padding(top = 16.dp, bottom = 14.dp)
) {
Column(
modifier = Modifier.weight(1f),
verticalArrangement = spacedBy(12.dp)
modifier = Modifier.weight(1f)
) {
when (archiveUploadProgressState.state) {
ArchiveUploadProgressState.State.None -> {
ArchiveUploadProgressState.State.None, ArchiveUploadProgressState.State.UserCanceled -> {
ArchiveProgressIndicator()
}
ArchiveUploadProgressState.State.Export -> {
val progressValue by animateFloatAsState(targetValue = archiveUploadProgressState.frameExportProgress(), animationSpec = tween(durationMillis = 250))
ArchiveProgressIndicator(progress = { progressValue })
ArchiveProgressIndicator(
progress = { progressValue },
isCancelable = true,
cancel = cancelArchiveUpload
)
}
ArchiveUploadProgressState.State.UploadBackupFile, ArchiveUploadProgressState.State.UploadMedia -> {
val progressValue by animateFloatAsState(targetValue = archiveUploadProgressState.uploadProgress(), animationSpec = tween(durationMillis = 250))
@@ -1110,12 +1113,14 @@ private fun ArchiveProgressIndicator(
isCancelable: Boolean = false,
cancel: () -> Unit = {}
) {
Row {
Row(
verticalAlignment = Alignment.CenterVertically
) {
LinearProgressIndicator(
trackColor = MaterialTheme.colorScheme.secondaryContainer,
progress = progress,
drawStopIndicator = {},
modifier = Modifier.fillMaxWidth()
modifier = Modifier.weight(1f).padding(vertical = 12.dp)
)
if (isCancelable) {
@@ -1132,7 +1137,7 @@ private fun ArchiveProgressIndicator(
@Composable
private fun getProgressStateMessage(archiveUploadProgressState: ArchiveUploadProgressState): String {
return when (archiveUploadProgressState.state) {
ArchiveUploadProgressState.State.None -> stringResource(R.string.RemoteBackupsSettingsFragment__processing_backup)
ArchiveUploadProgressState.State.None, ArchiveUploadProgressState.State.UserCanceled -> stringResource(R.string.RemoteBackupsSettingsFragment__processing_backup)
ArchiveUploadProgressState.State.Export -> getBackupExportPhaseProgressString(archiveUploadProgressState)
ArchiveUploadProgressState.State.UploadBackupFile, ArchiveUploadProgressState.State.UploadMedia -> getBackupUploadPhaseProgressString(archiveUploadProgressState)
}
@@ -1628,30 +1633,6 @@ private fun InProgressRowPreview() {
backupPhase = ArchiveUploadProgressState.BackupPhase.Account
)
)
InProgressBackupRow(
archiveUploadProgressState = ArchiveUploadProgressState(
state = ArchiveUploadProgressState.State.Export,
backupPhase = ArchiveUploadProgressState.BackupPhase.Call
)
)
InProgressBackupRow(
archiveUploadProgressState = ArchiveUploadProgressState(
state = ArchiveUploadProgressState.State.Export,
backupPhase = ArchiveUploadProgressState.BackupPhase.Sticker
)
)
InProgressBackupRow(
archiveUploadProgressState = ArchiveUploadProgressState(
state = ArchiveUploadProgressState.State.Export,
backupPhase = ArchiveUploadProgressState.BackupPhase.Recipient
)
)
InProgressBackupRow(
archiveUploadProgressState = ArchiveUploadProgressState(
state = ArchiveUploadProgressState.State.Export,
backupPhase = ArchiveUploadProgressState.BackupPhase.Thread
)
)
InProgressBackupRow(
archiveUploadProgressState = ArchiveUploadProgressState(
state = ArchiveUploadProgressState.State.Export,

View File

@@ -214,7 +214,7 @@ class RemoteBackupsSettingsViewModel : ViewModel() {
}
fun cancelUpload() {
// TODO [message-backups] -- Perform cancel of media upload.
ArchiveUploadProgress.cancel()
}
private suspend fun refreshState(lastPurchase: InAppPaymentTable.InAppPayment?) {

View File

@@ -31,6 +31,7 @@ import org.signal.core.util.stream.LimitedInputStream
import org.signal.libsignal.zkgroup.profiles.ProfileKey
import org.thoughtcrime.securesms.attachments.AttachmentId
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
import org.thoughtcrime.securesms.backup.ArchiveUploadProgress
import org.thoughtcrime.securesms.backup.v2.ArchiveValidator
import org.thoughtcrime.securesms.backup.v2.BackupMetadata
import org.thoughtcrime.securesms.backup.v2.BackupRepository
@@ -46,7 +47,6 @@ import org.thoughtcrime.securesms.database.MessageType
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.jobs.AttachmentUploadJob
import org.thoughtcrime.securesms.jobs.BackfillDigestJob
import org.thoughtcrime.securesms.jobs.BackupMessagesJob
import org.thoughtcrime.securesms.jobs.BackupRestoreJob
import org.thoughtcrime.securesms.jobs.BackupRestoreMediaJob
@@ -218,10 +218,8 @@ class InternalBackupPlaygroundViewModel : ViewModel() {
}
fun haltAllJobs() {
AppDependencies.jobManager.cancelAllInQueue(BackfillDigestJob.QUEUE)
AppDependencies.jobManager.cancelAllInQueue("ArchiveAttachmentJobs_0")
AppDependencies.jobManager.cancelAllInQueue("ArchiveAttachmentJobs_1")
AppDependencies.jobManager.cancelAllInQueue("ArchiveThumbnailUploadJob")
ArchiveUploadProgress.cancel()
AppDependencies.jobManager.cancelAllInQueue("BackupRestoreJob")
AppDependencies.jobManager.cancelAllInQueue("__LOCAL_BACKUP__")
}