summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-30 17:11:31 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-11 15:09:50 +0000
commit14353c306a7036c97de6d060614d7f6a76e43fdf (patch)
treea764b45e4ddfebc368dd3a76a24c5ead39c29cf5 /android/src
parente88e6b900f38a7fa3affcfa88a663b996a358430 (diff)
downloadmullvadvpn-14353c306a7036c97de6d060614d7f6a76e43fdf.tar.xz
mullvadvpn-14353c306a7036c97de6d060614d7f6a76e43fdf.zip
Move daemon thread to service
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt25
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt27
2 files changed, 33 insertions, 19 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index efeb83ba5c..927a6ba05e 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -22,13 +22,7 @@ import net.mullvad.mullvadvpn.relaylist.RelayItem
import net.mullvad.mullvadvpn.relaylist.RelayList
class MainActivity : FragmentActivity() {
- val activityCreated = CompletableDeferred<Unit>()
-
- var asyncService = CompletableDeferred<MullvadVpnService>()
- val service
- get() = runBlocking { asyncService.await() }
-
- val asyncDaemon = startDaemon()
+ var asyncDaemon = CompletableDeferred<MullvadDaemon>()
val daemon
get() = runBlocking { asyncDaemon.await() }
@@ -45,16 +39,20 @@ class MainActivity : FragmentActivity() {
var selectedRelayItem: RelayItem? = null
private val restoreSelectedRelayListItemJob = restoreSelectedRelayListItem()
+ private var waitForDaemonJob: Job? = null
private val serviceConnection = object : ServiceConnection {
override fun onServiceConnected(className: ComponentName, binder: IBinder) {
val localBinder = binder as MullvadVpnService.LocalBinder
- asyncService.complete(localBinder.service)
+ waitForDaemonJob = GlobalScope.launch(Dispatchers.Default) {
+ asyncDaemon.complete(localBinder.asyncDaemon.await())
+ }
}
override fun onServiceDisconnected(className: ComponentName) {
- asyncService = CompletableDeferred<MullvadVpnService>()
+ asyncDaemon.cancel()
+ asyncDaemon = CompletableDeferred<MullvadDaemon>()
}
}
@@ -62,8 +60,6 @@ class MainActivity : FragmentActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
- activityCreated.complete(Unit)
-
if (savedInstanceState == null) {
addInitialFragment()
}
@@ -86,6 +82,7 @@ class MainActivity : FragmentActivity() {
override fun onDestroy() {
restoreSelectedRelayListItemJob.cancel()
+ waitForDaemonJob?.cancel()
asyncSettings.cancel()
asyncRelayList.cancel()
asyncDaemon.cancel()
@@ -100,12 +97,6 @@ class MainActivity : FragmentActivity() {
}
}
- private fun startDaemon() = GlobalScope.async(Dispatchers.Default) {
- activityCreated.await()
- ApiRootCaFile().extract(this@MainActivity)
- MullvadDaemon(asyncService.await())
- }
-
private fun fetchRelayList() = GlobalScope.async(Dispatchers.Default) {
RelayList(asyncDaemon.await().getRelayLocations())
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
index 50e0271704..8785c94230 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
@@ -2,8 +2,11 @@ package net.mullvad.mullvadvpn
import java.net.InetAddress
+import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
import android.app.Activity
import android.content.Context
@@ -15,12 +18,26 @@ import android.os.IBinder
import net.mullvad.mullvadvpn.model.TunConfig
class MullvadVpnService : VpnService() {
+ private val created = CompletableDeferred<Unit>()
private val binder = LocalBinder()
+ val asyncDaemon = startDaemon()
+ val daemon
+ get() = runBlocking { asyncDaemon.await() }
+
+ override fun onCreate() {
+ created.complete(Unit)
+ }
+
override fun onBind(intent: Intent): IBinder {
return super.onBind(intent) ?: binder
}
+ override fun onDestroy() {
+ asyncDaemon.cancel()
+ created.cancel()
+ }
+
fun createTun(config: TunConfig): Int {
val builder = Builder().apply {
for (address in config.addresses) {
@@ -48,7 +65,13 @@ class MullvadVpnService : VpnService() {
}
inner class LocalBinder : Binder() {
- val service
- get() = this@MullvadVpnService
+ val asyncDaemon
+ get() = this@MullvadVpnService.asyncDaemon
+ }
+
+ private fun startDaemon() = GlobalScope.async(Dispatchers.Default) {
+ created.await()
+ ApiRootCaFile().extract(application)
+ MullvadDaemon(this@MullvadVpnService)
}
}