Skip to content

Commit

Permalink
Consent filtering by array (#371)
Browse files Browse the repository at this point in the history
* reformat the file

* undo formatting

* consent filtering

* turn off history sync

* add the inboxid functions

* write a bunch of tests

* add test for last message

* small rename clean up

* fix up read reciepts test
  • Loading branch information
nplasterer authored Jan 17, 2025
1 parent 9ec2055 commit 51c7b17
Show file tree
Hide file tree
Showing 14 changed files with 1,111 additions and 762 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,18 +78,29 @@ class ConversationsTest {
runBlocking { boClient.conversations.newGroup(listOf(caro.walletAddress)) }
assertEquals(runBlocking { boClient.conversations.list().size }, 2)
assertEquals(
runBlocking { boClient.conversations.list(consentState = ConsentState.ALLOWED).size },
runBlocking { boClient.conversations.list(consentStates = listOf(ConsentState.ALLOWED)).size },
2
)
runBlocking { group.updateConsentState(ConsentState.DENIED) }
assertEquals(
runBlocking { boClient.conversations.list(consentState = ConsentState.ALLOWED).size },
runBlocking { boClient.conversations.list(consentStates = listOf(ConsentState.ALLOWED)).size },
1
)
assertEquals(
runBlocking { boClient.conversations.list(consentState = ConsentState.DENIED).size },
runBlocking { boClient.conversations.list(consentStates = listOf(ConsentState.DENIED)).size },
1
)
assertEquals(
runBlocking {
boClient.conversations.list(
consentStates = listOf(
ConsentState.DENIED,
ConsentState.ALLOWED
)
).size
},
2
)
assertEquals(runBlocking { boClient.conversations.list().size }, 2)
}

Expand Down Expand Up @@ -119,17 +130,51 @@ class ConversationsTest {
runBlocking { boClient.conversations.newGroup(listOf(caro.walletAddress)) }
assert(runBlocking { boClient.conversations.syncAllConversations() }.toInt() >= 2)
assert(
runBlocking { boClient.conversations.syncAllConversations(consentState = ConsentState.ALLOWED) }.toInt() >= 2
runBlocking {
boClient.conversations.syncAllConversations(
consentStates = listOf(
ConsentState.ALLOWED
)
)
}.toInt() >= 2
)
assert(
runBlocking { boClient.conversations.syncAllConversations(consentState = ConsentState.DENIED) }.toInt() <= 1
runBlocking {
boClient.conversations.syncAllConversations(
consentStates = listOf(
ConsentState.DENIED
)
)
}.toInt() <= 1
)
runBlocking { group.updateConsentState(ConsentState.DENIED) }
assert(
runBlocking { boClient.conversations.syncAllConversations(consentState = ConsentState.ALLOWED) }.toInt() <= 2
runBlocking {
boClient.conversations.syncAllConversations(
consentStates = listOf(
ConsentState.ALLOWED
)
)
}.toInt() <= 2
)
assert(
runBlocking {
boClient.conversations.syncAllConversations(
consentStates = listOf(
ConsentState.DENIED
)
)
}.toInt() <= 2
)
assert(
runBlocking { boClient.conversations.syncAllConversations(consentState = ConsentState.DENIED) }.toInt() <= 2
runBlocking {
boClient.conversations.syncAllConversations(
consentStates = listOf(
ConsentState.DENIED,
ConsentState.ALLOWED
)
)
}.toInt() >= 2
)
assert(runBlocking { boClient.conversations.syncAllConversations() }.toInt() >= 2)
}
Expand Down
27 changes: 24 additions & 3 deletions library/src/androidTest/java/org/xmtp/android/library/DmTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,16 @@ class DmTest {
}
}

@Test
fun testCanCreateADmWithInboxId() {
runBlocking {
val convo1 = boClient.conversations.findOrCreateDmWithInboxId(alixClient.inboxId)
alixClient.conversations.sync()
val sameConvo1 = alixClient.conversations.findOrCreateDmWithInboxId(boClient.inboxId)
assertEquals(convo1.id, sameConvo1.id)
}
}

