diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_00.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_00.binproto index 15414b3e21..684bbc7eab 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_00.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_00.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_01.binproto index 35c3487402..cd385818bc 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_01.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_01.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_02.binproto index c593c22905..00daa86160 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_02.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_02.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_03.binproto index 56a3771a87..de8c2c0614 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_03.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_03.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_04.binproto index 6fcaf713b4..57c7445e3a 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_04.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_04.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_05.binproto index 8cdad8dad1..71f1682c94 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_05.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_05.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_06.binproto index 4b8fa54d51..8dd6f38717 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_06.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_06.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_07.binproto index a6cc7cbe0a..22432ca779 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_07.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_07.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_08.binproto index ef30bad93b..bd2bf6c24a 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_08.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_08.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_09.binproto index c29f4b5952..449b417580 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_09.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_09.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_10.binproto index 3d2bd0ab68..13dc200968 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_10.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_10.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_11.binproto index 1c56228d1d..535ed091dc 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_11.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_11.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_12.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_12.binproto index 69741d25d7..bd28a56501 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_12.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_12.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_13.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_13.binproto index 8f9bb7f948..0ed95dab81 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_13.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_13.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_14.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_14.binproto index 1a4638c778..396e345e56 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_14.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_14.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_15.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_15.binproto new file mode 100644 index 0000000000..f5285d8889 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_15.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_16.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_16.binproto new file mode 100644 index 0000000000..7061e979b8 Binary files /dev/null and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_16.binproto differ 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 431ce20549..0d383b51b4 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 @@ -940,13 +940,15 @@ private fun BackupMessageRecord.toRemoteQuote(mediaArchiveEnabled: Boolean, atta QuoteModel.Type.GIFT_BADGE -> Quote.Type.GIFT_BADGE } + val bodyRanges = this.quoteBodyRanges?.toRemoteBodyRanges(dateSent) ?: emptyList() + return Quote( targetSentTimestamp = this.quoteTargetSentTimestamp.takeIf { !this.quoteMissing && it != MessageTable.QUOTE_TARGET_MISSING_ID }?.clampToValidBackupRange(), authorId = this.quoteAuthor, text = this.quoteBody?.let { body -> Text( body = body, - bodyRanges = this.quoteBodyRanges?.toRemoteBodyRanges(this.dateSent) ?: emptyList() + bodyRanges = bodyRanges ) }, attachments = if (remoteType == Quote.Type.VIEW_ONCE) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt index 1643da8ed9..b7d2e10968 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt @@ -383,23 +383,10 @@ class ChatItemArchiveImporter( } if (this.standardMessage != null) { - val bodyRanges = this.standardMessage.text?.bodyRanges - if (!bodyRanges.isNullOrEmpty()) { - val mentions = bodyRanges.filter { it.mentionAci != null && it.start != null && it.length != null } - .mapNotNull { - val aci = ServiceId.ACI.parseOrNull(it.mentionAci!!) - - if (aci != null && !aci.isUnknown) { - val id = RecipientId.from(aci) - Mention(id, it.start!!, it.length!!) - } else { - null - } - } - if (mentions.isNotEmpty()) { - followUps += { messageId -> - SignalDatabase.mentions.insert(threadId, messageId, mentions) - } + val mentions = this.standardMessage.text?.bodyRanges.filterToLocalMentions() + if (mentions.isNotEmpty()) { + followUps += { messageId -> + SignalDatabase.mentions.insert(threadId, messageId, mentions) } } val linkPreviews = this.standardMessage.linkPreview.map { it.toLocalLinkPreview() } @@ -929,7 +916,7 @@ class ChatItemArchiveImporter( this.put(MessageTable.QUOTE_AUTHOR, importState.requireLocalRecipientId(quote.authorId).serialize()) this.put(MessageTable.QUOTE_BODY, quote.text?.body) this.put(MessageTable.QUOTE_TYPE, quote.type.toLocalQuoteType()) - this.put(MessageTable.QUOTE_BODY_RANGES, quote.text?.bodyRanges?.toLocalBodyRanges()?.encode()) + this.put(MessageTable.QUOTE_BODY_RANGES, quote.text?.bodyRanges?.toLocalBodyRanges(includeMentions = true)?.encode()) this.put(MessageTable.QUOTE_MISSING, (quote.targetSentTimestamp == null).toInt()) } @@ -983,13 +970,13 @@ class ChatItemArchiveImporter( } } - private fun List.toLocalBodyRanges(): BodyRangeList? { + private fun List.toLocalBodyRanges(includeMentions: Boolean = false): BodyRangeList? { if (this.isEmpty()) { return null } return BodyRangeList( - ranges = this.filter { it.mentionAci == null }.map { bodyRange -> + ranges = this.filter { includeMentions || it.mentionAci == null }.map { bodyRange -> BodyRangeList.BodyRange( mentionUuid = bodyRange.mentionAci?.let { UuidUtil.fromByteString(it) }?.toString(), style = bodyRange.style?.let { @@ -1135,6 +1122,24 @@ class ChatItemArchiveImporter( } } + private fun List?.filterToLocalMentions(): List { + if (this == null) { + return emptyList() + } + + return this.filter { it.mentionAci != null && it.start != null && it.length != null } + .mapNotNull { + val aci = ServiceId.ACI.parseOrNull(it.mentionAci!!) + + if (aci != null && !aci.isUnknown) { + val id = RecipientId.from(aci) + Mention(id, it.start!!, it.length!!) + } else { + null + } + } + } + private class MessageInsert( val contentValues: ContentValues, val followUp: ((Long) -> Unit)?,