diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-16 12:56:59 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-18 17:25:16 +0000 |
| commit | bb0e2faedc2cec86c34aa6d0552c683a05941c32 (patch) | |
| tree | 5bc4caed9c8daa3a8a23ab36cb758bcb1e985b3a /android | |
| parent | d3858d019f0c627eaf3f7641eb236939d8a7cafa (diff) | |
| download | mullvadvpn-bb0e2faedc2cec86c34aa6d0552c683a05941c32.tar.xz mullvadvpn-bb0e2faedc2cec86c34aa6d0552c683a05941c32.zip | |
Create `ConnectivityListener` helper class
Diffstat (limited to 'android')
| -rw-r--r-- | android/src/main/AndroidManifest.xml | 1 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectivityListener.kt | 59 |
2 files changed, 60 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) + } + } +} |
