mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-27 22:43:52 +00:00
Improved progress indicator for backup file upload.
This commit is contained in:
committed by
Greyson Parrelli
parent
a188eb64ab
commit
574d6c51ab
@@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.backup.v2.BackupRepository
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||
import org.thoughtcrime.securesms.keyvalue.protos.ArchiveUploadProgressState
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceAttachment
|
||||
import kotlin.math.max
|
||||
import kotlin.time.Duration.Companion.milliseconds
|
||||
|
||||
@@ -118,6 +119,22 @@ object ArchiveUploadProgress {
|
||||
}
|
||||
}
|
||||
|
||||
class ArchiveUploadProgressListener(
|
||||
private val shouldCancel: () -> Boolean = { false }
|
||||
) : SignalServiceAttachment.ProgressListener {
|
||||
override fun onAttachmentProgress(total: Long, progress: Long) {
|
||||
updateState(
|
||||
state = ArchiveUploadProgressState(
|
||||
state = ArchiveUploadProgressState.State.UploadingMessages,
|
||||
totalAttachments = total,
|
||||
completedAttachments = progress
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun shouldCancel(): Boolean = shouldCancel()
|
||||
}
|
||||
|
||||
object ArchiveBackupProgressListener : BackupRepository.ExportProgressListener {
|
||||
override fun onAccount() {
|
||||
updatePhase(ArchiveUploadProgressState.BackupPhase.Account)
|
||||
|
||||
@@ -947,10 +947,11 @@ object BackupRepository {
|
||||
fun uploadBackupFile(
|
||||
resumableSpec: ResumableMessagesBackupUploadSpec,
|
||||
backupStream: InputStream,
|
||||
backupStreamLength: Long
|
||||
backupStreamLength: Long,
|
||||
progressListener: ProgressListener? = null
|
||||
): NetworkResult<Unit> {
|
||||
val (form, resumableUploadUrl) = resumableSpec
|
||||
return SignalNetwork.archive.uploadBackupFile(form, resumableUploadUrl, backupStream, backupStreamLength)
|
||||
return SignalNetwork.archive.uploadBackupFile(form, resumableUploadUrl, backupStream, backupStreamLength, progressListener)
|
||||
.also { Log.i(TAG, "UploadBackupFileResult: $it") }
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,10 @@ import org.signal.core.ui.Snackbars
|
||||
import org.signal.core.ui.Texts
|
||||
import org.signal.core.ui.horizontalGutters
|
||||
import org.signal.core.ui.theme.SignalTheme
|
||||
import org.signal.core.util.bytes
|
||||
import org.signal.core.util.gibiBytes
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.signal.core.util.mebiBytes
|
||||
import org.signal.core.util.money.FiatMoney
|
||||
import org.thoughtcrime.securesms.BiometricDeviceAuthentication
|
||||
import org.thoughtcrime.securesms.R
|
||||
@@ -966,7 +969,7 @@ private fun getProgressStateMessage(archiveUploadProgressState: ArchiveUploadPro
|
||||
return when (archiveUploadProgressState.state) {
|
||||
ArchiveUploadProgressState.State.None -> stringResource(R.string.RemoteBackupsSettingsFragment__processing_backup)
|
||||
ArchiveUploadProgressState.State.BackingUpMessages -> getBackupPhaseMessage(archiveUploadProgressState)
|
||||
ArchiveUploadProgressState.State.UploadingMessages -> stringResource(R.string.RemoteBackupsSettingsFragment__uploading_messages)
|
||||
ArchiveUploadProgressState.State.UploadingMessages -> getUploadingMessages(archiveUploadProgressState)
|
||||
ArchiveUploadProgressState.State.UploadingAttachments -> getUploadingAttachmentsMessage(archiveUploadProgressState)
|
||||
}
|
||||
}
|
||||
@@ -989,6 +992,19 @@ private fun getBackupPhaseMessage(state: ArchiveUploadProgressState): String {
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun getUploadingMessages(state: ArchiveUploadProgressState): String {
|
||||
val formattedCompleted = state.completedAttachments.bytes.toUnitString()
|
||||
val formattedTotal = state.totalAttachments.bytes.toUnitString()
|
||||
val percent = if (state.totalAttachments == 0L) {
|
||||
0
|
||||
} else {
|
||||
((state.completedAttachments / state.totalAttachments.toFloat()) * 100).toInt()
|
||||
}
|
||||
|
||||
return stringResource(R.string.RemoteBackupsSettingsFragment__uploading_s_of_s_d, formattedCompleted, formattedTotal, percent)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun getUploadingAttachmentsMessage(state: ArchiveUploadProgressState): String {
|
||||
return if (state.totalAttachments == 0L) {
|
||||
@@ -1454,6 +1470,14 @@ private fun InProgressRowPreview() {
|
||||
totalAttachments = 100_000
|
||||
)
|
||||
)
|
||||
InProgressBackupRow(
|
||||
archiveUploadProgressState = ArchiveUploadProgressState(
|
||||
state = ArchiveUploadProgressState.State.UploadingMessages,
|
||||
backupPhase = ArchiveUploadProgressState.BackupPhase.BackupPhaseNone,
|
||||
completedAttachments = 1.gibiBytes.inWholeBytes + 100.mebiBytes.inWholeBytes,
|
||||
totalAttachments = 12.gibiBytes.inWholeBytes
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,7 +134,7 @@ class BackupMessagesJob private constructor(
|
||||
}
|
||||
|
||||
FileInputStream(tempBackupFile).use {
|
||||
when (val result = BackupRepository.uploadBackupFile(backupSpec, it, tempBackupFile.length())) {
|
||||
when (val result = BackupRepository.uploadBackupFile(backupSpec, it, tempBackupFile.length(), ArchiveUploadProgress.ArchiveUploadProgressListener { isCanceled })) {
|
||||
is NetworkResult.Success -> {
|
||||
Log.i(TAG, "Successfully uploaded backup file.")
|
||||
SignalStore.backup.hasBackupBeenUploaded = true
|
||||
|
||||
Reference in New Issue
Block a user