diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-30 17:11:31 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-11 15:09:50 +0000 |
| commit | 14353c306a7036c97de6d060614d7f6a76e43fdf (patch) | |
| tree | a764b45e4ddfebc368dd3a76a24c5ead39c29cf5 /android/src | |
| parent | e88e6b900f38a7fa3affcfa88a663b996a358430 (diff) | |
| download | mullvadvpn-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.kt | 25 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt | 27 |
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) } } |
