diff options
Diffstat (limited to 'android/src')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ConnectionProxy.kt | 120 |
1 files changed, 9 insertions, 111 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ConnectionProxy.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ConnectionProxy.kt index 45a8aa0f92..87621286bf 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ConnectionProxy.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ConnectionProxy.kt @@ -2,22 +2,17 @@ package net.mullvad.mullvadvpn.service.endpoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.Job import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.ClosedReceiveChannelException import kotlinx.coroutines.channels.actor import kotlinx.coroutines.channels.sendBlocking -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.ipc.Event import net.mullvad.mullvadvpn.ipc.Request import net.mullvad.mullvadvpn.model.TunnelState import net.mullvad.mullvadvpn.ui.MainActivity -import net.mullvad.talpid.tunnel.ActionAfterDisconnect import net.mullvad.talpid.util.EventNotifier -val ANTICIPATED_STATE_TIMEOUT_MS = 1500L - class ConnectionProxy(val vpnPermission: VpnPermission, endpoint: ServiceEndpoint) { private enum class Command { CONNECT, @@ -27,26 +22,20 @@ class ConnectionProxy(val vpnPermission: VpnPermission, endpoint: ServiceEndpoin private val commandChannel = spawnActor() private val daemon = endpoint.intermittentDaemon + private val initialState = TunnelState.Disconnected - var mainActivity: MainActivity? = null - - private var resetAnticipatedStateJob: Job? = null + private val fetchInitialStateJob = fetchInitialState() - private val initialState: TunnelState = TunnelState.Disconnected + var mainActivity: MainActivity? = null - var onStateChange = EventNotifier(initialState) - var onUiStateChange = EventNotifier(initialState) + var onStateChange = EventNotifier<TunnelState>(initialState) var state by onStateChange.notifiable() private set - var uiState by onUiStateChange.notifiable() - private set - - private val fetchInitialStateJob = fetchInitialState() init { daemon.registerListener(this) { newDaemon -> - newDaemon?.onTunnelStateChange = { newState -> handleNewState(newState) } + newDaemon?.onTunnelStateChange = { newState -> state = newState } } onStateChange.subscribe(this) { tunnelState -> @@ -61,30 +50,21 @@ class ConnectionProxy(val vpnPermission: VpnPermission, endpoint: ServiceEndpoin } fun connect() { - if (anticipateConnectingState()) { - commandChannel.sendBlocking(Command.CONNECT) - } + commandChannel.sendBlocking(Command.CONNECT) } fun reconnect() { - if (anticipateReconnectingState()) { - commandChannel.sendBlocking(Command.RECONNECT) - } + commandChannel.sendBlocking(Command.RECONNECT) } fun disconnect() { - if (anticipateDisconnectingState()) { - commandChannel.sendBlocking(Command.DISCONNECT) - } + commandChannel.sendBlocking(Command.DISCONNECT) } fun onDestroy() { commandChannel.close() - - onUiStateChange.unsubscribeAll() - onStateChange.unsubscribeAll() - fetchInitialStateJob.cancel() + onStateChange.unsubscribeAll() daemon.unregisterListener(this) } @@ -107,88 +87,6 @@ class ConnectionProxy(val vpnPermission: VpnPermission, endpoint: ServiceEndpoin } } - private fun handleNewState(newState: TunnelState) { - synchronized(this) { - resetAnticipatedStateJob?.cancel() - state = newState - uiState = newState - } - } - - private fun anticipateConnectingState(): Boolean { - synchronized(this) { - val currentState = uiState - - if (currentState is TunnelState.Connecting || currentState is TunnelState.Connected) { - return false - } else { - scheduleToResetAnticipatedState() - uiState = TunnelState.Connecting(null, null) - return true - } - } - } - - private fun anticipateReconnectingState(): Boolean { - synchronized(this) { - val currentState = uiState - - val willReconnect = when (currentState) { - is TunnelState.Disconnected -> false - is TunnelState.Disconnecting -> { - when (currentState.actionAfterDisconnect) { - ActionAfterDisconnect.Nothing -> false - ActionAfterDisconnect.Reconnect -> true - ActionAfterDisconnect.Block -> true - } - } - is TunnelState.Connecting -> true - is TunnelState.Connected -> true - is TunnelState.Error -> true - } - - if (willReconnect) { - scheduleToResetAnticipatedState() - uiState = TunnelState.Disconnecting(ActionAfterDisconnect.Reconnect) - } - - return willReconnect - } - } - - private fun anticipateDisconnectingState(): Boolean { - synchronized(this) { - val currentState = uiState - - if (currentState is TunnelState.Disconnected) { - return false - } else { - scheduleToResetAnticipatedState() - uiState = TunnelState.Disconnecting(ActionAfterDisconnect.Nothing) - return true - } - } - } - - private fun scheduleToResetAnticipatedState() { - resetAnticipatedStateJob?.cancel() - - var currentJob: Job? = null - - val newJob = GlobalScope.launch(Dispatchers.Default) { - delay(ANTICIPATED_STATE_TIMEOUT_MS) - - synchronized(this@ConnectionProxy) { - if (!currentJob!!.isCancelled) { - uiState = state - } - } - } - - currentJob = newJob - resetAnticipatedStateJob = newJob - } - private fun fetchInitialState() = GlobalScope.launch(Dispatchers.Default) { val currentState = daemon.await().getState() |
