diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-04-16 13:24:24 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-04-16 13:24:24 -0300 |
| commit | 6352d8b0c99b084174d81980dac8b0b9a98f16ac (patch) | |
| tree | c83395f12a7e650baa56f26f4a903613ead8428a /android/src | |
| parent | 21c86e53ed33f96d933e6c49e88969f899250dd8 (diff) | |
| parent | f6264ec6037da274bcca0a1bbeb5daf69b44b244 (diff) | |
| download | mullvadvpn-6352d8b0c99b084174d81980dac8b0b9a98f16ac.tar.xz mullvadvpn-6352d8b0c99b084174d81980dac8b0b9a98f16ac.zip | |
Merge branch 'split-relay-list-listener'
Diffstat (limited to 'android/src')
12 files changed, 100 insertions, 41 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt index c9a039be70..28f180ac04 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt @@ -6,6 +6,7 @@ import net.mullvad.mullvadvpn.model.AppVersionInfo as AppVersionInfoData import net.mullvad.mullvadvpn.model.GeoIpLocation import net.mullvad.mullvadvpn.model.KeygenEvent import net.mullvad.mullvadvpn.model.LoginStatus as LoginStatusData +import net.mullvad.mullvadvpn.model.RelayList import net.mullvad.mullvadvpn.model.Settings import net.mullvad.mullvadvpn.model.TunnelState @@ -32,6 +33,9 @@ sealed class Event : Message.EventMessage() { data class NewLocation(val location: GeoIpLocation?) : Event() @Parcelize + data class NewRelayList(val relayList: RelayList?) : Event() + + @Parcelize data class SettingsUpdate(val settings: Settings?) : Event() @Parcelize diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt index e5303f8fc4..23f9d87f77 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt @@ -1,6 +1,14 @@ package net.mullvad.mullvadvpn.model -data class Relay(val hostname: String, val active: Boolean, val tunnels: RelayTunnels) { +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class Relay( + val hostname: String, + val active: Boolean, + val tunnels: RelayTunnels +) : Parcelable { val hasWireguardTunnels get() = !tunnels.wireguard.isEmpty() } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt index bc9ec3327a..2373eba536 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt @@ -1,5 +1,8 @@ package net.mullvad.mullvadvpn.model +import android.os.Parcelable import java.util.ArrayList +import kotlinx.parcelize.Parcelize -data class RelayList(val countries: ArrayList<RelayListCountry>) +@Parcelize +data class RelayList(val countries: ArrayList<RelayListCountry>) : Parcelable diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt index 329120350d..d4b3e21f58 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt @@ -1,5 +1,12 @@ package net.mullvad.mullvadvpn.model +import android.os.Parcelable import java.util.ArrayList +import kotlinx.parcelize.Parcelize -data class RelayListCity(val name: String, val code: String, val relays: ArrayList<Relay>) +@Parcelize +data class RelayListCity( + val name: String, + val code: String, + val relays: ArrayList<Relay> +) : Parcelable diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt index 035cb52d19..20fdd7de71 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt @@ -1,9 +1,12 @@ package net.mullvad.mullvadvpn.model +import android.os.Parcelable import java.util.ArrayList +import kotlinx.parcelize.Parcelize +@Parcelize data class RelayListCountry( val name: String, val code: String, val cities: ArrayList<RelayListCity> -) +) : Parcelable diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayTunnels.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayTunnels.kt index 5946620566..5691932888 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayTunnels.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayTunnels.kt @@ -1,5 +1,8 @@ package net.mullvad.mullvadvpn.model +import android.os.Parcelable import java.util.ArrayList +import kotlinx.parcelize.Parcelize -data class RelayTunnels(val wireguard: ArrayList<WireguardEndpointData>) +@Parcelize +data class RelayTunnels(val wireguard: ArrayList<WireguardEndpointData>) : Parcelable diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt index 1d39f1170d..aee9b56082 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt @@ -1,3 +1,8 @@ package net.mullvad.mullvadvpn.model -class WireguardEndpointData() +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Suppress("PARCELABLE_PRIMARY_CONSTRUCTOR_IS_EMPTY") +@Parcelize +class WireguardEndpointData() : Parcelable diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt new file mode 100644 index 0000000000..bb5434e3e7 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt @@ -0,0 +1,42 @@ +package net.mullvad.mullvadvpn.service.endpoint + +import kotlin.properties.Delegates.observable +import net.mullvad.mullvadvpn.ipc.Event +import net.mullvad.mullvadvpn.model.RelayList +import net.mullvad.mullvadvpn.service.MullvadDaemon + +class RelayListListener(endpoint: ServiceEndpoint) { + val daemon = endpoint.intermittentDaemon + + var relayList by observable<RelayList?>(null) { _, _, relays -> + endpoint.sendEvent(Event.NewRelayList(relays)) + } + private set + + init { + daemon.registerListener(this) { newDaemon -> + newDaemon?.let { daemon -> + setUpListener(daemon) + fetchInitialRelayList(daemon) + } + } + } + + fun onDestroy() { + daemon.unregisterListener(this) + } + + private fun setUpListener(daemon: MullvadDaemon) { + daemon.onRelayListChange = { relayLocations -> + relayList = relayLocations + } + } + + private fun fetchInitialRelayList(daemon: MullvadDaemon) { + synchronized(this) { + if (relayList == null) { + relayList = daemon.getRelayLocations() + } + } + } +} diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt index 4a753bc01d..da0926034b 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt @@ -44,6 +44,7 @@ class ServiceEndpoint( val customDns = CustomDns(this) val keyStatusListener = KeyStatusListener(this) val locationInfoCache = LocationInfoCache(this) + val relayListListener = RelayListListener(this) val splitTunneling = SplitTunneling(SplitTunnelingPersistence(context), this) init { @@ -62,6 +63,7 @@ class ServiceEndpoint( customDns.onDestroy() keyStatusListener.onDestroy() locationInfoCache.onDestroy() + relayListListener.onDestroy() settingsListener.onDestroy() splitTunneling.onDestroy() } @@ -113,6 +115,7 @@ class ServiceEndpoint( Event.SplitTunnelingUpdate(splitTunneling.onChange.latestEvent), Event.CurrentVersion(appVersionInfoCache.currentVersion), Event.AppVersionInfo(appVersionInfoCache.appVersionInfo), + Event.NewRelayList(relayListListener.relayList), Event.ListenerReady ) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt index b1a9493e28..0da72332a8 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.dataproxy.RelayListListener import net.mullvad.mullvadvpn.service.MullvadDaemon import net.mullvad.mullvadvpn.ui.serviceconnection.AccountCache import net.mullvad.mullvadvpn.ui.serviceconnection.AppVersionInfoCache @@ -13,6 +12,7 @@ import net.mullvad.mullvadvpn.ui.serviceconnection.ConnectionProxy import net.mullvad.mullvadvpn.ui.serviceconnection.CustomDns import net.mullvad.mullvadvpn.ui.serviceconnection.KeyStatusListener import net.mullvad.mullvadvpn.ui.serviceconnection.LocationInfoCache +import net.mullvad.mullvadvpn.ui.serviceconnection.RelayListListener import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnection import net.mullvad.mullvadvpn.ui.serviceconnection.SettingsListener import net.mullvad.mullvadvpn.ui.serviceconnection.SplitTunneling diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt index fe8142ed7d..a37b595404 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt @@ -1,19 +1,17 @@ -package net.mullvad.mullvadvpn.dataproxy +package net.mullvad.mullvadvpn.ui.serviceconnection -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import net.mullvad.mullvadvpn.ipc.DispatchingHandler +import net.mullvad.mullvadvpn.ipc.Event import net.mullvad.mullvadvpn.model.Constraint import net.mullvad.mullvadvpn.model.RelayConstraints import net.mullvad.mullvadvpn.model.RelaySettings import net.mullvad.mullvadvpn.relaylist.RelayItem import net.mullvad.mullvadvpn.relaylist.RelayList -import net.mullvad.mullvadvpn.service.MullvadDaemon -import net.mullvad.mullvadvpn.ui.serviceconnection.SettingsListener - -class RelayListListener(val daemon: MullvadDaemon, val settingsListener: SettingsListener) { - private val setUpJob = setUp() +class RelayListListener( + eventDispatcher: DispatchingHandler<Event>, + val settingsListener: SettingsListener +) { private var relayList: RelayList? = null private var relaySettings: RelaySettings? = null @@ -34,36 +32,20 @@ class RelayListListener(val daemon: MullvadDaemon, val settingsListener: Setting } init { + eventDispatcher.registerHandler(Event.NewRelayList::class) { event -> + event.relayList?.let { relayLocations -> + relayListChanged(RelayList(relayLocations)) + } + } + settingsListener.relaySettingsNotifier.subscribe(this) { newRelaySettings -> relaySettingsChanged(newRelaySettings) } } fun onDestroy() { - setUpJob.cancel() settingsListener.relaySettingsNotifier.unsubscribe(this) - daemon.onRelayListChange = null - } - - private fun setUp() = GlobalScope.launch(Dispatchers.Default) { - setUpListener() - fetchInitialRelayList() - } - - private fun setUpListener() { - daemon.onRelayListChange = { relayLocations -> - relayListChanged(RelayList(relayLocations)) - } - } - - private fun fetchInitialRelayList() { - val relayLocations = daemon.getRelayLocations() - - synchronized(this) { - if (relayList == null && relayLocations != null) { - relayListChanged(RelayList(relayLocations)) - } - } + onRelayListChange = null } private fun relaySettingsChanged(newRelaySettings: RelaySettings?) { diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt index 8cd894d335..61f2f6ef5e 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt @@ -4,7 +4,6 @@ import android.os.Looper import android.os.Messenger import android.os.RemoteException import android.util.Log -import net.mullvad.mullvadvpn.dataproxy.RelayListListener import net.mullvad.mullvadvpn.di.SERVICE_CONNECTION_SCOPE import net.mullvad.mullvadvpn.ipc.DispatchingHandler import net.mullvad.mullvadvpn.ipc.Event @@ -44,7 +43,7 @@ class ServiceConnection(private val service: ServiceInstance) : KoinScopeCompone val appVersionInfoCache = AppVersionInfoCache(dispatcher, settingsListener) val customDns = CustomDns(service.messenger, settingsListener) - var relayListListener = RelayListListener(daemon, settingsListener) + var relayListListener = RelayListListener(dispatcher, settingsListener) init { registerListener() |
