summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-09-23 12:30:37 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-09-23 12:30:37 -0300
commit8c954fecee3120027fd1b847fd914c8aba03da3f (patch)
tree4367a0dcd15985adea3174491bafccb8ef28a21f /android/src
parent22259900d6af592d8ce0516452803feacee5f438 (diff)
parent50da89ab8d51cff475cdf985952c04ac5cfe58bc (diff)
downloadmullvadvpn-8c954fecee3120027fd1b847fd914c8aba03da3f.tar.xz
mullvadvpn-8c954fecee3120027fd1b847fd914c8aba03da3f.zip
Merge branch 'modernize-connectivity-listener'
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt82
-rw-r--r--android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt2
2 files changed, 37 insertions, 47 deletions
diff --git a/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt b/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt
index c0edbfd021..51ed63bd0a 100644
--- a/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt
+++ b/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt
@@ -1,69 +1,59 @@
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
+import android.net.ConnectivityManager.NetworkCallback
+import android.net.Network
+import android.net.NetworkCapabilities
+import android.net.NetworkRequest
+import kotlin.properties.Delegates.observable
import net.mullvad.talpid.util.EventNotifier
-class ConnectivityListener : BroadcastReceiver() {
- val connectivityNotifier = EventNotifier(true)
+class ConnectivityListener {
+ private val availableNetworks = HashSet<Network>()
- var isConnected = true
- private set(value) {
- field = value
+ private val callback = object : NetworkCallback() {
+ override fun onAvailable(network: Network) {
+ availableNetworks.add(network)
+ isConnected = true
+ }
+
+ override fun onLost(network: Network) {
+ availableNetworks.remove(network)
+ isConnected = !availableNetworks.isEmpty()
+ }
+ }
+
+ private lateinit var connectivityManager: ConnectivityManager
+ val connectivityNotifier = EventNotifier(false)
+
+ var isConnected by observable(false) { _, oldValue, newValue ->
+ if (newValue != oldValue) {
if (senderAddress != 0L) {
- notifyConnectivityChange(value, senderAddress)
+ notifyConnectivityChange(newValue, senderAddress)
}
- connectivityNotifier.notify(value)
+ connectivityNotifier.notify(newValue)
}
+ }
var senderAddress = 0L
fun register(context: Context) {
- val intentFilter = IntentFilter()
+ val request = NetworkRequest.Builder()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+ .build()
- 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)
+ connectivityManager =
+ context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
- if (networkInfo == null) {
- checkConnectionState(context)
- } else if (networkInfo.type != ConnectivityManager.TYPE_VPN) {
- if (networkInfo.detailedState == DetailedState.DISCONNECTED) {
- checkConnectionState(context)
- } else if (networkInfo.detailedState == DetailedState.CONNECTED) {
- isConnected = true
- }
- }
+ connectivityManager.registerNetworkCallback(request, callback)
}
- private fun checkConnectionState(context: Context) {
- val connectivityManager =
- context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
-
- isConnected = connectivityManager.allNetworks
- .map({ network -> connectivityManager.getNetworkInfo(network) })
- .filterNotNull()
- .any({ networkInfo ->
- networkInfo.type != ConnectivityManager.TYPE_VPN &&
- networkInfo.detailedState == DetailedState.CONNECTED
- })
+ fun unregister() {
+ connectivityManager.unregisterNetworkCallback(callback)
}
private fun finalize() {
diff --git a/android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt b/android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
index da1e076940..93c7f32c36 100644
--- a/android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
+++ b/android/src/main/kotlin/net/mullvad/talpid/TalpidVpnService.kt
@@ -28,7 +28,7 @@ open class TalpidVpnService : VpnService() {
}
override fun onDestroy() {
- connectivityListener.unregister(this)
+ connectivityListener.unregister()
}
fun getTun(config: TunConfig): Int {