diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_01.binproto index 7980c7cc92..7a92826e0b 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_01.binproto and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_01.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_02.binproto index 5254394fdf..8aa5a0b134 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_02.binproto and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_02.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_04.binproto index 170e59a9d4..b709396491 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_04.binproto and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_04.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_05.binproto index 578fc3f222..41043be7a5 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_05.binproto and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_05.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_07.binproto index 97994309d0..1258734352 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_07.binproto and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_07.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_08.binproto index 8113dd2408..2728512e1d 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_08.binproto and b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_08.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 index ab070129e7..c17667b967 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_01.binproto 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 index ff5146e13e..6605018c81 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto 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_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_04.binproto index 0ddf3fdd53..7901c82121 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_04.binproto 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 index e0a88e89a1..6947eef5b5 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_05.binproto 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_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto index 2479b2e97f..8d773f257a 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto 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 index 64a55aebbb..1f0341feb0 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto 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_standard_message_formatted_text_00.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_00.binproto index 106b18d28b..9ebe0ec6d5 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_00.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_00.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_01.binproto index 8f1a86703c..8a731b9809 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_01.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_01.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_02.binproto index b513dfa9d6..b6a0eb399e 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_02.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_02.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_03.binproto index 3a75a45dd3..7771c3e80f 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_03.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_03.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_04.binproto index 461ac3b3d4..b871624dcf 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_04.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_04.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_05.binproto index e6323a109b..dca4f16159 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_05.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_05.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_06.binproto index 5ba13ac33a..ac3855bc4c 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_06.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_06.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_07.binproto index 01bb28f39d..539fbbb8c0 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_07.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_07.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_08.binproto index 7cc5fdfc1b..a3f1850558 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_08.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_08.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_09.binproto index 01e1495d87..d189e33dc0 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_09.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_09.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_10.binproto index 3588dedde0..6ae6addf2a 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_10.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_10.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_11.binproto index 78cc9dfb8a..5563c697ef 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_11.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_11.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_12.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_12.binproto index 1f236803a1..331421f7e5 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_12.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_12.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_13.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_13.binproto index 01394f4bec..70b0e89ccc 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_13.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_13.binproto differ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_14.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_14.binproto index 22e1c65edc..d7b07030ee 100644 Binary files a/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_14.binproto and b/app/src/androidTest/assets/backupTests/chat_item_standard_message_formatted_text_14.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 00daa86160..8a53345dc5 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_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_04.binproto index 57c7445e3a..f79646f12d 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/recipient_groups_00.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_00.binproto index 7b8eaf72b4..4974d69d2a 100644 Binary files a/app/src/androidTest/assets/backupTests/recipient_groups_00.binproto and b/app/src/androidTest/assets/backupTests/recipient_groups_00.binproto differ diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_01.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_01.binproto index c6c4dc0d7b..670d007551 100644 Binary files a/app/src/androidTest/assets/backupTests/recipient_groups_01.binproto and b/app/src/androidTest/assets/backupTests/recipient_groups_01.binproto differ diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_02.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_02.binproto index 34eee1a7d2..6d617e0a0c 100644 Binary files a/app/src/androidTest/assets/backupTests/recipient_groups_02.binproto and b/app/src/androidTest/assets/backupTests/recipient_groups_02.binproto differ diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_03.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_03.binproto index 79d027e740..efeac8cb0b 100644 Binary files a/app/src/androidTest/assets/backupTests/recipient_groups_03.binproto and b/app/src/androidTest/assets/backupTests/recipient_groups_03.binproto differ 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 9450e0cf7a..0983ded275 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 @@ -130,6 +130,10 @@ object ExportOddities { return log(0, "Distribution list had self as a member. Removing it.") } + fun emptyQuote(sentTimestamp: Long): String { + return log(sentTimestamp, "Quote had no text or attachments. Removing it.") + } + private fun log(sentTimestamp: Long, message: String): String { return "[ODDITY][$sentTimestamp] $message" } 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 7b8884efc7..13bf48fc1e 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 @@ -956,21 +956,28 @@ private fun BackupMessageRecord.toRemoteQuote(mediaArchiveEnabled: Boolean, atta } val bodyRanges = this.quoteBodyRanges?.toRemoteBodyRanges(dateSent) ?: emptyList() + val body = this.quoteBody?.takeUnless { it.isBlank() }?.let { body -> + Text( + body = body, + bodyRanges = bodyRanges + ) + } + val attachments = if (remoteType == Quote.Type.VIEW_ONCE) { + emptyList() + } else { + attachments?.toRemoteQuoteAttachments(mediaArchiveEnabled) ?: emptyList() + } + + if (body == null && attachments.isEmpty()) { + Log.w(TAG, ExportOddities.emptyQuote(this.dateSent)) + return null + } 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 = bodyRanges - ) - }, - attachments = if (remoteType == Quote.Type.VIEW_ONCE) { - emptyList() - } else { - attachments?.toRemoteQuoteAttachments(mediaArchiveEnabled) ?: emptyList() - }, + text = body, + attachments = attachments, type = remoteType ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/GroupArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/GroupArchiveExporter.kt index 82d56442de..8b4719eba9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/GroupArchiveExporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/GroupArchiveExporter.kt @@ -56,6 +56,7 @@ class GroupArchiveExporter(private val selfAci: ServiceId.ACI, private val curso group = ArchiveGroup( masterKey = cursor.requireNonNullBlob(GroupTable.V2_MASTER_KEY).toByteString(), whitelisted = cursor.requireBoolean(RecipientTable.PROFILE_SHARING), + blocked = cursor.requireBoolean(RecipientTable.BLOCKED), hideStory = extras?.hideStory() ?: false, storySendMode = showAsStoryState.toRemote(), snapshot = decryptedGroup.toRemote(isActive, selfAci) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/GroupArchiveImporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/GroupArchiveImporter.kt index ea3597045b..e6d4421adf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/GroupArchiveImporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/GroupArchiveImporter.kt @@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.backup.v2.importer import android.content.ContentValues import org.signal.core.util.Base64 +import org.signal.core.util.toInt import org.signal.libsignal.zkgroup.groups.GroupMasterKey import org.signal.libsignal.zkgroup.groups.GroupSecretParams import org.signal.storageservice.protos.groups.AccessControl @@ -51,7 +52,8 @@ object GroupArchiveImporter { val values = ContentValues().apply { put(RecipientTable.GROUP_ID, groupId.toString()) put(RecipientTable.AVATAR_COLOR, AvatarColorHash.forGroupId(groupId).serialize()) - put(RecipientTable.PROFILE_SHARING, group.whitelisted) + put(RecipientTable.PROFILE_SHARING, group.whitelisted.toInt()) + put(RecipientTable.BLOCKED, group.blocked.toInt()) put(RecipientTable.TYPE, RecipientTable.RecipientType.GV2.id) put(RecipientTable.STORAGE_SERVICE_ID, Base64.encodeWithPadding(StorageSyncHelper.generateKey())) if (group.hideStory) { diff --git a/app/src/main/protowire/Backup.proto b/app/src/main/protowire/Backup.proto index 614042dad2..ca7ecb5410 100644 --- a/app/src/main/protowire/Backup.proto +++ b/app/src/main/protowire/Backup.proto @@ -30,6 +30,7 @@ message BackupInfo { // For example, Chats may all be together at the beginning, // or may each immediately precede its first ChatItem. message Frame { + // If unset, importers should skip this frame without throwing an error. oneof item { AccountData account = 1; Recipient recipient = 2; @@ -44,13 +45,13 @@ message Frame { message AccountData { enum PhoneNumberSharingMode { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Nobody" EVERYBODY = 1; NOBODY = 2; } message UsernameLink { enum Color { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Blue" BLUE = 1; WHITE = 2; GREY = 3; @@ -97,6 +98,7 @@ message AccountData { message IAPSubscriberData { bytes subscriberId = 1; + // If unset, importers should ignore the subscriber data without throwing an error. oneof iapSubscriptionId { // Identifies an Android Play Store IAP subscription. string purchaseToken = 2; @@ -119,6 +121,7 @@ message AccountData { message Recipient { uint64 id = 1; // generated id for reference only within this file + // If unset, importers should skip this frame without throwing an error. oneof destination { Contact contact = 2; Group group = 3; @@ -131,9 +134,9 @@ message Recipient { message Contact { enum IdentityState { - DEFAULT = 0; + DEFAULT = 0; // A valid value -- indicates unset by the user VERIFIED = 1; - UNVERIFIED = 2; + UNVERIFIED = 2; // Was once verified and is now unverified } message Registered {} @@ -142,7 +145,7 @@ message Contact { } enum Visibility { - VISIBLE = 0; + VISIBLE = 0; // A valid value -- the contact is not hidden HIDDEN = 1; HIDDEN_MESSAGE_REQUEST = 2; } @@ -159,6 +162,7 @@ message Contact { bool blocked = 5; Visibility visibility = 6; + // If unset, consider the user to be registered oneof registration { Registered registered = 7; NotRegistered notRegistered = 8; @@ -177,7 +181,7 @@ message Contact { message Group { enum StorySendMode { - DEFAULT = 0; + DEFAULT = 0; // A valid value -- indicates unset by the user DISABLED = 1; ENABLED = 2; } @@ -187,6 +191,7 @@ message Group { bool hideStory = 3; StorySendMode storySendMode = 4; GroupSnapshot snapshot = 5; + bool blocked = 6; // These are simply plaintext copies of the groups proto from Groups.proto. // They should be kept completely in-sync with Groups.proto. @@ -210,6 +215,7 @@ message Group { } message GroupAttributeBlob { + // If unset, consider the field it represents to not be present oneof content { string title = 1; bytes avatar = 2; @@ -220,7 +226,7 @@ message Group { message Member { enum Role { - UNKNOWN = 0; + UNKNOWN = 0; // Intepret as "Default" DEFAULT = 1; ADMINISTRATOR = 2; } @@ -252,7 +258,7 @@ message Group { message AccessControl { enum AccessRequired { - UNKNOWN = 0; + UNKNOWN = 0; // Intepret as "Unsatisfiable" ANY = 1; MEMBER = 2; ADMINISTRATOR = 3; @@ -292,7 +298,7 @@ message Chat { */ message CallLink { enum Restrictions { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Admin Approval" NONE = 1; ADMIN_APPROVAL = 2; } @@ -306,7 +312,7 @@ message CallLink { message AdHocCall { enum State { - UNKNOWN_STATE = 0; + UNKNOWN_STATE = 0; // Interpret as "Generic" GENERIC = 1; } @@ -322,6 +328,7 @@ message DistributionListItem { // by an all-0 UUID (00000000-0000-0000-0000-000000000000). bytes distributionId = 1; // distribution list ids are uuids + // If unset, importers should skip the item entirely without showing an error. oneof item { uint64 deletionTimestamp = 2; DistributionList distributionList = 3; @@ -330,7 +337,7 @@ message DistributionListItem { message DistributionList { enum PrivacyMode { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Only with" ONLY_WITH = 1; ALL_EXCEPT = 2; ALL = 3; @@ -365,12 +372,14 @@ message ChatItem { repeated ChatItem revisions = 6; // ordered from oldest to newest bool sms = 7; + // If unset, importers should skip this item without throwing an error. oneof directionalDetails { IncomingMessageDetails incoming = 8; OutgoingMessageDetails outgoing = 9; DirectionlessMessageDetails directionless = 10; } + // If unset, importers should skip this item without throwing an error. oneof item { StandardMessage standardMessage = 11; ContactMessage contactMessage = 12; @@ -419,6 +428,7 @@ message SendStatus { uint64 recipientId = 1; uint64 timestamp = 2; // the time the status was last updated -- if from a receipt, it should be the sentTime of the receipt + // If unset, importers should consider the status to be "pending" oneof deliveryStatus { Pending pending = 3; Sent sent = 4; @@ -455,6 +465,7 @@ message DirectStoryReplyMessage { FilePointer longText = 2; } + // If unset, importers should ignore the message without throwing an error. oneof reply { TextReply textReply = 1; string emoji = 2; @@ -473,7 +484,7 @@ message PaymentNotification { message FailedTransaction { // Failed payments can't be synced from the ledger enum FailureReason { - GENERIC = 0; + GENERIC = 0; // A valid value -- reason unknown NETWORK = 1; INSUFFICIENT_FUNDS = 2; } @@ -482,7 +493,7 @@ message PaymentNotification { message Transaction { enum Status { - INITIAL = 0; + INITIAL = 0; // A valid value -- state unconfirmed SUBMITTED = 1; SUCCESSFUL = 2; } @@ -499,6 +510,7 @@ message PaymentNotification { optional bytes receipt = 7; // mobile coin blobs } + // If unset, importers should treat the transaction as successful with no metadata. oneof payment { Transaction transaction = 1; FailedTransaction failedTransaction = 2; @@ -513,7 +525,7 @@ message PaymentNotification { message GiftBadge { enum State { - UNOPENED = 0; + UNOPENED = 0; // A valid state OPENED = 1; REDEEMED = 2; FAILED = 3; @@ -541,7 +553,7 @@ message ContactAttachment { message Phone { enum Type { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Home" HOME = 1; MOBILE = 2; WORK = 3; @@ -555,7 +567,7 @@ message ContactAttachment { message Email { enum Type { - UNKNOWN = 0; + UNKNOWN = 0; // Intepret as "Home" HOME = 1; MOBILE = 2; WORK = 3; @@ -569,7 +581,7 @@ message ContactAttachment { message PostalAddress { enum Type { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Home" HOME = 1; WORK = 2; CUSTOM = 3; @@ -629,7 +641,7 @@ message MessageAttachment { // but explicitly mutually exclusive. Note the different raw values // (non-zero starting values are not supported in proto3.) enum Flag { - NONE = 0; + NONE = 0; // A valid value -- no flag applied VOICE_MESSAGE = 1; BORDERLESS = 2; GIF = 3; @@ -680,6 +692,7 @@ message FilePointer { message InvalidAttachmentLocator { } + // If unset, importers should consider it to be an InvalidAttachmentLocator without throwing an error. oneof locator { BackupLocator backupLocator = 1; AttachmentLocator attachmentLocator = 2; @@ -698,7 +711,7 @@ message FilePointer { message Quote { enum Type { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Normal" NORMAL = 1; GIFT_BADGE = 2; VIEW_ONCE = 3; @@ -719,7 +732,7 @@ message Quote { message BodyRange { enum Style { - NONE = 0; + NONE = 0; // Importers should ignore the body range without throwing an error. BOLD = 1; ITALIC = 2; SPOILER = 3; @@ -727,9 +740,12 @@ message BodyRange { MONOSPACE = 5; } - optional uint32 start = 1; - optional uint32 length = 2; + // 'start' and 'length' are measured in UTF-16 code units. + // They may refer to offsets in a longText attachment. + uint32 start = 1; + uint32 length = 2; + // If unset, importers should ignore the body range without throwing an error. oneof associatedValue { bytes mentionAci = 3; Style style = 4; @@ -746,6 +762,7 @@ message Reaction { } message ChatUpdateMessage { + // If unset, importers should ignore the update message without throwing an error. oneof update { SimpleChatUpdate simpleUpdate = 1; GroupChangeChatUpdate groupChange = 2; @@ -761,19 +778,19 @@ message ChatUpdateMessage { message IndividualCall { enum Type { - UNKNOWN_TYPE = 0; + UNKNOWN_TYPE = 0; // Interpret as "Audio call" AUDIO_CALL = 1; VIDEO_CALL = 2; } enum Direction { - UNKNOWN_DIRECTION = 0; + UNKNOWN_DIRECTION = 0; // Interpret as "Incoming" INCOMING = 1; OUTGOING = 2; } enum State { - UNKNOWN_STATE = 0; + UNKNOWN_STATE = 0; // Interpret as "Accepted" ACCEPTED = 1; NOT_ACCEPTED = 2; // An incoming call that is no longer ongoing, which we neither accepted @@ -794,7 +811,7 @@ message IndividualCall { message GroupCall { enum State { - UNKNOWN_STATE = 0; + UNKNOWN_STATE = 0; // Interpret as "Generic" // A group call was started without ringing. GENERIC = 1; // We joined a group call that was started without ringing. @@ -825,7 +842,7 @@ message GroupCall { message SimpleChatUpdate { enum Type { - UNKNOWN = 0; + UNKNOWN = 0; // Importers should skip the update without throwing an error. JOINED_SIGNAL = 1; IDENTITY_UPDATE = 2; IDENTITY_VERIFIED = 3; @@ -859,6 +876,7 @@ message ProfileChangeChatUpdate { } message LearnedProfileChatUpdate { + // If unset, importers should consider the previous name to be an empty string. oneof previousName { uint64 e164 = 1; string username = 2; @@ -875,6 +893,7 @@ message SessionSwitchoverChatUpdate { message GroupChangeChatUpdate { message Update { + // If unset, importers should consider it to be a GenericGroupUpdate with unset updaterAci oneof update { GenericGroupUpdate genericGroupUpdate = 1; GroupCreationUpdate groupCreationUpdate = 2; @@ -944,7 +963,7 @@ message GroupDescriptionUpdate { } enum GroupV2AccessLevel { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Unsatisfiable" ANY = 1; MEMBER = 2; ADMINISTRATOR = 3; @@ -1134,6 +1153,7 @@ message ChatStyle { message CustomChatColor { uint64 id = 1; + // If unset, use the default chat color oneof color { fixed32 solid = 2; // 0xAARRGGBB Gradient gradient = 3; @@ -1144,7 +1164,7 @@ message ChatStyle { } enum WallpaperPreset { - UNKNOWN_WALLPAPER_PRESET = 0; + UNKNOWN_WALLPAPER_PRESET = 0; // Interpret as the wallpaper being unset SOLID_BLUSH = 1; SOLID_COPPER = 2; SOLID_DUST = 3; @@ -1169,7 +1189,7 @@ message ChatStyle { } enum BubbleColorPreset { - UNKNOWN_BUBBLE_COLOR_PRESET = 0; + UNKNOWN_BUBBLE_COLOR_PRESET = 0; // Interpret as the user's default chat bubble color SOLID_ULTRAMARINE = 1; SOLID_CRIMSON = 2; SOLID_VERMILION = 3; @@ -1194,6 +1214,7 @@ message ChatStyle { GRADIENT_TANGERINE = 22; } + // If unset, importers should consider there to be no wallpaper. oneof wallpaper { WallpaperPreset wallpaperPreset = 1; // This `FilePointer` is expected not to contain a `fileName`, `width`, @@ -1201,6 +1222,7 @@ message ChatStyle { FilePointer wallpaperPhoto = 2; } + // If unset, importers should consider it to be AutomaticBubbleColor oneof bubbleColor { // Bubble setting is automatically determined based on the wallpaper setting, // or `SOLID_ULTRAMARINE` for `noWallpaper` @@ -1216,7 +1238,7 @@ message ChatStyle { message NotificationProfile { enum DayOfWeek { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Monday" MONDAY = 1; TUESDAY = 2; WEDNESDAY = 3; @@ -1242,7 +1264,7 @@ message NotificationProfile { message ChatFolder { // Represents the default "All chats" folder record vs all other custom folders enum FolderType { - UNKNOWN = 0; + UNKNOWN = 0; // Interpret as "Custom" ALL = 1; CUSTOM = 2; } @@ -1257,4 +1279,4 @@ message ChatFolder { FolderType folderType = 6; repeated uint64 includedRecipientIds = 7; // generated recipient id of groups, contacts, and/or note to self repeated uint64 excludedRecipientIds = 8; // generated recipient id of groups, contacts, and/or note to self -} +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 66cd33e277..8696aa2b40 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ androidx-window = "1.3.0" glide = "4.15.1" gradle = "8.7.3" kotlin = "2.1.0" -libsignal-client = "0.65.2" +libsignal-client = "0.65.4" mp4parser = "1.9.39" android-gradle-plugin = "8.7.2" accompanist = "0.28.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 0e53bee0f7..ef441f32b4 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6604,20 +6604,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html - - - + + + - - + + - - - + + + - - + +