mirror of
https://github.com/wgtunnel/android.git
synced 2026-06-02 00:29:08 +02:00
fix: network monitor changes for Android 10
This commit is contained in:
@@ -40,6 +40,7 @@ import androidx.navigation3.runtime.entryProvider
|
||||
import androidx.navigation3.runtime.rememberNavBackStack
|
||||
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
|
||||
import androidx.navigation3.ui.NavDisplay
|
||||
import com.zaneschepke.networkmonitor.NetworkMonitor
|
||||
import com.zaneschepke.wireguardautotunnel.data.AppDatabase
|
||||
import com.zaneschepke.wireguardautotunnel.data.DataStoreManager.Companion.shouldShowDonationSnackbar
|
||||
import com.zaneschepke.wireguardautotunnel.data.model.AppMode
|
||||
@@ -111,6 +112,7 @@ class MainActivity : AppCompatActivity() {
|
||||
@Inject lateinit var appStateRepository: AppStateRepository
|
||||
@Inject lateinit var tunnelRepository: TunnelRepository
|
||||
@Inject lateinit var appDatabase: AppDatabase
|
||||
@Inject lateinit var networkMonitor: NetworkMonitor
|
||||
|
||||
private lateinit var roomBackup: RoomBackup
|
||||
|
||||
@@ -520,6 +522,7 @@ class MainActivity : AppCompatActivity() {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
networkMonitor.checkPermissionsAndUpdateState()
|
||||
WireGuardAutoTunnel.setUiActive(true)
|
||||
}
|
||||
|
||||
|
||||
+70
-69
@@ -95,19 +95,7 @@ class AndroidNetworkMonitor(
|
||||
Pair(detectionMethod, changed)
|
||||
}
|
||||
.flatMapLatest { (detectionMethod, _) ->
|
||||
val flag =
|
||||
when (detectionMethod) {
|
||||
DEFAULT ->
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
FLAG_INCLUDE_LOCATION_INFO
|
||||
} else {
|
||||
0
|
||||
}
|
||||
LEGACY,
|
||||
ROOT,
|
||||
SHIZUKU -> 0
|
||||
}
|
||||
createDefaultNetworkCallbackFlow(detectionMethod, flag)
|
||||
createDefaultNetworkCallbackFlow(detectionMethod)
|
||||
}
|
||||
|
||||
private fun isAndroidTv(): Boolean =
|
||||
@@ -137,70 +125,83 @@ class AndroidNetworkMonitor(
|
||||
}
|
||||
|
||||
private fun createDefaultNetworkCallbackFlow(
|
||||
detectionMethod: WifiDetectionMethod,
|
||||
flag: Int,
|
||||
detectionMethod: WifiDetectionMethod
|
||||
): Flow<TransportEvent> = callbackFlow {
|
||||
val callback =
|
||||
object : ConnectivityManager.NetworkCallback(flag) {
|
||||
val onAvailable: (Network) -> Unit = { network ->
|
||||
Timber.d("Network onAvailable: network=$network")
|
||||
}
|
||||
|
||||
override fun onAvailable(network: Network) {
|
||||
Timber.d("Network onAvailable: network=$network")
|
||||
trySend(TransportEvent.Unknown)
|
||||
}
|
||||
val onLost: (Network) -> Unit = { network ->
|
||||
Timber.d("Network onLost: network=$network")
|
||||
trySend(TransportEvent.Lost(network))
|
||||
}
|
||||
|
||||
override fun onLost(network: Network) {
|
||||
Timber.d("Network onLost: network=$network")
|
||||
val onCapabilitiesChanged: (Network, NetworkCapabilities) -> Unit =
|
||||
{ network, networkCapabilities ->
|
||||
val isValidated =
|
||||
networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
||||
val hasInternet =
|
||||
networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||
|
||||
Timber.d("onCapabilitiesChanged: network=$network, validated: $isValidated")
|
||||
|
||||
if (isValidated && hasInternet) {
|
||||
val event =
|
||||
when {
|
||||
networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_WIFI
|
||||
) -> {
|
||||
activeWifiNetworks[network.toString()] =
|
||||
Pair(network, networkCapabilities)
|
||||
TransportEvent.CapabilitiesChanged(
|
||||
network,
|
||||
networkCapabilities,
|
||||
detectionMethod,
|
||||
)
|
||||
}
|
||||
networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_CELLULAR
|
||||
) -> {
|
||||
activeWifiNetworks.clear()
|
||||
TransportEvent.CapabilitiesChanged(network, networkCapabilities)
|
||||
}
|
||||
networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_ETHERNET
|
||||
) -> {
|
||||
activeWifiNetworks.clear()
|
||||
TransportEvent.CapabilitiesChanged(network, networkCapabilities)
|
||||
}
|
||||
else -> TransportEvent.Unknown
|
||||
}
|
||||
trySend(event)
|
||||
} else {
|
||||
activeWifiNetworks.remove(network.toString())
|
||||
trySend(TransportEvent.Lost(network))
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCapabilitiesChanged(
|
||||
network: Network,
|
||||
networkCapabilities: NetworkCapabilities,
|
||||
) {
|
||||
val isValidated =
|
||||
networkCapabilities.hasCapability(
|
||||
NetworkCapabilities.NET_CAPABILITY_VALIDATED
|
||||
)
|
||||
val hasInternet =
|
||||
networkCapabilities.hasCapability(
|
||||
NetworkCapabilities.NET_CAPABILITY_INTERNET
|
||||
)
|
||||
val callback: ConnectivityManager.NetworkCallback =
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && detectionMethod == DEFAULT) {
|
||||
object : ConnectivityManager.NetworkCallback(FLAG_INCLUDE_LOCATION_INFO) {
|
||||
override fun onAvailable(network: Network) = onAvailable(network)
|
||||
|
||||
Timber.d("onCapabilitiesChanged: network=$network, validated: $isValidated")
|
||||
override fun onLost(network: Network) = onLost(network)
|
||||
|
||||
if (isValidated && hasInternet) {
|
||||
val event =
|
||||
when {
|
||||
networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_WIFI
|
||||
) -> {
|
||||
activeWifiNetworks[network.toString()] =
|
||||
Pair(network, networkCapabilities)
|
||||
TransportEvent.CapabilitiesChanged(
|
||||
network,
|
||||
networkCapabilities,
|
||||
detectionMethod,
|
||||
)
|
||||
}
|
||||
networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_CELLULAR
|
||||
) -> {
|
||||
activeWifiNetworks.clear()
|
||||
TransportEvent.CapabilitiesChanged(network, networkCapabilities)
|
||||
}
|
||||
networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_ETHERNET
|
||||
) -> {
|
||||
activeWifiNetworks.clear()
|
||||
TransportEvent.CapabilitiesChanged(network, networkCapabilities)
|
||||
}
|
||||
else -> TransportEvent.Unknown
|
||||
}
|
||||
trySend(event)
|
||||
} else {
|
||||
activeWifiNetworks.remove(network.toString())
|
||||
trySend(TransportEvent.Lost(network))
|
||||
}
|
||||
override fun onCapabilitiesChanged(
|
||||
network: Network,
|
||||
networkCapabilities: NetworkCapabilities,
|
||||
) = onCapabilitiesChanged(network, networkCapabilities)
|
||||
}
|
||||
} else {
|
||||
object : ConnectivityManager.NetworkCallback() {
|
||||
override fun onAvailable(network: Network) = onAvailable(network)
|
||||
|
||||
override fun onLost(network: Network) = onLost(network)
|
||||
|
||||
override fun onCapabilitiesChanged(
|
||||
network: Network,
|
||||
networkCapabilities: NetworkCapabilities,
|
||||
) = onCapabilitiesChanged(network, networkCapabilities)
|
||||
}
|
||||
}
|
||||
defaultNetworkCallback = callback
|
||||
|
||||
Reference in New Issue
Block a user