Просмотр исходного кода

Refactor: refactor network observer

kr328 4 лет назад
Родитель
Сommit
73550164a8

+ 4 - 3
service/src/main/java/com/github/kr328/clash/service/TunService.kt

@@ -1,5 +1,6 @@
 package com.github.kr328.clash.service
 package com.github.kr328.clash.service
 
 
+import android.annotation.TargetApi
 import android.app.PendingIntent
 import android.app.PendingIntent
 import android.content.Intent
 import android.content.Intent
 import android.net.ProxyInfo
 import android.net.ProxyInfo
@@ -62,7 +63,7 @@ class TunService : VpnService(), CoroutineScope by CoroutineScope(Dispatchers.De
                         true
                         true
                     }
                     }
                     network.onEvent { e ->
                     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) })
                             setUnderlyingNetworks(e.network?.let { arrayOf(it) })
                         }
                         }
 
 
@@ -182,12 +183,12 @@ class TunService : VpnService(), CoroutineScope by CoroutineScope(Dispatchers.De
             )
             )
 
 
             // Metered
             // Metered
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            if (Build.VERSION.SDK_INT >= 29) {
                 setMetered(false)
                 setMetered(false)
             }
             }
 
 
             // System Proxy
             // System Proxy
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && store.systemProxy) {
+            if (Build.VERSION.SDK_INT >= 29 && store.systemProxy) {
                 listenHttp()?.let {
                 listenHttp()?.let {
                     setHttpProxy(
                     setHttpProxy(
                         ProxyInfo.buildDirectProxy(
                         ProxyInfo.buildDirectProxy(

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