diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-03-26 19:40:11 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-23 18:08:56 +0000 |
| commit | 074a68305b2a2f67ff6c0d3156f3490ef0aa006c (patch) | |
| tree | 83354b998e1303baf62024c2f46044415a5fa200 /android | |
| parent | ee614ce4f1cb61961ca6e65a87902897d9315ead (diff) | |
| download | mullvadvpn-074a68305b2a2f67ff6c0d3156f3490ef0aa006c.tar.xz mullvadvpn-074a68305b2a2f67ff6c0d3156f3490ef0aa006c.zip | |
Use tunnel state events to update Connect screen
Diffstat (limited to 'android')
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) { |
