Refactor: refactor network observer

This commit is contained in:
kr328 2021-11-14 20:33:25 +08:00
parent 48a9ab313e
commit 73550164a8
2 changed files with 18 additions and 34 deletions

View File

@ -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(

View File

@ -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)