From a49caa0881524cc5b1308ced700082eae2536b18 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 19 Aug 2026 14:04:19 -0300 Subject: [PATCH] Convert legacy Long millis overloads to kotlin.time.Duration Replace delay/withTimeoutOrNull/debounce Long-millis calls with their kotlin.time.Duration overloads, convert millis timeout constants to Duration vals, and switch retryWithBackoff, the relay reconnect backoff and the sensitive-clipboard clear delay to Duration parameters. --- .../java/com/greenart7c3/nostrsigner/Amber.kt | 7 +++--- .../greenart7c3/nostrsigner/MainViewModel.kt | 3 ++- .../nostrsigner/relays/AmberRelayStat.kt | 9 ++++--- .../relays/NostrClientLoggerListener.kt | 9 ++++--- .../nostrsigner/service/ApplicationBackup.kt | 9 ++++--- .../nostrsigner/service/BunkerRequestUtils.kt | 12 +++++---- .../service/ProfileSubscription.kt | 7 +++--- .../nostrsigner/service/ReportSender.kt | 3 ++- .../nostrsigner/service/UpdateCheckWorker.kt | 5 ++-- .../nostrsigner/service/ZapstoreUpdater.kt | 7 +++--- .../greenart7c3/nostrsigner/ui/LoginScreen.kt | 9 ++++--- .../nostrsigner/ui/SensitiveClipboard.kt | 14 ++++++----- .../nostrsigner/ui/TranslationReportScreen.kt | 3 ++- .../ui/actions/EditRelaysDialog.kt | 12 +++++---- .../SignerProviderBenchmarkTest.kt | 5 ++-- .../service/BunkerRequestUtilsTest.kt | 25 ++++++++++--------- 16 files changed, 79 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt b/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt index 9dd0f868..a94a8ef9 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt @@ -76,6 +76,7 @@ import java.net.Socket import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit import kotlin.coroutines.cancellation.CancellationException +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -410,11 +411,11 @@ class Amber : if (attempt > 0) { TorManager.showRetrying() TorManager.stop() - delay(3000) + delay(3.seconds) TorManager.start(this@Amber, applicationIOScope) } attempt++ - withTimeoutOrNull(120_000L) { + withTimeoutOrNull(120.seconds) { TorManager.isRunning.first { it } } } @@ -553,7 +554,7 @@ class Amber : } AmberLog.d(TAG, "checkForNewRelaysAndUpdateAllFilters wasActive: $wasActive") if (!wasActive) { - delay(3000) + delay(3.seconds) client.connect() } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/MainViewModel.kt b/app/src/main/java/com/greenart7c3/nostrsigner/MainViewModel.kt index 3c339c81..fc693a59 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/MainViewModel.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/MainViewModel.kt @@ -15,6 +15,7 @@ import com.vitorpamplona.quartz.nip19Bech32.Nip19Parser import com.vitorpamplona.quartz.nip19Bech32.entities.NPub import com.vitorpamplona.quartz.nip19Bech32.toNpub import com.vitorpamplona.quartz.utils.Hex +import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -142,7 +143,7 @@ class MainViewModel(val context: Context) : ViewModel() { var error = true var count = 0 while (error && count < 10) { - delay(100) + delay(100.milliseconds) count++ try { if (route == Route.UpdateSettings.route) { diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/relays/AmberRelayStat.kt b/app/src/main/java/com/greenart7c3/nostrsigner/relays/AmberRelayStat.kt index 4fa2541d..3b3fbefd 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/relays/AmberRelayStat.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/relays/AmberRelayStat.kt @@ -24,6 +24,7 @@ import com.greenart7c3.nostrsigner.service.StopServiceReceiver import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.displayUrl +import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.MutableSharedFlow @@ -62,7 +63,7 @@ class AmberRelayStats( @SuppressLint("MissingPermission") val relayStatus = combine(client.availableRelaysFlow(), client.connectedRelaysFlow()) { available, connected -> available to connected - }.debounce(300).onEach { + }.debounce(300.milliseconds).onEach { this.available = it.first this.connected = it.second val notificationManager = NotificationManagerCompat.from(appContext) @@ -115,13 +116,13 @@ class AmberRelayStats( notificationManager.createNotificationChannel(statusChannel) Amber.instance.applicationIOScope.launch { - Amber.instance.client.availableRelaysFlow().debounce(300).collect { + Amber.instance.client.availableRelaysFlow().debounce(300.milliseconds).collect { available = it updateNotification() } } Amber.instance.applicationIOScope.launch { - Amber.instance.client.connectedRelaysFlow().debounce(300).collect { + Amber.instance.client.connectedRelaysFlow().debounce(300.milliseconds).collect { connected = it updateNotification() } @@ -130,7 +131,7 @@ class AmberRelayStats( // Trailing-edge debounce for the counter path (addSent/addFailed): // the last tick of a burst always renders, at most one notify per // 300ms window. - counterTick.debounce(300).collect { + counterTick.debounce(300.milliseconds).collect { updateNotification() } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/relays/NostrClientLoggerListener.kt b/app/src/main/java/com/greenart7c3/nostrsigner/relays/NostrClientLoggerListener.kt index 2ba302c9..bf0b156c 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/relays/NostrClientLoggerListener.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/relays/NostrClientLoggerListener.kt @@ -17,6 +17,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.Command import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.EventCmd import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.ReqCmd import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -52,7 +53,7 @@ class NostrClientLoggerListener( val scope: CoroutineScope, ) : RelayConnectionListener { private var reconnectJob: Job? = null - private var reconnectDelay = 5_000L + private var reconnectDelay = 5.seconds private var lastDisconnectTime = 0L // Counts the failure against the relay and only schedules a reconnect while it @@ -71,15 +72,15 @@ class NostrClientLoggerListener( private fun reconnectWithBackoff() { val now = System.currentTimeMillis() if (now - lastDisconnectTime > 60_000) { - reconnectDelay = 5_000L + reconnectDelay = 5.seconds } lastDisconnectTime = now reconnectJob?.cancel() reconnectJob = scope.launch { - AmberLog.d(Amber.TAG, "Reconnecting in ${reconnectDelay / 1000}s...") + AmberLog.d(Amber.TAG, "Reconnecting in ${reconnectDelay.inWholeSeconds}s...") delay(reconnectDelay) - reconnectDelay = (reconnectDelay * 2).coerceAtMost(60_000L) + reconnectDelay = (reconnectDelay * 2).coerceAtMost(60.seconds) if (!BuildFlavorChecker.isOfflineFlavor() && !Amber.instance.settings.killSwitch.value) { Amber.instance.reconnect() } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/ApplicationBackup.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/ApplicationBackup.kt index 60f88843..8181369c 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/ApplicationBackup.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/ApplicationBackup.kt @@ -24,13 +24,14 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer import com.vitorpamplona.quartz.utils.TimeUtils import java.util.UUID import kotlin.coroutines.cancellation.CancellationException +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.delay private const val BACKUP_KIND = 30078 private const val BACKUP_D_TAG = "amber-app-backup" private const val INBOX_KIND = 10002 -private const val INBOX_FETCH_TIMEOUT_MS = 10_000L -private const val BACKUP_FETCH_TIMEOUT_MS = 15_000L +private val INBOX_FETCH_TIMEOUT = 10.seconds +private val BACKUP_FETCH_TIMEOUT = 15.seconds private const val PAYLOAD_VERSION = 1 private val AGGREGATOR_RELAY = RelayUrlNormalizer.normalizeOrNull("wss://aggr.nostr.land/") @@ -181,7 +182,7 @@ object ApplicationBackup { limit = 1, ) client.subscribe(subId, discoveryRelays.associateWith { listOf(filter) }) - delay(INBOX_FETCH_TIMEOUT_MS) + delay(INBOX_FETCH_TIMEOUT) } catch (e: Exception) { if (e is CancellationException) throw e AmberLog.w(Amber.TAG, "ApplicationBackup: inbox relay fetch failed", e) @@ -273,7 +274,7 @@ object ApplicationBackup { limit = 1, ) client.subscribe(subId, relays.associateWith { listOf(filter) }) - delay(BACKUP_FETCH_TIMEOUT_MS) + delay(BACKUP_FETCH_TIMEOUT) } catch (e: Exception) { if (e is CancellationException) throw e AmberLog.e(Amber.TAG, "ApplicationBackup: failed to fetch backup event", e) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt index 15eaefb3..4538625e 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt @@ -37,6 +37,8 @@ import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerResponse import com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent import com.vitorpamplona.quartz.utils.TimeUtils import kotlin.collections.toSet +import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList @@ -218,11 +220,11 @@ object BunkerRequestUtils { suspend fun retryWithBackoff( maxRetries: Int = 5, - initialDelayMs: Long = 200L, - maxDelayMs: Long = 3_200L, + initialDelay: Duration = 200.milliseconds, + maxDelay: Duration = 3_200.milliseconds, block: suspend () -> Boolean, ): Boolean { - var currentDelay = initialDelayMs + var currentDelay = initialDelay repeat(maxRetries) { attempt -> delay(currentDelay) @@ -231,7 +233,7 @@ object BunkerRequestUtils { } if (attempt < maxRetries - 1) { - currentDelay = (currentDelay * 2).coerceAtMost(maxDelayMs) + currentDelay = (currentDelay * 2).coerceAtMost(maxDelay) } } @@ -397,7 +399,7 @@ object BunkerRequestUtils { activity?.finishAndRemoveTask() } - delay(500) + delay(500.milliseconds) if (signPolicy != null) { AmberUtils.configureSignPolicy(application, signPolicy, key, permissions) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/ProfileSubscription.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/ProfileSubscription.kt index 87f78d58..d7d56d74 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/ProfileSubscription.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/ProfileSubscription.kt @@ -40,13 +40,14 @@ import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.utils.TimeUtils import java.util.UUID import java.util.concurrent.ConcurrentHashMap +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -private const val EOSE_TIMEOUT_MS = 30_000L +private val EOSE_TIMEOUT = 30.seconds class ProfileSubscription( val client: NostrClient, @@ -170,7 +171,7 @@ class ProfileSubscription( relaysPerSubId[subId] = ConcurrentHashMap.newKeySet().apply { addAll(relayListFilter.keys) } client.subscribe(subId, relayListFilter) timeoutJobs[subId] = scope.launch { - delay(EOSE_TIMEOUT_MS) + delay(EOSE_TIMEOUT) if (relaysPerSubId.containsKey(subId)) { unsubscribe(subId) // still fetch the profile with whatever relay list we have saved @@ -186,7 +187,7 @@ class ProfileSubscription( relaysPerSubId[subId] = ConcurrentHashMap.newKeySet().apply { addAll(profileFilter.keys) } client.subscribe(subId, profileFilter) timeoutJobs[subId] = scope.launch { - delay(EOSE_TIMEOUT_MS) + delay(EOSE_TIMEOUT) if (relaysPerSubId.containsKey(subId)) { unsubscribe(subId) } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/ReportSender.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/ReportSender.kt index 76624318..4a900aea 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/ReportSender.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/ReportSender.kt @@ -36,6 +36,7 @@ import com.vitorpamplona.quartz.nip19Bech32.toNpub import com.vitorpamplona.quartz.nip40Expiration.expiration import com.vitorpamplona.quartz.utils.Hex import com.vitorpamplona.quartz.utils.TimeUtils +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -109,7 +110,7 @@ object ReportSender { ) } onDone() - delay(10000) + delay(10.seconds) client.disconnect() } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/UpdateCheckWorker.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/UpdateCheckWorker.kt index 972630ba..d1ea9bf0 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/UpdateCheckWorker.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/UpdateCheckWorker.kt @@ -8,10 +8,11 @@ import com.greenart7c3.nostrsigner.AmberLog import com.greenart7c3.nostrsigner.BuildConfig import com.greenart7c3.nostrsigner.BuildFlavorChecker import kotlin.coroutines.cancellation.CancellationException +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.flow.first import kotlinx.coroutines.withTimeoutOrNull -private const val CHECK_TIMEOUT_MS = 30_000L +private val CHECK_TIMEOUT = 30.seconds class UpdateCheckWorker(appContext: Context, workerParams: WorkerParameters) : CoroutineWorker(appContext, workerParams) { @@ -29,7 +30,7 @@ class UpdateCheckWorker(appContext: Context, workerParams: WorkerParameters) : C // If a check was actually started, wait for it to finish so the notification fires // before WorkManager considers the job done. if (updater.isChecking.value) { - withTimeoutOrNull(CHECK_TIMEOUT_MS) { + withTimeoutOrNull(CHECK_TIMEOUT) { updater.isChecking.first { !it } } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/ZapstoreUpdater.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/ZapstoreUpdater.kt index 759bfbe7..a1c8389d 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/ZapstoreUpdater.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/ZapstoreUpdater.kt @@ -28,6 +28,7 @@ import java.io.File import java.security.MessageDigest import java.util.UUID import kotlin.coroutines.cancellation.CancellationException +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -38,7 +39,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import okhttp3.Request -private const val EOSE_TIMEOUT_MS = 15_000L +private val EOSE_TIMEOUT = 15.seconds private const val RELEASE_KIND = 30063 private val UPDATE_RELAY_URLS = listOf( "wss://relay.zapstore.dev", @@ -129,7 +130,7 @@ class ZapstoreUpdater( } timeoutJob = scope.launch { - delay(EOSE_TIMEOUT_MS) + delay(EOSE_TIMEOUT) AmberLog.w(Amber.TAG, "ZapstoreUpdater: timeout waiting for EOSE") onReleaseEose() } @@ -339,7 +340,7 @@ class ZapstoreUpdater( } context.startActivity(intent) scope.launch(Dispatchers.Main) { - delay(2000) + delay(2.seconds) downloadState.value = DownloadState.IDLE } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt index 2470e9bf..f6f37271 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt @@ -119,6 +119,7 @@ import com.vitorpamplona.quartz.nip06KeyDerivation.Bip39Mnemonics import com.vitorpamplona.quartz.nip06KeyDerivation.Nip06 import com.vitorpamplona.quartz.nip19Bech32.toNpub import com.vitorpamplona.quartz.utils.RandomInstance +import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -1055,7 +1056,7 @@ fun LoginPage( if (isValid.first != null) { keyPair = isValid.first!! scope.launch { - delay(200) + delay(200.milliseconds) pageState.animateScrollToPage(1) } } else { @@ -1139,7 +1140,7 @@ fun LoginPage( if (isValid.first != null) { keyPair = isValid.first!! scope.launch { - delay(200) + delay(200.milliseconds) pageState.animateScrollToPage(1) } } else { @@ -1182,7 +1183,7 @@ fun LoginPage( keyPair = isValid.first!! keyboardController?.hide() scope.launch { - delay(200) + delay(200.milliseconds) pageState.animateScrollToPage(1) } } else { @@ -1212,7 +1213,7 @@ fun LoginPage( keyPair = isValid.first!! keyboardController?.hide() scope.launch { - delay(200) + delay(200.milliseconds) pageState.animateScrollToPage(1) } } else { diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/SensitiveClipboard.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/SensitiveClipboard.kt index fef0e4c6..24166fb9 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/SensitiveClipboard.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/SensitiveClipboard.kt @@ -7,12 +7,14 @@ import android.os.PersistableBundle import androidx.compose.ui.platform.ClipEntry import androidx.compose.ui.platform.Clipboard import com.greenart7c3.nostrsigner.Amber +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch /** How long a copied secret stays on the clipboard before it is cleared. */ -const val SENSITIVE_CLIPBOARD_CLEAR_DELAY_MS = 60_000L +val SENSITIVE_CLIPBOARD_CLEAR_DELAY = 60.seconds /** * Creates a [ClipData] flagged as sensitive so the system (Android 13+) avoids @@ -34,7 +36,7 @@ fun newSensitivePlainText(label: CharSequence, text: CharSequence): ClipData { /** * Copies a secret to the clipboard flagged as sensitive content and schedules it - * to be cleared after [clearAfterMillis]. The clipboard is only cleared if it + * to be cleared after [clearAfter]. The clipboard is only cleared if it * still contains the copied secret, so anything the user copies afterwards is * left untouched. */ @@ -42,19 +44,19 @@ suspend fun Clipboard.setSensitiveClip( label: CharSequence, text: CharSequence, scope: CoroutineScope = Amber.instance.applicationIOScope, - clearAfterMillis: Long = SENSITIVE_CLIPBOARD_CLEAR_DELAY_MS, + clearAfter: Duration = SENSITIVE_CLIPBOARD_CLEAR_DELAY, ) { setClipEntry(ClipEntry(newSensitivePlainText(label, text))) - scheduleSensitiveClear(text, scope, clearAfterMillis) + scheduleSensitiveClear(text, scope, clearAfter) } private fun Clipboard.scheduleSensitiveClear( copiedValue: CharSequence, scope: CoroutineScope, - delayMillis: Long, + clearAfter: Duration, ) { scope.launch { - delay(delayMillis) + delay(clearAfter) val currentText = getClipEntry()?.clipData?.let { clip -> if (clip.itemCount > 0) clip.getItemAt(0).text?.toString() else null } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/TranslationReportScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/TranslationReportScreen.kt index b9c5eb12..551f6e87 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/TranslationReportScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/TranslationReportScreen.kt @@ -63,6 +63,7 @@ import com.vitorpamplona.quartz.nip19Bech32.toNpub import com.vitorpamplona.quartz.nip40Expiration.expiration import com.vitorpamplona.quartz.utils.Hex import com.vitorpamplona.quartz.utils.TimeUtils +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -177,7 +178,7 @@ fun TranslationReportScreen( Amber.instance.pendingTranslationReport.value = null onLoading(false) onDismiss() - delay(10000) + delay(10.seconds) client.disconnect() } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt index 9cafa6fd..1947d228 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt @@ -89,6 +89,8 @@ import com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent import com.vitorpamplona.quartz.utils.TimeUtils import java.util.Base64 import java.util.UUID +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -158,7 +160,7 @@ fun DefaultRelaysScreen( scope.launch(Dispatchers.IO) { if (!BuildFlavorChecker.isOfflineFlavor()) { Amber.instance.checkForNewRelaysAndUpdateAllFilters() - delay(2000) + delay(2.seconds) Amber.instance.client.reconnect() isLoading.value = false } else { @@ -458,9 +460,9 @@ fun onAddRelay( mapOf(addedWSS to filters), ) - val canContinue = withTimeoutOrNull(30000) { + val canContinue = withTimeoutOrNull(30.seconds) { while (!canSendRequest) { - delay(200) + delay(200.milliseconds) } true } @@ -489,7 +491,7 @@ fun onAddRelay( success = client.publishAndConfirm(signedEvent, setOf(addedWSS)) if (!success) { errorCount++ - delay(1000) + delay(1.seconds) signedEvent = signer.signerSync.sign( TimeUtils.now(), NostrConnectEvent.KIND, @@ -503,7 +505,7 @@ fun onAddRelay( AmberListenerSingleton.latestErrorMessages.clear() var count = 0 while (!filterResult && count < 10) { - delay(1000) + delay(1.seconds) count++ } } else { diff --git a/app/src/test/java/com/greenart7c3/nostrsigner/SignerProviderBenchmarkTest.kt b/app/src/test/java/com/greenart7c3/nostrsigner/SignerProviderBenchmarkTest.kt index 301174f7..e49774c9 100644 --- a/app/src/test/java/com/greenart7c3/nostrsigner/SignerProviderBenchmarkTest.kt +++ b/app/src/test/java/com/greenart7c3/nostrsigner/SignerProviderBenchmarkTest.kt @@ -3,6 +3,7 @@ package com.greenart7c3.nostrsigner import java.net.URI import kotlin.system.measureNanoTime import kotlin.system.measureTimeMillis +import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.first @@ -78,7 +79,7 @@ class SignerProviderBenchmarkTest { runBlocking { val warmup = MutableStateFlow(true) launch { - delay(1) + delay(1.milliseconds) warmup.value = false } warmup.first { !it } @@ -88,7 +89,7 @@ class SignerProviderBenchmarkTest { val state = MutableStateFlow(true) runBlocking { launch { - delay(releaseAfterMs) + delay(releaseAfterMs.milliseconds) state.value = false } state.first { !it } diff --git a/app/src/test/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtilsTest.kt b/app/src/test/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtilsTest.kt index f2cf8465..3b380e1a 100644 --- a/app/src/test/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtilsTest.kt +++ b/app/src/test/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtilsTest.kt @@ -6,6 +6,7 @@ import com.greenart7c3.nostrsigner.models.SignerType import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerRequest import io.mockk.every import io.mockk.mockk +import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch @@ -344,8 +345,8 @@ class BunkerRequestUtilsTest { var calls = 0 val result = BunkerRequestUtils.retryWithBackoff( maxRetries = 3, - initialDelayMs = 1L, - maxDelayMs = 4L, + initialDelay = 1.milliseconds, + maxDelay = 4.milliseconds, ) { calls++ true @@ -359,8 +360,8 @@ class BunkerRequestUtilsTest { var calls = 0 val result = BunkerRequestUtils.retryWithBackoff( maxRetries = 5, - initialDelayMs = 1L, - maxDelayMs = 4L, + initialDelay = 1.milliseconds, + maxDelay = 4.milliseconds, ) { calls++ calls >= 3 @@ -374,8 +375,8 @@ class BunkerRequestUtilsTest { var calls = 0 val result = BunkerRequestUtils.retryWithBackoff( maxRetries = 3, - initialDelayMs = 1L, - maxDelayMs = 4L, + initialDelay = 1.milliseconds, + maxDelay = 4.milliseconds, ) { calls++ false @@ -389,8 +390,8 @@ class BunkerRequestUtilsTest { var calls = 0 val result = BunkerRequestUtils.retryWithBackoff( maxRetries = 1, - initialDelayMs = 1L, - maxDelayMs = 4L, + initialDelay = 1.milliseconds, + maxDelay = 4.milliseconds, ) { calls++ false @@ -403,8 +404,8 @@ class BunkerRequestUtilsTest { fun `retryWithBackoff with maxRetries 1 returns true on success`() = runBlocking { val result = BunkerRequestUtils.retryWithBackoff( maxRetries = 1, - initialDelayMs = 1L, - maxDelayMs = 4L, + initialDelay = 1.milliseconds, + maxDelay = 4.milliseconds, ) { true } assertTrue(result) } @@ -415,8 +416,8 @@ class BunkerRequestUtilsTest { var calls = 0 BunkerRequestUtils.retryWithBackoff( maxRetries = maxRetries, - initialDelayMs = 1L, - maxDelayMs = 4L, + initialDelay = 1.milliseconds, + maxDelay = 4.milliseconds, ) { calls++ false