@@ -4,10 +4,11 @@ import android.net.ConnectivityManager
4
4
import android.net.LinkProperties
5
5
import android.net.Network
6
6
import android.net.NetworkCapabilities
7
- import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN
8
7
import android.net.NetworkRequest
9
8
import co.touchlab.kermit.Logger
10
9
import java.net.DatagramSocket
10
+ import java.net.Inet4Address
11
+ import java.net.Inet6Address
11
12
import java.net.InetAddress
12
13
import kotlin.collections.ArrayList
13
14
import kotlinx.coroutines.CoroutineScope
@@ -17,7 +18,6 @@ import kotlinx.coroutines.flow.SharingStarted
17
18
import kotlinx.coroutines.flow.StateFlow
18
19
import kotlinx.coroutines.flow.combine
19
20
import kotlinx.coroutines.flow.distinctUntilChanged
20
- import kotlinx.coroutines.flow.filterIsInstance
21
21
import kotlinx.coroutines.flow.map
22
22
import kotlinx.coroutines.flow.onEach
23
23
import kotlinx.coroutines.flow.scan
@@ -27,7 +27,6 @@ import net.mullvad.talpid.model.Connectivity
27
27
import net.mullvad.talpid.model.NetworkState
28
28
import net.mullvad.talpid.util.IPAvailabilityUtils
29
29
import net.mullvad.talpid.util.NetworkEvent
30
- import net.mullvad.talpid.util.NetworkEvent.CapabilitiesChanged
31
30
import net.mullvad.talpid.util.RawNetworkState
32
31
import net.mullvad.talpid.util.defaultRawNetworkStateFlow
33
32
import net.mullvad.talpid.util.networkEvents
@@ -63,32 +62,25 @@ class ConnectivityListener(
63
62
.stateIn(scope, SharingStarted .Eagerly , null )
64
63
65
64
_isConnected =
66
- combine(
67
- _currentNetworkState ,
68
- connectivityManager
69
- .defaultRawNetworkStateFlow()
70
- .filterIsInstance<CapabilitiesChanged >(),
71
- hasInternetCapability(),
72
- ) {
73
- currentNetworkState: NetworkState ? ,
74
- capabilitiesChanged: CapabilitiesChanged ,
65
+ combine(connectivityManager.defaultRawNetworkStateFlow(), hasInternetCapability()) {
66
+ rawNetworkState: RawNetworkState ? ,
75
67
hasInternetCapability: Boolean ->
76
68
if (hasInternetCapability) {
77
- if (
78
- capabilitiesChanged.networkCapabilities.hasCapability(
79
- NET_CAPABILITY_NOT_VPN
80
- )
81
- ) {
69
+ val isUnderlyingNetwork =
70
+ rawNetworkState
71
+ ?.networkCapabilities
72
+ ?.hasCapability( NetworkCapabilities . NET_CAPABILITY_NOT_VPN ) == true
73
+ if (isUnderlyingNetwork ) {
82
74
// If the default network is not a VPN we can check the addresses
83
75
// directly
84
76
Connectivity .Status (
85
77
ipv4 =
86
- currentNetworkState ?.routes?.any {
87
- ! it.destination.isIpv6
78
+ rawNetworkState.linkProperties ?.routes?.any {
79
+ it.destination.address is Inet4Address
88
80
} == true ,
89
81
ipv6 =
90
- currentNetworkState ?.routes?.any {
91
- it.destination.isIpv6
82
+ rawNetworkState.linkProperties ?.routes?.any {
83
+ it.destination.address is Inet6Address
92
84
} == true ,
93
85
)
94
86
} else {
@@ -106,6 +98,7 @@ class ConnectivityListener(
106
98
Connectivity .Status (false , false )
107
99
}
108
100
}
101
+ .distinctUntilChanged()
109
102
.onEach {
110
103
when (it) {
111
104
Connectivity .PresumeOnline -> notifyConnectivityChange(true , true )
0 commit comments