diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-01-26 01:02:38 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-02-15 18:47:22 +0000 |
| commit | 03719482ee2805991c3091704edbab389324ed69 (patch) | |
| tree | 3ca0db32cd7cf731599eb1a40a804333e3849613 /android/src | |
| parent | eeb01fc472e3f095b02b5a3d6480677a16882eea (diff) | |
| download | mullvadvpn-03719482ee2805991c3091704edbab389324ed69.tar.xz mullvadvpn-03719482ee2805991c3091704edbab389324ed69.zip | |
Wait for daemon to be ready before registering
Diffstat (limited to 'android/src')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt | 5 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt | 32 |
2 files changed, 33 insertions, 4 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt index 63d7e0ecb4..0e43e7aa64 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt @@ -101,15 +101,16 @@ class MullvadVpnService : TalpidVpnService() { initializeSplitTunneling() + daemonInstance = DaemonInstance(this) keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager notificationManager = ForegroundNotificationManager(this, serviceNotifier, keyguardManager) tunnelStateUpdater = TunnelStateUpdater(this, serviceNotifier) - endpoint = ServiceEndpoint(Looper.getMainLooper()) + endpoint = ServiceEndpoint(Looper.getMainLooper(), daemonInstance.intermittentDaemon) notificationManager.acknowledgeStartForegroundService() - daemonInstance = DaemonInstance(this).apply { + daemonInstance.apply { intermittentDaemon.registerListener(this@MullvadVpnService) { daemon -> handleDaemonInstance(daemon) } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt index e401a116a8..6541ef2ba7 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt @@ -3,12 +3,22 @@ package net.mullvad.mullvadvpn.service.endpoint import android.os.DeadObjectException import android.os.Looper import android.os.Messenger +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.channels.ClosedReceiveChannelException +import kotlinx.coroutines.channels.SendChannel +import kotlinx.coroutines.channels.actor +import kotlinx.coroutines.channels.sendBlocking import net.mullvad.mullvadvpn.ipc.DispatchingHandler import net.mullvad.mullvadvpn.ipc.Event import net.mullvad.mullvadvpn.ipc.Request +import net.mullvad.mullvadvpn.service.MullvadDaemon +import net.mullvad.mullvadvpn.util.Intermittent -class ServiceEndpoint(looper: Looper) { +class ServiceEndpoint(looper: Looper, private val intermittentDaemon: Intermittent<MullvadDaemon>) { private val listeners = mutableSetOf<Messenger>() + private val registrationQueue: SendChannel<Messenger> = startRegistrator() internal val dispatcher = DispatchingHandler(looper) { message -> Request.fromMessage(message) @@ -18,12 +28,13 @@ class ServiceEndpoint(looper: Looper) { init { dispatcher.registerHandler(Request.RegisterListener::class) { request -> - registerListener(request.listener) + registrationQueue.sendBlocking(request.listener) } } fun onDestroy() { dispatcher.onDestroy() + registrationQueue.close() } internal fun sendEvent(event: Event) { @@ -42,6 +53,23 @@ class ServiceEndpoint(looper: Looper) { } } + private fun startRegistrator() = GlobalScope.actor<Messenger>( + Dispatchers.Default, + Channel.UNLIMITED + ) { + try { + while (true) { + val listener = channel.receive() + + intermittentDaemon.await() + + registerListener(listener) + } + } catch (exception: ClosedReceiveChannelException) { + // Registration queue closed; stop registrator + } + } + private fun registerListener(listener: Messenger) { synchronized(this) { listeners.add(listener) |
