Skip to content

Commit 0025487

Browse files
authored
refactor: connectivity monitoring (#553)
1 parent 1b9560b commit 0025487

File tree

12 files changed

+127
-349
lines changed

12 files changed

+127
-349
lines changed

app/src/main/java/com/zaneschepke/wireguardautotunnel/data/domain/Settings.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,8 @@ data class Settings(
8585
defaultValue = "3",
8686
)
8787
val debounceDelaySeconds: Int = 3,
88-
)
88+
) {
89+
fun debounceDelayMillis(): Long {
90+
return debounceDelaySeconds * 1000L
91+
}
92+
}

app/src/main/java/com/zaneschepke/wireguardautotunnel/module/NetworkQualifiers.kt

-15
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.zaneschepke.wireguardautotunnel.module
22

3-
import com.zaneschepke.wireguardautotunnel.service.network.EthernetService
4-
import com.zaneschepke.wireguardautotunnel.service.network.MobileDataService
3+
import com.zaneschepke.wireguardautotunnel.service.network.InternetConnectivityService
54
import com.zaneschepke.wireguardautotunnel.service.network.NetworkService
6-
import com.zaneschepke.wireguardautotunnel.service.network.WifiService
75
import dagger.Binds
86
import dagger.Module
97
import dagger.hilt.InstallIn
@@ -14,14 +12,5 @@ import dagger.hilt.components.SingletonComponent
1412
abstract class ServiceModule {
1513

1614
@Binds
17-
@Wifi
18-
abstract fun provideWifiService(wifiService: WifiService): NetworkService
19-
20-
@Binds
21-
@MobileData
22-
abstract fun provideMobileDataService(mobileDataService: MobileDataService): NetworkService
23-
24-
@Binds
25-
@Ethernet
26-
abstract fun provideEthernetService(ethernetService: EthernetService): NetworkService
15+
abstract fun provideInternetConnectivityService(wifiService: InternetConnectivityService): NetworkService
2716
}

app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt

+2-6
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ class TunnelModule {
7979
@IoDispatcher ioDispatcher: CoroutineDispatcher,
8080
serviceManager: ServiceManager,
8181
notificationService: NotificationService,
82-
@Wifi wifiService: NetworkService,
83-
@MobileData mobileDataService: NetworkService,
84-
@Ethernet ethernetService: NetworkService,
82+
internetConnectivityService: NetworkService,
8583
): TunnelService {
8684
return WireGuardTunnel(
8785
amneziaBackend,
@@ -92,9 +90,7 @@ class TunnelModule {
9290
ioDispatcher,
9391
serviceManager,
9492
notificationService,
95-
wifiService,
96-
mobileDataService,
97-
ethernetService,
93+
internetConnectivityService,
9894
)
9995
}
10096

app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/autotunnel/AutoTunnelService.kt

+27-44
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.zaneschepke.wireguardautotunnel.service.foreground.autotunnel
22

33
import android.content.Intent
4+
import android.net.NetworkCapabilities
45
import android.os.IBinder
56
import android.os.PowerManager
67
import androidx.core.app.ServiceCompat
@@ -11,17 +12,15 @@ import com.zaneschepke.wireguardautotunnel.R
1112
import com.zaneschepke.wireguardautotunnel.data.domain.Settings
1213
import com.zaneschepke.wireguardautotunnel.data.repository.AppDataRepository
1314
import com.zaneschepke.wireguardautotunnel.module.AppShell
14-
import com.zaneschepke.wireguardautotunnel.module.Ethernet
1515
import com.zaneschepke.wireguardautotunnel.module.IoDispatcher
1616
import com.zaneschepke.wireguardautotunnel.module.MainImmediateDispatcher
17-
import com.zaneschepke.wireguardautotunnel.module.MobileData
18-
import com.zaneschepke.wireguardautotunnel.module.Wifi
1917
import com.zaneschepke.wireguardautotunnel.service.foreground.ServiceManager
2018
import com.zaneschepke.wireguardautotunnel.service.foreground.autotunnel.model.AutoTunnelEvent
2119
import com.zaneschepke.wireguardautotunnel.service.foreground.autotunnel.model.AutoTunnelState
2220
import com.zaneschepke.wireguardautotunnel.service.foreground.autotunnel.model.NetworkState
21+
import com.zaneschepke.wireguardautotunnel.service.network.InternetConnectivityService
2322
import com.zaneschepke.wireguardautotunnel.service.network.NetworkService
24-
import com.zaneschepke.wireguardautotunnel.service.network.WifiService
23+
import com.zaneschepke.wireguardautotunnel.service.network.NetworkStatus
2524
import com.zaneschepke.wireguardautotunnel.service.notification.NotificationAction
2625
import com.zaneschepke.wireguardautotunnel.service.notification.NotificationService
2726
import com.zaneschepke.wireguardautotunnel.service.notification.WireGuardNotification
@@ -53,16 +52,7 @@ class AutoTunnelService : LifecycleService() {
5352
lateinit var rootShell: Provider<RootShell>
5453

5554
@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
6656

6757
@Inject
6858
lateinit var appDataRepository: Provider<AppDataRepository>
@@ -168,17 +158,28 @@ class AutoTunnelService : LifecycleService() {
168158
}
169159
}
170160

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+
171175
private fun startAutoTunnelStateJob() = lifecycleScope.launch(ioDispatcher) {
172176
combine(
173177
combineSettings(),
174-
combineNetworkEventsJob(),
178+
networkService.status.map {
179+
buildNetworkState(it)
180+
}.distinctUntilChanged(),
175181
) { 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)
182183
}.collect { state ->
183184
Timber.d("Network state: ${state.networkState}")
184185
autoTunnelStateFlow.update {
@@ -187,32 +188,15 @@ class AutoTunnelService : LifecycleService() {
187188
}
188189
}
189190

190-
private fun getWifiName(setting: Settings): String? {
191+
private suspend fun getWifiName(wifiCapabilities: NetworkCapabilities): String? {
192+
val setting = appDataRepository.get().settings.getSettings()
191193
return if (setting.isWifiNameByShellEnabled) {
192194
rootShell.get().getCurrentWifiName()
193-
} else if (wifiService.capabilities != null) {
194-
WifiService.getNetworkName(wifiService.capabilities!!, this@AutoTunnelService)
195195
} else {
196-
null
196+
InternetConnectivityService.getNetworkName(wifiCapabilities, this@AutoTunnelService)
197197
}
198198
}
199199

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-
216200
private fun combineSettings(): Flow<Pair<Settings, TunnelConfigs>> {
217201
return combine(
218202
appDataRepository.get().settings.getSettingsFlow(),
@@ -229,9 +213,8 @@ class AutoTunnelService : LifecycleService() {
229213
private fun startAutoTunnelJob() = lifecycleScope.launch(ioDispatcher) {
230214
Timber.i("Starting auto-tunnel network event watcher")
231215
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 ->
235218
if (watcherState == defaultState) return@collect
236219
Timber.d("New auto tunnel state emitted")
237220
when (val event = watcherState.asAutoTunnelEvent()) {

app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/EthernetService.kt

-67
This file was deleted.

0 commit comments

Comments
 (0)