diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-01-04 17:44:30 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-04-12 13:19:37 +0000 |
| commit | 948f88006f2b8baf9be0fc8eba37940fad113ec0 (patch) | |
| tree | d4b4c558817bd4d08d655999794a489538f91d7b /android/src | |
| parent | 90a50180746139c07f8aea0a8922f415006a05a1 (diff) | |
| download | mullvadvpn-948f88006f2b8baf9be0fc8eba37940fad113ec0.tar.xz mullvadvpn-948f88006f2b8baf9be0fc8eba37940fad113ec0.zip | |
Refactor `ConnectionProxy` into an actor
Diffstat (limited to 'android/src')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxy.kt | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxy.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxy.kt index c21c4d54c6..5bfdb25f07 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxy.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ConnectionProxy.kt @@ -7,6 +7,10 @@ import kotlinx.coroutines.CompletableDeferred 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.model.TunnelState @@ -17,9 +21,16 @@ import net.mullvad.talpid.util.EventNotifier val ANTICIPATED_STATE_TIMEOUT_MS = 1500L class ConnectionProxy(val context: Context, val daemon: MullvadDaemon) { + private enum class Command { + CONNECT, + RECONNECT, + DISCONNECT, + } + + private val commandChannel = spawnActor() + var mainActivity: MainActivity? = null - private var activeAction: Job? = null private var resetAnticipatedStateJob: Job? = null private val initialState: TunnelState = TunnelState.Disconnected @@ -47,47 +58,50 @@ class ConnectionProxy(val context: Context, val daemon: MullvadDaemon) { fun connect() { if (anticipateConnectingState()) { - cancelActiveAction() - requestVpnPermission() - - activeAction = GlobalScope.launch(Dispatchers.Default) { - vpnPermission.await() - daemon.connect() - } + commandChannel.sendBlocking(Command.CONNECT) } } fun reconnect() { if (anticipateReconnectingState()) { - cancelActiveAction() - activeAction = GlobalScope.launch(Dispatchers.Default) { - daemon.reconnect() - } + commandChannel.sendBlocking(Command.RECONNECT) } } fun disconnect() { if (anticipateDisconnectingState()) { - cancelActiveAction() - activeAction = GlobalScope.launch(Dispatchers.Default) { - daemon.disconnect() - } + commandChannel.sendBlocking(Command.DISCONNECT) } } - fun cancelActiveAction() { - activeAction?.cancel() - } - fun onDestroy() { + commandChannel.close() daemon.onTunnelStateChange = null onUiStateChange.unsubscribeAll() onStateChange.unsubscribeAll() fetchInitialStateJob.cancel() - cancelActiveAction() + } + + private fun spawnActor() = GlobalScope.actor<Command>(Dispatchers.Default, Channel.UNLIMITED) { + try { + while (true) { + val command = channel.receive() + + when (command) { + Command.CONNECT -> { + vpnPermission.await() + daemon.connect() + } + Command.RECONNECT -> daemon.reconnect() + Command.DISCONNECT -> daemon.disconnect() + } + } + } catch (exception: ClosedReceiveChannelException) { + // Closed sender, so stop the actor + } } private fun anticipateConnectingState(): Boolean { |
