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/MainActivity.kt17
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt10
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCity.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCountry.kt14
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt17
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt184
11 files changed, 66 insertions, 196 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index f9eb6d9a29..b68671afbd 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -1,8 +1,10 @@
package net.mullvad.mullvadvpn
import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
@@ -10,6 +12,9 @@ import kotlinx.coroutines.Job
import android.os.Bundle
import android.support.v4.app.FragmentActivity
+import net.mullvad.mullvadvpn.relaylist.RelayItem
+import net.mullvad.mullvadvpn.relaylist.RelayList
+
class MainActivity : FragmentActivity() {
val activityCreated = CompletableDeferred<Unit>()
@@ -17,7 +22,12 @@ class MainActivity : FragmentActivity() {
val daemon
get() = runBlocking { asyncDaemon.await() }
- var selectedRelayItemCode: String? = null
+ var asyncRelayList: Deferred<RelayList> = fetchRelayList()
+ private set
+ val relayList: RelayList
+ get() = runBlocking { asyncRelayList.await() }
+
+ var selectedRelayItem: RelayItem? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -31,6 +41,7 @@ class MainActivity : FragmentActivity() {
}
override fun onDestroy() {
+ asyncRelayList.cancel()
asyncDaemon.cancel()
super.onDestroy()
@@ -48,4 +59,8 @@ class MainActivity : FragmentActivity() {
ApiRootCaFile().extract(this@MainActivity)
MullvadDaemon()
}
+
+ private fun fetchRelayList() = GlobalScope.async(Dispatchers.Default) {
+ RelayList(asyncDaemon.await().getRelayLocations())
+ }
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
index 152eaac970..b01bccb5a4 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
@@ -1,6 +1,7 @@
package net.mullvad.mullvadvpn
import net.mullvad.mullvadvpn.model.AccountData
+import net.mullvad.mullvadvpn.model.RelayList
import net.mullvad.mullvadvpn.model.Settings
class MullvadDaemon {
@@ -10,6 +11,7 @@ class MullvadDaemon {
}
external fun getAccountData(accountToken: String): AccountData?
+ external fun getRelayLocations(): RelayList
external fun getSettings(): Settings
external fun setAccount(accountToken: String?)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
index 369e4d9289..7b1673c448 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
@@ -10,6 +10,7 @@ import android.view.ViewGroup
import android.widget.ImageButton
import net.mullvad.mullvadvpn.relaylist.RelayItemDividerDecoration
+import net.mullvad.mullvadvpn.relaylist.RelayList
import net.mullvad.mullvadvpn.relaylist.RelayListAdapter
class SelectLocationFragment : Fragment() {
@@ -32,11 +33,12 @@ class SelectLocationFragment : Fragment() {
}
private fun configureRelayList(relayList: RecyclerView) {
- val parentActivity = activity as MainActivity?
- val relayListAdapter = RelayListAdapter(parentActivity?.selectedRelayItemCode)
+ val parentActivity = activity as MainActivity
+ val relayListAdapter =
+ RelayListAdapter(parentActivity.relayList, parentActivity.selectedRelayItem)
- relayListAdapter.onSelect = { relayItemCode ->
- parentActivity?.selectedRelayItemCode = relayItemCode
+ relayListAdapter.onSelect = { relayItem ->
+ parentActivity.selectedRelayItem = relayItem
close()
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt
new file mode 100644
index 0000000000..85c062c4c6
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt
@@ -0,0 +1,4 @@
+package net.mullvad.mullvadvpn.model
+
+data class Relay(val hostname: String) {
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt
new file mode 100644
index 0000000000..ac3b02096e
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt
@@ -0,0 +1,4 @@
+package net.mullvad.mullvadvpn.model
+
+data class RelayList(val countries: List<RelayListCountry>) {
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt
new file mode 100644
index 0000000000..98dd1f2ce6
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt
@@ -0,0 +1,4 @@
+package net.mullvad.mullvadvpn.model
+
+data class RelayListCity(val name: String, val code: String, val relays: List<Relay>) {
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt
new file mode 100644
index 0000000000..037b055a0d
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt
@@ -0,0 +1,4 @@
+package net.mullvad.mullvadvpn.model
+
+data class RelayListCountry(val name: String, val code: String, val cities: List<RelayListCity>) {
+}
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 182a0ae3e5..a5e1d5cce8 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCity.kt
@@ -47,6 +47,4 @@ class RelayCity(
}
fun getRelayCount(): Int = relays.size
-
- fun findRelayByCode(code: String): RelayItem? = relays.find { relay -> relay.code == code }
}
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 ab78172b51..80b63875d5 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCountry.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayCountry.kt
@@ -45,18 +45,4 @@ class RelayCountry(
}
fun getRelayCount(): Int = cities.map { city -> city.getRelayCount() }.sum()
-
- fun findRelayItemByCode(cityCode: String, relayCode: String?): RelayItem? {
- for (city in cities) {
- if (city.code == cityCode) {
- if (relayCode != null) {
- return city.findRelayByCode("$cityCode-$relayCode")
- } else {
- return city
- }
- }
- }
-
- return null
- }
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt
new file mode 100644
index 0000000000..a70ac13eaa
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt
@@ -0,0 +1,17 @@
+package net.mullvad.mullvadvpn.relaylist
+
+class RelayList {
+ val countries: List<RelayCountry>
+
+ 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) }
+
+ RelayCity(city.name, city.code, false, relays)
+ }
+
+ RelayCountry(country.name, country.code, false, cities)
+ }
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt
index 583df4899c..de3336a4ea 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt
@@ -9,17 +9,14 @@ import android.view.ViewGroup
import net.mullvad.mullvadvpn.R
-class RelayListAdapter(private val initialSelectedItemCode: String?) : Adapter<RelayItemHolder>() {
- private val relayList = fakeRelayList
+class RelayListAdapter(
+ private val relayList: RelayList,
+ private var selectedItem: RelayItem?
+) : Adapter<RelayItemHolder>() {
private val activeIndices = LinkedList<WeakReference<RelayListAdapterPosition>>()
- private var selectedItem: RelayItem? = null
private var selectedItemHolder: RelayItemHolder? = null
- var onSelect: ((String?) -> Unit)? = null
-
- init {
- initialSelectedItemCode?.let { code -> selectedItem = findRelayItemByCode(code) }
- }
+ var onSelect: ((RelayItem?) -> Unit)? = null
override fun onCreateViewHolder(parentView: ViewGroup, type: Int): RelayItemHolder {
val inflater = LayoutInflater.from(parentView.context)
@@ -34,7 +31,7 @@ class RelayListAdapter(private val initialSelectedItemCode: String?) : Adapter<R
override fun onBindViewHolder(holder: RelayItemHolder, position: Int) {
var remaining = position
- for (country in relayList) {
+ for (country in relayList.countries) {
val itemOrCount = country.getItem(remaining)
when (itemOrCount) {
@@ -47,7 +44,8 @@ class RelayListAdapter(private val initialSelectedItemCode: String?) : Adapter<R
}
}
- override fun getItemCount() = relayList.map { country -> country.visibleItemCount }.sum()
+ override fun getItemCount() =
+ relayList.countries.map { country -> country.visibleItemCount }.sum()
fun selectItem(item: RelayItem?, holder: RelayItemHolder?) {
selectedItemHolder?.selected = false
@@ -56,7 +54,7 @@ class RelayListAdapter(private val initialSelectedItemCode: String?) : Adapter<R
selectedItemHolder = holder
selectedItemHolder?.apply { selected = true }
- onSelect?.invoke(item?.code)
+ onSelect?.invoke(item)
}
fun expandItem(itemIndex: RelayListAdapterPosition, childCount: Int) {
@@ -102,168 +100,4 @@ class RelayListAdapter(private val initialSelectedItemCode: String?) : Adapter<R
holder.selected = false
}
}
-
- private fun findRelayItemByCode(code: String): RelayItem? {
- val codeParts = code.split('-')
-
- for (country in relayList) {
- if (country.code == codeParts[0]) {
- if (codeParts.size == 1) {
- return country
- } else {
- var relayCode: String? = null
-
- if (codeParts.size == 3) {
- relayCode = codeParts[2]
- }
-
- return country.findRelayItemByCode("${codeParts[0]}-${codeParts[1]}", relayCode)
- }
- }
- }
-
- return null
- }
}
-
-val fakeRelayList = listOf(
- RelayCountry(
- "Australia",
- "au",
- false,
- listOf(
- RelayCity(
- "Brisbane",
- "au-bne",
- false,
- listOf(Relay("au-bne-001"))
- ),
- RelayCity(
- "Melbourne",
- "au-mel",
- false,
- listOf(Relay("au-mel-002"), Relay("au-mel-003"), Relay("au-mel-004"))
- ),
- RelayCity(
- "Perth",
- "au-per",
- false,
- listOf(Relay("au-per-001"))
- ),
- RelayCity(
- "Sydney",
- "au-syd",
- false,
- listOf(
- Relay("au1-wireguard"),
- Relay("au-syd-001"),
- Relay("au-syd-002"),
- Relay("au-mel-003")
- )
- )
- )
- ),
- RelayCountry(
- "South Africa",
- "za",
- false,
- listOf(
- RelayCity(
- "Johannesburg",
- "za-jnb",
- false,
- listOf(Relay("za-jnb-001"))
- )
- )
- ),
- RelayCountry(
- "Sweden",
- "se",
- false,
- listOf(
- RelayCity(
- "Gothenburg",
- "se-got",
- false,
- listOf(
- Relay("se3-wireguard"),
- Relay("se5-wireguard"),
- Relay("se-got-001"),
- Relay("se-got-002"),
- Relay("se-got-003"),
- Relay("se-got-004"),
- Relay("se-got-005"),
- Relay("se-got-006"),
- Relay("se-got-007")
- )
- ),
- RelayCity(
- "Helsingborg",
- "se-hel",
- false,
- listOf(
- Relay("se-hel-001"),
- Relay("se-hel-002"),
- Relay("se-hel-003"),
- Relay("se-hel-004"),
- Relay("se-hel-007"),
- Relay("se-hel-008")
- )
- ),
- RelayCity(
- "Malmö",
- "se-mma",
- false,
- listOf(
- Relay("se4-wireguard"),
- Relay("se-mma-001"),
- Relay("se-mma-002"),
- Relay("se-mma-003"),
- Relay("se-mma-004"),
- Relay("se-mma-005"),
- Relay("se-mma-006"),
- Relay("se-mma-007"),
- Relay("se-mma-008"),
- Relay("se-mma-009"),
- Relay("se-mma-010")
- )
- ),
- RelayCity(
- "Stockholm",
- "se-sto",
- false,
- listOf(
- Relay("se2-wireguard"),
- Relay("se6-wireguard"),
- Relay("se7-wireguard"),
- Relay("se8-wireguard"),
- Relay("se-sto-001"),
- Relay("se-sto-002"),
- Relay("se-sto-003"),
- Relay("se-sto-004"),
- Relay("se-sto-005"),
- Relay("se-sto-006"),
- Relay("se-sto-007"),
- Relay("se-sto-008"),
- Relay("se-sto-009"),
- Relay("se-sto-010"),
- Relay("se-sto-011"),
- Relay("se-sto-012"),
- Relay("se-sto-013"),
- Relay("se-sto-014"),
- Relay("se-sto-015"),
- Relay("se-sto-016"),
- Relay("se-sto-017"),
- Relay("se-sto-018"),
- Relay("se-sto-019"),
- Relay("se-sto-020"),
- Relay("se-sto-021"),
- Relay("se-sto-022"),
- Relay("se-sto-023"),
- Relay("se-sto-024"),
- Relay("se-sto-025")
- )
- )
- )
- )
-)