From 752f72236c4e9010feb9fa469d72460a0a79d919 Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Thu, 11 Apr 2024 16:21:41 -0700 Subject: [PATCH 1/5] get pagination working --- .../xmtp/android/library/ConversationTest.kt | 27 +++++++++++++++++++ .../org/xmtp/android/library/ApiClient.kt | 4 --- .../java/org/xmtp/android/library/Contacts.kt | 3 ++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt b/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt index 8cfb1a57a..0b233dc4f 100644 --- a/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt +++ b/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt @@ -1,5 +1,6 @@ package org.xmtp.android.library +import android.util.Log import androidx.test.ext.junit.runners.AndroidJUnit4 import app.cash.turbine.test import com.google.protobuf.kotlin.toByteString @@ -910,4 +911,30 @@ class ConversationTest { assertFalse(Topic.isValidTopic(directMessageV2)) assertFalse(Topic.isValidTopic(preferenceList)) } + + @Test + fun testBigWallet() { + val privateKeyData = listOf(0x08, 0x36, 0x20, 0x0f, 0xfa, 0xfa, 0x17, 0xa3, 0xcb, 0x8b, 0x54, 0xf2, 0x2d, 0x6a, 0xfa, 0x60, 0xb1, 0x3d, 0xa4, 0x87, 0x26, 0x54, 0x32, 0x41, 0xad, 0xc5, 0xc2, 0x50, 0xdb, 0xb0, 0xe0, 0xcd) + .map { it.toByte() } + .toByteArray() + // Use hardcoded privateKey + val privateKey = PrivateKeyBuilder.buildFromPrivateKeyData(privateKeyData) + val privateKeyBuilder = PrivateKeyBuilder(privateKey) + val options = + ClientOptions(api = ClientOptions.Api(env = XMTPEnvironment.DEV)) + val client = Client().create(account = privateKeyBuilder, options = options) + + runBlocking { + val start = Date() + val consentList = client.contacts.refreshConsentList() + val end = Date() + Log.d("LOPI", "Loaded ${consentList.entries.size} consent entries in ${(end.time - start.time) / 1000.0}s") + + + val start2 = Date() + val consentList2 = client.contacts.refreshConsentList() + val end2 = Date() + Log.d("LOPI", "Second time loaded ${consentList2.entries.size} consent entries in ${(end2.time - start2.time) / 1000.0}s") + } + } } diff --git a/library/src/main/java/org/xmtp/android/library/ApiClient.kt b/library/src/main/java/org/xmtp/android/library/ApiClient.kt index 9766c574d..b10c5c390 100644 --- a/library/src/main/java/org/xmtp/android/library/ApiClient.kt +++ b/library/src/main/java/org/xmtp/android/library/ApiClient.kt @@ -138,10 +138,6 @@ data class GRPCApiClient( envelopes.addAll(response.envelopesList) cursor = response.pagingInfo.cursor hasNextPage = response.envelopesList.isNotEmpty() && response.pagingInfo.hasCursor() - if (pagination?.limit != null && envelopes.size >= pagination.limit) { - envelopes = envelopes.take(pagination.limit).toMutableList() - break - } } return envelopes } diff --git a/library/src/main/java/org/xmtp/android/library/Contacts.kt b/library/src/main/java/org/xmtp/android/library/Contacts.kt index a11960556..f998ce5b0 100644 --- a/library/src/main/java/org/xmtp/android/library/Contacts.kt +++ b/library/src/main/java/org/xmtp/android/library/Contacts.kt @@ -70,7 +70,8 @@ class ConsentList( Topic.preferenceList(identifier).description, Pagination( after = lastFetched, - direction = MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING + direction = MessageApiOuterClass.SortDirection.SORT_DIRECTION_ASCENDING, + limit = 500 ), ) lastFetched = newDate From 359830fb9180e4550a86ffc9a8f1f18d9b64e8ec Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Thu, 11 Apr 2024 16:33:56 -0700 Subject: [PATCH 2/5] add logging to the envelopes --- library/src/main/java/org/xmtp/android/library/Contacts.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/library/src/main/java/org/xmtp/android/library/Contacts.kt b/library/src/main/java/org/xmtp/android/library/Contacts.kt index f998ce5b0..c350c0be8 100644 --- a/library/src/main/java/org/xmtp/android/library/Contacts.kt +++ b/library/src/main/java/org/xmtp/android/library/Contacts.kt @@ -1,5 +1,6 @@ package org.xmtp.android.library +import android.util.Log import com.google.protobuf.kotlin.toByteStringUtf8 import kotlinx.coroutines.runBlocking import org.xmtp.android.library.messages.ContactBundle @@ -65,6 +66,7 @@ class ConsentList( @OptIn(ExperimentalUnsignedTypes::class) suspend fun load(): List { val newDate = Date() + val start = Date() val envelopes = client.apiClient.envelopes( Topic.preferenceList(identifier).description, @@ -74,6 +76,9 @@ class ConsentList( limit = 500 ), ) + val end = Date() + Log.d("LOPI", "Loaded ${envelopes.size} consent envelopes in ${(end.time - start.time) / 1000.0}s") + lastFetched = newDate val preferences: MutableList = mutableListOf() for (envelope in envelopes) { From 0000585aa5f3f20ec7809af0618c8710757247a8 Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Fri, 12 Apr 2024 13:16:44 -0700 Subject: [PATCH 3/5] update the logic for pagination --- .../org/xmtp/android/library/ApiClient.kt | 13 ++++++-- .../android/library/messages/PagingInfo.kt | 30 +++---------------- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/library/src/main/java/org/xmtp/android/library/ApiClient.kt b/library/src/main/java/org/xmtp/android/library/ApiClient.kt index b10c5c390..4f6480d75 100644 --- a/library/src/main/java/org/xmtp/android/library/ApiClient.kt +++ b/library/src/main/java/org/xmtp/android/library/ApiClient.kt @@ -129,16 +129,25 @@ data class GRPCApiClient( * It yields all the envelopes in the query using the paging info * from the prior response to fetch the next page. */ - override suspend fun envelopes(topic: String, pagination: Pagination?): List { + override suspend fun envelopes( + topic: String, + pagination: Pagination?, + ): List { var envelopes: MutableList = mutableListOf() var hasNextPage = true var cursor: Cursor? = null while (hasNextPage) { - val response = query(topic = topic, pagination = pagination, cursor = cursor) + val response = + query(topic = topic, pagination = pagination, cursor = cursor) envelopes.addAll(response.envelopesList) cursor = response.pagingInfo.cursor hasNextPage = response.envelopesList.isNotEmpty() && response.pagingInfo.hasCursor() + if (pagination?.limit != null && pagination.limit <= 100 && envelopes.size >= pagination.limit) { + envelopes = envelopes.take(pagination.limit).toMutableList() + break + } } + return envelopes } diff --git a/library/src/main/java/org/xmtp/android/library/messages/PagingInfo.kt b/library/src/main/java/org/xmtp/android/library/messages/PagingInfo.kt index 6f3f5dc3b..2c6d3938c 100644 --- a/library/src/main/java/org/xmtp/android/library/messages/PagingInfo.kt +++ b/library/src/main/java/org/xmtp/android/library/messages/PagingInfo.kt @@ -16,35 +16,13 @@ data class Pagination( ) { val pagingInfo: PagingInfo get() { - return PagingInfo.newBuilder().also { - if (limit != null) { - it.limit = limit + return PagingInfo.newBuilder().also { page -> + limit?.let { + page.limit = it } if (direction != null) { - it.direction = direction + page.direction = direction } }.build() } } - -class PagingInfoBuilder { - companion object { - fun buildFromPagingInfo( - limit: Int? = null, - cursor: PagingInfoCursor? = null, - direction: PagingInfoSortDirection? = null, - ): PagingInfo { - return PagingInfo.newBuilder().also { - if (limit != null) { - it.limit = limit - } - if (cursor != null) { - it.cursor = cursor - } - if (direction != null) { - it.direction = direction - } - }.build() - } - } -} From c8f3412c1d63ecaffe09f9b3415700b7400d013d Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Fri, 12 Apr 2024 13:17:51 -0700 Subject: [PATCH 4/5] remove testing code --- .../xmtp/android/library/ConversationTest.kt | 27 ------------------- .../java/org/xmtp/android/library/Contacts.kt | 4 --- 2 files changed, 31 deletions(-) diff --git a/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt b/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt index 0b233dc4f..8cfb1a57a 100644 --- a/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt +++ b/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt @@ -1,6 +1,5 @@ package org.xmtp.android.library -import android.util.Log import androidx.test.ext.junit.runners.AndroidJUnit4 import app.cash.turbine.test import com.google.protobuf.kotlin.toByteString @@ -911,30 +910,4 @@ class ConversationTest { assertFalse(Topic.isValidTopic(directMessageV2)) assertFalse(Topic.isValidTopic(preferenceList)) } - - @Test - fun testBigWallet() { - val privateKeyData = listOf(0x08, 0x36, 0x20, 0x0f, 0xfa, 0xfa, 0x17, 0xa3, 0xcb, 0x8b, 0x54, 0xf2, 0x2d, 0x6a, 0xfa, 0x60, 0xb1, 0x3d, 0xa4, 0x87, 0x26, 0x54, 0x32, 0x41, 0xad, 0xc5, 0xc2, 0x50, 0xdb, 0xb0, 0xe0, 0xcd) - .map { it.toByte() } - .toByteArray() - // Use hardcoded privateKey - val privateKey = PrivateKeyBuilder.buildFromPrivateKeyData(privateKeyData) - val privateKeyBuilder = PrivateKeyBuilder(privateKey) - val options = - ClientOptions(api = ClientOptions.Api(env = XMTPEnvironment.DEV)) - val client = Client().create(account = privateKeyBuilder, options = options) - - runBlocking { - val start = Date() - val consentList = client.contacts.refreshConsentList() - val end = Date() - Log.d("LOPI", "Loaded ${consentList.entries.size} consent entries in ${(end.time - start.time) / 1000.0}s") - - - val start2 = Date() - val consentList2 = client.contacts.refreshConsentList() - val end2 = Date() - Log.d("LOPI", "Second time loaded ${consentList2.entries.size} consent entries in ${(end2.time - start2.time) / 1000.0}s") - } - } } diff --git a/library/src/main/java/org/xmtp/android/library/Contacts.kt b/library/src/main/java/org/xmtp/android/library/Contacts.kt index c350c0be8..edadf7422 100644 --- a/library/src/main/java/org/xmtp/android/library/Contacts.kt +++ b/library/src/main/java/org/xmtp/android/library/Contacts.kt @@ -1,6 +1,5 @@ package org.xmtp.android.library -import android.util.Log import com.google.protobuf.kotlin.toByteStringUtf8 import kotlinx.coroutines.runBlocking import org.xmtp.android.library.messages.ContactBundle @@ -66,7 +65,6 @@ class ConsentList( @OptIn(ExperimentalUnsignedTypes::class) suspend fun load(): List { val newDate = Date() - val start = Date() val envelopes = client.apiClient.envelopes( Topic.preferenceList(identifier).description, @@ -76,8 +74,6 @@ class ConsentList( limit = 500 ), ) - val end = Date() - Log.d("LOPI", "Loaded ${envelopes.size} consent envelopes in ${(end.time - start.time) / 1000.0}s") lastFetched = newDate val preferences: MutableList = mutableListOf() From c6cb5d72495c3cf988069e8b01b68ad1f8c8173b Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Fri, 12 Apr 2024 13:59:55 -0700 Subject: [PATCH 5/5] potential fix for flaky test --- .../java/org/xmtp/android/library/ConversationTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt b/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt index 8cfb1a57a..c6aacc425 100644 --- a/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt +++ b/library/src/androidTest/java/org/xmtp/android/library/ConversationTest.kt @@ -855,6 +855,7 @@ class ConversationTest { val caroConversation = bobClient.conversations.newConversation(fixtures.caro.walletAddress) bobClient.contacts.refreshConsentList() + Thread.sleep(1000) assertEquals(bobClient.contacts.consentList.entries.size, 2) assertTrue(bobConversation.consentState() == ConsentState.ALLOWED) assertTrue(caroConversation.consentState() == ConsentState.ALLOWED)