summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt28
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SelectLocationFragment.kt18
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SwitchLocationButton.kt71
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/Relay.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItem.kt3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt4
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)
}