Skip to content

Commit

Permalink
Make all ids strings & add prepare message consent (#271)
Browse files Browse the repository at this point in the history
* fix up the consent and make all ids strings'

* fix up the lint
  • Loading branch information
nplasterer authored Jul 8, 2024
1 parent cc07eee commit 4d7e05c
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 55 deletions.
47 changes: 18 additions & 29 deletions library/src/androidTest/java/org/xmtp/android/library/GroupTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -733,10 +733,10 @@ class GroupTest {
boClient.conversations.streamGroups().test {
val group =
alixClient.conversations.newGroup(listOf(bo.walletAddress))
assertEquals(group.id.toHex(), awaitItem().id.toHex())
assertEquals(group.id, awaitItem().id)
val group2 =
caroClient.conversations.newGroup(listOf(bo.walletAddress))
assertEquals(group2.id.toHex(), awaitItem().id.toHex())
assertEquals(group2.id, awaitItem().id)
}
}

Expand Down Expand Up @@ -836,7 +836,7 @@ class GroupTest {
runBlocking { alixClient.conversations.syncGroups() }
val alixGroup = alixClient.findGroup(boGroup.id)

assertEquals(alixGroup?.id?.toHex(), boGroup.id.toHex())
assertEquals(alixGroup?.id, boGroup.id)
}

@Test
Expand All @@ -853,24 +853,9 @@ class GroupTest {
runBlocking { alixClient.conversations.syncGroups() }
val alixGroup = alixClient.findGroup(boGroup.id)
runBlocking { alixGroup?.sync() }
val alixMessage = alixClient.findMessage(boMessageId.hexToByteArray())
val alixMessage = alixClient.findMessage(boMessageId)

assertEquals(alixMessage?.id?.toHex(), boMessageId)
}

@Test
fun testTranslatingIds() {
val boGroup = runBlocking {
boClient.conversations.newGroup(
listOf(
alix.walletAddress,
caro.walletAddress
)
)
}
val hex = boGroup.id.toHex()

assert(hex.hexToByteArray().contentEquals(boGroup.id))
assertEquals(alixMessage?.id, boMessageId)
}

@Test
Expand All @@ -883,21 +868,25 @@ class GroupTest {
)
)
}
val preparedMessage = boGroup.prepareMessage("Test text")
assertEquals(boGroup.messages().size, 2)
assertEquals(boGroup.messages(deliveryStatus = MessageDeliveryStatus.PUBLISHED).size, 1)
assertEquals(boGroup.messages(deliveryStatus = MessageDeliveryStatus.UNPUBLISHED).size, 1)
runBlocking { alixClient.conversations.syncGroups() }
val alixGroup: Group = alixClient.findGroup(boGroup.id)!!
assert(!alixClient.contacts.isGroupAllowed(boGroup.id))
val preparedMessage = runBlocking { alixGroup.prepareMessage("Test text") }
assert(alixClient.contacts.isGroupAllowed(boGroup.id))
assertEquals(alixGroup.messages().size, 1)
assertEquals(alixGroup.messages(deliveryStatus = MessageDeliveryStatus.PUBLISHED).size, 0)
assertEquals(alixGroup.messages(deliveryStatus = MessageDeliveryStatus.UNPUBLISHED).size, 1)

runBlocking {
preparedMessage.publish()
boGroup.sync()
alixGroup.sync()
}

assertEquals(boGroup.messages(deliveryStatus = MessageDeliveryStatus.PUBLISHED).size, 2)
assertEquals(boGroup.messages(deliveryStatus = MessageDeliveryStatus.UNPUBLISHED).size, 0)
assertEquals(boGroup.messages().size, 2)
assertEquals(alixGroup.messages(deliveryStatus = MessageDeliveryStatus.PUBLISHED).size, 1)
assertEquals(alixGroup.messages(deliveryStatus = MessageDeliveryStatus.UNPUBLISHED).size, 0)
assertEquals(alixGroup.messages().size, 1)

val message = boGroup.messages().first()
val message = alixGroup.messages().first()

assertEquals(preparedMessage.messageId, message.id)
}
Expand Down
8 changes: 4 additions & 4 deletions library/src/main/java/org/xmtp/android/library/Client.kt
Original file line number Diff line number Diff line change
Expand Up @@ -532,21 +532,21 @@ class Client() {
}
}

