diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt index 8a568faaf..6a4a4edda 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt @@ -49,8 +49,7 @@ object ServiceManager { start() } - @Synchronized - fun start() { + private fun start() { Log.d("ServiceManager", "Pre Starting Relay Services $isStarted $account") if (isStarted && account != null) { return @@ -105,7 +104,7 @@ object ServiceManager { } } - fun pause() { + private fun pause() { Log.d("ServiceManager", "Pausing Relay Services") NostrAccountDataSource.stop() @@ -153,19 +152,42 @@ object ServiceManager { } } + // This method keeps the pause/start in a Syncronized block to + // avoid concurrent pauses and starts. + @Synchronized + fun forceRestart(account: Account? = null, start: Boolean = true, pause: Boolean = true) { + if (pause) { + pause() + } + + if (start) { + if (account != null) { + start(account) + } else { + start() + } + } + } + fun restartIfDifferentAccount(account: Account) { if (this.account != account) { - pause() - start(account) + forceRestart(account, true, true) } } fun forceRestartIfItShould() { if (shouldPauseService) { - pause() - start() + forceRestart(null, true, true) } } + + fun justStart() { + forceRestart(null, true, false) + } + + fun pauseForGood() { + forceRestart(null, false, true) + } } object SingletonDiskCache { 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 cfcf9877d..4e9ce8341 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -1278,7 +1278,7 @@ object LocalCache { childrenToBeRemoved.addAll(it.removeAllChildNotes()) } - removeChildrenOf(childrenToBeRemoved) + removeFromCache(childrenToBeRemoved) if (toBeRemoved.size > 100 || it.value.notes.size > 100) { println("PRUNE: ${toBeRemoved.size} messages removed from ${it.value.toBestDisplayName()}. ${it.value.notes.size} kept") @@ -1297,7 +1297,7 @@ object LocalCache { childrenToBeRemoved.addAll(it.removeAllChildNotes()) } - removeChildrenOf(childrenToBeRemoved) + removeFromCache(childrenToBeRemoved) if (toBeRemoved.size > 1) { println("PRUNE: ${toBeRemoved.size} private messages with ${userPair.value.toBestDisplayName()} removed. ${it.roomMessages.size} kept") @@ -1328,7 +1328,7 @@ object LocalCache { childrenToBeRemoved.addAll(it.removeAllChildNotes()) } - removeChildrenOf(childrenToBeRemoved) + removeFromCache(childrenToBeRemoved) if (toBeRemoved.size > 1) { println("PRUNE: ${toBeRemoved.size} old version of addressables removed.") @@ -1357,7 +1357,7 @@ object LocalCache { childrenToBeRemoved.addAll(it.removeAllChildNotes()) } - removeChildrenOf(childrenToBeRemoved) + removeFromCache(childrenToBeRemoved) toBeRemoved.forEach { it.replyTo?.forEach { masterNote -> @@ -1380,22 +1380,24 @@ object LocalCache { masterNote.clearEOSE() // allows reloading of these events if needed } - if (note.event is LnZapEvent) { - (note.event as LnZapEvent).zappedAuthor().mapNotNull { + val noteEvent = note.event + + if (noteEvent is LnZapEvent) { + noteEvent.zappedAuthor().forEach { val author = getUserIfExists(it) author?.removeZap(note) author?.clearEOSE() } } - if (note.event is LnZapRequestEvent) { - (note.event as LnZapRequestEvent).zappedAuthor().mapNotNull { + if (noteEvent is LnZapRequestEvent) { + noteEvent.zappedAuthor().mapNotNull { val author = getUserIfExists(it) author?.removeZap(note) author?.clearEOSE() } } - if (note.event is ReportEvent) { - (note.event as ReportEvent).reportedAuthor().mapNotNull { + if (noteEvent is ReportEvent) { + noteEvent.reportedAuthor().mapNotNull { val author = getUserIfExists(it.key) author?.removeReport(note) author?.clearEOSE() @@ -1405,31 +1407,7 @@ object LocalCache { notes.remove(note.idHex) } - fun removeAuthorLinkTo(note: Note) { - if (note.event is LnZapEvent) { - (note.event as LnZapEvent).zappedAuthor().mapNotNull { - val author = getUserIfExists(it) - author?.removeZap(note) - author?.clearEOSE() - } - } - if (note.event is LnZapRequestEvent) { - (note.event as LnZapRequestEvent).zappedAuthor().mapNotNull { - val author = getUserIfExists(it) - author?.removeZap(note) - author?.clearEOSE() - } - } - if (note.event is ReportEvent) { - (note.event as ReportEvent).reportedAuthor().mapNotNull { - val author = getUserIfExists(it.key) - author?.removeReport(note) - author?.clearEOSE() - } - } - } - - fun removeChildrenOf(nextToBeRemoved: List) { + fun removeFromCache(nextToBeRemoved: List) { nextToBeRemoved.forEach { note -> removeFromCache(note) } @@ -1449,7 +1427,7 @@ object LocalCache { childrenToBeRemoved.addAll(it.removeAllChildNotes()) } - removeChildrenOf(childrenToBeRemoved) + removeFromCache(childrenToBeRemoved) if (toBeRemoved.size > 1) { println("PRUNE: ${toBeRemoved.size} thread replies removed.") @@ -1476,7 +1454,7 @@ object LocalCache { childrenToBeRemoved.addAll(it.removeAllChildNotes()) } - removeChildrenOf(childrenToBeRemoved) + removeFromCache(childrenToBeRemoved) println("PRUNE: ${toBeRemoved.size} messages removed because they were Hidden") } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt index 8586b9b33..7e3733db9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -104,7 +104,7 @@ class MainActivity : AppCompatActivity() { // Only starts after login if (ServiceManager.shouldPauseService) { GlobalScope.launch(Dispatchers.IO) { - ServiceManager.start() + ServiceManager.justStart() } } @@ -127,7 +127,7 @@ class MainActivity : AppCompatActivity() { if (ServiceManager.shouldPauseService) { GlobalScope.launch(Dispatchers.IO) { - ServiceManager.pause() + ServiceManager.pauseForGood() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt index 422414c88..9c9907667 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt @@ -627,8 +627,7 @@ private suspend fun enableTor( account.proxyPort = portNumber.value.toInt() account.proxy = HttpClient.initProxy(checked, "127.0.0.1", account.proxyPort) LocalPreferences.saveToEncryptedStorage(account) - ServiceManager.pause() - ServiceManager.start() + ServiceManager.forceRestart() } @Composable