diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-12-04 09:38:41 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-12-04 09:38:41 -0300 |
| commit | 6e9d2c96c9fbd13f06d3d1ab2f4b36a55995d3ae (patch) | |
| tree | eb2779084909cdc1a07b70f5178ad7fd741aa0ff /android/src | |
| parent | 09cd80e4b818ab66876b059c94ecc169feccd0dc (diff) | |
| parent | 9c5a7afff17913d8adeff3ea3fa2c972bfa9b00b (diff) | |
| download | mullvadvpn-6e9d2c96c9fbd13f06d3d1ab2f4b36a55995d3ae.tar.xz mullvadvpn-6e9d2c96c9fbd13f06d3d1ab2f4b36a55995d3ae.zip | |
Merge branch 'android-offline-check'
Diffstat (limited to 'android/src')
3 files changed, 80 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt index 67fe711a6c..91bc269ba2 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadVpnService.kt @@ -23,6 +23,7 @@ class MullvadVpnService : TalpidVpnService() { private lateinit var notificationManager: ForegroundNotificationManager override fun onCreate() { + super.onCreate() setUp() created.complete(Unit) } @@ -47,6 +48,7 @@ class MullvadVpnService : TalpidVpnService() { tearDown() daemon.cancel() created.cancel() + super.onDestroy() } inner class LocalBinder : Binder() { diff --git a/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt b/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt new file mode 100644 index 0000000000..f0b6e2e923 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt @@ -0,0 +1,68 @@ +package net.mullvad.talpid + +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 isConnected = true + private set(value) { + field = value + + if (senderAddress != 0L) { + notifyConnectivityChange(value, senderAddress) + } + } + + var senderAddress = 0L + + fun register(context: Context) { + val intentFilter = IntentFilter() + + intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION) + context.registerReceiver(this, intentFilter) + + checkConnectionState(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) { + checkConnectionState(context) + } else if (networkInfo.detailedState == DetailedState.CONNECTED) { + isConnected = true + } + } + } + + private fun checkConnectionState(context: Context) { + val connectivityManager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + isConnected = connectivityManager.allNetworks + .map({ network -> connectivityManager.getNetworkInfo(network) }) + .any({ networkInfo -> + networkInfo.type != ConnectivityManager.TYPE_VPN && + networkInfo.detailedState == DetailedState.CONNECTED + }) + } + + private fun finalize() { + destroySender(senderAddress) + senderAddress = 0L + } + + private external fun notifyConnectivityChange(isConnected: Boolean, senderAddress: Long) + private external fun destroySender(senderAddress: Long) +} diff --git a/android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt b/android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt index 96de4082cc..185f401f7e 100644 --- a/android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt +++ b/android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt @@ -4,6 +4,16 @@ import android.net.VpnService import net.mullvad.talpid.tun_provider.TunConfig open class TalpidVpnService : VpnService() { + val connectivityListener = ConnectivityListener() + + override fun onCreate() { + connectivityListener.register(this) + } + + override fun onDestroy() { + connectivityListener.unregister(this) + } + fun createTun(config: TunConfig): Int { val builder = Builder().apply { for (address in config.addresses) { |
