diff options
Diffstat (limited to 'android')
6 files changed, 119 insertions, 10 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt index dac1426b2a..f627ad789a 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt @@ -21,11 +21,13 @@ import android.widget.Button import android.widget.ImageButton import net.mullvad.mullvadvpn.dataproxy.LocationInfoCache +import net.mullvad.mullvadvpn.dataproxy.RelayListListener import net.mullvad.mullvadvpn.model.GeoIpLocation import net.mullvad.mullvadvpn.model.TunnelStateTransition class ConnectFragment : Fragment() { private lateinit var actionButton: ConnectActionButton + private lateinit var switchLocationButton: SwitchLocationButton private lateinit var headerBar: HeaderBar private lateinit var notificationBanner: NotificationBanner private lateinit var status: ConnectionStatus @@ -33,6 +35,7 @@ class ConnectFragment : Fragment() { private lateinit var parentActivity: MainActivity private lateinit var locationInfoCache: LocationInfoCache + private lateinit var relayListListener: RelayListListener private var daemon = CompletableDeferred<MullvadDaemon>() private var vpnPermission = CompletableDeferred<Unit>() @@ -50,6 +53,7 @@ class ConnectFragment : Fragment() { parentActivity = context as MainActivity locationInfoCache = parentActivity.locationInfoCache + relayListListener = parentActivity.relayListListener waitForDaemonJob = waitForDaemon(parentActivity.asyncDaemon) } @@ -64,10 +68,6 @@ class ConnectFragment : Fragment() { parentActivity.openSettings() } - view.findViewById<Button>(R.id.switch_location).setOnClickListener { - openSwitchLocationScreen() - } - headerBar = HeaderBar(view, context!!) notificationBanner = NotificationBanner(view) status = ConnectionStatus(view, context!!) @@ -80,13 +80,31 @@ class ConnectFragment : Fragment() { onDisconnect = { disconnect() } } + switchLocationButton = SwitchLocationButton(view) + switchLocationButton.onClick = { openSwitchLocationScreen() } + attachListenerJob = attachListener() return view } + override fun onResume() { + super.onResume() + + relayListListener.onRelayListChange = { relayList, selectedRelayItem -> + switchLocationButton.location = selectedRelayItem + } + } + + override fun onPause() { + relayListListener.onRelayListChange = null + + super.onPause() + } + override fun onDestroyView() { locationInfo.onDestroy() + switchLocationButton.onDestroy() waitForDaemonJob?.cancel() attachListenerJob?.cancel() @@ -186,6 +204,8 @@ class ConnectFragment : Fragment() { private fun updateView(state: TunnelStateTransition) = GlobalScope.launch(Dispatchers.Main) { actionButton.state = state + switchLocationButton.state = state + headerBar.setState(state) notificationBanner.setState(state) status.setState(state) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt index 62a9440f64..96519c1893 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt @@ -48,10 +48,6 @@ class SelectLocationFragment : Fragment() { parentActivity = context as MainActivity relayListListener = parentActivity.relayListListener - - relayListListener.onRelayListChange = { relayList, selectedItem -> - updateRelayListJob = updateRelayList(relayList, selectedItem) - } } override fun onCreateView( @@ -71,6 +67,20 @@ class SelectLocationFragment : Fragment() { return view } + override fun onResume() { + super.onResume() + + relayListListener.onRelayListChange = { relayList, selectedItem -> + updateRelayListJob = updateRelayList(relayList, selectedItem) + } + } + + override fun onPause() { + relayListListener.onRelayListChange = null + + super.onPause() + } + override fun onDestroyView() { updateRelayListJob?.cancel() diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/SwitchLocationButton.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SwitchLocationButton.kt new file mode 100644 index 0000000000..4c89bc259e --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SwitchLocationButton.kt @@ -0,0 +1,71 @@ +package net.mullvad.mullvadvpn + +import kotlinx.coroutines.launch +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Job + +import android.graphics.drawable.Drawable +import android.view.View +import android.widget.Button + +import net.mullvad.mullvadvpn.model.TunnelStateTransition +import net.mullvad.mullvadvpn.relaylist.RelayItem + +class SwitchLocationButton(val parentView: View) { + private val button: Button = parentView.findViewById(R.id.switch_location) + private val chevron: Drawable = button.compoundDrawables[2] + + private var updateJob: Job? = null + + var location: RelayItem? = null + set(value) { + field = value + update() + } + + var state: TunnelStateTransition = TunnelStateTransition.Disconnected() + set(value) { + field = value + update() + } + + var onClick: (() -> Unit)? = null + + init { + button.setOnClickListener { onClick?.invoke() } + } + + fun onDestroy() { + updateJob?.cancel() + } + + private fun update() { + updateJob?.cancel() + updateJob = GlobalScope.launch(Dispatchers.Main) { + when (state) { + is TunnelStateTransition.Disconnected -> showLocation() + is TunnelStateTransition.Disconnecting -> showLocation() + is TunnelStateTransition.Connecting -> showLabel() + is TunnelStateTransition.Connected -> showLabel() + is TunnelStateTransition.Blocked -> showLocation() + } + } + } + + private fun showLabel() { + button.setText(R.string.switch_location) + button.setCompoundDrawables(null, null, null, null) + } + + private fun showLocation() { + val locationName = location?.locationName + + if (locationName == null) { + showLabel() + } else { + button.setText(locationName) + button.setCompoundDrawables(null, null, chevron, null) + } + } +} 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 7e2f09e289..863dc69d8e 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/Relay.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/Relay.kt @@ -5,7 +5,8 @@ import net.mullvad.mullvadvpn.model.LocationConstraint data class Relay( val countryCode: String, val cityCode: String, - override val name: String + override val name: String, + val cityName: String ) : RelayItem { override val code = name override val type = RelayItemType.Relay @@ -14,6 +15,8 @@ data class Relay( override val visibleChildCount = 0 + override val locationName = "$cityName ($name)" + override var expanded get() = false set(value) {} 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 22f39cbf7e..d55378fbd4 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItem.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItem.kt @@ -13,5 +13,8 @@ interface RelayItem { val visibleItemCount: Int get() = visibleChildCount + 1 + val locationName: String + get() = name + var expanded: Boolean } 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 e6bd7728b0..7c3870c4dd 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt @@ -13,7 +13,9 @@ class RelayList { .map { city -> val relays = city.relays .filter { relay -> relay.hasWireguardTunnels } - .map { relay -> Relay(country.code, city.code, relay.hostname) } + .map { relay -> + Relay(country.code, city.code, relay.hostname, city.name) + } RelayCity(city.name, country.code, city.code, false, relays) } |
