diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-13 19:25:33 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-17 14:42:59 +0000 |
| commit | c2f14fb16aeb6b830af95a823c5018761e760f8f (patch) | |
| tree | aaeb3b1d751cce30ae3aff3fd6c5b61d57ca984e /android/src | |
| parent | 6599e42d93469d5fbe4ac77b0b16721d1acd257c (diff) | |
| download | mullvadvpn-c2f14fb16aeb6b830af95a823c5018761e760f8f.tar.xz mullvadvpn-c2f14fb16aeb6b830af95a823c5018761e760f8f.zip | |
Use `RelayListListener` to handle the relay list
Diffstat (limited to 'android/src')
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 |
