summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-23 09:37:21 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-23 09:37:21 -0300
commit8ab37040fcc2e8ec0e70555608351e9f4aa01e2c (patch)
tree4e6f599959aaabc8281d64d0967681c45d947533 /android
parenta995adbc781a4afd7142cb4d22fe6edffbe20607 (diff)
parent3e8c45e2b8d270ec1e46a0487212e741c0f6db02 (diff)
downloadmullvadvpn-8ab37040fcc2e8ec0e70555608351e9f4aa01e2c.tar.xz
mullvadvpn-8ab37040fcc2e8ec0e70555608351e9f4aa01e2c.zip
Merge branch 'set-relay-constraint-on-android'
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt25
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt11
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettingsUpdate.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/Relay.kt9
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCity.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCountry.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItem.kt3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt6
10 files changed, 74 insertions, 3 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
index b01bccb5a4..6d084e6274 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn
import net.mullvad.mullvadvpn.model.AccountData
import net.mullvad.mullvadvpn.model.RelayList
+import net.mullvad.mullvadvpn.model.RelaySettingsUpdate
import net.mullvad.mullvadvpn.model.Settings
class MullvadDaemon {
@@ -14,6 +15,7 @@ class MullvadDaemon {
external fun getRelayLocations(): RelayList
external fun getSettings(): Settings
external fun setAccount(accountToken: String?)
+ external fun updateRelaySettings(update: RelaySettingsUpdate)
private external fun initialize()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
index 7b1673c448..5ca767c19e 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
@@ -1,5 +1,9 @@
package net.mullvad.mullvadvpn
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.widget.LinearLayoutManager
@@ -9,6 +13,10 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
+import net.mullvad.mullvadvpn.model.Constraint
+import net.mullvad.mullvadvpn.model.LocationConstraint
+import net.mullvad.mullvadvpn.model.RelaySettingsUpdate
+import net.mullvad.mullvadvpn.relaylist.RelayItem
import net.mullvad.mullvadvpn.relaylist.RelayItemDividerDecoration
import net.mullvad.mullvadvpn.relaylist.RelayList
import net.mullvad.mullvadvpn.relaylist.RelayListAdapter
@@ -39,6 +47,7 @@ class SelectLocationFragment : Fragment() {
relayListAdapter.onSelect = { relayItem ->
parentActivity.selectedRelayItem = relayItem
+ updateLocationConstraint(relayItem)
close()
}
@@ -49,4 +58,20 @@ class SelectLocationFragment : Fragment() {
addItemDecoration(RelayItemDividerDecoration(context!!))
}
}
+
+ private fun updateLocationConstraint(relayItem: RelayItem?) =
+ GlobalScope.launch(Dispatchers.Default) {
+ val parentActivity = activity as MainActivity
+ var constraint: Constraint<LocationConstraint>
+
+ if (relayItem == null) {
+ constraint = Constraint.Any()
+ } else {
+ constraint = Constraint.Only(relayItem.location)
+ }
+
+ parentActivity.asyncDaemon.await().updateRelaySettings(
+ RelaySettingsUpdate.RelayConstraintsUpdate(constraint)
+ )
+ }
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt
new file mode 100644
index 0000000000..97b3414176
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+sealed class Constraint<T>() {
+ class Any<T>() : Constraint<T>()
+ class Only<T>(val value: T) : Constraint<T>()
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt
new file mode 100644
index 0000000000..4fc07a4b43
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt
@@ -0,0 +1,11 @@
+package net.mullvad.mullvadvpn.model
+
+sealed class LocationConstraint(val code: Array<String>) {
+ class Country(var countryCode: String) : LocationConstraint(arrayOf(countryCode))
+
+ class City(var countryCode: String, var cityCode: String)
+ : LocationConstraint(arrayOf(countryCode, cityCode))
+
+ class Hostname(var countryCode: String, var cityCode: String, var hostname: String)
+ : LocationConstraint(arrayOf(countryCode, cityCode, hostname))
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettingsUpdate.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettingsUpdate.kt
new file mode 100644
index 0000000000..aec094fe09
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettingsUpdate.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+sealed class RelaySettingsUpdate {
+ class CustomTunnelEndpoint() : RelaySettingsUpdate()
+ class RelayConstraintsUpdate(var location: Constraint<LocationConstraint>?) : RelaySettingsUpdate()
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/Relay.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/Relay.kt
index 131f71df9d..7e2f09e289 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/Relay.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/Relay.kt
@@ -1,8 +1,15 @@
package net.mullvad.mullvadvpn.relaylist
-data class Relay(override val name: String) : RelayItem {
+import net.mullvad.mullvadvpn.model.LocationConstraint
+
+data class Relay(
+ val countryCode: String,
+ val cityCode: String,
+ override val name: String
+) : RelayItem {
override val code = name
override val type = RelayItemType.Relay
+ override val location = LocationConstraint.Hostname(countryCode, cityCode, name)
override val hasChildren = false
override val visibleChildCount = 0
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCity.kt
index a5e1d5cce8..15c52fce43 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCity.kt
@@ -1,12 +1,17 @@
package net.mullvad.mullvadvpn.relaylist
+import net.mullvad.mullvadvpn.model.LocationConstraint
+
class RelayCity(
override val name: String,
+ val countryCode: String,
override val code: String,
override var expanded: Boolean,
val relays: List<Relay>
) : RelayItem {
override val type = RelayItemType.City
+ override val location = LocationConstraint.City(countryCode, code)
+
override val hasChildren
get() = relays.size > 1
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCountry.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCountry.kt
index 80b63875d5..fb2aacab33 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCountry.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCountry.kt
@@ -1,5 +1,7 @@
package net.mullvad.mullvadvpn.relaylist
+import net.mullvad.mullvadvpn.model.LocationConstraint
+
class RelayCountry(
override val name: String,
override val code: String,
@@ -7,6 +9,8 @@ class RelayCountry(
val cities: List<RelayCity>
) : RelayItem {
override val type = RelayItemType.Country
+ override val location = LocationConstraint.Country(code)
+
override val hasChildren
get() = getRelayCount() > 1
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItem.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItem.kt
index 9f325e6377..22f39cbf7e 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItem.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItem.kt
@@ -1,9 +1,12 @@
package net.mullvad.mullvadvpn.relaylist
+import net.mullvad.mullvadvpn.model.LocationConstraint
+
interface RelayItem {
val type: RelayItemType
val name: String
val code: String
+ val location: LocationConstraint
val hasChildren: Boolean
val visibleChildCount: Int
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt
index a70ac13eaa..964833f675 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt
@@ -6,9 +6,11 @@ class RelayList {
constructor(model: net.mullvad.mullvadvpn.model.RelayList) {
countries = model.countries.map { country ->
val cities = country.cities.map { city ->
- val relays = city.relays.map { relay -> Relay(relay.hostname) }
+ val relays = city.relays.map { relay ->
+ Relay(country.code, city.code, relay.hostname)
+ }
- RelayCity(city.name, city.code, false, relays)
+ RelayCity(city.name, country.code, city.code, false, relays)
}
RelayCountry(country.name, country.code, false, cities)