Skip to content

Commit 5cd5d9f

Browse files
authored
Merge branch 'np/v3-identity' into np/inbox-id-private-preference
2 parents 19eb2bb + 6ac955d commit 5cd5d9f

File tree

16 files changed

+128
-69
lines changed

16 files changed

+128
-69
lines changed

example/src/main/java/org/xmtp/android/example/ClientManager.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.xmtp.android.library.Client
1111
import org.xmtp.android.library.ClientOptions
1212
import org.xmtp.android.library.XMTPEnvironment
1313
import org.xmtp.android.library.messages.PrivateKeyBundleV1Builder
14-
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupMembershipChangeCodec
14+
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupUpdatedCodec
1515

1616
object ClientManager {
1717

@@ -47,7 +47,7 @@ object ClientManager {
4747
val v1Bundle =
4848
PrivateKeyBundleV1Builder.fromEncodedData(data = encodedPrivateKeyData)
4949
_client = Client().buildFrom(v1Bundle, clientOptions(appContext))
50-
Client.register(codec = GroupMembershipChangeCodec())
50+
Client.register(codec = GroupUpdatedCodec())
5151
_clientState.value = ClientState.Ready
5252
} catch (e: Exception) {
5353
_clientState.value = ClientState.Error(e.localizedMessage.orEmpty())

example/src/main/java/org/xmtp/android/example/connect/ConnectWalletViewModel.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import org.xmtp.android.library.Client
2121
import org.xmtp.android.library.XMTPException
2222
import org.xmtp.android.library.messages.PrivateKeyBuilder
2323
import org.xmtp.android.library.messages.PrivateKeyBundleV1Builder
24-
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupMembershipChangeCodec
24+
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupUpdatedCodec
2525

2626
class ConnectWalletViewModel(application: Application) : AndroidViewModel(application) {
2727

@@ -87,7 +87,7 @@ class ConnectWalletViewModel(application: Application) : AndroidViewModel(applic
8787
try {
8888
val wallet = PrivateKeyBuilder()
8989
val client = Client().create(wallet, ClientManager.clientOptions(getApplication()))
90-
Client.register(codec = GroupMembershipChangeCodec())
90+
Client.register(codec = GroupUpdatedCodec())
9191
_uiState.value = ConnectUiState.Success(
9292
wallet.address,
9393
PrivateKeyBundleV1Builder.encodeData(client.privateKeyBundleV1)
@@ -112,7 +112,7 @@ class ConnectWalletViewModel(application: Application) : AndroidViewModel(applic
112112
}
113113
}
114114
val client = Client().create(wallet, ClientManager.clientOptions(getApplication()))
115-
Client.register(codec = GroupMembershipChangeCodec())
115+
Client.register(codec = GroupUpdatedCodec())
116116
_uiState.value = ConnectUiState.Success(
117117
wallet.address,
118118
PrivateKeyBundleV1Builder.encodeData(client.privateKeyBundleV1)

example/src/main/java/org/xmtp/android/example/conversation/ConversationViewHolder.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ConversationViewHolder(
4040
} else if (item.mostRecentMessage?.content<Any>() is GroupMembershipChanges) {
4141
val changes = item.mostRecentMessage.content() as? GroupMembershipChanges
4242
"Membership Changed ${
43-
changes?.membersAddedList?.mapNotNull { it.accountAddress }.toString()
43+
changes?.addedInboxesList?.mapNotNull { it.inboxId }.toString()
4444
}"
4545
} else {
4646
""

example/src/main/java/org/xmtp/android/example/message/MessageViewHolder.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class MessageViewHolder(
5353
val changes = item.message.content() as? GroupMembershipChanges
5454
binding.messageBody.text =
5555
"Membership Changed ${
56-
changes?.membersAddedList?.mapNotNull { it.accountAddress }.toString()
56+
changes?.addedInboxesList?.mapNotNull { it.inboxId }.toString()
5757
}"
5858
}
5959
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class PushNotificationsService : FirebaseMessagingService() {
104104
} else if (decodedMessage.content<Any>() is GroupMembershipChanges) {
105105
val changes = decodedMessage.content() as? GroupMembershipChanges
106106
"Membership Changed ${
107-
changes?.membersAddedList?.mapNotNull { it.accountAddress }.toString()
107+
changes?.addedInboxesList?.mapNotNull { it.inboxId }.toString()
108108
}"
109109
} else {
110110
""

library/build.gradle

+4-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ android {
5252
withJavadocJar()
5353
}
5454
}
55+
lint {
56+
baseline = file("lint-baseline.xml")
57+
}
5558
}
5659

5760
protobuf {
@@ -86,7 +89,7 @@ dependencies {
8689
implementation 'org.web3j:crypto:5.0.0'
8790
implementation "net.java.dev.jna:jna:5.14.0@aar"
8891
api 'com.google.protobuf:protobuf-kotlin-lite:3.22.3'
89-
api 'org.xmtp:proto-kotlin:3.58.0'
92+
api 'org.xmtp:proto-kotlin:3.61.1'
9093

9194
testImplementation 'junit:junit:4.13.2'
9295
androidTestImplementation 'app.cash.turbine:turbine:0.12.1'

library/lint-baseline.xml

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<issues format="6" by="lint 8.0.0" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0)" variant="all" version="8.0.0">
3+
4+
<issue
5+
id="NewApi"
6+
message="Call requires API level 33 (current min is 23): `java.lang.ref.Cleaner#create`"
7+
errorLine1=" val cleaner = java.lang.ref.Cleaner.create()"
8+
errorLine2=" ~~~~~~">
9+
<location
10+
file="src/main/java/xmtpv3.kt"
11+
line="2270"
12+
column="41"/>
13+
</issue>
14+
15+
<issue
16+
id="NewApi"
17+
message="Call requires API level 33 (current min is 23): `java.lang.ref.Cleaner#register`"
18+
errorLine1=" JavaLangRefCleanable(cleaner.register(value, cleanUpTask))"
19+
errorLine2=" ~~~~~~~~">
20+
<location
21+
file="src/main/java/xmtpv3.kt"
22+
line="2273"
23+
column="38"/>
24+
</issue>
25+
26+
<issue
27+
id="NewApi"
28+
message="Call requires API level 33 (current min is 23): `java.lang.ref.Cleaner.Cleanable#clean`"
29+
errorLine1=" override fun clean() = cleanable.clean()"
30+
errorLine2=" ~~~~~">
31+
<location
32+
file="src/main/java/xmtpv3.kt"
33+
line="2279"
34+
column="38"/>
35+
</issue>
36+
37+
<issue
38+
id="SimpleDateFormat"
39+
message="To get local formatting use `getDateInstance()`, `getDateTimeInstance()`, or `getTimeInstance()`, or use `new SimpleDateFormat(String template, Locale locale)` with for example `Locale.US` for ASCII dates."
40+
errorLine1=" val formatter = SimpleDateFormat(&quot;EEE, dd MMM yyyy HH:mm:ss &apos;GMT&apos;&quot;)"
41+
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
42+
<location
43+
file="src/main/java/org/xmtp/android/library/messages/Signature.kt"
44+
line="53"
45+
column="21"/>
46+
</issue>
47+
48+
</issues>

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

+1
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ class ConversationsTest {
216216
}
217217

218218
@Test
219+
@Ignore("TODO: Fix Flaky Test")
219220
fun testNetworkConsentOverConsentProof() {
220221
val timestamp = Date().time
221222
val signatureText = Signature.newBuilder().build().consentProofText(boClient.address, timestamp)

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

+7-6
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import org.xmtp.android.library.messages.MessageDeliveryStatus
2222
import org.xmtp.android.library.messages.PrivateKey
2323
import org.xmtp.android.library.messages.PrivateKeyBuilder
2424
import org.xmtp.android.library.messages.walletAddress
25-
import uniffi.xmtpv3.org.xmtp.android.library.codecs.ContentTypeGroupMembershipChange
26-
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupMembershipChangeCodec
25+
import uniffi.xmtpv3.org.xmtp.android.library.codecs.ContentTypeGroupUpdated
2726
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupMembershipChanges
27+
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupUpdatedCodec
2828

2929
@RunWith(AndroidJUnit4::class)
3030
class GroupTest {
@@ -458,7 +458,7 @@ class GroupTest {
458458

459459
@Test
460460
fun testCanStreamGroupMessages() = kotlinx.coroutines.test.runTest {
461-
Client.register(codec = GroupMembershipChangeCodec())
461+
Client.register(codec = GroupUpdatedCodec())
462462
val membershipChange = GroupMembershipChanges.newBuilder().build()
463463

464464
val group = boClient.conversations.newGroup(listOf(alix.walletAddress.lowercase()))
@@ -469,7 +469,7 @@ class GroupTest {
469469
assertEquals("hi", awaitItem().body)
470470
alixGroup.send(
471471
content = membershipChange,
472-
options = SendOptions(contentType = ContentTypeGroupMembershipChange),
472+
options = SendOptions(contentType = ContentTypeGroupUpdated),
473473
)
474474
alixGroup.send("hi again")
475475
assertEquals("hi again", awaitItem().body)
@@ -536,8 +536,9 @@ class GroupTest {
536536
}
537537

538538
@Test
539+
@Ignore("TODO: Fix Flaky Test")
539540
fun testCanStreamAllDecryptedGroupMessages() = kotlinx.coroutines.test.runTest {
540-
Client.register(codec = GroupMembershipChangeCodec())
541+
Client.register(codec = GroupUpdatedCodec())
541542
val membershipChange = GroupMembershipChanges.newBuilder().build()
542543
val group = caroClient.conversations.newGroup(listOf(alix.walletAddress))
543544
alixClient.conversations.syncGroups()
@@ -557,7 +558,7 @@ class GroupTest {
557558
group.send("hi 1")
558559
group.send(
559560
content = membershipChange,
560-
options = SendOptions(contentType = ContentTypeGroupMembershipChange),
561+
options = SendOptions(contentType = ContentTypeGroupUpdated),
561562
)
562563
group.send("hi 2")
563564

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

+13-13
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import org.junit.runner.RunWith
1111
import org.xmtp.android.library.messages.PrivateKey
1212
import org.xmtp.android.library.messages.PrivateKeyBuilder
1313
import org.xmtp.android.library.messages.walletAddress
14-
import uniffi.xmtpv3.org.xmtp.android.library.codecs.ContentTypeGroupMembershipChange
15-
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupMembershipChangeCodec
14+
import uniffi.xmtpv3.org.xmtp.android.library.codecs.ContentTypeGroupUpdated
1615
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupMembershipChanges
16+
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupUpdatedCodec
1717

1818
@RunWith(AndroidJUnit4::class)
19-
class GroupMembershipChangeTest {
19+
class GroupUpdatedTest {
2020
lateinit var alixWallet: PrivateKeyBuilder
2121
lateinit var boWallet: PrivateKeyBuilder
2222
lateinit var alix: PrivateKey
@@ -52,7 +52,7 @@ class GroupMembershipChangeTest {
5252

5353
@Test
5454
fun testCanAddMembers() {
55-
Client.register(codec = GroupMembershipChangeCodec())
55+
Client.register(codec = GroupUpdatedCodec())
5656

5757
val group = runBlocking {
5858
alixClient.conversations.newGroup(
@@ -66,15 +66,15 @@ class GroupMembershipChangeTest {
6666
assertEquals(messages.size, 1)
6767
val content: GroupMembershipChanges? = messages.first().content()
6868
assertEquals(
69-
listOf(bo.walletAddress.lowercase(), caro.walletAddress.lowercase()).sorted(),
70-
content?.membersAddedList?.map { it.accountAddress.lowercase() }?.sorted()
69+
listOf(boClient.inboxId.lowercase(), caroClient.inboxId.lowercase()).sorted(),
70+
content?.addedInboxesList?.map { it.inboxId.lowercase() }?.sorted()
7171
)
72-
assert(content?.membersRemovedList.isNullOrEmpty())
72+
assert(content?.removedInboxesList.isNullOrEmpty())
7373
}
7474

7575
@Test
7676
fun testCanRemoveMembers() {
77-
Client.register(codec = GroupMembershipChangeCodec())
77+
Client.register(codec = GroupUpdatedCodec())
7878

7979
val group = runBlocking {
8080
alixClient.conversations.newGroup(
@@ -94,15 +94,15 @@ class GroupMembershipChangeTest {
9494
val content: GroupMembershipChanges? = updatedMessages.first().content()
9595

9696
assertEquals(
97-
listOf(caro.walletAddress.lowercase()),
98-
content?.membersRemovedList?.map { it.accountAddress.lowercase() }?.sorted()
97+
listOf(caroClient.inboxId.lowercase()),
98+
content?.removedInboxesList?.map { it.inboxId.lowercase() }?.sorted()
9999
)
100-
assert(content?.membersAddedList.isNullOrEmpty())
100+
assert(content?.addedInboxesList.isNullOrEmpty())
101101
}
102102

103103
@Test
104104
fun testRemovesInvalidMessageKind() {
105-
Client.register(codec = GroupMembershipChangeCodec())
105+
Client.register(codec = GroupUpdatedCodec())
106106

107107
val membershipChange = GroupMembershipChanges.newBuilder().build()
108108

@@ -120,7 +120,7 @@ class GroupMembershipChangeTest {
120120
runBlocking {
121121
group.send(
122122
content = membershipChange,
123-
options = SendOptions(contentType = ContentTypeGroupMembershipChange),
123+
options = SendOptions(contentType = ContentTypeGroupUpdated),
124124
)
125125
group.sync()
126126
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ class Client() {
228228
account,
229229
clientOptions.appContext,
230230
privateKeyBundleV1,
231-
LegacyIdentitySource.NONE,
231+
legacyIdentityKey,
232232
account.address
233233
)
234234

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

-36
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package uniffi.xmtpv3.org.xmtp.android.library.codecs
2+
3+
import org.xmtp.android.library.codecs.ContentCodec
4+
import org.xmtp.android.library.codecs.ContentTypeId
5+
import org.xmtp.android.library.codecs.ContentTypeIdBuilder
6+
import org.xmtp.android.library.codecs.EncodedContent
7+
import org.xmtp.proto.mls.message.contents.TranscriptMessages.GroupUpdated
8+
9+
typealias GroupMembershipChanges = org.xmtp.proto.mls.message.contents.TranscriptMessages.GroupUpdated
10+
11+
val ContentTypeGroupUpdated = ContentTypeIdBuilder.builderFromAuthorityId(
12+
"xmtp.org",
13+
"group_updated",
14+
versionMajor = 1,
15+
versionMinor = 0,
16+
)
17+
18+
data class GroupUpdatedCodec(override var contentType: ContentTypeId = ContentTypeGroupUpdated) :
19+
ContentCodec<GroupUpdated> {
20+
21+
override fun encode(content: GroupUpdated): EncodedContent {
22+
return EncodedContent.newBuilder().also {
23+
it.type = ContentTypeGroupUpdated
24+
it.content = content.toByteString()
25+
}.build()
26+
}
27+
28+
override fun decode(content: EncodedContent): GroupUpdated {
29+
return GroupMembershipChanges.parseFrom(content.content)
30+
}
31+
32+
override fun fallback(content: GroupUpdated): String? {
33+
return null
34+
}
35+
36+
override fun shouldPush(content: GroupUpdated): Boolean = false
37+
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import org.xmtp.android.library.toHex
1212
import uniffi.xmtpv3.FfiDeliveryStatus
1313
import uniffi.xmtpv3.FfiGroupMessageKind
1414
import uniffi.xmtpv3.FfiMessage
15-
import uniffi.xmtpv3.org.xmtp.android.library.codecs.ContentTypeGroupMembershipChange
15+
import uniffi.xmtpv3.org.xmtp.android.library.codecs.ContentTypeGroupUpdated
1616
import java.util.Date
1717

1818
data class MessageV3(val client: Client, private val libXMTPMessage: FfiMessage) {
@@ -47,7 +47,7 @@ data class MessageV3(val client: Client, private val libXMTPMessage: FfiMessage)
4747
sent = sentAt,
4848
deliveryStatus = deliveryStatus
4949
)
50-
if (decodedMessage.encodedContent.type == ContentTypeGroupMembershipChange && libXMTPMessage.kind != FfiGroupMessageKind.MEMBERSHIP_CHANGE) {
50+
if (decodedMessage.encodedContent.type == ContentTypeGroupUpdated && libXMTPMessage.kind != FfiGroupMessageKind.MEMBERSHIP_CHANGE) {
5151
throw XMTPException("Error decoding group membership change")
5252
}
5353
return decodedMessage

0 commit comments

Comments
 (0)