Skip to content

Commit 6cc22bc

Browse files
committed
tweak this so it happens in the decode methods instea
1 parent fcb5ae1 commit 6cc22bc

File tree

9 files changed

+48
-69
lines changed

9 files changed

+48
-69
lines changed

example/src/main/java/org/xmtp/android/example/pushnotifications/PushNotificationsService.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class PushNotificationsService : FirebaseMessagingService() {
9292
return
9393
}
9494
val decodedMessage = if (conversation is Conversation.Group) {
95-
runBlocking { conversation.group.processMessage(encryptedMessageData) }
95+
runBlocking { conversation.group.processMessage(encryptedMessageData).decode() }
9696
} else {
9797
val envelope = EnvelopeBuilder.buildFromString(topic, Date(), encryptedMessageData)
9898
conversation.decode(envelope)

library/src/androidTest/java/org/xmtp/android/library/GroupMembershipChangeTest.kt

-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import org.junit.Assert.assertEquals
88
import org.junit.Before
99
import org.junit.Test
1010
import org.junit.runner.RunWith
11-
import org.xmtp.android.library.messages.MessageKind
1211
import org.xmtp.android.library.messages.PrivateKey
1312
import org.xmtp.android.library.messages.PrivateKeyBuilder
1413
import org.xmtp.android.library.messages.walletAddress
@@ -71,7 +70,6 @@ class GroupMembershipChangeTest {
7170
content?.membersAddedList?.map { it.accountAddress.lowercase() }?.sorted()
7271
)
7372
assert(content?.membersRemovedList.isNullOrEmpty())
74-
assertEquals(messages.first().kind, MessageKind.MEMBERSHIP_CHANGE)
7573
}
7674

7775
@Test
@@ -100,7 +98,6 @@ class GroupMembershipChangeTest {
10098
content?.membersRemovedList?.map { it.accountAddress.lowercase() }?.sorted()
10199
)
102100
assert(content?.membersAddedList.isNullOrEmpty())
103-
assertEquals(updatedMessages.first().kind, MessageKind.MEMBERSHIP_CHANGE)
104101
}
105102

106103
@Test

library/src/androidTest/java/org/xmtp/android/library/GroupTest.kt

-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import org.xmtp.android.library.codecs.Reaction
1717
import org.xmtp.android.library.codecs.ReactionAction
1818
import org.xmtp.android.library.codecs.ReactionCodec
1919
import org.xmtp.android.library.codecs.ReactionSchema
20-
import org.xmtp.android.library.messages.MessageKind
2120
import org.xmtp.android.library.messages.PrivateKey
2221
import org.xmtp.android.library.messages.PrivateKeyBuilder
2322
import org.xmtp.android.library.messages.walletAddress
@@ -327,7 +326,6 @@ class GroupTest {
327326
runBlocking { sameGroup.sync() }
328327
assertEquals(sameGroup.messages().size, 2)
329328
assertEquals(sameGroup.messages().first().body, "gm")
330-
assertEquals(sameGroup.messages().first().kind, MessageKind.APPLICATION)
331329
}
332330

333331
@Test

library/src/main/java/org/xmtp/android/library/Conversations.kt

