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/src/main/kotlin | |
| parent | d3858d019f0c627eaf3f7641eb236939d8a7cafa (diff) | |
| download | mullvadvpn-bb0e2faedc2cec86c34aa6d0552c683a05941c32.tar.xz mullvadvpn-bb0e2faedc2cec86c34aa6d0552c683a05941c32.zip | |
Create `ConnectivityListener` helper class
Diffstat (limited to 'android/src/main/kotlin')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectivityListener.kt | 59 |
1 files changed, 59 insertions, 0 deletions
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) + } + } +} |