fun findGroup(groupId: ByteArray): Group? {
fun findGroup(groupId: String): Group? {
v3Client?.let {
try {
return Group(this, it.group(groupId))
return Group(this, it.group(groupId.hexToByteArray()))
} catch (e: Exception) {
return null
}
}
throw XMTPException("Error no V3 client initialized")
}

fun findMessage(messageId: ByteArray): MessageV3? {
fun findMessage(messageId: String): MessageV3? {
v3Client?.let {
try {
return MessageV3(this, it.message(messageId))
return MessageV3(this, it.message(messageId.hexToByteArray()))
} catch (e: Exception) {
return null
}
Expand Down
16 changes: 8 additions & 8 deletions library/src/main/java/org/xmtp/android/library/Contacts.kt
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,8 @@ class ConsentList(
return entry?.consentType ?: ConsentState.UNKNOWN
}

fun groupState(groupId: ByteArray): ConsentState {
val entry = entries[ConsentListEntry.groupId(groupId.toHex()).key]
fun groupState(groupId: String): ConsentState {
val entry = entries[ConsentListEntry.groupId(groupId).key]

return entry?.consentType ?: ConsentState.UNKNOWN
}
Expand Down Expand Up @@ -288,16 +288,16 @@ data class Contacts(
consentList.publish(entries)
}

suspend fun allowGroups(groupIds: List<ByteArray>) {
suspend fun allowGroups(groupIds: List<String>) {
val entries = groupIds.map {
consentList.allowGroup(it.toHex())
consentList.allowGroup(it)
}
consentList.publish(entries)
}

suspend fun denyGroups(groupIds: List<ByteArray>) {
suspend fun denyGroups(groupIds: List<String>) {
val entries = groupIds.map {
consentList.denyGroup(it.toHex())
consentList.denyGroup(it)
}
consentList.publish(entries)
}
Expand All @@ -324,11 +324,11 @@ data class Contacts(
return consentList.state(address) == ConsentState.DENIED
}

fun isGroupAllowed(groupId: ByteArray): Boolean {
fun isGroupAllowed(groupId: String): Boolean {
return consentList.groupState(groupId) == ConsentState.ALLOWED
}

fun isGroupDenied(groupId: ByteArray): Boolean {
fun isGroupDenied(groupId: String): Boolean {
return consentList.groupState(groupId) == ConsentState.DENIED
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ data class Conversations(
groupPinnedFrameUrl = groupPinnedFrameUrl
)
) ?: throw XMTPException("Client does not support Groups")
client.contacts.allowGroups(groupIds = listOf(group.id()))
client.contacts.allowGroups(groupIds = listOf(group.id().toHex()))

return Group(client, group)
}
Expand Down
11 changes: 7 additions & 4 deletions library/src/main/java/org/xmtp/android/library/Group.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ import kotlin.time.Duration.Companion.nanoseconds
import kotlin.time.DurationUnit

class Group(val client: Client, private val libXMTPGroup: FfiGroup) {
val id: ByteArray
get() = libXMTPGroup.id()
val id: String
get() = libXMTPGroup.id().toHex()

val topic: String
get() = Topic.groupMessage(id.toHex()).description
get() = Topic.groupMessage(id).description

val createdAt: Date
get() = Date(libXMTPGroup.createdAtNs() / 1_000_000)
Expand Down Expand Up @@ -100,7 +100,10 @@ class Group(val client: Client, private val libXMTPGroup: FfiGroup) {
return encoded
}

fun <T> prepareMessage(content: T, options: SendOptions? = null): UnpublishedMessage {
suspend fun <T> prepareMessage(content: T, options: SendOptions? = null): UnpublishedMessage {
if (client.contacts.consentList.groupState(groupId = id) == ConsentState.UNKNOWN) {
client.contacts.allowGroups(groupIds = listOf(id))
}
val encodeContent = encodeContent(content = content, options = options)
return UnpublishedMessage(libXMTPGroup.sendOptimistic(encodeContent.toByteArray()))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ import java.util.Date

data class MessageV3(val client: Client, private val libXMTPMessage: FfiMessage) {

val id: ByteArray
get() = libXMTPMessage.id
val id: String
get() = libXMTPMessage.id.toHex()

val convoId: ByteArray
get() = libXMTPMessage.convoId
val convoId: String
get() = libXMTPMessage.convoId.toHex()

val senderInboxId: String
get() = libXMTPMessage.senderInboxId
Expand All @@ -39,9 +39,9 @@ data class MessageV3(val client: Client, private val libXMTPMessage: FfiMessage)
fun decode(): DecodedMessage {
try {
val decodedMessage = DecodedMessage(
id = id.toHex(),
id = id,
client = client,
topic = Topic.groupMessage(convoId.toHex()).description,
topic = Topic.groupMessage(convoId).description,
encodedContent = EncodedContent.parseFrom(libXMTPMessage.content),
senderAddress = senderInboxId,
sent = sentAt,
Expand Down Expand Up @@ -76,8 +76,8 @@ data class MessageV3(val client: Client, private val libXMTPMessage: FfiMessage)

fun decrypt(): DecryptedMessage {
return DecryptedMessage(
id = id.toHex(),
topic = Topic.groupMessage(convoId.toHex()).description,
id = id,
topic = Topic.groupMessage(convoId).description,
encodedContent = decode().encodedContent,
senderAddress = senderInboxId,
sentAt = sentAt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ class UnpublishedMessage(private val libXMTPUnpublishedMessage: FfiUnpublishedMe
val messageId: String
get() = libXMTPUnpublishedMessage.id().toHex()

suspend fun publish() {
suspend fun publish(): String {
libXMTPUnpublishedMessage.publish()
return messageId
}
}

0 comments on commit 4d7e05c

Please sign in to comment.