+6-7
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import org.xmtp.android.library.messages.DecryptedMessage
1717
import org.xmtp.android.library.messages.Envelope
1818
import org.xmtp.android.library.messages.EnvelopeBuilder
1919
import org.xmtp.android.library.messages.InvitationV1
20-
import org.xmtp.android.library.messages.MessageKind
2120
import org.xmtp.android.library.messages.MessageV1Builder
2221
import org.xmtp.android.library.messages.Pagination
2322
import org.xmtp.android.library.messages.SealedInvitation
@@ -578,9 +577,9 @@ data class Conversations(
578577
fun streamAllGroupMessages(): Flow<DecodedMessage> = callbackFlow {
579578
val messageCallback = object : FfiMessageCallback {
580579
override fun onMessage(message: FfiMessage) {
581-
val decodedMessage = MessageV3(client, message).decode()
582-
if (!(decodedMessage.encodedContent.type == ContentTypeGroupMembershipChange && decodedMessage.kind != MessageKind.MEMBERSHIP_CHANGE)) {
583-
trySend(decodedMessage)
580+
val decodedMessage = MessageV3(client, message).decodeOrNull()
581+
decodedMessage?.let {
582+
trySend(it)
584583
}
585584
}
586585
}
@@ -592,9 +591,9 @@ data class Conversations(
592591
fun streamAllGroupDecryptedMessages(): Flow<DecryptedMessage> = callbackFlow {
593592
val messageCallback = object : FfiMessageCallback {
594593
override fun onMessage(message: FfiMessage) {
595-
val decryptedMessage = MessageV3(client, message).decrypt()
596-
if (!(decryptedMessage.encodedContent.type == ContentTypeGroupMembershipChange && decryptedMessage.kind != MessageKind.MEMBERSHIP_CHANGE)) {
597-
trySend(decryptedMessage)
594+
val decryptedMessage = MessageV3(client, message).decryptOrNull()
595+
decryptedMessage?.let {
596+
trySend(it)
598597
}
599598
}
600599
}

library/src/main/java/org/xmtp/android/library/DecodedMessage.kt

-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package org.xmtp.android.library
22

33
import org.xmtp.android.library.codecs.TextCodec
44
import org.xmtp.android.library.codecs.decoded
5-
import org.xmtp.android.library.messages.MessageKind
65
import org.xmtp.proto.message.contents.Content
76
import java.util.Date
87

@@ -13,7 +12,6 @@ data class DecodedMessage(
1312
var encodedContent: Content.EncodedContent,
1413
var senderAddress: String,
1514
var sent: Date,
16-
var kind: MessageKind = MessageKind.APPLICATION
1715
) {
1816
companion object {
1917
fun preview(client: Client, topic: String, body: String, senderAddress: String, sent: Date): DecodedMessage {

library/src/main/java/org/xmtp/android/library/Group.kt

+16-39
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import org.xmtp.android.library.codecs.EncodedContent
88
import org.xmtp.android.library.codecs.compress
99
import org.xmtp.android.library.libxmtp.MessageV3
1010
import org.xmtp.android.library.messages.DecryptedMessage
11-
import org.xmtp.android.library.messages.MessageKind
1211
import org.xmtp.android.library.messages.PagingInfoSortDirection
1312
import org.xmtp.android.library.messages.Topic
1413
import org.xmtp.proto.message.api.v1.MessageApiOuterClass
@@ -18,7 +17,6 @@ import uniffi.xmtpv3.FfiListMessagesOptions
1817
import uniffi.xmtpv3.FfiMessage
1918
import uniffi.xmtpv3.FfiMessageCallback
2019
import uniffi.xmtpv3.GroupPermissions
21-
import uniffi.xmtpv3.org.xmtp.android.library.codecs.ContentTypeGroupMembershipChange
2220
import java.util.Date
2321
import kotlin.time.Duration.Companion.nanoseconds
2422
import kotlin.time.DurationUnit
@@ -95,17 +93,13 @@ class Group(val client: Client, private val libXMTPGroup: FfiGroup) {
9593
sentAfterNs = after?.time?.nanoseconds?.toLong(DurationUnit.NANOSECONDS),
9694
limit = limit?.toLong()
9795
)
98-
).map {
99-
MessageV3(client, it).decode()
100-
}
101-
102-
val filteredMessages = messages.filterNot {
103-
it.encodedContent.type == ContentTypeGroupMembershipChange && it.kind != MessageKind.MEMBERSHIP_CHANGE
96+
).mapNotNull {
97+
MessageV3(client, it).decodeOrNull()
10498
}
10599

106100
return when (direction) {
107-
MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING -> filteredMessages
108-
else -> filteredMessages.reversed()
101+
MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING -> messages
102+
else -> messages.reversed()
109103
}
110104
}
111105

@@ -121,36 +115,19 @@ class Group(val client: Client, private val libXMTPGroup: FfiGroup) {
121115
sentAfterNs = after?.time?.nanoseconds?.toLong(DurationUnit.NANOSECONDS),
122116
limit = limit?.toLong()
123117
)
124-
).map {
125-
MessageV3(client, it).decrypt()
126-
}
127-
128-
val filteredMessages = messages.filterNot {
129-
it.encodedContent.type == ContentTypeGroupMembershipChange && it.kind != MessageKind.MEMBERSHIP_CHANGE
118+
).mapNotNull {
119+
MessageV3(client, it).decryptOrNull()
130120
}
131121

132122
return when (direction) {
133-
MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING -> filteredMessages
134-
else -> filteredMessages.reversed()
123+
MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING -> messages
124+
else -> messages.reversed()
135125
}
136126
}
137127

138-
suspend fun processMessage(envelopeBytes: ByteArray): DecodedMessage {
128+
suspend fun processMessage(envelopeBytes: ByteArray): MessageV3 {
139129
val message = libXMTPGroup.processStreamedGroupMessage(envelopeBytes)
140-
val decodedMessage = MessageV3(client, message).decode()
141-
if (decodedMessage.encodedContent.type == ContentTypeGroupMembershipChange && decodedMessage.kind != MessageKind.MEMBERSHIP_CHANGE) {
142-
throw XMTPException("Invalid message")
143-
}
144-
return decodedMessage
145-
}
146-
147-
suspend fun processMessageDecrypted(envelopeBytes: ByteArray): DecryptedMessage {
148-
val message = libXMTPGroup.processStreamedGroupMessage(envelopeBytes)
149-
val decryptedMessage = MessageV3(client, message).decrypt()
150-
if (decryptedMessage.encodedContent.type == ContentTypeGroupMembershipChange && decryptedMessage.kind != MessageKind.MEMBERSHIP_CHANGE) {
151-
throw XMTPException("Invalid message")
152-
}
153-
return decryptedMessage
130+
return MessageV3(client, message)
154131
}
155132

156133
fun isActive(): Boolean {
@@ -198,9 +175,9 @@ class Group(val client: Client, private val libXMTPGroup: FfiGroup) {
198175
fun streamMessages(): Flow<DecodedMessage> = callbackFlow {
199176
val messageCallback = object : FfiMessageCallback {
200177
override fun onMessage(message: FfiMessage) {
201-
val decodedMessage = MessageV3(client, message).decode()
202-
if (!(decodedMessage.encodedContent.type == ContentTypeGroupMembershipChange && decodedMessage.kind != MessageKind.MEMBERSHIP_CHANGE)) {
203-
trySend(decodedMessage)
178+
val decodedMessage = MessageV3(client, message).decodeOrNull()
179+
decodedMessage?.let {
180+
trySend(it)
204181
}
205182
}
206183
}
@@ -212,9 +189,9 @@ class Group(val client: Client, private val libXMTPGroup: FfiGroup) {
212189
fun streamDecryptedMessages(): Flow<DecryptedMessage> = callbackFlow {
213190
val messageCallback = object : FfiMessageCallback {
214191
override fun onMessage(message: FfiMessage) {
215-
val decryptedMessage = MessageV3(client, message).decrypt()
216-
if (!(decryptedMessage.encodedContent.type == ContentTypeGroupMembershipChange && decryptedMessage.kind != MessageKind.MEMBERSHIP_CHANGE)) {
217-
trySend(decryptedMessage)
192+
val decryptedMessage = MessageV3(client, message).decryptOrNull()
193+
decryptedMessage?.let {
194+
trySend(it)
218195
}
219196
}
220197
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package org.xmtp.android.library.libxmtp
22

3+
import android.util.Log
34
import org.xmtp.android.library.Client
45
import org.xmtp.android.library.DecodedMessage
56
import org.xmtp.android.library.XMTPException
67
import org.xmtp.android.library.codecs.EncodedContent
78
import org.xmtp.android.library.messages.DecryptedMessage
8-
import org.xmtp.android.library.messages.MessageKind
99
import org.xmtp.android.library.messages.Topic
1010
import org.xmtp.android.library.toHex
1111
import uniffi.xmtpv3.FfiGroupMessageKind
1212
import uniffi.xmtpv3.FfiMessage
13+
import uniffi.xmtpv3.org.xmtp.android.library.codecs.ContentTypeGroupMembershipChange
1314
import java.util.Date
1415

1516
data class MessageV3(val client: Client, private val libXMTPMessage: FfiMessage) {
@@ -26,36 +27,50 @@ data class MessageV3(val client: Client, private val libXMTPMessage: FfiMessage)
2627
val sentAt: Date
2728
get() = Date(libXMTPMessage.sentAtNs / 1_000_000)
2829

29-
val kind: MessageKind
30-
get() = when (libXMTPMessage.kind) {
31-
FfiGroupMessageKind.APPLICATION -> MessageKind.APPLICATION
32-
FfiGroupMessageKind.MEMBERSHIP_CHANGE -> MessageKind.MEMBERSHIP_CHANGE
33-
}
34-
3530
fun decode(): DecodedMessage {
3631
try {
37-
return DecodedMessage(
32+
val decodedMessage = DecodedMessage(
3833
id = id.toHex(),
3934
client = client,
4035
topic = Topic.groupMessage(convoId.toHex()).description,
4136
encodedContent = EncodedContent.parseFrom(libXMTPMessage.content),
4237
senderAddress = senderAddress,
4338
sent = sentAt,
44-
kind = kind
4539
)
40+
if (decodedMessage.encodedContent.type == ContentTypeGroupMembershipChange && libXMTPMessage.kind != FfiGroupMessageKind.MEMBERSHIP_CHANGE) {
41+
throw XMTPException("Error decoding group membership change")
42+
}
43+
return decodedMessage
4644
} catch (e: Exception) {
4745
throw XMTPException("Error decoding message", e)
4846
}
4947
}
5048

49+
fun decodeOrNull(): DecodedMessage? {
50+
return try {
51+
decode()
52+
} catch (e: Exception) {
53+
Log.d("MESSAGE_V3", "discarding message that failed to decode", e)
54+
null
55+
}
56+
}
57+
58+
fun decryptOrNull(): DecryptedMessage? {
59+
return try {
60+
decrypt()
61+
} catch (e: Exception) {
62+
Log.d("MESSAGE_V3", "discarding message that failed to decrypt", e)
63+
null
64+
}
65+
}
66+
5167
fun decrypt(): DecryptedMessage {
5268
return DecryptedMessage(
5369
id = id.toHex(),
5470
topic = Topic.groupMessage(convoId.toHex()).description,
5571
encodedContent = decode().encodedContent,
5672
senderAddress = senderAddress,
5773
sentAt = Date(),
58-
kind = kind
5974
)
6075
}
6176
}

library/src/main/java/org/xmtp/android/library/messages/DecryptedMessage.kt

-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,4 @@ data class DecryptedMessage(
99
var senderAddress: String,
1010
var sentAt: Date,
1111
var topic: String = "",
12-
var kind: MessageKind = MessageKind.APPLICATION
1312
)

library/src/main/java/org/xmtp/android/library/messages/Message.kt

-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ enum class MessageVersion(val rawValue: String) {
1212
}
1313
}
1414

15-
enum class MessageKind {
16-
APPLICATION, MEMBERSHIP_CHANGE
17-
}
18-
1915
class MessageBuilder {
2016
companion object {
2117
fun buildFromMessageV1(v1: MessageV1): Message {

0 commit comments

Comments
 (0)