summaryrefslogtreecommitdiffhomepage
path: root/android/src/main
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-16 12:56:59 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-18 17:25:16 +0000
commitbb0e2faedc2cec86c34aa6d0552c683a05941c32 (patch)
tree5bc4caed9c8daa3a8a23ab36cb758bcb1e985b3a /android/src/main
parentd3858d019f0c627eaf3f7641eb236939d8a7cafa (diff)
downloadmullvadvpn-bb0e2faedc2cec86c34aa6d0552c683a05941c32.tar.xz
mullvadvpn-bb0e2faedc2cec86c34aa6d0552c683a05941c32.zip
Create `ConnectivityListener` helper class
Diffstat (limited to 'android/src/main')
-rw-r--r--android/src/main/AndroidManifest.xml1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectivityListener.kt59
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)
+ }
+ }
+}