From b6f5cc9ae50161227e4a8e4ac6734e70d38ec8af Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 28 Feb 2023 20:10:52 -0500 Subject: [PATCH] Activating the Atomic Boolean instead of Synchronized sections --- .../vitorpamplona/amethyst/NotificationCache.kt | 2 -- .../com/vitorpamplona/amethyst/model/Account.kt | 2 -- .../amethyst/model/AntiSpamFilter.kt | 2 -- .../com/vitorpamplona/amethyst/model/Channel.kt | 1 - .../vitorpamplona/amethyst/model/LocalCache.kt | 2 -- .../java/com/vitorpamplona/amethyst/model/Note.kt | 15 ++++++++++----- .../java/com/vitorpamplona/amethyst/model/User.kt | 2 -- .../amethyst/service/relays/RelayPool.kt | 1 - .../amethyst/ui/screen/CardFeedViewModel.kt | 2 -- .../amethyst/ui/screen/FeedViewModel.kt | 3 +-- .../amethyst/ui/screen/LnZapFeedViewModel.kt | 2 -- .../amethyst/ui/screen/RelayFeedView.kt | 2 -- .../amethyst/ui/screen/UserFeedViewModel.kt | 2 -- 13 files changed, 11 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/NotificationCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/NotificationCache.kt index 1f29fd1bc..90018df67 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/NotificationCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/NotificationCache.kt @@ -44,12 +44,10 @@ class NotificationLiveData(val cache: NotificationCache): LiveData(AccountState(account)) { var handlerWaiting = AtomicBoolean() - @Synchronized fun invalidateData() { if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Default) scope.launch { try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt index 32efc9df0..3fec4edf8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt @@ -67,12 +67,10 @@ class AntiSpamLiveData(val cache: AntiSpamFilter): LiveData(AntiS // Refreshes observers in batches. var handlerWaiting = AtomicBoolean() - @Synchronized fun invalidateData() { if (!hasActiveObservers()) return if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Main) scope.launch { try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt index 648ed5b4a..a24445dcc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt @@ -23,7 +23,6 @@ class Channel(val idHex: String) { return info.name ?: idDisplayNote() } - @Synchronized fun addNote(note: Note) { notes[note.idHex] = note } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index e9575eea8..3372b2942 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -735,12 +735,10 @@ class LocalCacheLiveData(val cache: LocalCache): LiveData(Local // Refreshes observers in batches. var handlerWaiting = AtomicBoolean() - @Synchronized fun invalidateData() { if (!hasActiveObservers()) return if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Main) scope.launch { try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt index 7c0d517bb..d464fe9e1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -18,8 +18,10 @@ import java.util.regex.Pattern import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import nostr.postr.events.Event val tagSearch = Pattern.compile("(?:\\s|\\A)\\#\\[([0-9]+)\\]") @@ -318,17 +320,20 @@ class NoteLiveData(val note: Note): LiveData(NoteState(note)) { // Refreshes observers in batches. var handlerWaiting = AtomicBoolean() - @Synchronized fun invalidateData() { if (!hasActiveObservers()) return if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Main) scope.launch { - delay(100) - refresh() - handlerWaiting.set(false) + try { + delay(100) + refresh() + } finally { + withContext(NonCancellable) { + handlerWaiting.set(false) + } + } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index 7d9c4925a..0bdfc3356 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -379,11 +379,9 @@ class UserLiveData(val user: User): LiveData(UserState(user)) { // Refreshes observers in batches. var handlerWaiting = AtomicBoolean() - @Synchronized fun invalidateData() { if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Main) scope.launch { try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt index 902034682..7b96ca7ea 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt @@ -94,7 +94,6 @@ object RelayPool: Relay.Listener { fun onSendResponse(eventId: String, success: Boolean, message: String, relay: Relay) } - @Synchronized override fun onEvent(relay: Relay, subscriptionId: String, event: Event) { listeners.forEach { it.onEvent(event, subscriptionId, relay) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index ec40daec2..d1c1cfe91 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -129,11 +129,9 @@ open class CardFeedViewModel(val dataSource: FeedFilter): ViewModel() { var handlerWaiting = AtomicBoolean() - @Synchronized private fun invalidateData() { if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Default) scope.launch { try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index d7a0c9d9c..94c8cd364 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -87,11 +87,10 @@ abstract class FeedViewModel(val localFilter: FeedFilter): ViewModel() { } private var handlerWaiting = AtomicBoolean() - @Synchronized + fun invalidateData() { if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Default) scope.launch { try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt index c71ae13bc..b24c82828 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt @@ -61,11 +61,9 @@ open class LnZapFeedViewModel(val dataSource: FeedFilter>): Vie var handlerWaiting = AtomicBoolean() - @Synchronized private fun invalidateData() { if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Default) scope.launch { try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt index e66b49931..99e2d40e4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt @@ -83,11 +83,9 @@ class RelayFeedViewModel: ViewModel() { var handlerWaiting = AtomicBoolean() - @Synchronized private fun invalidateData() { if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Default) scope.launch { try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt index d84e0ef2e..1f6acfccd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt @@ -65,11 +65,9 @@ open class UserFeedViewModel(val dataSource: FeedFilter): ViewModel() { var handlerWaiting = AtomicBoolean() - @Synchronized private fun invalidateData() { if (handlerWaiting.getAndSet(true)) return - handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Default) scope.launch { try {