summaryrefslogtreecommitdiffhomepage
path: root/android/src/main
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-30 16:50:10 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-11 15:09:50 +0000
commite88e6b900f38a7fa3affcfa88a663b996a358430 (patch)
treecae62bd1b8ca211ca285bf97ee8ad4ddf00130e6 /android/src/main
parent4ec1e855b1d1f3e73838dcac39e00c72a6281b4c (diff)
downloadmullvadvpn-e88e6b900f38a7fa3affcfa88a663b996a358430.tar.xz
mullvadvpn-e88e6b900f38a7fa3affcfa88a663b996a358430.zip
Make `MullvadVpnService` a service
Diffstat (limited to 'android/src/main')
-rw-r--r--android/src/main/AndroidManifest.xml2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt37
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt57
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
+ }
}