From 73550164a823526bb0f3ff618226a1091d51e4e6 Mon Sep 17 00:00:00 2001 From: kr328 Date: Sun, 14 Nov 2021 20:33:25 +0800 Subject: [PATCH] Refactor: refactor network observer --- .../github/kr328/clash/service/TunService.kt | 7 +-- .../clash/module/NetworkObserveModule.kt | 45 ++++++------------- 2 files changed, 18 insertions(+), 34 deletions(-) diff --git a/service/src/main/java/com/github/kr328/clash/service/TunService.kt b/service/src/main/java/com/github/kr328/clash/service/TunService.kt index 7b3345e5..8177ce84 100644 --- a/service/src/main/java/com/github/kr328/clash/service/TunService.kt +++ b/service/src/main/java/com/github/kr328/clash/service/TunService.kt @@ -1,5 +1,6 @@ package com.github.kr328.clash.service +import android.annotation.TargetApi import android.app.PendingIntent import android.content.Intent import android.net.ProxyInfo @@ -62,7 +63,7 @@ class TunService : VpnService(), CoroutineScope by CoroutineScope(Dispatchers.De true } network.onEvent { e -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { + if (Build.VERSION.SDK_INT in 22..28) @TargetApi(22) { setUnderlyingNetworks(e.network?.let { arrayOf(it) }) } @@ -182,12 +183,12 @@ class TunService : VpnService(), CoroutineScope by CoroutineScope(Dispatchers.De ) // Metered - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + if (Build.VERSION.SDK_INT >= 29) { setMetered(false) } // System Proxy - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && store.systemProxy) { + if (Build.VERSION.SDK_INT >= 29 && store.systemProxy) { listenHttp()?.let { setHttpProxy( ProxyInfo.buildDirectProxy( diff --git a/service/src/main/java/com/github/kr328/clash/service/clash/module/NetworkObserveModule.kt b/service/src/main/java/com/github/kr328/clash/service/clash/module/NetworkObserveModule.kt index 2a7f1562..ccf30dfd 100644 --- a/service/src/main/java/com/github/kr328/clash/service/clash/module/NetworkObserveModule.kt +++ b/service/src/main/java/com/github/kr328/clash/service/clash/module/NetworkObserveModule.kt @@ -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(service) { @@ -21,8 +18,19 @@ class NetworkObserveModule(service: Service) : private val connectivity = service.getSystemService()!! private val networks: Channel = 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)