From 7901cad90bdb741e004ea86b7e6942e1223f43c7 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 17 Oct 2025 14:21:38 -0300 Subject: [PATCH] Show sheet for validation error. --- .../org/thoughtcrime/securesms/backup/v2/BackupRepository.kt | 2 +- .../java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt | 3 +++ .../java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt index c9632e7a4a..fe4349c86f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt @@ -564,7 +564,7 @@ object BackupRepository { return false } - return !SignalStore.backup.hasBackupBeenUploaded && SignalStore.backup.hasBackupFailure && System.currentTimeMillis().milliseconds > SignalStore.backup.nextBackupFailureSheetSnoozeTime + return (!SignalStore.backup.hasBackupBeenUploaded || SignalStore.backup.hasValidationError) && SignalStore.backup.hasBackupFailure && System.currentTimeMillis().milliseconds > SignalStore.backup.nextBackupFailureSheetSnoozeTime } /** 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 fddd134e1a..8fc781c56e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt @@ -397,6 +397,7 @@ class BackupMessagesJob private constructor( when (val result = ArchiveValidator.validateSignalBackup(tempBackupFile, backupKey, forwardSecrecyToken)) { ArchiveValidator.ValidationResult.Success -> { + SignalStore.backup.hasValidationError = false Log.d(TAG, "Successfully passed validation.", true) } @@ -407,6 +408,7 @@ class BackupMessagesJob private constructor( is ArchiveValidator.ValidationResult.MessageValidationError -> { Log.w(TAG, "The backup file fails validation! Message: ${result.exception.message}, Details: ${result.messageDetails}", true) + SignalStore.backup.hasValidationError = true ArchiveUploadProgress.onValidationFailure() return BackupFileResult.Failure } @@ -414,6 +416,7 @@ class BackupMessagesJob private constructor( is ArchiveValidator.ValidationResult.RecipientDuplicateE164Error -> { Log.w(TAG, "The backup file fails validation with a duplicate recipient! Message: ${result.exception.message}, Details: ${result.details}", true) AppDependencies.jobManager.add(E164FormattingJob()) + SignalStore.backup.hasValidationError = true ArchiveUploadProgress.onValidationFailure() return BackupFileResult.Failure } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt index 52fd5c1543..45897d63b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt @@ -77,6 +77,7 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) { private const val KEY_NOT_ENOUGH_REMOTE_STORAGE_SPACE = "backup.not.enough.remote.storage.space" private const val KEY_NOT_ENOUGH_REMOTE_STORAGE_SPACE_DISPLAY_SHEET = "backup.not.enough.remote.storage.space.display.sheet" private const val KEY_MANUAL_NO_BACKUP_NOTIFIED = "backup.manual.no.backup.notified" + private const val KEY_VALIDATION_ERROR = "backup.validation.error" private const val KEY_USER_MANUALLY_SKIPPED_MEDIA_RESTORE = "backup.user.manually.skipped.media.restore" private const val KEY_BACKUP_EXPIRED_AND_DOWNGRADED = "backup.expired.and.downgraded" @@ -300,6 +301,9 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) { /** True if we believe we have successfully uploaded a backup, otherwise false. */ var hasBackupBeenUploaded: Boolean by booleanValue(KEY_BACKUP_UPLOADED, false) + /** Set when we fail to validate a user's backup during the export process */ + var hasValidationError: Boolean by booleanValue(KEY_VALIDATION_ERROR, false) + val hasBackupFailure: Boolean get() = getBoolean(KEY_BACKUP_FAIL, false) val nextBackupFailureSnoozeTime: Duration get() = getLong(KEY_BACKUP_FAIL_ACKNOWLEDGED_SNOOZE_TIME, 0L).milliseconds val nextBackupFailureSheetSnoozeTime: Duration get() = getLong(KEY_BACKUP_FAIL_SHEET_SNOOZE_TIME, getNextBackupFailureSheetSnoozeTime(lastBackupTime.milliseconds).inWholeMilliseconds).milliseconds