From 3e43a75acd7a95d370f61a6a53819618a3de2b13 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 19 Jul 2024 09:46:58 -0400 Subject: [PATCH 1/5] Fixes the keyboard overriding parts of the screen --- .../vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt index 27ff5c064..ace6774cf 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt @@ -35,6 +35,7 @@ import androidx.compose.animation.togetherWith import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.DrawerValue @@ -485,7 +486,7 @@ private fun MainScaffold( } }, ) { - Column(modifier = Modifier.padding(it)) { + Column(modifier = Modifier.padding(it).imePadding()) { AppNavigation( homeFeedViewModel = homeFeedViewModel, repliesFeedViewModel = repliesFeedViewModel, From 59b3ff1b940a30683b902b5773027e2598b9667c Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 19 Jul 2024 07:58:12 -0300 Subject: [PATCH 2/5] Added sendAndWaitForResponse to Client.kt --- .../vitorpamplona/ammolite/relays/Client.kt | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt index 12bc0a62f..f9d5bb1c3 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt @@ -29,6 +29,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import java.util.UUID +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit /** * The Nostr Client manages multiple personae the user may switch between. Events are received and @@ -130,6 +132,68 @@ object Client : RelayPool.Listener { RelayPool.sendFilter(subscriptionId, filters) } + fun sendAndWaitForResponse( + signedEvent: EventInterface, + relay: String? = null, + feedTypes: Set? = null, + relayList: List? = null, + onDone: (() -> Unit)? = null, + timeoutInSeconds: Long = 30, + ) { + checkNotInMainThread() + + val size = if (relay != null) 1 else relayList?.size ?: RelayPool.availableRelays() + val latch = CountDownLatch(size) + + Log.d("Relay", "Waiting for $size responses") + + subscribe( + object : Listener() { + override fun onEvent( + event: Event, + subscriptionId: String, + relay: Relay, + afterEOSE: Boolean, + ) { + if (event.id() == signedEvent.id()) { + unsubscribe(this) + latch.countDown() + Log.d("Relay", "Received response for ${event.id()} relay ${relay.url} count: ${latch.count}") + } + } + + override fun onError(error: Error, subscriptionId: String, relay: Relay) { + unsubscribe(this) + latch.countDown() + Log.d("Relay", "Error from relay ${relay.url} count: ${latch.count} error: $error") + } + + override fun onRelayStateChange( + type: Relay.StateType, + relay: Relay, + subscriptionId: String?, + ) { + if (type == Relay.StateType.DISCONNECT) { + unsubscribe(this) + latch.countDown() + Log.d("Relay", "Disconnected from relay ${relay.url} count: ${latch.count}") + } + } + + override fun onSendResponse(eventId: String, success: Boolean, message: String, relay: Relay) { + if (eventId == signedEvent.id()) { + unsubscribe(this) + latch.countDown() + Log.d("Relay", "Received response for $eventId from relay ${relay.url} count: ${latch.count}") + } + } + }, + ) + + send(signedEvent, relay, feedTypes, relayList, onDone) + latch.await(timeoutInSeconds, TimeUnit.SECONDS) + } + fun sendFilterOnlyIfDisconnected( subscriptionId: String = UUID.randomUUID().toString().substring(0..10), filters: List = listOf(), From 62a2cba18b170b99640c1a53156436c653153406 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 19 Jul 2024 08:05:04 -0300 Subject: [PATCH 3/5] fix lint --- .../com/vitorpamplona/ammolite/relays/Client.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt index f9d5bb1c3..e41972900 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt @@ -162,7 +162,11 @@ object Client : RelayPool.Listener { } } - override fun onError(error: Error, subscriptionId: String, relay: Relay) { + override fun onError( + error: Error, + subscriptionId: String, + relay: Relay, + ) { unsubscribe(this) latch.countDown() Log.d("Relay", "Error from relay ${relay.url} count: ${latch.count} error: $error") @@ -180,7 +184,12 @@ object Client : RelayPool.Listener { } } - override fun onSendResponse(eventId: String, success: Boolean, message: String, relay: Relay) { + override fun onSendResponse( + eventId: String, + success: Boolean, + message: String, + relay: Relay, + ) { if (eventId == signedEvent.id()) { unsubscribe(this) latch.countDown() From d0190c87a2b5f9e7b69d480a672ccec1c27573d7 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 19 Jul 2024 10:50:59 -0300 Subject: [PATCH 4/5] add more logs, add optional listener, fix await call --- .../vitorpamplona/ammolite/relays/Client.kt | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt index e41972900..53c663582 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt @@ -28,6 +28,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import java.util.UUID import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit @@ -132,44 +133,35 @@ object Client : RelayPool.Listener { RelayPool.sendFilter(subscriptionId, filters) } - fun sendAndWaitForResponse( + @OptIn(DelicateCoroutinesApi::class) + suspend fun sendAndWaitForResponse( signedEvent: EventInterface, relay: String? = null, feedTypes: Set? = null, relayList: List? = null, onDone: (() -> Unit)? = null, + additionalListener: Listener? = null, timeoutInSeconds: Long = 30, ) { checkNotInMainThread() val size = if (relay != null) 1 else relayList?.size ?: RelayPool.availableRelays() val latch = CountDownLatch(size) + val relayErrors = mutableMapOf() - Log.d("Relay", "Waiting for $size responses") + Log.d("sendAndWaitForResponse", "Waiting for $size responses") - subscribe( + val subscription = object : Listener() { - override fun onEvent( - event: Event, - subscriptionId: String, - relay: Relay, - afterEOSE: Boolean, - ) { - if (event.id() == signedEvent.id()) { - unsubscribe(this) - latch.countDown() - Log.d("Relay", "Received response for ${event.id()} relay ${relay.url} count: ${latch.count}") - } - } - override fun onError( error: Error, subscriptionId: String, relay: Relay, ) { - unsubscribe(this) - latch.countDown() - Log.d("Relay", "Error from relay ${relay.url} count: ${latch.count} error: $error") + relayErrors[relay.url]?.let { + latch.countDown() + } + Log.d("sendAndWaitForResponse", "onError Error from relay ${relay.url} count: ${latch.count} error: $error") } override fun onRelayStateChange( @@ -178,9 +170,8 @@ object Client : RelayPool.Listener { subscriptionId: String?, ) { if (type == Relay.StateType.DISCONNECT) { - unsubscribe(this) latch.countDown() - Log.d("Relay", "Disconnected from relay ${relay.url} count: ${latch.count}") + Log.d("sendAndWaitForResponse", "onRelayStateChange Disconnected from relay ${relay.url} count: ${latch.count}") } } @@ -191,16 +182,27 @@ object Client : RelayPool.Listener { relay: Relay, ) { if (eventId == signedEvent.id()) { - unsubscribe(this) latch.countDown() - Log.d("Relay", "Received response for $eventId from relay ${relay.url} count: ${latch.count}") + Log.d("sendAndWaitForResponse", "onSendResponse Received response for $eventId from relay ${relay.url} count: ${latch.count} message $message success $success") } } - }, - ) + } - send(signedEvent, relay, feedTypes, relayList, onDone) - latch.await(timeoutInSeconds, TimeUnit.SECONDS) + subscribe(subscription) + additionalListener?.let { subscribe(it) } + + val job = + GlobalScope.launch(Dispatchers.IO) { + send(signedEvent, relay, feedTypes, relayList, onDone) + } + job.join() + + runBlocking { + latch.await(timeoutInSeconds, TimeUnit.SECONDS) + } + Log.d("sendAndWaitForResponse", "countdown finished") + unsubscribe(subscription) + additionalListener?.let { unsubscribe(it) } } fun sendFilterOnlyIfDisconnected( From 80c369a6ae0ece9772440673b1e1bb93e2b1f4f6 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 19 Jul 2024 10:52:36 -0300 Subject: [PATCH 5/5] change default timeout to 15 seconds --- .../src/main/java/com/vitorpamplona/ammolite/relays/Client.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt index 53c663582..12ef2ce52 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Client.kt @@ -141,7 +141,7 @@ object Client : RelayPool.Listener { relayList: List? = null, onDone: (() -> Unit)? = null, additionalListener: Listener? = null, - timeoutInSeconds: Long = 30, + timeoutInSeconds: Long = 15, ) { checkNotInMainThread()