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
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+