Skip to content

Commit b579a65

Browse files
committed
get the new codec working as expected
1 parent 816106f commit b579a65

File tree

6 files changed

+69
-36
lines changed

6 files changed

+69
-36
lines changed

library/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ dependencies {
8686
implementation 'org.web3j:crypto:5.0.0'
8787
implementation "net.java.dev.jna:jna:5.13.0@aar"
8888
api 'com.google.protobuf:protobuf-kotlin-lite:3.22.3'
89-
api 'org.xmtp:proto-kotlin:3.38.0'
89+
api 'org.xmtp:proto-kotlin:3.40.1'
9090

9191
testImplementation 'junit:junit:4.13.2'
9292
androidTestImplementation 'app.cash.turbine:turbine:0.12.1'

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

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

33
import androidx.test.ext.junit.runners.AndroidJUnit4
44
import androidx.test.platform.app.InstrumentationRegistry
5+
import kotlinx.coroutines.runBlocking
56
import org.junit.Assert.*
67
import org.junit.Before
78
import org.junit.Test
@@ -64,10 +65,10 @@ class GroupMembershipChangeTest {
6465
assertEquals(messages.size, 1)
6566
val content: GroupMembershipChanges? = messages.first().content()
6667
assertEquals(
67-
listOf(bo.walletAddress, caro.walletAddress),
68-
content?.membersAdded?.map { it.accountAddress }?.sorted()
68+
listOf(bo.walletAddress.lowercase(), caro.walletAddress.lowercase()).sorted(),
69+
content?.membersAddedList?.map { it.accountAddress.lowercase() }?.sorted()
6970
)
70-
assert(content?.membersRemoved.isNullOrEmpty())
71+
assert(content?.membersRemovedList.isNullOrEmpty())
7172
}
7273

7374
@Test
@@ -82,13 +83,15 @@ class GroupMembershipChangeTest {
8283
)
8384
val messages = group.messages()
8485
assertEquals(messages.size, 1)
86+
assertEquals(group.memberAddresses().size, 3)
8587
group.removeMembers(listOf(caro.walletAddress.lowercase()))
86-
assertEquals(messages.size, 2)
88+
assertEquals(group.messages().size, 2)
89+
assertEquals(group.memberAddresses().size, 2)
8790
val content: GroupMembershipChanges? = messages.first().content()
8891
assertEquals(
89-
listOf(caro.walletAddress),
90-
content?.membersRemoved?.map { it.accountAddress }?.sorted()
92+
listOf(caro.walletAddress.lowercase()),
93+
content?.membersRemovedList?.map { it.accountAddress.lowercase() }?.sorted()
9194
)
92-
assert(content?.membersAdded.isNullOrEmpty())
95+
assert(content?.membersAddedList.isNullOrEmpty())
9396
}
9497
}

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

+52-10
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package org.xmtp.android.library
22

3-
import android.util.Log
43
import androidx.test.ext.junit.runners.AndroidJUnit4
54
import androidx.test.platform.app.InstrumentationRegistry
6-
import kotlinx.coroutines.runBlocking
7-
import org.junit.Assert
5+
import app.cash.turbine.test
6+
import kotlinx.coroutines.ExperimentalCoroutinesApi
87
import org.junit.Assert.*
98
import org.junit.Before
109
import org.junit.Test
1110
import org.junit.runner.RunWith
11+
import org.xmtp.android.library.codecs.ContentTypeReaction
12+
import org.xmtp.android.library.codecs.Reaction
13+
import org.xmtp.android.library.codecs.ReactionAction
14+
import org.xmtp.android.library.codecs.ReactionCodec
15+
import org.xmtp.android.library.codecs.ReactionSchema
1216
import org.xmtp.android.library.messages.PrivateKey
1317
import org.xmtp.android.library.messages.PrivateKeyBuilder
1418
import org.xmtp.android.library.messages.walletAddress
1519

