diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 147bf2114..d0df9852c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -1,8 +1,10 @@ package com.vitorpamplona.amethyst.model import android.content.res.Resources +import android.util.Log import androidx.core.os.ConfigurationCompat import androidx.lifecycle.LiveData +import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.service.relays.Constants import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent @@ -394,12 +396,21 @@ class Account( }.toTypedArray() } + fun reconnectIfRelaysHaveChanged() { + val newRelaySet = activeRelays() ?: convertLocalRelays() + if (!Client.isSameRelaySetConfig(newRelaySet)) { + Client.disconnect() + Client.connect(newRelaySet) + RelayPool.requestAndWatch() + } + } + init { - userProfile().liveRelays.observeForever { - GlobalScope.launch(Dispatchers.IO) { - Client.disconnect() - Client.connect(activeRelays() ?: convertLocalRelays()) - RelayPool.requestAndWatch() + GlobalScope.launch(Dispatchers.Main) { + userProfile().liveRelays.observeForever { + GlobalScope.launch(Dispatchers.IO) { + reconnectIfRelaysHaveChanged() + } } } } 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 044455abc..7b98739c0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.model +import android.util.Log import androidx.lifecycle.LiveData import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource import com.vitorpamplona.amethyst.service.model.LnZapEvent @@ -221,10 +222,9 @@ class User(val pubkeyHex: String) { } fun updateRelays(relayUse: Map) { - if (relays != relayUse) { - relays = relayUse - liveRelays.invalidateData() - } + // no need to test if relays are different. The Account will check for us. + relays = relayUse + liveRelays.invalidateData() } fun updateUserInfo(newUserInfo: UserMetadata, updateAt: Long) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt index 15e4f256d..6a08b6a9b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt @@ -32,6 +32,20 @@ object Client: RelayPool.Listener { this.relays = relays } + fun isSameRelaySetConfig(newRelayConfig: Array): Boolean { + if (relays.size != newRelayConfig.size) return false + + relays.forEach { oldRelayInfo -> + val newRelayInfo = newRelayConfig.find { it.url == oldRelayInfo.url } + + if (newRelayInfo == null) return false + + if (!oldRelayInfo.isSameRelayConfig(newRelayInfo)) return false + } + + return true + } + fun sendFilter( subscriptionId: String = UUID.randomUUID().toString().substring(0..10), filters: List = listOf() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt index 3fcd73e8c..5378b942c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt @@ -204,6 +204,13 @@ class Relay( socket?.send("""["CLOSE","$subscriptionId"]""") } + fun isSameRelayConfig(other: Relay): Boolean { + return url == other.url + && write == other.write + && read == other.read + && activeTypes == other.activeTypes + } + enum class Type { // Websocket connected CONNECT, 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 66ab816de..166878a1a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -75,8 +75,8 @@ class MainActivity : ComponentActivity() { override fun onResume() { super.onResume() - - ServiceManager.start() + // Only starts after login + //ServiceManager.start() } override fun onPause() { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt index 51369ecf2..85e9e65db 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.ui.screen +import androidx.compose.runtime.rememberCoroutineScope import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.LocalPreferences @@ -21,8 +22,10 @@ class AccountStateViewModel(private val localPreferences: LocalPreferences): Vie init { // pulls account from storage. - localPreferences.loadFromEncryptedStorage()?.let { - login(it) + viewModelScope.launch(Dispatchers.IO) { + localPreferences.loadFromEncryptedStorage()?.let { + login(it) + } } }