diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-18 20:58:25 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-18 20:58:25 -0300 |
| commit | 529badb6c2f8814221358bd4400e9811c2184ab2 (patch) | |
| tree | d1524815ab4f13aef8062e5fa045be87a9a21e1b /android | |
| parent | 1f9cac7a2418138d1c1138a5816cffd8df6ebe55 (diff) | |
| parent | f67fc9f071ad27c0729d027c6cfd0133c4f842ba (diff) | |
| download | mullvadvpn-529badb6c2f8814221358bd4400e9811c2184ab2.tar.xz mullvadvpn-529badb6c2f8814221358bd4400e9811c2184ab2.zip | |
Merge branch 'improve-connectivity'
Diffstat (limited to 'android')
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) |
