summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-04-16 13:24:24 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-04-16 13:24:24 -0300
commit6352d8b0c99b084174d81980dac8b0b9a98f16ac (patch)
treec83395f12a7e650baa56f26f4a903613ead8428a /android/src
parent21c86e53ed33f96d933e6c49e88969f899250dd8 (diff)
parentf6264ec6037da274bcca0a1bbeb5daf69b44b244 (diff)
downloadmullvadvpn-6352d8b0c99b084174d81980dac8b0b9a98f16ac.tar.xz
mullvadvpn-6352d8b0c99b084174d81980dac8b0b9a98f16ac.zip
Merge branch 'split-relay-list-listener'
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt10
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt9
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayTunnels.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayListListener.kt42
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt (renamed from android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/RelayListListener.kt)46
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt3
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()