diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_00.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_00.binproto new file mode 100644 index 0000000000..754aa762db Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_00.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_01.binproto new file mode 100644 index 0000000000..ab070129e7 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_01.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto new file mode 100644 index 0000000000..ff5146e13e Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_03.binproto new file mode 100644 index 0000000000..b6b8180256 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_03.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_04.binproto new file mode 100644 index 0000000000..0ddf3fdd53 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_04.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_05.binproto new file mode 100644 index 0000000000..e0a88e89a1 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_05.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_06.binproto new file mode 100644 index 0000000000..2ec2a65ba3 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_06.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto new file mode 100644 index 0000000000..2479b2e97f Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto new file mode 100644 index 0000000000..64a55aebbb Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_09.binproto new file mode 100644 index 0000000000..3f49b0a246 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_09.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_10.binproto new file mode 100644 index 0000000000..45d13ef66c Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_10.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_11.binproto new file mode 100644 index 0000000000..e8e29ac2d7 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_11.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_12.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_12.binproto new file mode 100644 index 0000000000..34d95160a5 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_12.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_13.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_13.binproto new file mode 100644 index 0000000000..189445621f Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_13.binproto differ diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt index 2530d65631..0887335bc7 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt @@ -81,6 +81,11 @@ class ArchiveImportExportTests { runTests { it.startsWith("chat_item_direct_story_reply_") } } +// @Test + fun chatItemDirectStoryReplyMessageWithEdits() { + runTests { it.startsWith("chat_item_direct_story_reply_with_edits_") } + } + // @Test fun chatItemExpirationTimerUpdate() { runTests { it.startsWith("chat_item_expiration_timer_update_") } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt index f2e62e926c..7a04bed8da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt @@ -58,8 +58,12 @@ object ExportSkips { */ object ExportOddities { - fun revisionsOnNonStandardMessage(sentTimestamp: Long): String { - return log(sentTimestamp, "Attempted to set revisions on a non-standard message. Ignoring revisions.") + fun revisionsOnUnexpectedMessageType(sentTimestamp: Long): String { + return log(sentTimestamp, "Attempted to set revisions on message that doesn't support it. Ignoring revisions.") + } + + fun mismatchedRevisionHistory(sentTimestamp: Long): String { + return log(sentTimestamp, "Revisions for this message contained items of a different type than the parent item. Ignoring mismatched revisions.") } fun outgoingMessageWasSentButTimerNotStarted(sentTimestamp: Long): String { 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 33c781038c..3e6910bb38 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 @@ -325,14 +325,7 @@ class ChatItemArchiveExporter( } if (record.latestRevisionId == null) { - val previousEdits = revisionMap.remove(record.id) - if (previousEdits != null) { - if (builder.standardMessage != null) { - builder.revisions = previousEdits - } else { - Log.w(TAG, ExportOddities.revisionsOnNonStandardMessage(record.dateSent)) - } - } + builder.revisions = revisionMap.remove(record.id)?.repairRevisions(builder) ?: emptyList() buffer += builder.build() } else { var previousEdits = revisionMap[record.latestRevisionId] @@ -1331,6 +1324,25 @@ private fun ExecutorService.submitTyped(callable: Callable): Future { return this.submit(callable) } +fun List.repairRevisions(current: ChatItem.Builder): List { + return if (current.standardMessage != null) { + val filtered = this.filter { it.standardMessage != null } + 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 } + if (this.size != filtered.size) { + Log.w(TAG, ExportOddities.mismatchedRevisionHistory(current.dateSent)) + } + filtered + } else { + Log.w(TAG, ExportOddities.revisionsOnUnexpectedMessageType(current.dateSent)) + emptyList() + } +} + private fun Cursor.toBackupMessageRecord(pastIds: Set, backupStartTime: Long): BackupMessageRecord? { val id = this.requireLong(MessageTable.ID) if (pastIds.contains(id)) {