From edf5ecf2d66185bbc7310f493e05a497f3dbffbb Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 21 Mar 2025 13:58:46 -0400 Subject: [PATCH] Fix potential archive export issue around voice notes in revisions. --- .../v2/exporters/ChatItemArchiveExporter.kt | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt index 69b7988f65..ef83421d01 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt @@ -1475,10 +1475,14 @@ fun ChatItem.validateChatItem(): ChatItem? { fun List.repairRevisions(current: ChatItem.Builder): List { return if (current.standardMessage != null) { - val filtered = this.filter { it.standardMessage != null } + val filtered = this + .filter { it.standardMessage != null } + .map { it.withDowngradeVoiceNotes() } + if (this.size != filtered.size) { Log.w(TAG, ExportOddities.mismatchedRevisionHistory(current.dateSent)) } + filtered } else if (current.directStoryReplyMessage != null) { val filtered = this.filter { it.directStoryReplyMessage != null } @@ -1506,6 +1510,28 @@ private fun List.withFixedVoiceNotes(textPresent: Boolean): L } } +private fun ChatItem.withDowngradeVoiceNotes(): ChatItem { + if (this.standardMessage == null) { + return this + } + + if (this.standardMessage.attachments.none { it.flag == MessageAttachment.Flag.VOICE_MESSAGE }) { + return this + } + + return this.copy( + standardMessage = this.standardMessage.copy( + attachments = this.standardMessage.attachments.map { + if (it.flag == MessageAttachment.Flag.VOICE_MESSAGE) { + it.copy(flag = MessageAttachment.Flag.NONE) + } else { + it + } + } + ) + ) +} + private fun Cursor.toBackupMessageRecord(pastIds: Set, backupStartTime: Long): BackupMessageRecord? { val id = this.requireLong(MessageTable.ID) if (pastIds.contains(id)) {