From 79de5f733fb32147a9f8f77e758339762a458002 Mon Sep 17 00:00:00 2001 From: jeffrey-signal Date: Fri, 20 Jun 2025 16:28:00 -0400 Subject: [PATCH] Prevent backup from being triggered while a restore is in progress. --- .../securesms/jobs/BackupMessagesJob.kt | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt index f21c9dc2d8..96b3128bf7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt @@ -10,6 +10,7 @@ import org.signal.core.util.isNotNullOrBlank import org.signal.core.util.logging.Log import org.signal.protos.resumableuploads.ResumableUpload import org.thoughtcrime.securesms.backup.ArchiveUploadProgress +import org.thoughtcrime.securesms.backup.RestoreState import org.thoughtcrime.securesms.backup.v2.ArchiveMediaItemIterator import org.thoughtcrime.securesms.backup.v2.ArchiveValidator import org.thoughtcrime.securesms.backup.v2.BackupRepository @@ -21,6 +22,7 @@ import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint import org.thoughtcrime.securesms.jobmanager.impl.WifiConstraint import org.thoughtcrime.securesms.jobs.protos.BackupMessagesJobData import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.keyvalue.isDecisionPending import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.storage.StorageSyncHelper @@ -51,7 +53,33 @@ class BackupMessagesJob private constructor( const val KEY = "BackupMessagesJob" + private fun isBackupAllowed(): Boolean { + return when { + SignalStore.registration.restoreDecisionState.isDecisionPending -> { + Log.i(TAG, "Backup not allowed: a restore decision is pending.") + false + } + + SignalStore.backup.restoreState == RestoreState.PENDING -> { + Log.i(TAG, "Backup not allowed: a restore is pending.") + false + } + + SignalStore.backup.restoreState == RestoreState.RESTORING_DB -> { + Log.i(TAG, "Backup not allowed: a restore is in progress.") + false + } + + else -> true + } + } + fun enqueue() { + if (!isBackupAllowed()) { + Log.d(TAG, "Skip enqueueing BackupMessagesJob.") + return + } + val jobManager = AppDependencies.jobManager val chain = jobManager.startChain(BackupMessagesJob()) @@ -97,6 +125,11 @@ class BackupMessagesJob private constructor( } override fun run(): Result { + if (!isBackupAllowed()) { + Log.d(TAG, "Skip running BackupMessagesJob.") + return Result.success() + } + val stopwatch = Stopwatch("BackupMessagesJob") SignalDatabase.attachments.createKeyIvDigestForAttachmentsThatNeedArchiveUpload().takeIf { it > 0 }?.let { count -> Log.w(TAG, "Needed to create $count key/iv/digests.") }