summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-13 19:25:33 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-17 14:42:59 +0000
commitc2f14fb16aeb6b830af95a823c5018761e760f8f (patch)
treeaaeb3b1d751cce30ae3aff3fd6c5b61d57ca984e /android
parent6599e42d93469d5fbe4ac77b0b16721d1acd257c (diff)
downloadmullvadvpn-c2f14fb16aeb6b830af95a823c5018761e760f8f.tar.xz
mullvadvpn-c2f14fb16aeb6b830af95a823c5018761e760f8f.zip
Use `RelayListListener` to handle the relay list
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt31
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt62
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt36
3 files changed, 68 insertions, 61 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index 71416c92c4..e21c7b6682 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -20,27 +20,21 @@ import net.mullvad.mullvadvpn.model.RelaySettings
import net.mullvad.mullvadvpn.model.Settings
import net.mullvad.mullvadvpn.relaylist.RelayItem
import net.mullvad.mullvadvpn.relaylist.RelayList
+import net.mullvad.mullvadvpn.relaylist.RelayListListener
class MainActivity : FragmentActivity() {
var asyncDaemon = CompletableDeferred<MullvadDaemon>()
val daemon
get() = runBlocking { asyncDaemon.await() }
- var asyncRelayList: Deferred<RelayList> = fetchRelayList()
- private set
- val relayList: RelayList
- get() = runBlocking { asyncRelayList.await() }
-
var asyncSettings = fetchSettings()
private set
val settings
get() = runBlocking { asyncSettings.await() }
val accountCache = AccountCache(this)
+ var relayListListener = RelayListListener(this)
- var selectedRelayItem: RelayItem? = null
-
- private val restoreSelectedRelayListItemJob = restoreSelectedRelayListItem()
private var waitForDaemonJob: Job? = null
private val serviceConnection = object : ServiceConnection {
@@ -84,11 +78,10 @@ class MainActivity : FragmentActivity() {
override fun onDestroy() {
accountCache.onDestroy()
+ relayListListener.onDestroy()
- restoreSelectedRelayListItemJob.cancel()
waitForDaemonJob?.cancel()
asyncSettings.cancel()
- asyncRelayList.cancel()
asyncDaemon.cancel()
super.onDestroy()
@@ -122,25 +115,7 @@ 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/SelectLocationFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
index 5ca767c19e..a545e088f5 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt
@@ -3,7 +3,9 @@ package net.mullvad.mullvadvpn
import kotlinx.coroutines.launch
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
+import android.content.Context
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.widget.LinearLayoutManager
@@ -20,8 +22,35 @@ import net.mullvad.mullvadvpn.relaylist.RelayItem
import net.mullvad.mullvadvpn.relaylist.RelayItemDividerDecoration
import net.mullvad.mullvadvpn.relaylist.RelayList
import net.mullvad.mullvadvpn.relaylist.RelayListAdapter
+import net.mullvad.mullvadvpn.relaylist.RelayListListener
class SelectLocationFragment : Fragment() {
+ private lateinit var parentActivity: MainActivity
+ private lateinit var relayListListener: RelayListListener
+
+ private val relayListAdapter = RelayListAdapter()
+
+ private var updateRelayListJob: Job? = null
+
+ init {
+ relayListAdapter.onSelect = { relayItem ->
+ relayListListener.selectedRelayItem = relayItem
+ updateLocationConstraint()
+ close()
+ }
+ }
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+
+ parentActivity = context as MainActivity
+ relayListListener = parentActivity.relayListListener
+
+ relayListListener.onRelayListChange = { relayList, selectedItem ->
+ updateRelayListJob = updateRelayList(relayList, selectedItem)
+ }
+ }
+
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -36,21 +65,17 @@ class SelectLocationFragment : Fragment() {
return view
}
+ override fun onDestroyView() {
+ updateRelayListJob?.cancel()
+
+ super.onDestroyView()
+ }
+
fun close() {
activity?.onBackPressed()
}
private fun configureRelayList(relayList: RecyclerView) {
- val parentActivity = activity as MainActivity
- val relayListAdapter =
- RelayListAdapter(parentActivity.relayList, parentActivity.selectedRelayItem)
-
- relayListAdapter.onSelect = { relayItem ->
- parentActivity.selectedRelayItem = relayItem
- updateLocationConstraint(relayItem)
- close()
- }
-
relayList.apply {
layoutManager = LinearLayoutManager(context!!)
adapter = relayListAdapter
@@ -59,19 +84,16 @@ class SelectLocationFragment : Fragment() {
}
}
- 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)
- }
+ private fun updateLocationConstraint() = GlobalScope.launch(Dispatchers.Default) {
+ val constraint = relayListListener.selectedRelayLocation
parentActivity.asyncDaemon.await().updateRelaySettings(
RelaySettingsUpdate.RelayConstraintsUpdate(constraint)
)
}
+
+ private fun updateRelayList(relayList: RelayList, selectedItem: RelayItem?) =
+ GlobalScope.launch(Dispatchers.Main) {
+ relayListAdapter.onRelayListChange(relayList, selectedItem)
+ }
}
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 de3336a4ea..60ad96171c 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt
@@ -9,10 +9,9 @@ import android.view.ViewGroup
import net.mullvad.mullvadvpn.R
-class RelayListAdapter(
- private val relayList: RelayList,
- private var selectedItem: RelayItem?
-) : Adapter<RelayItemHolder>() {
+class RelayListAdapter : Adapter<RelayItemHolder>() {
+ private var relayList: RelayList? = null
+ private var selectedItem: RelayItem? = null
private val activeIndices = LinkedList<WeakReference<RelayListAdapterPosition>>()
private var selectedItemHolder: RelayItemHolder? = null
@@ -29,23 +28,34 @@ class RelayListAdapter(
}
override fun onBindViewHolder(holder: RelayItemHolder, position: Int) {
- var remaining = position
+ val relayList = this.relayList
- for (country in relayList.countries) {
- val itemOrCount = country.getItem(remaining)
+ if (relayList != null) {
+ var remaining = position
- when (itemOrCount) {
- is GetItemResult.Item -> {
- bindHolderToItem(holder, itemOrCount.item, position)
- return
+ for (country in relayList.countries) {
+ val itemOrCount = country.getItem(remaining)
+
+ when (itemOrCount) {
+ is GetItemResult.Item -> {
+ bindHolderToItem(holder, itemOrCount.item, position)
+ return
+ }
+ is GetItemResult.Count -> remaining -= itemOrCount.count
}
- is GetItemResult.Count -> remaining -= itemOrCount.count
}
}
}
override fun getItemCount() =
- relayList.countries.map { country -> country.visibleItemCount }.sum()
+ relayList?.countries?.map { country -> country.visibleItemCount }?.sum() ?: 0
+
+ fun onRelayListChange(relayList: RelayList, selectedItem: RelayItem?) {
+ this.relayList = relayList
+ this.selectedItem = selectedItem
+
+ notifyDataSetChanged()
+ }
fun selectItem(item: RelayItem?, holder: RelayItemHolder?) {
selectedItemHolder?.selected = false