diff options
Diffstat (limited to 'android/src')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt index 7a3ec1dd9c..17c5dff47d 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt @@ -41,25 +41,25 @@ class ConnectionProxy(val parentActivity: MainActivity) { } fun connect() { - uiState = TunnelState.Connecting(null) + if (anticipateConnectingState()) { + cancelActiveAction() - cancelActiveAction() - - val vpnPermission = parentActivity.requestVpnPermission() + val vpnPermission = parentActivity.requestVpnPermission() - activeAction = GlobalScope.launch(Dispatchers.Default) { - if (vpnPermission.await()) { - daemon.await().connect() + activeAction = GlobalScope.launch(Dispatchers.Default) { + if (vpnPermission.await()) { + daemon.await().connect() + } } } } fun disconnect() { - uiState = TunnelState.Disconnecting(ActionAfterDisconnect.Nothing()) - - cancelActiveAction() - activeAction = GlobalScope.launch(Dispatchers.Default) { - daemon.await().disconnect() + if (anticipateDisconnectingState()) { + cancelActiveAction() + activeAction = GlobalScope.launch(Dispatchers.Default) { + daemon.await().disconnect() + } } } @@ -74,6 +74,32 @@ class ConnectionProxy(val parentActivity: MainActivity) { cancelActiveAction() } + private fun anticipateConnectingState(): Boolean { + synchronized(this) { + val currentState = state + + if (currentState is TunnelState.Connecting || currentState is TunnelState.Connected) { + return false + } else { + uiState = TunnelState.Connecting(null) + return true + } + } + } + + private fun anticipateDisconnectingState(): Boolean { + synchronized(this) { + val currentState = state + + if (currentState is TunnelState.Disconnected) { + return false + } else { + uiState = TunnelState.Disconnecting(ActionAfterDisconnect.Nothing()) + return true + } + } + } + private fun fetchInitialState() = GlobalScope.launch(Dispatchers.Default) { val initialState = daemon.await().getState() |
