Update to libsignal 0.65.4

This commit is contained in:
Greyson Parrelli
2025-01-28 10:52:53 -05:00
parent 2e89b8acee
commit 9862b758e5
40 changed files with 92 additions and 56 deletions

View File

@@ -130,6 +130,10 @@ object ExportOddities {
return log(0, "Distribution list had self as a member. Removing it.") 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 { private fun log(sentTimestamp: Long, message: String): String {
return "[ODDITY][$sentTimestamp] $message" return "[ODDITY][$sentTimestamp] $message"
} }

View File

@@ -956,21 +956,28 @@ private fun BackupMessageRecord.toRemoteQuote(mediaArchiveEnabled: Boolean, atta
} }
val bodyRanges = this.quoteBodyRanges?.toRemoteBodyRanges(dateSent) ?: emptyList() 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( return Quote(
targetSentTimestamp = this.quoteTargetSentTimestamp.takeIf { !this.quoteMissing && it != MessageTable.QUOTE_TARGET_MISSING_ID }?.clampToValidBackupRange(), targetSentTimestamp = this.quoteTargetSentTimestamp.takeIf { !this.quoteMissing && it != MessageTable.QUOTE_TARGET_MISSING_ID }?.clampToValidBackupRange(),
authorId = this.quoteAuthor, authorId = this.quoteAuthor,
text = this.quoteBody?.let { body -> text = body,
Text( attachments = attachments,
body = body,
bodyRanges = bodyRanges
)
},
attachments = if (remoteType == Quote.Type.VIEW_ONCE) {
emptyList()
} else {
attachments?.toRemoteQuoteAttachments(mediaArchiveEnabled) ?: emptyList()
},
type = remoteType type = remoteType
) )
} }

View File

