summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-03-26 19:40:11 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-23 18:08:56 +0000
commit074a68305b2a2f67ff6c0d3156f3490ef0aa006c (patch)
tree83354b998e1303baf62024c2f46044415a5fa200
parentee614ce4f1cb61961ca6e65a87902897d9315ead (diff)
downloadmullvadvpn-074a68305b2a2f67ff6c0d3156f3490ef0aa006c.tar.xz
mullvadvpn-074a68305b2a2f67ff6c0d3156f3490ef0aa006c.zip
Use tunnel state events to update Connect screen
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt20
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt58
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionState.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt19
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/HeaderBar.kt19
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt19
6 files changed, 71 insertions, 71 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt
index 4a577cd337..faf4a61521 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt
@@ -3,15 +3,19 @@ package net.mullvad.mullvadvpn
import android.view.View
import android.widget.Button
+import net.mullvad.mullvadvpn.model.TunnelStateTransition
+
class ConnectActionButton(val parentView: View) {
private val button: Button = parentView.findViewById(R.id.action_button)
- var state = ConnectionState.Disconnected
+ var state: TunnelStateTransition = TunnelStateTransition.Disconnected()
set(value) {
when (value) {
- ConnectionState.Disconnected -> disconnected()
- ConnectionState.Connecting -> connecting()
- ConnectionState.Connected -> connected()
+ is TunnelStateTransition.Disconnected -> disconnected()
+ is TunnelStateTransition.Disconnecting -> disconnected()
+ is TunnelStateTransition.Connecting -> connecting()
+ is TunnelStateTransition.Connected -> connected()
+ is TunnelStateTransition.Blocked -> connected()
}
field = value
@@ -27,9 +31,11 @@ class ConnectActionButton(val parentView: View) {
private fun action() {
when (state) {
- ConnectionState.Disconnected -> onConnect?.invoke()
- ConnectionState.Connecting -> onCancel?.invoke()
- ConnectionState.Connected -> onDisconnect?.invoke()
+ is TunnelStateTransition.Disconnected -> onConnect?.invoke()
+ is TunnelStateTransition.Disconnecting -> onConnect?.invoke()
+ is TunnelStateTransition.Connecting -> onCancel?.invoke()
+ is TunnelStateTransition.Connected -> onDisconnect?.invoke()
+ is TunnelStateTransition.Blocked -> onDisconnect?.invoke()
}
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
index 8d7abfd24e..11bfabe912 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
@@ -4,6 +4,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
import android.content.Context
import android.os.Bundle
@@ -14,24 +15,18 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Button
+import net.mullvad.mullvadvpn.model.TunnelStateTransition
+
class ConnectFragment : Fragment() {
private lateinit var actionButton: ConnectActionButton
private lateinit var headerBar: HeaderBar
private lateinit var notificationBanner: NotificationBanner
private lateinit var status: ConnectionStatus
- private lateinit var connectHandler: Handler
private lateinit var daemon: Deferred<MullvadDaemon>
- private var state = ConnectionState.Disconnected
- set(value) {
- actionButton.state = value
- headerBar.state = value
- notificationBanner.state = value
- status.state = value
-
- field = value
- }
+ private var attachListenerJob: Job? = null
+ private var updateViewJob: Job? = null
override fun onAttach(context: Context) {
super.onAttach(context)
@@ -39,12 +34,6 @@ class ConnectFragment : Fragment() {
daemon = (context as MainActivity).asyncDaemon
}
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- connectHandler = Handler()
- }
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -67,31 +56,40 @@ class ConnectFragment : Fragment() {
onDisconnect = { disconnect() }
}
+ attachListenerJob = attachListener()
+
return view
}
- private fun connect() {
- state = ConnectionState.Connecting
- GlobalScope.launch(Dispatchers.Default) {
- daemon.await().connect()
- }
+ override fun onDestroyView() {
+ attachListenerJob?.cancel()
+ detachListener()
+ updateViewJob?.cancel()
+ super.onDestroyView()
+ }
- connectHandler.postDelayed(Runnable { connected() }, 1000)
+ private fun attachListener() = GlobalScope.launch(Dispatchers.Default) {
+ daemon.await().onTunnelStateChange = { state -> updateViewJob = updateView(state) }
}
- private fun disconnect() {
- state = ConnectionState.Disconnected
+ private fun detachListener() = GlobalScope.launch(Dispatchers.Default) {
+ daemon.await().onTunnelStateChange = null
+ }
- GlobalScope.launch(Dispatchers.Default) {
- daemon.await().disconnect()
- }
+ private fun connect() = GlobalScope.launch(Dispatchers.Default) {
+ daemon.await().connect()
+ }
- connectHandler.removeCallbacksAndMessages(null)
+ private fun disconnect() = GlobalScope.launch(Dispatchers.Default) {
+ daemon.await().disconnect()
}
- private fun connected() {
- state = ConnectionState.Connected
+ private fun updateView(state: TunnelStateTransition) = GlobalScope.launch(Dispatchers.Main) {
+ actionButton.state = state
+ headerBar.setState(state)
+ notificationBanner.setState(state)
+ status.setState(state)
}
private fun openSwitchLocationScreen() {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionState.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionState.kt
deleted file mode 100644
index 4764ce05fe..0000000000
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionState.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package net.mullvad.mullvadvpn
-
-enum class ConnectionState {
- Disconnected,
- Connecting,
- Connected,
-}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt
index 7f608c5431..652eae4da5 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt
@@ -4,6 +4,8 @@ import android.content.Context
import android.view.View
import android.widget.TextView
+import net.mullvad.mullvadvpn.model.TunnelStateTransition
+
class ConnectionStatus(val parentView: View, val context: Context) {
private val spinner: View = parentView.findViewById(R.id.connecting_spinner)
private val text: TextView = parentView.findViewById(R.id.connection_status)
@@ -12,16 +14,15 @@ class ConnectionStatus(val parentView: View, val context: Context) {
private val connectingTextColor = context.getColor(R.color.white)
private val connectedTextColor = context.getColor(R.color.green)
- var state = ConnectionState.Disconnected
- set(value) {
- when (value) {
- ConnectionState.Disconnected -> disconnected()
- ConnectionState.Connecting -> connecting()
- ConnectionState.Connected -> connected()
- }
-
- field = value
+ fun setState(state: TunnelStateTransition) {
+ when (state) {
+ is TunnelStateTransition.Disconnecting -> disconnected()
+ is TunnelStateTransition.Disconnected -> disconnected()
+ is TunnelStateTransition.Connecting -> connecting()
+ is TunnelStateTransition.Connected -> connected()
+ is TunnelStateTransition.Blocked -> connected()
}
+ }
private fun disconnected() {
spinner.visibility = View.GONE
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/HeaderBar.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/HeaderBar.kt
index 4c46174f51..6988dae839 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/HeaderBar.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/HeaderBar.kt
@@ -3,22 +3,23 @@ package net.mullvad.mullvadvpn
import android.content.Context
import android.view.View
+import net.mullvad.mullvadvpn.model.TunnelStateTransition
+
class HeaderBar(val parentView: View, val context: Context) {
private val headerBar: View = parentView.findViewById(R.id.header_bar)
private val securedColor = context.getColor(R.color.green)
private val unsecuredColor = context.getColor(R.color.red)
- var state = ConnectionState.Disconnected
- set(value) {
- when (value) {
- ConnectionState.Disconnected -> unsecured()
- ConnectionState.Connecting -> secured()
- ConnectionState.Connected -> secured()
- }
-
- field = value
+ fun setState(state: TunnelStateTransition) {
+ when (state) {
+ is TunnelStateTransition.Disconnected -> unsecured()
+ is TunnelStateTransition.Connecting -> secured()
+ is TunnelStateTransition.Connected -> secured()
+ is TunnelStateTransition.Disconnecting -> secured()
+ is TunnelStateTransition.Blocked -> secured()
}
+ }
private fun unsecured() {
headerBar.setBackgroundColor(unsecuredColor)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt
index 531e43f96f..7789d57435 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt
@@ -2,20 +2,21 @@ package net.mullvad.mullvadvpn
import android.view.View
+import net.mullvad.mullvadvpn.model.TunnelStateTransition
+
class NotificationBanner(val parentView: View) {
private val banner: View = parentView.findViewById(R.id.notification_banner)
private var visible = false
- var state = ConnectionState.Disconnected
- set(value) {
- when (value) {
- ConnectionState.Disconnected -> hide()
- ConnectionState.Connecting -> show()
- ConnectionState.Connected -> hide()
- }
-
- field = value
+ fun setState(state: TunnelStateTransition) {
+ when (state) {
+ is TunnelStateTransition.Disconnecting -> hide()
+ is TunnelStateTransition.Disconnected -> hide()
+ is TunnelStateTransition.Connecting -> show()
+ is TunnelStateTransition.Connected -> hide()
+ is TunnelStateTransition.Blocked -> show()
}
+ }
private fun show() {
if (!visible) {