|
|
@@ -1,6 +1,5 @@
|
|
|
package com.github.kr328.clash.service.clash.module
|
|
|
|
|
|
-import android.annotation.TargetApi
|
|
|
import android.app.Service
|
|
|
import android.net.*
|
|
|
import android.os.Build
|
|
|
@@ -10,9 +9,7 @@ import com.github.kr328.clash.core.Clash
|
|
|
import com.github.kr328.clash.service.util.resolveDns
|
|
|
import kotlinx.coroutines.NonCancellable
|
|
|
import kotlinx.coroutines.channels.Channel
|
|
|
-import kotlinx.coroutines.delay
|
|
|
import kotlinx.coroutines.withContext
|
|
|
-import java.util.concurrent.TimeUnit
|
|
|
|
|
|
class NetworkObserveModule(service: Service) :
|
|
|
Module<NetworkObserveModule.NetworkChanged>(service) {
|
|
|
@@ -21,8 +18,19 @@ class NetworkObserveModule(service: Service) :
|
|
|
private val connectivity = service.getSystemService<ConnectivityManager>()!!
|
|
|
private val networks: Channel<Network?> = Channel(Channel.CONFLATED)
|
|
|
private val request = NetworkRequest.Builder().apply {
|
|
|
+ addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
|
|
+ addTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH)
|
|
|
+ addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
|
|
|
+ addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
|
|
|
+ addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
|
|
|
addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
|
|
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
|
|
+ if (Build.VERSION.SDK_INT >= 26)
|
|
|
+ addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
|
|
|
+ if (Build.VERSION.SDK_INT >= 27)
|
|
|
+ addTransportType(NetworkCapabilities.TRANSPORT_LOWPAN)
|
|
|
+ if (Build.VERSION.SDK_INT >= 31)
|
|
|
+ addTransportType(NetworkCapabilities.TRANSPORT_USB)
|
|
|
if (Build.VERSION.SDK_INT == 23) { // workarounds for OEM bugs
|
|
|
removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
|
|
removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)
|
|
|
@@ -30,49 +38,24 @@ class NetworkObserveModule(service: Service) :
|
|
|
}.build()
|
|
|
|
|
|
private val callback = object : ConnectivityManager.NetworkCallback() {
|
|
|
- private var internet: Boolean = false
|
|
|
private var network: Network? = null
|
|
|
|
|
|
override fun onAvailable(network: Network) {
|
|
|
this.network = network
|
|
|
|
|
|
- networks.trySend(network)
|
|
|
- }
|
|
|
-
|
|
|
- override fun onCapabilitiesChanged(
|
|
|
- network: Network,
|
|
|
- networkCapabilities: NetworkCapabilities
|
|
|
- ) {
|
|
|
- val internet = networkCapabilities
|
|
|
- .hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
|
|
-
|
|
|
- if (this.network == network && this.internet != internet) {
|
|
|
- this.internet = internet
|
|
|
-
|
|
|
+ if (this.network != network)
|
|
|
networks.trySend(network)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- override fun onLost(network: Network) {
|
|
|
- if (this.network == network) {
|
|
|
- networks.trySend(null)
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
|
|
|
- if (this.network == network) {
|
|
|
+ if (this.network == network)
|
|
|
networks.trySend(network)
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
override suspend fun run() {
|
|
|
try {
|
|
|
- if (Build.VERSION.SDK_INT in 24..27) @TargetApi(24) {
|
|
|
- connectivity.registerDefaultNetworkCallback(callback)
|
|
|
- } else {
|
|
|
- connectivity.requestNetwork(request, callback)
|
|
|
- }
|
|
|
+ connectivity.registerNetworkCallback(request, callback)
|
|
|
} catch (e: Exception) {
|
|
|
Log.w("Observe network changed: $e", e)
|
|
|
|