@@ -56,6 +56,7 @@ class GroupArchiveExporter(private val selfAci: ServiceId.ACI, private val curso
group = ArchiveGroup( group = ArchiveGroup(
masterKey = cursor.requireNonNullBlob(GroupTable.V2_MASTER_KEY).toByteString(), masterKey = cursor.requireNonNullBlob(GroupTable.V2_MASTER_KEY).toByteString(),
whitelisted = cursor.requireBoolean(RecipientTable.PROFILE_SHARING), whitelisted = cursor.requireBoolean(RecipientTable.PROFILE_SHARING),
blocked = cursor.requireBoolean(RecipientTable.BLOCKED),
hideStory = extras?.hideStory() ?: false, hideStory = extras?.hideStory() ?: false,
storySendMode = showAsStoryState.toRemote(), storySendMode = showAsStoryState.toRemote(),
snapshot = decryptedGroup.toRemote(isActive, selfAci) snapshot = decryptedGroup.toRemote(isActive, selfAci)

View File

@@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.backup.v2.importer
import android.content.ContentValues import android.content.ContentValues
import org.signal.core.util.Base64 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.GroupMasterKey
import org.signal.libsignal.zkgroup.groups.GroupSecretParams import org.signal.libsignal.zkgroup.groups.GroupSecretParams
import org.signal.storageservice.protos.groups.AccessControl import org.signal.storageservice.protos.groups.AccessControl
@@ -51,7 +52,8 @@ object GroupArchiveImporter {
val values = ContentValues().apply { val values = ContentValues().apply {
put(RecipientTable.GROUP_ID, groupId.toString()) put(RecipientTable.GROUP_ID, groupId.toString())
put(RecipientTable.AVATAR_COLOR, AvatarColorHash.forGroupId(groupId).serialize()) 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.TYPE, RecipientTable.RecipientType.GV2.id)
put(RecipientTable.STORAGE_SERVICE_ID, Base64.encodeWithPadding(StorageSyncHelper.generateKey())) put(RecipientTable.STORAGE_SERVICE_ID, Base64.encodeWithPadding(StorageSyncHelper.generateKey()))
if (group.hideStory) { if (group.hideStory) {

View File

@@ -30,6 +30,7 @@ message BackupInfo {
// For example, Chats may all be together at the beginning, // For example, Chats may all be together at the beginning,
// or may each immediately precede its first ChatItem. // or may each immediately precede its first ChatItem.
message Frame { message Frame {
// If unset, importers should skip this frame without throwing an error.
oneof item { oneof item {
AccountData account = 1; AccountData account = 1;
Recipient recipient = 2; Recipient recipient = 2;
@@ -44,13 +45,13 @@ message Frame {
message AccountData { message AccountData {
enum PhoneNumberSharingMode { enum PhoneNumberSharingMode {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Nobody"
EVERYBODY = 1; EVERYBODY = 1;
NOBODY = 2; NOBODY = 2;
} }
message UsernameLink { message UsernameLink {
enum Color { enum Color {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Blue"
BLUE = 1; BLUE = 1;
WHITE = 2; WHITE = 2;
GREY = 3; GREY = 3;
@@ -97,6 +98,7 @@ message AccountData {
message IAPSubscriberData { message IAPSubscriberData {
bytes subscriberId = 1; bytes subscriberId = 1;
// If unset, importers should ignore the subscriber data without throwing an error.
oneof iapSubscriptionId { oneof iapSubscriptionId {
// Identifies an Android Play Store IAP subscription. // Identifies an Android Play Store IAP subscription.
string purchaseToken = 2; string purchaseToken = 2;
@@ -119,6 +121,7 @@ message AccountData {
message Recipient { message Recipient {
uint64 id = 1; // generated id for reference only within this file uint64 id = 1; // generated id for reference only within this file
// If unset, importers should skip this frame without throwing an error.
oneof destination { oneof destination {
Contact contact = 2; Contact contact = 2;
Group group = 3; Group group = 3;
@@ -131,9 +134,9 @@ message Recipient {
message Contact { message Contact {
enum IdentityState { enum IdentityState {
DEFAULT = 0; DEFAULT = 0; // A valid value -- indicates unset by the user
VERIFIED = 1; VERIFIED = 1;
UNVERIFIED = 2; UNVERIFIED = 2; // Was once verified and is now unverified
} }
message Registered {} message Registered {}
@@ -142,7 +145,7 @@ message Contact {
} }
enum Visibility { enum Visibility {
VISIBLE = 0; VISIBLE = 0; // A valid value -- the contact is not hidden
HIDDEN = 1; HIDDEN = 1;
HIDDEN_MESSAGE_REQUEST = 2; HIDDEN_MESSAGE_REQUEST = 2;
} }
@@ -159,6 +162,7 @@ message Contact {
bool blocked = 5; bool blocked = 5;
Visibility visibility = 6; Visibility visibility = 6;
// If unset, consider the user to be registered
oneof registration { oneof registration {
Registered registered = 7; Registered registered = 7;
NotRegistered notRegistered = 8; NotRegistered notRegistered = 8;
@@ -177,7 +181,7 @@ message Contact {
message Group { message Group {
enum StorySendMode { enum StorySendMode {
DEFAULT = 0; DEFAULT = 0; // A valid value -- indicates unset by the user
DISABLED = 1; DISABLED = 1;
ENABLED = 2; ENABLED = 2;
} }
@@ -187,6 +191,7 @@ message Group {
bool hideStory = 3; bool hideStory = 3;
StorySendMode storySendMode = 4; StorySendMode storySendMode = 4;
GroupSnapshot snapshot = 5; GroupSnapshot snapshot = 5;
bool blocked = 6;
// These are simply plaintext copies of the groups proto from Groups.proto. // These are simply plaintext copies of the groups proto from Groups.proto.
// They should be kept completely in-sync with Groups.proto. // They should be kept completely in-sync with Groups.proto.
@@ -210,6 +215,7 @@ message Group {
} }
message GroupAttributeBlob { message GroupAttributeBlob {
// If unset, consider the field it represents to not be present
oneof content { oneof content {
string title = 1; string title = 1;
bytes avatar = 2; bytes avatar = 2;
@@ -220,7 +226,7 @@ message Group {
message Member { message Member {
enum Role { enum Role {
UNKNOWN = 0; UNKNOWN = 0; // Intepret as "Default"
DEFAULT = 1; DEFAULT = 1;
ADMINISTRATOR = 2; ADMINISTRATOR = 2;
} }
@@ -252,7 +258,7 @@ message Group {
message AccessControl { message AccessControl {
enum AccessRequired { enum AccessRequired {
UNKNOWN = 0; UNKNOWN = 0; // Intepret as "Unsatisfiable"
ANY = 1; ANY = 1;
MEMBER = 2; MEMBER = 2;
ADMINISTRATOR = 3; ADMINISTRATOR = 3;
@@ -292,7 +298,7 @@ message Chat {
*/ */
message CallLink { message CallLink {
enum Restrictions { enum Restrictions {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Admin Approval"
NONE = 1; NONE = 1;
ADMIN_APPROVAL = 2; ADMIN_APPROVAL = 2;
} }
@@ -306,7 +312,7 @@ message CallLink {
message AdHocCall { message AdHocCall {
enum State { enum State {
UNKNOWN_STATE = 0; UNKNOWN_STATE = 0; // Interpret as "Generic"
GENERIC = 1; GENERIC = 1;
} }
@@ -322,6 +328,7 @@ message DistributionListItem {
// by an all-0 UUID (00000000-0000-0000-0000-000000000000). // by an all-0 UUID (00000000-0000-0000-0000-000000000000).
bytes distributionId = 1; // distribution list ids are uuids bytes distributionId = 1; // distribution list ids are uuids
// If unset, importers should skip the item entirely without showing an error.
oneof item { oneof item {
uint64 deletionTimestamp = 2; uint64 deletionTimestamp = 2;
DistributionList distributionList = 3; DistributionList distributionList = 3;
@@ -330,7 +337,7 @@ message DistributionListItem {
message DistributionList { message DistributionList {
enum PrivacyMode { enum PrivacyMode {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Only with"
ONLY_WITH = 1; ONLY_WITH = 1;
ALL_EXCEPT = 2; ALL_EXCEPT = 2;
ALL = 3; ALL = 3;
@@ -365,12 +372,14 @@ message ChatItem {
repeated ChatItem revisions = 6; // ordered from oldest to newest repeated ChatItem revisions = 6; // ordered from oldest to newest
bool sms = 7; bool sms = 7;
// If unset, importers should skip this item without throwing an error.
oneof directionalDetails { oneof directionalDetails {
IncomingMessageDetails incoming = 8; IncomingMessageDetails incoming = 8;
OutgoingMessageDetails outgoing = 9; OutgoingMessageDetails outgoing = 9;
DirectionlessMessageDetails directionless = 10; DirectionlessMessageDetails directionless = 10;
} }
// If unset, importers should skip this item without throwing an error.
oneof item { oneof item {
StandardMessage standardMessage = 11; StandardMessage standardMessage = 11;
ContactMessage contactMessage = 12; ContactMessage contactMessage = 12;
@@ -419,6 +428,7 @@ message SendStatus {
uint64 recipientId = 1; 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 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 { oneof deliveryStatus {
Pending pending = 3; Pending pending = 3;
Sent sent = 4; Sent sent = 4;
@@ -455,6 +465,7 @@ message DirectStoryReplyMessage {
FilePointer longText = 2; FilePointer longText = 2;
} }
// If unset, importers should ignore the message without throwing an error.
oneof reply { oneof reply {
TextReply textReply = 1; TextReply textReply = 1;
string emoji = 2; string emoji = 2;
@@ -473,7 +484,7 @@ message PaymentNotification {
message FailedTransaction { // Failed payments can't be synced from the ledger message FailedTransaction { // Failed payments can't be synced from the ledger
enum FailureReason { enum FailureReason {
GENERIC = 0; GENERIC = 0; // A valid value -- reason unknown
NETWORK = 1; NETWORK = 1;
INSUFFICIENT_FUNDS = 2; INSUFFICIENT_FUNDS = 2;
} }
@@ -482,7 +493,7 @@ message PaymentNotification {
message Transaction { message Transaction {
enum Status { enum Status {
INITIAL = 0; INITIAL = 0; // A valid value -- state unconfirmed
SUBMITTED = 1; SUBMITTED = 1;
SUCCESSFUL = 2; SUCCESSFUL = 2;
} }
@@ -499,6 +510,7 @@ message PaymentNotification {
optional bytes receipt = 7; // mobile coin blobs optional bytes receipt = 7; // mobile coin blobs
} }
// If unset, importers should treat the transaction as successful with no metadata.
oneof payment { oneof payment {
Transaction transaction = 1; Transaction transaction = 1;
FailedTransaction failedTransaction = 2; FailedTransaction failedTransaction = 2;
@@ -513,7 +525,7 @@ message PaymentNotification {
message GiftBadge { message GiftBadge {
enum State { enum State {
UNOPENED = 0; UNOPENED = 0; // A valid state
OPENED = 1; OPENED = 1;
REDEEMED = 2; REDEEMED = 2;
FAILED = 3; FAILED = 3;
@@ -541,7 +553,7 @@ message ContactAttachment {
message Phone { message Phone {
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Home"
HOME = 1; HOME = 1;
MOBILE = 2; MOBILE = 2;
WORK = 3; WORK = 3;
@@ -555,7 +567,7 @@ message ContactAttachment {
message Email { message Email {
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN = 0; // Intepret as "Home"
HOME = 1; HOME = 1;
MOBILE = 2; MOBILE = 2;
WORK = 3; WORK = 3;
@@ -569,7 +581,7 @@ message ContactAttachment {
message PostalAddress { message PostalAddress {
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Home"
HOME = 1; HOME = 1;
WORK = 2; WORK = 2;
CUSTOM = 3; CUSTOM = 3;
@@ -629,7 +641,7 @@ message MessageAttachment {
// but explicitly mutually exclusive. Note the different raw values // but explicitly mutually exclusive. Note the different raw values
// (non-zero starting values are not supported in proto3.) // (non-zero starting values are not supported in proto3.)
enum Flag { enum Flag {
NONE = 0; NONE = 0; // A valid value -- no flag applied
VOICE_MESSAGE = 1; VOICE_MESSAGE = 1;
BORDERLESS = 2; BORDERLESS = 2;
GIF = 3; GIF = 3;
@@ -680,6 +692,7 @@ message FilePointer {
message InvalidAttachmentLocator { message InvalidAttachmentLocator {
} }
// If unset, importers should consider it to be an InvalidAttachmentLocator without throwing an error.
oneof locator { oneof locator {
BackupLocator backupLocator = 1; BackupLocator backupLocator = 1;
AttachmentLocator attachmentLocator = 2; AttachmentLocator attachmentLocator = 2;
@@ -698,7 +711,7 @@ message FilePointer {
message Quote { message Quote {
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Normal"
NORMAL = 1; NORMAL = 1;
GIFT_BADGE = 2; GIFT_BADGE = 2;
VIEW_ONCE = 3; VIEW_ONCE = 3;
@@ -719,7 +732,7 @@ message Quote {
message BodyRange { message BodyRange {
enum Style { enum Style {
NONE = 0; NONE = 0; // Importers should ignore the body range without throwing an error.
BOLD = 1; BOLD = 1;
ITALIC = 2; ITALIC = 2;
SPOILER = 3; SPOILER = 3;
@@ -727,9 +740,12 @@ message BodyRange {
MONOSPACE = 5; MONOSPACE = 5;
} }
optional uint32 start = 1; // 'start' and 'length' are measured in UTF-16 code units.
optional uint32 length = 2; // 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 { oneof associatedValue {
bytes mentionAci = 3; bytes mentionAci = 3;
Style style = 4; Style style = 4;
@@ -746,6 +762,7 @@ message Reaction {
} }
message ChatUpdateMessage { message ChatUpdateMessage {
// If unset, importers should ignore the update message without throwing an error.
oneof update { oneof update {
SimpleChatUpdate simpleUpdate = 1; SimpleChatUpdate simpleUpdate = 1;
GroupChangeChatUpdate groupChange = 2; GroupChangeChatUpdate groupChange = 2;
@@ -761,19 +778,19 @@ message ChatUpdateMessage {
message IndividualCall { message IndividualCall {
enum Type { enum Type {
UNKNOWN_TYPE = 0; UNKNOWN_TYPE = 0; // Interpret as "Audio call"
AUDIO_CALL = 1; AUDIO_CALL = 1;
VIDEO_CALL = 2; VIDEO_CALL = 2;
} }
enum Direction { enum Direction {
UNKNOWN_DIRECTION = 0; UNKNOWN_DIRECTION = 0; // Interpret as "Incoming"
INCOMING = 1; INCOMING = 1;
OUTGOING = 2; OUTGOING = 2;
} }
enum State { enum State {
UNKNOWN_STATE = 0; UNKNOWN_STATE = 0; // Interpret as "Accepted"
ACCEPTED = 1; ACCEPTED = 1;
NOT_ACCEPTED = 2; NOT_ACCEPTED = 2;
// An incoming call that is no longer ongoing, which we neither accepted // An incoming call that is no longer ongoing, which we neither accepted
@@ -794,7 +811,7 @@ message IndividualCall {
message GroupCall { message GroupCall {
enum State { enum State {
UNKNOWN_STATE = 0; UNKNOWN_STATE = 0; // Interpret as "Generic"
// A group call was started without ringing. // A group call was started without ringing.
GENERIC = 1; GENERIC = 1;
// We joined a group call that was started without ringing. // We joined a group call that was started without ringing.
@@ -825,7 +842,7 @@ message GroupCall {
message SimpleChatUpdate { message SimpleChatUpdate {
enum Type { enum Type {
UNKNOWN = 0; UNKNOWN = 0; // Importers should skip the update without throwing an error.
JOINED_SIGNAL = 1; JOINED_SIGNAL = 1;
IDENTITY_UPDATE = 2; IDENTITY_UPDATE = 2;
IDENTITY_VERIFIED = 3; IDENTITY_VERIFIED = 3;
@@ -859,6 +876,7 @@ message ProfileChangeChatUpdate {
} }
message LearnedProfileChatUpdate { message LearnedProfileChatUpdate {
// If unset, importers should consider the previous name to be an empty string.
oneof previousName { oneof previousName {
uint64 e164 = 1; uint64 e164 = 1;
string username = 2; string username = 2;
@@ -875,6 +893,7 @@ message SessionSwitchoverChatUpdate {
message GroupChangeChatUpdate { message GroupChangeChatUpdate {
message Update { message Update {
// If unset, importers should consider it to be a GenericGroupUpdate with unset updaterAci
oneof update { oneof update {
GenericGroupUpdate genericGroupUpdate = 1; GenericGroupUpdate genericGroupUpdate = 1;
GroupCreationUpdate groupCreationUpdate = 2; GroupCreationUpdate groupCreationUpdate = 2;
@@ -944,7 +963,7 @@ message GroupDescriptionUpdate {
} }
enum GroupV2AccessLevel { enum GroupV2AccessLevel {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Unsatisfiable"
ANY = 1; ANY = 1;
MEMBER = 2; MEMBER = 2;
ADMINISTRATOR = 3; ADMINISTRATOR = 3;
@@ -1134,6 +1153,7 @@ message ChatStyle {
message CustomChatColor { message CustomChatColor {
uint64 id = 1; uint64 id = 1;
// If unset, use the default chat color
oneof color { oneof color {
fixed32 solid = 2; // 0xAARRGGBB fixed32 solid = 2; // 0xAARRGGBB
Gradient gradient = 3; Gradient gradient = 3;
@@ -1144,7 +1164,7 @@ message ChatStyle {
} }
enum WallpaperPreset { enum WallpaperPreset {
UNKNOWN_WALLPAPER_PRESET = 0; UNKNOWN_WALLPAPER_PRESET = 0; // Interpret as the wallpaper being unset
SOLID_BLUSH = 1; SOLID_BLUSH = 1;
SOLID_COPPER = 2; SOLID_COPPER = 2;
SOLID_DUST = 3; SOLID_DUST = 3;
@@ -1169,7 +1189,7 @@ message ChatStyle {
} }
enum BubbleColorPreset { 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_ULTRAMARINE = 1;
SOLID_CRIMSON = 2; SOLID_CRIMSON = 2;
SOLID_VERMILION = 3; SOLID_VERMILION = 3;
@@ -1194,6 +1214,7 @@ message ChatStyle {
GRADIENT_TANGERINE = 22; GRADIENT_TANGERINE = 22;
} }
// If unset, importers should consider there to be no wallpaper.
oneof wallpaper { oneof wallpaper {
WallpaperPreset wallpaperPreset = 1; WallpaperPreset wallpaperPreset = 1;
// This `FilePointer` is expected not to contain a `fileName`, `width`, // This `FilePointer` is expected not to contain a `fileName`, `width`,
@@ -1201,6 +1222,7 @@ message ChatStyle {
FilePointer wallpaperPhoto = 2; FilePointer wallpaperPhoto = 2;
} }
// If unset, importers should consider it to be AutomaticBubbleColor
oneof bubbleColor { oneof bubbleColor {
// Bubble setting is automatically determined based on the wallpaper setting, // Bubble setting is automatically determined based on the wallpaper setting,
// or `SOLID_ULTRAMARINE` for `noWallpaper` // or `SOLID_ULTRAMARINE` for `noWallpaper`
@@ -1216,7 +1238,7 @@ message ChatStyle {
message NotificationProfile { message NotificationProfile {
enum DayOfWeek { enum DayOfWeek {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Monday"
MONDAY = 1; MONDAY = 1;
TUESDAY = 2; TUESDAY = 2;
WEDNESDAY = 3; WEDNESDAY = 3;
@@ -1242,7 +1264,7 @@ message NotificationProfile {
message ChatFolder { message ChatFolder {
// Represents the default "All chats" folder record vs all other custom folders // Represents the default "All chats" folder record vs all other custom folders
enum FolderType { enum FolderType {
UNKNOWN = 0; UNKNOWN = 0; // Interpret as "Custom"
ALL = 1; ALL = 1;
CUSTOM = 2; CUSTOM = 2;
} }

View File

@@ -13,7 +13,7 @@ androidx-window = "1.3.0"
glide = "4.15.1" glide = "4.15.1"
gradle = "8.7.3" gradle = "8.7.3"
kotlin = "2.1.0" kotlin = "2.1.0"
libsignal-client = "0.65.2" libsignal-client = "0.65.4"
mp4parser = "1.9.39" mp4parser = "1.9.39"
android-gradle-plugin = "8.7.2" android-gradle-plugin = "8.7.2"
accompanist = "0.28.0" accompanist = "0.28.0"

View File

@@ -6604,20 +6604,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="6eb4422e8a618b3b76cb2096a3619d251f9e27989dc68307a1e5414c3710f2d1" origin="Generated by Gradle"/> <sha256 value="6eb4422e8a618b3b76cb2096a3619d251f9e27989dc68307a1e5414c3710f2d1" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="org.signal" name="libsignal-android" version="0.65.2"> <component group="org.signal" name="libsignal-android" version="0.65.4">
<artifact name="libsignal-android-0.65.2.aar"> <artifact name="libsignal-android-0.65.4.aar">
<sha256 value="faab9438ba2e62324f76dfd2c24fbaabc1fed547dd3d6e6020ad417d8f9321f3" origin="Generated by Gradle"/> <sha256 value="21e2d7f9477e6c790cf460d839daaa7d74fda43e1f33360efd89a52eee26b906" origin="Generated by Gradle"/>
</artifact> </artifact>
<artifact name="libsignal-android-0.65.2.module"> <artifact name="libsignal-android-0.65.4.module">
<sha256 value="fb0c7ea259e7e6d3099b0e738cbd728be4af8cc284b5fb624bb11b4412384837" origin="Generated by Gradle"/> <sha256 value="d86f7b3e763be0638e8d0048292834a720412a57c67eeb764ade339a8a66350d" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="org.signal" name="libsignal-client" version="0.65.2"> <component group="org.signal" name="libsignal-client" version="0.65.4">
<artifact name="libsignal-client-0.65.2.jar"> <artifact name="libsignal-client-0.65.4.jar">
<sha256 value="ab3f8a2f8915bf14af9b219f7690026c33071a40da4a284213ba6cfc16538d72" origin="Generated by Gradle"/> <sha256 value="4f57d871be39b000a9f5611feba60c305420c4c4a1ed1d224584d0d9c4325d0c" origin="Generated by Gradle"/>
</artifact> </artifact>
<artifact name="libsignal-client-0.65.2.module"> <artifact name="libsignal-client-0.65.4.module">
<sha256 value="4b1ab575de696867241e1bbbee4224824f6c38aa835d422e591a62cdc98dd34c" origin="Generated by Gradle"/> <sha256 value="45c7e668b5fa408d9e2c389631e72cd11741aeff375ef2c8f0e74752f6e687d2" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="org.signal" name="ringrtc-android" version="2.49.3"> <component group="org.signal" name="ringrtc-android" version="2.49.3">