20+
@OptIn(ExperimentalCoroutinesApi::class)
1621
@RunWith(AndroidJUnit4::class)
1722
class GroupTest {
1823
lateinit var fakeApiClient: FakeApiClient
@@ -139,24 +144,61 @@ class GroupTest {
139144

140145
@Test
141146
fun testCanSendContentTypesToGroup() {
147+
Client.register(codec = ReactionCodec())
148+
142149
val group = boClient.conversations.newGroup(listOf(alix.walletAddress.lowercase()))
150+
group.send("gm")
151+
val messageToReact = group.messages()[0]
143152

144-
}
153+
val reaction = Reaction(
154+
reference = messageToReact.id,
155+
action = ReactionAction.Added,
156+
content = "U+1F603",
157+
schema = ReactionSchema.Unicode
158+
)
145159

146-
@Test
147-
fun testCanStreamGroupMessages() {
148-
val group = boClient.conversations.newGroup(listOf(alix.walletAddress.lowercase()))
160+
group.send(content = reaction, options = SendOptions(contentType = ContentTypeReaction))
161+
162+
val messages = group.messages()
163+
assertEquals(messages.size, 3)
164+
val content: Reaction? = messages.first().content()
165+
assertEquals("U+1F603", content?.content)
166+
assertEquals(messageToReact.id, content?.reference)
167+
assertEquals(ReactionAction.Added, content?.action)
168+
assertEquals(ReactionSchema.Unicode, content?.schema)
149169
}
150170

151171
@Test
152-
fun testCanStreamGroups() {
172+
fun testCanStreamGroupMessages() = kotlinx.coroutines.test.runTest {
153173
val group = boClient.conversations.newGroup(listOf(alix.walletAddress.lowercase()))
154174

175+
group.streamMessages().test {
176+
group.send("hi")
177+
assertEquals("hi", awaitItem().body)
178+
awaitComplete()
179+
}
155180
}
156181

157182
@Test
158-
fun testCanStreamGroupsAndConversations() {
159-
val group = boClient.conversations.newGroup(listOf(alix.walletAddress.lowercase()))
183+
fun testCanStreamGroups() = kotlinx.coroutines.test.runTest {
184+
boClient.conversations.streamGroups().test {
185+
val conversation =
186+
boClient.conversations.newGroup(listOf(alix.walletAddress.lowercase()))
187+
conversation.send(content = "hi")
188+
assertEquals("hi", awaitItem().messages().first().body)
189+
awaitComplete()
190+
}
191+
}
160192

193+
@Test
194+
fun testCanStreamGroupsAndConversations() = kotlinx.coroutines.test.runTest {
195+
boClient.conversations.stream(includeGroups = true).test {
196+
val group =
197+
boClient.conversations.newGroup(listOf(alix.walletAddress.lowercase()))
198+
val conversation =
199+
boClient.conversations.newConversation(alix.walletAddress.lowercase())
200+
assertEquals("hi", awaitItem().messages().first().body)
201+
awaitComplete()
202+
}
161203
}
162204
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.xmtp.android.library
22

3+
import android.util.Log
34
import kotlinx.coroutines.coroutineScope
45
import kotlinx.coroutines.flow.Flow
56
import kotlinx.coroutines.flow.flow

library/src/main/java/org/xmtp/android/library/codecs/GroupMembershipChangeCodec.kt

+4-18
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,32 @@
11
package uniffi.xmtpv3.org.xmtp.android.library.codecs
22

33
import com.google.gson.GsonBuilder
4-
import com.google.protobuf.kotlin.toByteStringUtf8
54
import org.xmtp.android.library.codecs.ContentCodec
65
import org.xmtp.android.library.codecs.ContentTypeId
76
import org.xmtp.android.library.codecs.ContentTypeIdBuilder
87
import org.xmtp.android.library.codecs.EncodedContent
98

9+
typealias GroupMembershipChanges = org.xmtp.proto.mls.message.contents.TranscriptMessages.GroupMembershipChanges
10+
1011
val ContentTypeGroupMembershipChange = ContentTypeIdBuilder.builderFromAuthorityId(
1112
"xmtp.org",
1213
"group_membership_change",
1314
versionMajor = 1,
1415
versionMinor = 0
1516
)
1617

17-
data class GroupMembershipChanges(
18-
val membersAdded: List<MembershipChange>,
19-
val membersRemoved: List<MembershipChange>,
20-
val installationsAdded: List<MembershipChange>,
21-
val installationsRemoved: List<MembershipChange>,
22-
)
23-
24-
data class MembershipChange(
25-
val installationIds: List<ByteArray>,
26-
val accountAddress: String,
27-
val initiatedByAccountAddress: String,
28-
)
29-
3018
data class GroupMembershipChangeCodec(override var contentType: ContentTypeId = ContentTypeGroupMembershipChange) :
3119
ContentCodec<GroupMembershipChanges> {
3220

3321
override fun encode(content: GroupMembershipChanges): EncodedContent {
34-
val gson = GsonBuilder().create()
3522
return EncodedContent.newBuilder().also {
3623
it.type = ContentTypeGroupMembershipChange
37-
it.content = gson.toJson(content).toByteStringUtf8()
24+
it.content = content.toByteString()
3825
}.build()
3926
}
4027

4128
override fun decode(content: EncodedContent): GroupMembershipChanges {
42-
val gson = GsonBuilder().create()
43-
return gson.fromJson(content.content.toStringUtf8(), GroupMembershipChanges::class.java)
29+
return GroupMembershipChanges.parseFrom(content.content)
4430
}
4531

4632
override fun fallback(content: GroupMembershipChanges): String? {

library/src/main/java/org/xmtp/android/library/libxmtp/MessageEmitter.kt

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.xmtp.android.library.libxmtp
22

3+
import android.util.Log
34
import kotlinx.coroutines.flow.MutableSharedFlow
45
import kotlinx.coroutines.flow.asSharedFlow
56
import uniffi.xmtpv3.FfiMessage

0 commit comments

Comments
 (0)