diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-23 09:37:21 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-23 09:37:21 -0300 |
| commit | 8ab37040fcc2e8ec0e70555608351e9f4aa01e2c (patch) | |
| tree | 4e6f599959aaabc8281d64d0967681c45d947533 /android | |
| parent | a995adbc781a4afd7142cb4d22fe6edffbe20607 (diff) | |
| parent | 3e8c45e2b8d270ec1e46a0487212e741c0f6db02 (diff) | |
| download | mullvadvpn-8ab37040fcc2e8ec0e70555608351e9f4aa01e2c.tar.xz mullvadvpn-8ab37040fcc2e8ec0e70555608351e9f4aa01e2c.zip | |
Merge branch 'set-relay-constraint-on-android'
Diffstat (limited to 'android')
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) |