@Test
fun testsCanFindDmByInboxId() {
runBlocking {
Expand Down Expand Up @@ -156,18 +166,29 @@ class DmTest {
val dm = runBlocking { boClient.conversations.findOrCreateDm(alix.walletAddress) }
assertEquals(runBlocking { boClient.conversations.listDms().size }, 2)
assertEquals(
runBlocking { boClient.conversations.listDms(consentState = ConsentState.ALLOWED).size },
runBlocking { boClient.conversations.listDms(consentStates = listOf(ConsentState.ALLOWED)).size },
2
)
runBlocking { dm.updateConsentState(ConsentState.DENIED) }
assertEquals(
runBlocking { boClient.conversations.listDms(consentState = ConsentState.ALLOWED).size },
runBlocking { boClient.conversations.listDms(consentStates = listOf(ConsentState.ALLOWED)).size },
1
)
assertEquals(
runBlocking { boClient.conversations.listDms(consentState = ConsentState.DENIED).size },
runBlocking { boClient.conversations.listDms(consentStates = listOf(ConsentState.DENIED)).size },
1
)
assertEquals(
runBlocking {
boClient.conversations.listDms(
consentStates = listOf(
ConsentState.ALLOWED,
ConsentState.DENIED
)
).size
},
2
)
assertEquals(runBlocking { boClient.conversations.listDms().size }, 2)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -506,4 +506,38 @@ class GroupPermissionsTest {
runBlocking { alixClient.conversations.sync() }
assert(runBlocking { alixClient.conversations.listGroups() }.size == 1)
}

@Test
fun canCreateGroupWithInboxIdCustomPermissions() {
val permissionPolicySet = PermissionPolicySet(
addMemberPolicy = PermissionOption.Admin,
removeMemberPolicy = PermissionOption.Deny,
addAdminPolicy = PermissionOption.Admin,
removeAdminPolicy = PermissionOption.SuperAdmin,
updateGroupNamePolicy = PermissionOption.Admin,
updateGroupDescriptionPolicy = PermissionOption.Allow,
updateGroupImagePolicy = PermissionOption.Admin,
updateGroupPinnedFrameUrlPolicy = PermissionOption.Deny,
updateMessageExpirationPolicy = PermissionOption.Admin,
)
val boGroup = runBlocking {
boClient.conversations.newGroupCustomPermissionsWithInboxIds(
inboxIds = listOf(alixClient.inboxId, caroClient.inboxId),
permissionPolicySet = permissionPolicySet,
)
}
runBlocking { alixClient.conversations.sync() }
val alixGroup = runBlocking { alixClient.conversations.listGroups().first() }

// Verify permission look correct
val alixPermissionSet = alixGroup.permissionPolicySet()
assert(alixPermissionSet.addMemberPolicy == PermissionOption.Admin)
assert(alixPermissionSet.removeMemberPolicy == PermissionOption.Deny)
assert(alixPermissionSet.addAdminPolicy == PermissionOption.Admin)
assert(alixPermissionSet.removeAdminPolicy == PermissionOption.SuperAdmin)
assert(alixPermissionSet.updateGroupNamePolicy == PermissionOption.Admin)
assert(alixPermissionSet.updateGroupDescriptionPolicy == PermissionOption.Allow)
assert(alixPermissionSet.updateGroupImagePolicy == PermissionOption.Admin)
assert(alixPermissionSet.updateGroupPinnedFrameUrlPolicy == PermissionOption.Deny)
}
}
57 changes: 54 additions & 3 deletions library/src/androidTest/java/org/xmtp/android/library/GroupTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,46 @@ class GroupTest {
assert(!runBlocking { alixGroup.isCreator() })
}

@Test
fun testCanCreateAGroupWithInboxIdsDefaultPermissions() {
val boGroup = runBlocking {
boClient.conversations.newGroupWithInboxIds(listOf(alixClient.inboxId))
}
runBlocking {
alixClient.conversations.sync()
boGroup.sync()
}
val alixGroup = runBlocking { alixClient.conversations.listGroups().first() }
assert(boGroup.id.isNotEmpty())
assert(alixGroup.id.isNotEmpty())

runBlocking {
alixGroup.addMembers(listOf(caro.walletAddress))
boGroup.sync()
}
assertEquals(runBlocking { alixGroup.members().size }, 3)
assertEquals(runBlocking { boGroup.members().size }, 3)

// All members also defaults remove to admin only now.
assertThrows(XMTPException::class.java) {
runBlocking {
alixGroup.removeMembers(listOf(caro.walletAddress))
boGroup.sync()
}
}

assertEquals(runBlocking { alixGroup.members().size }, 3)
assertEquals(runBlocking { boGroup.members().size }, 3)

assertEquals(boGroup.permissionPolicySet().addMemberPolicy, PermissionOption.Allow)
assertEquals(alixGroup.permissionPolicySet().addMemberPolicy, PermissionOption.Allow)
assertEquals(boGroup.isSuperAdmin(boClient.inboxId), true)
assertEquals(boGroup.isSuperAdmin(alixClient.inboxId), false)
assertEquals(alixGroup.isSuperAdmin(boClient.inboxId), true)
assertEquals(alixGroup.isSuperAdmin(alixClient.inboxId), false)
assert(!runBlocking { alixGroup.isCreator() })
}

@Test
fun testCanListGroupMembers() {
val group = runBlocking {
Expand Down Expand Up @@ -488,18 +528,29 @@ class GroupTest {
runBlocking { boClient.conversations.newGroup(listOf(caro.walletAddress)) }
assertEquals(runBlocking { boClient.conversations.listGroups().size }, 2)
assertEquals(
runBlocking { boClient.conversations.listGroups(consentState = ConsentState.ALLOWED).size },
runBlocking { boClient.conversations.listGroups(consentStates = listOf(ConsentState.ALLOWED)).size },
2
)
runBlocking { group.updateConsentState(ConsentState.DENIED) }
assertEquals(
runBlocking { boClient.conversations.listGroups(consentState = ConsentState.ALLOWED).size },
runBlocking { boClient.conversations.listGroups(consentStates = listOf(ConsentState.ALLOWED)).size },
1
)
assertEquals(
runBlocking { boClient.conversations.listGroups(consentState = ConsentState.DENIED).size },
runBlocking { boClient.conversations.listGroups(consentStates = listOf(ConsentState.DENIED)).size },
1
)
assertEquals(
runBlocking {
boClient.conversations.listGroups(
consentStates = listOf(
ConsentState.ALLOWED,
ConsentState.DENIED
)
).size
},
2
)
assertEquals(runBlocking { boClient.conversations.listGroups().size }, 2)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,31 @@ class ReadReceiptTest {
Client.register(codec = ReadReceiptCodec())

val fixtures = fixtures()
val aliceClient = fixtures.alixClient
val aliceConversation = runBlocking {
aliceClient.conversations.newConversation(fixtures.bo.walletAddress)
val alixClient = fixtures.alixClient
val alixConversation = runBlocking {
alixClient.conversations.newConversation(fixtures.bo.walletAddress)
}

runBlocking { aliceConversation.send(text = "hey alice 2 bob") }
runBlocking { alixConversation.send(text = "hey alice 2 bob") }

val readReceipt = ReadReceipt

runBlocking {
aliceConversation.send(
alixConversation.send(
content = readReceipt,
options = SendOptions(contentType = ContentTypeReadReceipt),
)
}
val messages = runBlocking { aliceConversation.messages() }
val messages = runBlocking { alixConversation.messages() }
assertEquals(messages.size, 2)
if (messages.size == 2) {
val contentType: String = messages.first().encodedContent.type.typeId
assertEquals(contentType, "readReceipt")
}
val convos = runBlocking { alixClient.conversations.list() }
assertEquals(
runBlocking { convos.first().lastMessage() }!!.encodedContent.type.typeId,
"text"
)
}
}
1 change: 0 additions & 1 deletion library/src/main/java/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@ Kotlin code emitted by the `bindings_ffi` crate in [libxmtp](https://github.com/
1. From repo [libxmtp](https://github.com/xmtp/libxmtp) run the [kotlin release action](https://github.com/xmtp/libxmtp/actions/workflows/release-kotlin-bindings.yml) for the branch you desire (this should take about 4 minutes)
2. Once you see the [kotlin bindings GitHub action](https://github.com/xmtp/libxmtp/actions/workflows/release-kotlin-bindings.yml) is finished, with `libxmtp` repo and `xmtp-android` (this repo) cloned locally in sibling directories, and `libxmtp` checked out to the correct release commit, run the script:
`./gen_kotlin.sh` within the `bindings_ffi` folder.
3. **(If only testing, you can skip this step**)Run format (cmd + opt + l) function to keep the code format consistent and diff small for `xmtp-android/library/src/main/java/xmtpv3.kt`

You should now be on the latest libxmtp. Tests will fail if the jniLibs do not match the version of xmtpv3.
4 changes: 2 additions & 2 deletions library/src/main/java/libxmtp-version.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
Version: f04e0049
Version: fc37819c
Branch: main
Date: 2025-01-14 23:09:48 +0000
Date: 2025-01-17 01:38:53 +0000
6 changes: 1 addition & 5 deletions library/src/main/java/org/xmtp/android/library/Client.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,7 @@ data class ClientOptions(
val preAuthenticateToInboxCallback: PreEventCallback? = null,
val appContext: Context,
val dbEncryptionKey: ByteArray,
val historySyncUrl: String = when (api.env) {
XMTPEnvironment.PRODUCTION -> "https://message-history.production.ephemera.network/"
XMTPEnvironment.LOCAL -> "http://10.0.2.2:5558"
else -> "https://message-history.dev.ephemera.network/"
},
val historySyncUrl: String? = null,
val dbDirectory: String? = null,
) {
data class Api(
Expand Down
Loading

0 comments on commit 51c7b17

Please sign in to comment.