summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-01-26 01:02:38 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-02-15 18:47:22 +0000
commit03719482ee2805991c3091704edbab389324ed69 (patch)
tree3ca0db32cd7cf731599eb1a40a804333e3849613 /android/src
parenteeb01fc472e3f095b02b5a3d6480677a16882eea (diff)
downloadmullvadvpn-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.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt32
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)