summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt50
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()