Skip to content

Commit 4da951f

Browse files
committed
Merge branch 'main' of https://github.com/xmtp/xmtp-android into gg/enhancement/add_sender_hmac_to_message_v2
2 parents 887f1f4 + a59fe92 commit 4da951f

File tree

13 files changed

+203
-21
lines changed

13 files changed

+203
-21
lines changed

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import org.xmtp.android.example.R
1111
import org.xmtp.android.example.conversation.ConversationDetailViewModel
1212
import org.xmtp.android.example.databinding.ListItemMessageBinding
1313
import org.xmtp.android.example.extension.margins
14-
import org.xmtp.proto.mls.message.contents.TranscriptMessages
1514
import uniffi.xmtpv3.org.xmtp.android.library.codecs.GroupMembershipChanges
15+
import java.text.SimpleDateFormat
16+
import java.util.Locale
1617

1718
class MessageViewHolder(
1819
private val binding: ListItemMessageBinding,
@@ -45,6 +46,9 @@ class MessageViewHolder(
4546
binding.messageContainer.layoutParams = params
4647
if (item.message.content<Any>() is String) {
4748
binding.messageBody.text = item.message.body
49+
val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
50+
binding.messageDate.text = sdf.format(item.message.sent)
51+
4852
} else if (item.message.content<Any>() is GroupMembershipChanges) {
4953
val changes = item.message.content() as? GroupMembershipChanges
5054
binding.messageBody.text =

example/src/main/res/layout/list_item_message.xml

+18-6
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,25 @@
1515
app:cardCornerRadius="8dp"
1616
app:layout_constraintTop_toTopOf="parent"
1717
tools:ignore="MissingConstraints">
18-
19-
<TextView
20-
android:id="@+id/messageBody"
18+
<LinearLayout
2119
android:layout_width="wrap_content"
22-
android:layout_height="wrap_content"
23-
android:textSize="16sp"
24-
android:layout_margin="8dp" />
20+
android:layout_height="wrap_content">
21+
<TextView
22+
android:id="@+id/messageBody"
23+
android:layout_width="wrap_content"
24+
android:layout_height="wrap_content"
25+
android:textSize="16sp"
26+
android:layout_margin="8dp" />
27+
<TextView
28+
android:id="@+id/messageDate"
29+
android:layout_width="wrap_content"
30+
android:layout_height="wrap_content"
31+
android:textSize="16sp"
32+
android:layout_margin="8dp"
33+
/>
34+
</LinearLayout>
35+
36+
2537

2638
</androidx.cardview.widget.CardView>
2739

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

+17
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,23 @@ class ClientTest {
126126
assertEquals(client.address.lowercase(), v3Client?.accountAddress()?.lowercase())
127127
}
128128

129+
@Test
130+
fun testCreatesAV3DevClient() {
131+
val context = InstrumentationRegistry.getInstrumentation().targetContext
132+
val fakeWallet = PrivateKeyBuilder()
133+
val client =
134+
Client().create(
135+
account = fakeWallet,
136+
options = ClientOptions(
137+
ClientOptions.Api(XMTPEnvironment.DEV, true),
138+
enableAlphaMls = true,
139+
appContext = context
140+
)
141+
)
142+
val v3Client = client.libXMTPClient
143+
assertEquals(client.address.lowercase(), v3Client?.accountAddress()?.lowercase())
144+
}
145+
129146
@Test
130147
fun testDoesNotCreateAV3Client() {
131148
val fakeWallet = PrivateKeyBuilder()

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

+39-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package org.xmtp.android.library
33
import androidx.test.ext.junit.runners.AndroidJUnit4
44
import androidx.test.platform.app.InstrumentationRegistry
55
import app.cash.turbine.test
6-
import kotlinx.coroutines.ExperimentalCoroutinesApi
76
import kotlinx.coroutines.runBlocking
87
import org.junit.Assert.assertEquals
98
import org.junit.Assert.assertThrows
@@ -113,6 +112,45 @@ class GroupTest {
113112
)
114113
}
115114

115+
@Test
116+
fun testCanRemoveGroupMembersWhenNotCreator() {
117+
boClient.conversations.newGroup(
118+
listOf(
119+
alix.walletAddress,
120+
caro.walletAddress
121+
)
122+
)
123+
runBlocking { alixClient.conversations.syncGroups() }
124+
val group = alixClient.conversations.listGroups().first()
125+
group.removeMembers(listOf(caro.walletAddress))
126+
assertEquals(
127+
group.memberAddresses().sorted(),
128+
listOf(
129+
alix.walletAddress.lowercase(),
130+
bo.walletAddress.lowercase()
131+
).sorted()
132+
)
133+
}
134+
135+
@Test
136+
fun testIsActiveReturnsCorrectly() {
137+
val group = boClient.conversations.newGroup(
138+
listOf(
139+
alix.walletAddress,
140+
caro.walletAddress
141+
)
142+
)
143+
runBlocking { caroClient.conversations.syncGroups() }
144+
val caroGroup = caroClient.conversations.listGroups().first()
145+
runBlocking { caroGroup.sync() }
146+
assert(caroGroup.isActive())
147+
assert(group.isActive())
148+
group.removeMembers(listOf(caro.walletAddress))
149+
runBlocking { caroGroup.sync() }
150+
assert(group.isActive())
151+
assert(!caroGroup.isActive())
152+
}
153+
116154
@Test
117155
fun testCanListGroups() {
118156
boClient.conversations.newGroup(listOf(alix.walletAddress))
@@ -200,11 +238,9 @@ class GroupTest {
200238
assertEquals(ReactionSchema.Unicode, content?.schema)
201239
}
202240

203-
@OptIn(ExperimentalCoroutinesApi::class)
204241
@Test
205242
fun testCanStreamGroupMessages() = kotlinx.coroutines.test.runTest {
206243
val group = boClient.conversations.newGroup(listOf(alix.walletAddress.lowercase()))
207-
208244
group.streamMessages().test {
209245
group.send("hi")
210246
assertEquals("hi", awaitItem().body)
@@ -213,7 +249,6 @@ class GroupTest {
213249
}
214250
}
215251

216-
@OptIn(ExperimentalCoroutinesApi::class)
217252
@Test
218253
fun testCanStreamDecryptedGroupMessages() = kotlinx.coroutines.test.runTest {
219254
val group = boClient.conversations.newGroup(listOf(alix.walletAddress))
@@ -226,7 +261,6 @@ class GroupTest {
226261
}
227262
}
228263

229-
@OptIn(ExperimentalCoroutinesApi::class)
230264
@Test
231265
fun testCanStreamGroups() = kotlinx.coroutines.test.runTest {
232266
boClient.conversations.streamGroups().test {
@@ -239,7 +273,6 @@ class GroupTest {
239273
}
240274
}
241275

242-
@OptIn(ExperimentalCoroutinesApi::class)
243276
@Test
244277
fun testCanStreamGroupsAndConversations() = kotlinx.coroutines.test.runTest {
245278
boClient.conversations.streamAll().test {

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import org.xmtp.proto.message.api.v1.MessageApiOuterClass.QueryRequest
4444
import uniffi.xmtpv3.FfiXmtpClient
4545
import uniffi.xmtpv3.LegacyIdentitySource
4646
import uniffi.xmtpv3.createClient
47+
import uniffi.xmtpv3.getVersionInfo
4748
import java.io.File
4849
import java.nio.charset.StandardCharsets
4950
import java.security.KeyStore
@@ -81,6 +82,7 @@ class Client() {
8182
lateinit var conversations: Conversations
8283
var logger: XMTPLogger = XMTPLogger()
8384
var libXMTPClient: FfiXmtpClient? = null
85+
val libXMTPVersion: String = getVersionInfo()
8486

8587
companion object {
8688
private const val TAG = "Client"
@@ -347,7 +349,7 @@ class Client() {
347349
throw XMTPException("No signer passed but signer was required.")
348350
}
349351
}
350-
352+
Log.i(TAG, "LibXMTP $libXMTPVersion")
351353
return v3Client
352354
}
353355

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ data class Conversations(
110110
}
111111

112112
val group = runBlocking {
113-
libXMTPConversations?.createGroup(accountAddresses)
113+
libXMTPConversations?.createGroup(accountAddresses, permissions = null)
114114
?: throw XMTPException("Client does not support Groups")
115115
}
116116
return Group(client, group)

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,17 @@ class Group(val client: Client, private val libXMTPGroup: FfiGroup) {
121121
fun decrypt(message: Message): DecryptedMessage {
122122
return DecryptedMessage(
123123
id = message.id.toHex(),
124-
topic = message.id.toHex(),
124+
topic = message.convoId.toHex(),
125125
encodedContent = message.decode().encodedContent,
126126
senderAddress = message.senderAddress,
127127
sentAt = Date()
128128
)
129129
}
130130

131+
fun isActive(): Boolean {
132+
return libXMTPGroup.isActive()
133+
}
134+
131135
fun addMembers(addresses: List<String>) {
132136
runBlocking { libXMTPGroup.addMembers(addresses) }
133137
}

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

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ data class Message(val client: Client, private val libXMTPMessage: FfiMessage) {
1212
val id: ByteArray
1313
get() = libXMTPMessage.id
1414

15+
val convoId: ByteArray
16+
get() = libXMTPMessage.convoId
17+
1518
val senderAddress: String
1619
get() = libXMTPMessage.addrFrom
1720

0 commit comments

Comments
 (0)