Add progress phases for initialization and finalization for local backups.

This commit is contained in:
Alex Hart
2026-03-16 14:50:02 -03:00
committed by Michelle Tang
parent d2c8b6e14c
commit 2f41d15a41
14 changed files with 254 additions and 213 deletions

View File

@@ -36,9 +36,10 @@ import org.signal.core.ui.compose.Rows
import org.signal.core.ui.compose.Scaffolds
import org.signal.core.ui.compose.Snackbars
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.backup.BackupCreationProgress
import org.thoughtcrime.securesms.backup.isIdle
import org.thoughtcrime.securesms.backup.v2.ui.status.BackupCreationProgressRow
import org.thoughtcrime.securesms.components.compose.rememberBiometricsAuthentication
import org.thoughtcrime.securesms.keyvalue.protos.LocalBackupCreationProgress
import org.thoughtcrime.securesms.util.BackupUtil
import org.signal.core.ui.R as CoreUiR
import org.signal.core.ui.compose.DayNightPreviews as DayNightPreview
@@ -120,7 +121,7 @@ internal fun LocalBackupsSettingsScreen(
)
}
} else {
val isCreating = state.progress !is BackupCreationProgress.Idle
val isCreating = !state.progress.isIdle
if (isCreating) {
item {
@@ -272,7 +273,7 @@ private fun LocalBackupsSettingsEnabledIdlePreview() {
lastBackupLabel = "Last backup: 1 hour ago",
folderDisplayName = "/storage/emulated/0/Signal/Backups",
scheduleTimeLabel = "1:00 AM",
progress = BackupCreationProgress.Idle
progress = LocalBackupCreationProgress(idle = LocalBackupCreationProgress.Idle())
),
callback = LocalBackupsSettingsCallback.Empty
)
@@ -289,8 +290,8 @@ private fun LocalBackupsSettingsEnabledExportingIndeterminatePreview() {
lastBackupLabel = "Last backup: 1 hour ago",
folderDisplayName = "/storage/emulated/0/Signal/Backups",
scheduleTimeLabel = "1:00 AM",
progress = BackupCreationProgress.Exporting(
phase = BackupCreationProgress.ExportPhase.ACCOUNT
progress = LocalBackupCreationProgress(
exporting = LocalBackupCreationProgress.Exporting(phase = LocalBackupCreationProgress.ExportPhase.ACCOUNT)
)
),
callback = LocalBackupsSettingsCallback.Empty
@@ -308,10 +309,12 @@ private fun LocalBackupsSettingsEnabledExportingMessagesPreview() {
lastBackupLabel = "Last backup: 1 hour ago",
folderDisplayName = "/storage/emulated/0/Signal/Backups",
scheduleTimeLabel = "1:00 AM",
progress = BackupCreationProgress.Exporting(
phase = BackupCreationProgress.ExportPhase.MESSAGE,
frameExportCount = 42000,
frameTotalCount = 100000
progress = LocalBackupCreationProgress(
exporting = LocalBackupCreationProgress.Exporting(
phase = LocalBackupCreationProgress.ExportPhase.MESSAGE,
frameExportCount = 42000,
frameTotalCount = 100000
)
)
),
callback = LocalBackupsSettingsCallback.Empty
@@ -329,10 +332,12 @@ private fun LocalBackupsSettingsEnabledTransferringPreview() {
lastBackupLabel = "Last backup: 1 hour ago",
folderDisplayName = "/storage/emulated/0/Signal/Backups",
scheduleTimeLabel = "1:00 AM",
progress = BackupCreationProgress.Transferring(
completed = 50,
total = 200,
mediaPhase = true
progress = LocalBackupCreationProgress(
transferring = LocalBackupCreationProgress.Transferring(
completed = 50,
total = 200,
mediaPhase = true
)
)
),
callback = LocalBackupsSettingsCallback.Empty
@@ -350,7 +355,7 @@ private fun LocalBackupsSettingsEnabledNonLegacyPreview() {
lastBackupLabel = "Last backup: 1 hour ago",
folderDisplayName = "Signal Backups",
scheduleTimeLabel = "1:00 AM",
progress = BackupCreationProgress.Idle
progress = LocalBackupCreationProgress(idle = LocalBackupCreationProgress.Idle())
),
callback = LocalBackupsSettingsCallback.Empty
)

View File

@@ -4,7 +4,7 @@
*/
package org.thoughtcrime.securesms.components.settings.app.backups.local
import org.thoughtcrime.securesms.backup.BackupCreationProgress
import org.thoughtcrime.securesms.keyvalue.protos.LocalBackupCreationProgress
/**
* Immutable state for the on-device backups settings screen.
@@ -18,6 +18,6 @@ data class LocalBackupsSettingsState(
val lastBackupLabel: String? = null,
val folderDisplayName: String? = null,
val scheduleTimeLabel: String? = null,
val progress: BackupCreationProgress = BackupCreationProgress.Idle,
val progress: LocalBackupCreationProgress = LocalBackupCreationProgress(idle = LocalBackupCreationProgress.Idle()),
val isDeleting: Boolean = false
)

View File

@@ -14,20 +14,16 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.signal.core.ui.util.StorageUtil
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.backup.BackupCreationEvent
import org.thoughtcrime.securesms.backup.BackupCreationProgress
import org.thoughtcrime.securesms.backup.BackupPassphrase
import org.thoughtcrime.securesms.components.settings.app.backups.remote.BackupKeyCredentialManagerHandler
import org.thoughtcrime.securesms.components.settings.app.backups.remote.BackupKeySaveState
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.jobs.LocalBackupJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.keyvalue.protos.LocalBackupCreationProgress
import org.thoughtcrime.securesms.util.BackupUtil
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.TextSecurePreferences
@@ -77,11 +73,11 @@ class LocalBackupsViewModel : ViewModel(), BackupKeyCredentialManagerHandler {
}
}
EventBus.getDefault().register(this)
}
override fun onCleared() {
EventBus.getDefault().unregister(this)
viewModelScope.launch {
SignalStore.backup.newLocalBackupProgressFlow.collect { progress ->
internalSettingsState.update { it.copy(progress = progress) }
}
}
}
fun refreshSettingsState() {
@@ -112,14 +108,7 @@ class LocalBackupsViewModel : ViewModel(), BackupKeyCredentialManagerHandler {
}
fun onBackupStarted() {
internalSettingsState.update {
it.copy(progress = BackupCreationProgress.Exporting(phase = BackupCreationProgress.ExportPhase.NONE))
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onBackupEvent(event: BackupCreationEvent.LocalEncrypted) {
internalSettingsState.update { it.copy(progress = event.progress) }
SignalStore.backup.newLocalBackupProgress = LocalBackupCreationProgress(exporting = LocalBackupCreationProgress.Exporting(phase = LocalBackupCreationProgress.ExportPhase.NONE))
}
fun turnOffAndDelete(context: Context) {