summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-18 20:58:25 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-18 20:58:25 -0300
commit529badb6c2f8814221358bd4400e9811c2184ab2 (patch)
treed1524815ab4f13aef8062e5fa045be87a9a21e1b /android
parent1f9cac7a2418138d1c1138a5816cffd8df6ebe55 (diff)
parentf67fc9f071ad27c0729d027c6cfd0133c4f842ba (diff)
downloadmullvadvpn-529badb6c2f8814221358bd4400e9811c2184ab2.tar.xz
mullvadvpn-529badb6c2f8814221358bd4400e9811c2184ab2.zip
Merge branch 'improve-connectivity'
Diffstat (limited to 'android')
-rw-r--r--android/src/main/AndroidManifest.xml1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectivityListener.kt59
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt7
3 files changed, 67 insertions, 0 deletions
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index 88dfa8ae67..9e21e5ec90 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"
package="net.mullvad.mullvadvpn"
>
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectivityListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectivityListener.kt
new file mode 100644
index 0000000000..cf212762aa
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectivityListener.kt
@@ -0,0 +1,59 @@
+package net.mullvad.mullvadvpn
+
+import kotlinx.coroutines.CompletableDeferred
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.net.ConnectivityManager
+import android.net.NetworkInfo
+import android.net.NetworkInfo.DetailedState
+
+class ConnectivityListener : BroadcastReceiver() {
+ var vpnDisconnected = CompletableDeferred<Unit>()
+ private set
+
+ fun register(context: Context) {
+ val intentFilter = IntentFilter()
+
+ intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
+ context.registerReceiver(this, intentFilter)
+
+ checkInitialState(context)
+ }
+
+ fun unregister(context: Context) {
+ context.unregisterReceiver(this)
+ }
+
+ override fun onReceive(context: Context, intent: Intent) {
+ val networkInfo =
+ intent.getParcelableExtra<NetworkInfo>(ConnectivityManager.EXTRA_NETWORK_INFO)
+
+ if (networkInfo.type == ConnectivityManager.TYPE_VPN) {
+ if (networkInfo.detailedState == DetailedState.DISCONNECTED) {
+ vpnDisconnected.complete(Unit)
+ } else if (networkInfo.detailedState == DetailedState.CONNECTED) {
+ vpnDisconnected.cancel()
+ vpnDisconnected = CompletableDeferred<Unit>()
+ }
+ }
+ }
+
+ private fun checkInitialState(context: Context) {
+ val connectivityManager =
+ context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+
+ val isVpnConnected = connectivityManager.allNetworks
+ .map({ network -> connectivityManager.getNetworkInfo(network) })
+ .any({ networkInfo ->
+ networkInfo.type == ConnectivityManager.TYPE_VPN
+ && networkInfo.detailedState == DetailedState.CONNECTED
+ })
+
+ if (!isVpnConnected) {
+ vpnDisconnected.complete(Unit)
+ }
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
index 8785c94230..e728752461 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt
@@ -18,6 +18,7 @@ import android.os.IBinder
import net.mullvad.mullvadvpn.model.TunConfig
class MullvadVpnService : VpnService() {
+ private val connectivityListener = ConnectivityListener()
private val created = CompletableDeferred<Unit>()
private val binder = LocalBinder()
@@ -27,6 +28,7 @@ class MullvadVpnService : VpnService() {
override fun onCreate() {
created.complete(Unit)
+ connectivityListener.register(this)
}
override fun onBind(intent: Intent): IBinder {
@@ -34,11 +36,16 @@ class MullvadVpnService : VpnService() {
}
override fun onDestroy() {
+ connectivityListener.unregister(this)
asyncDaemon.cancel()
created.cancel()
}
fun createTun(config: TunConfig): Int {
+ runBlocking {
+ connectivityListener.vpnDisconnected.await()
+ }
+
val builder = Builder().apply {
for (address in config.addresses) {
addAddress(address, 32)