diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-30 16:50:10 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-11 15:09:50 +0000 |
| commit | e88e6b900f38a7fa3affcfa88a663b996a358430 (patch) | |
| tree | cae62bd1b8ca211ca285bf97ee8ad4ddf00130e6 /android | |
| parent | 4ec1e855b1d1f3e73838dcac39e00c72a6281b4c (diff) | |
| download | mullvadvpn-e88e6b900f38a7fa3affcfa88a663b996a358430.tar.xz mullvadvpn-e88e6b900f38a7fa3affcfa88a663b996a358430.zip | |
Make `MullvadVpnService` a service
Diffstat (limited to 'android')
3 files changed, 53 insertions, 43 deletions
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index d025f278a5..d8e2136048 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -24,7 +24,7 @@ </activity> <service - android:name=".MullvadVpnService$InnerVpnService" + android:name=".MullvadVpnService" android:permission="android.permission.BIND_VPN_SERVICE" > <intent-filter> diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt index 320b2e1c94..efeb83ba5c 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt @@ -9,7 +9,11 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job +import android.content.ComponentName +import android.content.Intent +import android.content.ServiceConnection import android.os.Bundle +import android.os.IBinder import android.support.v4.app.FragmentActivity import net.mullvad.mullvadvpn.model.RelaySettings @@ -20,6 +24,10 @@ 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() val daemon get() = runBlocking { asyncDaemon.await() } @@ -38,6 +46,18 @@ class MainActivity : FragmentActivity() { private val restoreSelectedRelayListItemJob = restoreSelectedRelayListItem() + private val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(className: ComponentName, binder: IBinder) { + val localBinder = binder as MullvadVpnService.LocalBinder + + asyncService.complete(localBinder.service) + } + + override fun onServiceDisconnected(className: ComponentName) { + asyncService = CompletableDeferred<MullvadVpnService>() + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) @@ -49,6 +69,21 @@ class MainActivity : FragmentActivity() { } } + override fun onStart() { + super.onStart() + + val intent = Intent(this, MullvadVpnService::class.java) + + startService(intent) + bindService(intent, serviceConnection, 0) + } + + override fun onStop() { + unbindService(serviceConnection) + + super.onStop() + } + override fun onDestroy() { restoreSelectedRelayListItemJob.cancel() asyncSettings.cancel() @@ -68,7 +103,7 @@ class MainActivity : FragmentActivity() { private fun startDaemon() = GlobalScope.async(Dispatchers.Default) { activityCreated.await() ApiRootCaFile().extract(this@MainActivity) - MullvadDaemon(MullvadVpnService(this@MainActivity)) + MullvadDaemon(asyncService.await()) } private fun fetchRelayList() = GlobalScope.async(Dispatchers.Default) { diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt index 486c6aa1a7..50e0271704 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt @@ -9,54 +9,20 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.net.VpnService +import android.os.Binder +import android.os.IBinder import net.mullvad.mullvadvpn.model.TunConfig -var INNER_VPN_SERVICE = CompletableDeferred<MullvadVpnService.InnerVpnService>() -var SERVICE_NOT_RUNNING = true +class MullvadVpnService : VpnService() { + private val binder = LocalBinder() -class MullvadVpnService(val context: Context) { - class InnerVpnService : VpnService() { - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - INNER_VPN_SERVICE.complete(this) - - return super.onStartCommand(intent, flags, startId) - } - - override fun onDestroy() { - INNER_VPN_SERVICE = CompletableDeferred<MullvadVpnService.InnerVpnService>() - SERVICE_NOT_RUNNING = true - super.onDestroy() - } - - fun builder(): Builder { - return Builder() - } + override fun onBind(intent: Intent): IBinder { + return super.onBind(intent) ?: binder } fun createTun(config: TunConfig): Int { - return createTun(config, startService()) - } - - fun bypass(socket: Int): Boolean { - return startService().protect(socket) - } - - private fun startService(): InnerVpnService { - lateinit var service: InnerVpnService - - if (SERVICE_NOT_RUNNING) { - SERVICE_NOT_RUNNING = false - context.startService(Intent(context, InnerVpnService::class.java)) - } - - runBlocking { service = INNER_VPN_SERVICE.await() } - - return service - } - - private fun createTun(config: TunConfig, service: InnerVpnService): Int { - val builder = service.builder().apply { + val builder = Builder().apply { for (address in config.addresses) { addAddress(address, 32) } @@ -76,4 +42,13 @@ class MullvadVpnService(val context: Context) { return vpnInterface.detachFd() } + + fun bypass(socket: Int): Boolean { + return protect(socket) + } + + inner class LocalBinder : Binder() { + val service + get() = this@MullvadVpnService + } } |
