diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt b/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt index e552a33b..68b4ce2e 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt @@ -75,6 +75,8 @@ import java.net.Socket import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit import kotlin.coroutines.cancellation.CancellationException +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -402,11 +404,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(2.minutes) { TorManager.isRunning.first { it } } } @@ -545,7 +547,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 1d22ae09..dfb016bc 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.flow.combine import kotlinx.coroutines.flow.debounce @@ -43,7 +44,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) @@ -96,13 +97,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() } 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 646f14d4..6fb3798a 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 b700380c..ab849234 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/") @@ -182,7 +183,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) @@ -274,7 +275,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 d1f5e862..8b44155f 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt @@ -36,6 +36,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 @@ -213,11 +215,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) @@ -226,7 +228,7 @@ object BunkerRequestUtils { } if (attempt < maxRetries - 1) { - currentDelay = (currentDelay * 2).coerceAtMost(maxDelayMs) + currentDelay = (currentDelay * 2).coerceAtMost(maxDelay) } } @@ -392,7 +394,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 d7cd6b7a..f2b69ad1 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/ProfileSubscription.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/ProfileSubscription.kt @@ -39,13 +39,14 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.utils.TimeUtils import java.util.UUID +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, @@ -165,7 +166,7 @@ class ProfileSubscription( relaysPerSubId[subId] = relayListFilter.keys.toMutableSet() 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 @@ -181,7 +182,7 @@ class ProfileSubscription( relaysPerSubId[subId] = profileFilter.keys.toMutableSet() 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/RelayDisconnectService.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/RelayDisconnectService.kt index 3271fb73..c8b3a469 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/RelayDisconnectService.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/RelayDisconnectService.kt @@ -3,6 +3,7 @@ package com.greenart7c3.nostrsigner.service import android.content.Context import androidx.work.Worker import androidx.work.WorkerParameters +import kotlin.time.Duration.Companion.minutes import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -17,7 +18,7 @@ class RelayDisconnectService(ctx: Context, params: WorkerParameters) : Worker(ct val job = ioScope.launch { val url = inputData.getString("relay") - delay(60000) + delay(1.minutes) url?.let { // TODO: this class is not being used, but this new way of using Nostr client requires removing the relay from all filters to disconnect it // val relay = Amber.instance.client.getRelay(it) 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/TrustScoreService.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/TrustScoreService.kt index 83f30949..be5acfc8 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/TrustScoreService.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/TrustScoreService.kt @@ -108,6 +108,7 @@ object TrustScoreService { } // Safe call needed: the offline flavor compiles against OkHttp 4, where body is nullable + @Suppress("UNNECESSARY_SAFE_CALL") val body = response.body?.string() if (body == null) { cacheResult(normalizedUrl, null, isFailed = true) 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/WebDavService.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/WebDavService.kt index c4002c65..ad3fc2a1 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/WebDavService.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/WebDavService.kt @@ -67,6 +67,7 @@ object WebDavService { client.newCall(request).execute().use { response -> if (response.isSuccessful) { // Safe call needed: the offline flavor compiles against OkHttp 4, where body is nullable + @Suppress("UNNECESSARY_SAFE_CALL", "USELESS_ELVIS") val body = response.body?.string() ?: "" Result.success(body) } else { 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 5a06e6b3..1215484c 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/ZapstoreUpdater.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/ZapstoreUpdater.kt @@ -26,6 +26,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 @@ -36,7 +37,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", @@ -128,7 +129,7 @@ class ZapstoreUpdater( } timeoutJob = scope.launch { - delay(EOSE_TIMEOUT_MS) + delay(EOSE_TIMEOUT) AmberLog.w(Amber.TAG, "ZapstoreUpdater: timeout waiting for EOSE") onReleaseEose() } @@ -288,7 +289,8 @@ class ZapstoreUpdater( return null } - // Safe call needed: the offline flavor compiles against OkHttp 4, where body is nullable + // Elvis needed: the offline flavor compiles against OkHttp 4, where body is nullable + @Suppress("USELESS_ELVIS") val body = response.body ?: return null val contentLength = body.contentLength() val apkFile = File(context.cacheDir, "amber-update-${release.version}.apk") @@ -338,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 eb9659dd..e4d3b67f 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 { @@ -438,9 +440,9 @@ fun onAddRelay( mapOf(addedWSS to filters), ) - val canContinue = withTimeoutOrNull(30000) { + val canContinue = withTimeoutOrNull(30.seconds) { while (!canSendRequest) { - delay(200) + delay(200.milliseconds) } true } @@ -469,7 +471,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, @@ -483,7 +485,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 0a362482..d227499f 100644 --- a/app/src/test/java/com/greenart7c3/nostrsigner/SignerProviderBenchmarkTest.kt +++ b/app/src/test/java/com/greenart7c3/nostrsigner/SignerProviderBenchmarkTest.kt @@ -2,6 +2,7 @@ package com.greenart7c3.nostrsigner 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 @@ -77,7 +78,7 @@ class SignerProviderBenchmarkTest { runBlocking { val warmup = MutableStateFlow(true) launch { - delay(1) + delay(1.milliseconds) warmup.value = false } warmup.first { !it } @@ -87,7 +88,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