summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/LaunchFragment.kt3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt29
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt46
6 files changed, 89 insertions, 3 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/LaunchFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/LaunchFragment.kt
index 043c8efe15..f2a5a5a97f 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/LaunchFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/LaunchFragment.kt
@@ -38,8 +38,7 @@ class LaunchFragment : Fragment() {
private fun checkForAccountToken() = GlobalScope.async(Dispatchers.Default) {
val parentActivity = activity as MainActivity
- val daemon = parentActivity.asyncDaemon.await()
- val settings = daemon.getSettings()
+ val settings = parentActivity.asyncSettings.await()
settings.accountToken != null
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index b68671afbd..6e3d34730b 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -12,6 +12,8 @@ import kotlinx.coroutines.Job
import android.os.Bundle
import android.support.v4.app.FragmentActivity
+import net.mullvad.mullvadvpn.model.RelaySettings
+import net.mullvad.mullvadvpn.model.Settings
import net.mullvad.mullvadvpn.relaylist.RelayItem
import net.mullvad.mullvadvpn.relaylist.RelayList
@@ -27,8 +29,15 @@ class MainActivity : FragmentActivity() {
val relayList: RelayList
get() = runBlocking { asyncRelayList.await() }
+ var asyncSettings = fetchSettings()
+ private set
+ val settings
+ get() = runBlocking { asyncSettings.await() }
+
var selectedRelayItem: RelayItem? = null
+ private val restoreSelectedRelayListItemJob = restoreSelectedRelayListItem()
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
@@ -41,6 +50,8 @@ class MainActivity : FragmentActivity() {
}
override fun onDestroy() {
+ restoreSelectedRelayListItemJob.cancel()
+ asyncSettings.cancel()
asyncRelayList.cancel()
asyncDaemon.cancel()
@@ -63,4 +74,22 @@ class MainActivity : FragmentActivity() {
private fun fetchRelayList() = GlobalScope.async(Dispatchers.Default) {
RelayList(asyncDaemon.await().getRelayLocations())
}
+
+ private fun fetchSettings() = GlobalScope.async(Dispatchers.Default) {
+ asyncDaemon.await().getSettings()
+ }
+
+ private fun restoreSelectedRelayListItem() = GlobalScope.launch(Dispatchers.Default) {
+ val relaySettings = asyncSettings.await().relaySettings
+
+ when (relaySettings) {
+ is RelaySettings.CustomTunnelEndpoint -> selectedRelayItem = null
+ is RelaySettings.RelayConstraints -> {
+ val location = relaySettings.location
+ val relayList = asyncRelayList.await()
+
+ selectedRelayItem = relayList.findItemForLocation(location, true)
+ }
+ }
+ }
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt
new file mode 100644
index 0000000000..6fded8f9c5
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+sealed class RelaySettings {
+ class CustomTunnelEndpoint() : RelaySettings()
+ class RelayConstraints(var location: Constraint<LocationConstraint>) : RelaySettings()
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
index 1254492b57..c0c2abdbe7 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
@@ -1,4 +1,4 @@
package net.mullvad.mullvadvpn.model
-data class Settings(var accountToken: String?) {
+data class Settings(var accountToken: String?, var relaySettings: RelaySettings) {
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt
index b67c31e2a9..e753d3af5a 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt
@@ -65,6 +65,12 @@ class RelayItemHolder(
if (item.hasChildren) {
chevron.visibility = View.VISIBLE
+
+ if (item.expanded) {
+ chevron.rotation = 180.0F
+ } else {
+ chevron.rotation = 0.0F
+ }
} else {
chevron.visibility = View.GONE
}
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 964833f675..809fa1265f 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt
@@ -1,5 +1,8 @@
package net.mullvad.mullvadvpn.relaylist
+import net.mullvad.mullvadvpn.model.Constraint
+import net.mullvad.mullvadvpn.model.LocationConstraint
+
class RelayList {
val countries: List<RelayCountry>
@@ -16,4 +19,47 @@ class RelayList {
RelayCountry(country.name, country.code, false, cities)
}
}
+
+ fun findItemForLocation(
+ constraint: Constraint<LocationConstraint>,
+ expand: Boolean = false
+ ): RelayItem? {
+ when (constraint) {
+ is Constraint.Any -> return null
+ is Constraint.Only -> {
+ val location = constraint.value
+
+ when (location) {
+ is LocationConstraint.Country -> {
+ return countries.find { country -> country.code == location.countryCode }
+ }
+ is LocationConstraint.City -> {
+ val country = countries.find { country ->
+ country.code == location.countryCode
+ }
+
+ if (expand) {
+ country?.expanded = true
+ }
+
+ return country?.cities?.find { city -> city.code == location.cityCode }
+ }
+ is LocationConstraint.Hostname -> {
+ val country = countries.find { country ->
+ country.code == location.countryCode
+ }
+
+ val city = country?.cities?.find { city -> city.code == location.cityCode }
+
+ if (expand) {
+ country?.expanded = true
+ city?.expanded = true
+ }
+
+ return city?.relays?.find { relay -> relay.name == location.hostname }
+ }
+ }
+ }
+ }
+ }
}