From 187d77c1384c3bb2fcdd9535efc20088a03a7cde Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 24 Apr 2025 18:07:22 -0400 Subject: [PATCH] Marks GlobalScope as optin --- .../java/com/vitorpamplona/amethyst/model/Account.kt | 8 ++++++++ .../playback/composable/controls/SaveButton.kt | 2 +- .../service/playback/playerPool/MediaSessionPool.kt | 3 +++ .../playback/service/PlaybackServiceClient.kt | 2 ++ .../com/vitorpamplona/amethyst/ui/MainActivity.kt | 7 ++++++- .../amethyst/ui/note/NIP05VerificationDisplay.kt | 7 ++++--- .../vitorpamplona/amethyst/ui/note/ZapFormatter.kt | 12 ++++++------ .../amethyst/ui/screen/AccountStateViewModel.kt | 2 ++ .../com/vitorpamplona/ammolite/relays/NostrClient.kt | 1 + .../com/vitorpamplona/ammolite/relays/RelayPool.kt | 2 ++ 10 files changed, 35 insertions(+), 11 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 64cd2089d..7fcb11a90 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -3745,32 +3745,38 @@ class Account( settings.backupContactList?.let { Log.d("AccountRegisterObservers", "Loading saved contacts ${it.toJson()}") + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { LocalCache.consume(it) } } settings.backupUserMetadata?.let { Log.d("AccountRegisterObservers", "Loading saved user metadata ${it.toJson()}") + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { LocalCache.consume(it, null) } } settings.backupDMRelayList?.let { Log.d("AccountRegisterObservers", "Loading saved DM Relay List ${it.toJson()}") + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { LocalCache.verifyAndConsume(it, null) } } settings.backupNIP65RelayList?.let { Log.d("AccountRegisterObservers", "Loading saved nip65 relay list ${it.toJson()}") + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { LocalCache.verifyAndConsume(it, null) } } settings.backupSearchRelayList?.let { Log.d("AccountRegisterObservers", "Loading saved search relay list ${it.toJson()}") + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { LocalCache.verifyAndConsume(it, null) } } settings.backupPrivateHomeRelayList?.let { event -> Log.d("AccountRegisterObservers", "Loading saved private home relay list ${event.toJson()}") + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { event.privateTags(signer) { LocalCache.verifyAndConsume(event, null) @@ -3780,6 +3786,7 @@ class Account( settings.backupAppSpecificData?.let { event -> Log.d("AccountRegisterObservers", "Loading saved app specific data ${event.toJson()}") + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { LocalCache.verifyAndConsume(event, null) signer.decrypt(event.content, event.pubKey) { decrypted -> @@ -3798,6 +3805,7 @@ class Account( settings.backupMuteList?.let { Log.d("AccountRegisterObservers", "Loading saved mute list ${it.toJson()}") + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { LocalCache.verifyAndConsume(it, null) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/composable/controls/SaveButton.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/composable/controls/SaveButton.kt index 12e48a608..a839e054d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/composable/controls/SaveButton.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/composable/controls/SaveButton.kt @@ -70,7 +70,7 @@ fun AnimatedSaveButton( } } -@kotlin.OptIn(ExperimentalPermissionsApi::class) +@OptIn(ExperimentalPermissionsApi::class) @Composable fun SaveButton(onSaveClick: (localContext: Context) -> Unit) { Box(modifier = PinBottomIconSize) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/playerPool/MediaSessionPool.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/playerPool/MediaSessionPool.kt index 7f5efa57a..ae964c624 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/playerPool/MediaSessionPool.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/playerPool/MediaSessionPool.kt @@ -35,6 +35,7 @@ import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.ListenableFuture import com.vitorpamplona.amethyst.ui.MainActivity import com.vitorpamplona.quartz.utils.TimeUtils +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -130,6 +131,7 @@ class MediaSessionPool( fun cleanupUnused() { if (lastCleanup < TimeUtils.oneMinuteAgo()) { lastCleanup = TimeUtils.now() + @kotlin.OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.Main) { var counter = 0 val snap = cache.snapshot() @@ -149,6 +151,7 @@ class MediaSessionPool( } fun destroy() { + @kotlin.OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.Main) { cache.evictAll() playingMap.forEach { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/service/PlaybackServiceClient.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/service/PlaybackServiceClient.kt index 321b82742..bbf026424 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/service/PlaybackServiceClient.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/service/PlaybackServiceClient.kt @@ -28,6 +28,7 @@ import androidx.media3.session.MediaController import androidx.media3.session.SessionToken import com.vitorpamplona.amethyst.service.playback.composable.MediaControllerState import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -45,6 +46,7 @@ object PlaybackServiceClient { // release when can if (myController != null) { mediaControllerState.controller = null + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.Main) { // myController.pause() // myController.stop() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt index 7a6333d09..22ff2e646 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -100,8 +100,12 @@ class MainActivity : AppCompatActivity() { override fun onPause() { Log.d("ActivityLifecycle", "MainActivity.onPause $this") - GlobalScope.launch(Dispatchers.IO) { LanguageTranslatorService.clear() } + @OptIn(DelicateCoroutinesApi::class) + GlobalScope.launch(Dispatchers.IO) { + LanguageTranslatorService.clear() + } + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { debugState(this@MainActivity) Amethyst.instance.sources.printCounters() @@ -114,6 +118,7 @@ class MainActivity : AppCompatActivity() { super.onStop() // Graph doesn't completely clear. + // @OptIn(DelicateCoroutinesApi::class) // GlobalScope.launch(Dispatchers.Default) { // serviceManager.trimMemory() // } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt index 7767525f3..429878b0f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt @@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.OpenInNew import androidx.compose.material.icons.filled.OpenInNew import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -306,7 +307,7 @@ fun DisplayStatusInner( onClick = { runCatching { uri.openUri(url.trim()) } }, ) { Icon( - imageVector = Icons.Default.OpenInNew, + imageVector = Icons.AutoMirrored.Filled.OpenInNew, null, modifier = Size15Modifier, tint = MaterialTheme.colorScheme.lessImportantLink, @@ -326,7 +327,7 @@ fun DisplayStatusInner( }, ) { Icon( - imageVector = Icons.Default.OpenInNew, + imageVector = Icons.AutoMirrored.Filled.OpenInNew, null, modifier = Size15Modifier, tint = MaterialTheme.colorScheme.lessImportantLink, @@ -348,7 +349,7 @@ fun DisplayStatusInner( }, ) { Icon( - imageVector = Icons.Default.OpenInNew, + imageVector = Icons.AutoMirrored.Filled.OpenInNew, null, modifier = Size15Modifier, tint = MaterialTheme.colorScheme.lessImportantLink, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapFormatter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapFormatter.kt index e5024ad67..2a67a6442 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapFormatter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapFormatter.kt @@ -66,12 +66,12 @@ fun showAmount(amount: BigDecimal?): String { if (amount.abs() < BigDecimal(0.01)) return "" return when { - amount >= TenGiga -> dfGBig.get().format(amount.div(OneGiga).setScale(0, RoundingMode.HALF_UP)) - amount >= OneGiga -> dfGSmall.get().format(amount.div(OneGiga).setScale(0, RoundingMode.HALF_UP)) - amount >= TenMega -> dfMBig.get().format(amount.div(OneMega).setScale(0, RoundingMode.HALF_UP)) - amount >= OneMega -> dfMSmall.get().format(amount.div(OneMega).setScale(0, RoundingMode.HALF_UP)) - amount >= TenKilo -> dfK.get().format(amount.div(OneKilo).setScale(0, RoundingMode.HALF_UP)) - else -> dfN.get().format(amount) + amount >= TenGiga -> dfGBig.get()!!.format(amount.div(OneGiga).setScale(0, RoundingMode.HALF_UP)) + amount >= OneGiga -> dfGSmall.get()!!.format(amount.div(OneGiga).setScale(0, RoundingMode.HALF_UP)) + amount >= TenMega -> dfMBig.get()!!.format(amount.div(OneMega).setScale(0, RoundingMode.HALF_UP)) + amount >= OneMega -> dfMSmall.get()!!.format(amount.div(OneMega).setScale(0, RoundingMode.HALF_UP)) + amount >= TenKilo -> dfK.get()!!.format(amount.div(OneKilo).setScale(0, RoundingMode.HALF_UP)) + else -> dfN.get()!!.format(amount) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt index 4b2f623ff..569ac9a10 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -62,6 +62,7 @@ import com.vitorpamplona.quartz.nip50Search.SearchRelayListEvent import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.utils.Hex import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.GlobalScope @@ -314,6 +315,7 @@ class AccountStateViewModel : ViewModel() { startUI(accountSettings) + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { delay(2000) // waits for the new user to connect to the new relays. accountSettings.backupUserMetadata?.let { Amethyst.instance.client.send(it) } diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrClient.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrClient.kt index 3c894a406..bd3422f2b 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrClient.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrClient.kt @@ -225,6 +225,7 @@ class NostrClient( additionalListener?.let { subscribe(it) } val job = + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { if (relayList != null) { send(signedEvent, relayList) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayPool.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayPool.kt index 303940f93..e347a4bcc 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayPool.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/RelayPool.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.ammolite.service.checkNotInMainThread import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.relay.RelayState +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.channels.BufferOverflow @@ -72,6 +73,7 @@ class RelayPool : Relay.Listener { relay.connectAndRunAfterSync { whenConnected(relay) + @OptIn(DelicateCoroutinesApi::class) GlobalScope.launch(Dispatchers.IO) { delay(timeout) // waits for a reply relay.disconnect()