1
1
package com.zaneschepke.wireguardautotunnel.service.foreground.autotunnel
2
2
3
3
import android.content.Intent
4
+ import android.net.NetworkCapabilities
4
5
import android.os.IBinder
5
6
import android.os.PowerManager
6
7
import androidx.core.app.ServiceCompat
@@ -11,17 +12,15 @@ import com.zaneschepke.wireguardautotunnel.R
11
12
import com.zaneschepke.wireguardautotunnel.data.domain.Settings
12
13
import com.zaneschepke.wireguardautotunnel.data.repository.AppDataRepository
13
14
import com.zaneschepke.wireguardautotunnel.module.AppShell
14
- import com.zaneschepke.wireguardautotunnel.module.Ethernet
15
15
import com.zaneschepke.wireguardautotunnel.module.IoDispatcher
16
16
import com.zaneschepke.wireguardautotunnel.module.MainImmediateDispatcher
17
- import com.zaneschepke.wireguardautotunnel.module.MobileData
18
- import com.zaneschepke.wireguardautotunnel.module.Wifi
19
17
import com.zaneschepke.wireguardautotunnel.service.foreground.ServiceManager
20
18
import com.zaneschepke.wireguardautotunnel.service.foreground.autotunnel.model.AutoTunnelEvent
21
19
import com.zaneschepke.wireguardautotunnel.service.foreground.autotunnel.model.AutoTunnelState
22
20
import com.zaneschepke.wireguardautotunnel.service.foreground.autotunnel.model.NetworkState
21
+ import com.zaneschepke.wireguardautotunnel.service.network.InternetConnectivityService
23
22
import com.zaneschepke.wireguardautotunnel.service.network.NetworkService
24
- import com.zaneschepke.wireguardautotunnel.service.network.WifiService
23
+ import com.zaneschepke.wireguardautotunnel.service.network.NetworkStatus
25
24
import com.zaneschepke.wireguardautotunnel.service.notification.NotificationAction
26
25
import com.zaneschepke.wireguardautotunnel.service.notification.NotificationService
27
26
import com.zaneschepke.wireguardautotunnel.service.notification.WireGuardNotification
@@ -53,16 +52,7 @@ class AutoTunnelService : LifecycleService() {
53
52
lateinit var rootShell: Provider <RootShell >
54
53
55
54
@Inject
56
- @Wifi
57
- lateinit var wifiService: NetworkService
58
-
59
- @Inject
60
- @MobileData
61
- lateinit var mobileDataService: NetworkService
62
-
63
- @Inject
64
- @Ethernet
65
- lateinit var ethernetService: NetworkService
55
+ lateinit var networkService: NetworkService
66
56
67
57
@Inject
68
58
lateinit var appDataRepository: Provider <AppDataRepository >
@@ -168,17 +158,28 @@ class AutoTunnelService : LifecycleService() {
168
158
}
169
159
}
170
160
161
+ suspend fun buildNetworkState (networkStatus : NetworkStatus ): NetworkState {
162
+ return with (autoTunnelStateFlow.value.networkState) {
163
+ val wifiName = when {
164
+ networkStatus.wifiAvailable &&
165
+ (wifiName == null || wifiName == Constants .UNREADABLE_SSID || networkService.didWifiChangeSinceLastCapabilitiesQuery) -> {
166
+ networkService.getWifiCapabilities()?.let { getWifiName(it) } ? : wifiName
167
+ }
168
+ ! networkStatus.wifiAvailable -> null
169
+ else -> wifiName
170
+ }
171
+ copy(networkStatus.wifiAvailable, networkStatus.cellularAvailable, networkStatus.ethernetAvailable, wifiName)
172
+ }
173
+ }
174
+
171
175
private fun startAutoTunnelStateJob () = lifecycleScope.launch(ioDispatcher) {
172
176
combine(
173
177
combineSettings(),
174
- combineNetworkEventsJob(),
178
+ networkService.status.map {
179
+ buildNetworkState(it)
180
+ }.distinctUntilChanged(),
175
181
) { double, networkState ->
176
- var wifiName: String? = null
177
- if (networkState.wifiName == Constants .UNREADABLE_SSID && double.first.isTunnelOnWifiEnabled) {
178
- wifiName = getWifiName(double.first)
179
- }
180
- val netState = wifiName?.let { networkState.copy(wifiName = it) } ? : networkState
181
- AutoTunnelState (tunnelService.get().vpnState.value, netState, double.first, double.second)
182
+ AutoTunnelState (tunnelService.get().vpnState.value, networkState, double.first, double.second)
182
183
}.collect { state ->
183
184
Timber .d(" Network state: ${state.networkState} " )
184
185
autoTunnelStateFlow.update {
@@ -187,32 +188,15 @@ class AutoTunnelService : LifecycleService() {
187
188
}
188
189
}
189
190
190
- private fun getWifiName (setting : Settings ): String? {
191
+ private suspend fun getWifiName (wifiCapabilities : NetworkCapabilities ): String? {
192
+ val setting = appDataRepository.get().settings.getSettings()
191
193
return if (setting.isWifiNameByShellEnabled) {
192
194
rootShell.get().getCurrentWifiName()
193
- } else if (wifiService.capabilities != null ) {
194
- WifiService .getNetworkName(wifiService.capabilities!! , this @AutoTunnelService)
195
195
} else {
196
- null
196
+ InternetConnectivityService .getNetworkName(wifiCapabilities, this @AutoTunnelService)
197
197
}
198
198
}
199
199
200
- @OptIn(FlowPreview ::class )
201
- private fun combineNetworkEventsJob (): Flow <NetworkState > {
202
- return combine(
203
- wifiService.status,
204
- mobileDataService.status,
205
- ethernetService.status,
206
- ) { wifi, mobileData, ethernet ->
207
- NetworkState (
208
- wifi.available,
209
- mobileData.available,
210
- ethernet.available,
211
- wifi.name,
212
- )
213
- }.distinctUntilChanged()
214
- }
215
-
216
200
private fun combineSettings (): Flow <Pair <Settings , TunnelConfigs >> {
217
201
return combine(
218
202
appDataRepository.get().settings.getSettingsFlow(),
@@ -229,9 +213,8 @@ class AutoTunnelService : LifecycleService() {
229
213
private fun startAutoTunnelJob () = lifecycleScope.launch(ioDispatcher) {
230
214
Timber .i(" Starting auto-tunnel network event watcher" )
231
215
val settings = appDataRepository.get().settings.getSettings()
232
- val debounce = settings.debounceDelaySeconds * 1000L
233
- Timber .d(" Starting with debounce delay of: $debounce " )
234
- autoTunnelStateFlow.debounce(debounce).collect { watcherState ->
216
+ Timber .d(" Starting with debounce delay of: ${settings.debounceDelaySeconds} seconds" )
217
+ autoTunnelStateFlow.debounce(settings.debounceDelayMillis()).collect { watcherState ->
235
218
if (watcherState == defaultState) return @collect
236
219
Timber .d(" New auto tunnel state emitted" )
237
220
when (val event = watcherState.asAutoTunnelEvent()) {
0 commit comments