From 9510f43252823e4cb9daee21071b81a2e9bee427 Mon Sep 17 00:00:00 2001 From: Zane Schepke Date: Mon, 10 Nov 2025 20:51:41 -0500 Subject: [PATCH] fix: global overrides regression, support prompt bug --- app/src/main/AndroidManifest.xml | 5 +++- .../wireguardautotunnel/MainActivity.kt | 2 +- .../core/broadcast/RestartReceiver.kt | 1 + .../service/autotunnel/AutoTunnelService.kt | 2 +- .../core/tunnel/TunnelManager.kt | 6 ++-- .../data/dao/TunnelConfigDao.kt | 28 +++++++++++-------- .../repository/DataStoreAppStateRepository.kt | 2 ++ .../tunnels/components/GettingStartedLabel.kt | 4 +-- .../screens/tunnels/components/TunnelList.kt | 8 +++++- app/src/main/res/values/strings.xml | 2 +- .../networkmonitor/AndroidNetworkMonitor.kt | 3 +- 11 files changed, 40 insertions(+), 23 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6bc50dc0..ee49f540 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -198,7 +198,10 @@ - + + + + { + Timber.i("Restoring state on package upgrade") tunnelManager.handleRestore() logReader.deleteAndClearLogs() appStateRepository.setShouldShowDonationSnackbar(true) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/autotunnel/AutoTunnelService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/autotunnel/AutoTunnelService.kt index f649e9d4..5bf2b6c3 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/autotunnel/AutoTunnelService.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/autotunnel/AutoTunnelService.kt @@ -234,7 +234,7 @@ class AutoTunnelService : LifecycleService() { return combine( settingsRepository.flow.map { it.appMode }.distinctUntilChanged(), autoTunnelRepository.get().flow, - tunnelsRepository.flow.map { tunnels -> + tunnelsRepository.userTunnelsFlow.map { tunnels -> // isActive is ignored for equality checks so user can manually toggle off // tunnel with auto-tunnel tunnels.map { it.copy(isActive = false) } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelManager.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelManager.kt index 5995a473..ae418049 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelManager.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelManager.kt @@ -322,11 +322,11 @@ constructor( withContext(ioDispatcher) { val settings = settingsRepository.getGeneralSettings() val autoTunnelSettings = autoTunnelSettingsRepository.getAutoTunnelSettings() - val tunnels = tunnelsRepository.getAll() + val tunnels = tunnelsRepository.userTunnelsFlow.firstOrNull() if (autoTunnelSettings.isAutoTunnelEnabled) return@withContext restoreAutoTunnel(autoTunnelSettings) if (settings.appMode == AppMode.LOCK_DOWN) handleLockDownModeInit() - if (tunnels.any { it.isActive }) { + if (tunnels?.any { it.isActive } == true) { if (settings.appMode == AppMode.VPN && !serviceManager.hasVpnPermission()) return@withContext localErrorEvents.emit(null to NotAuthorized()) when (settings.appMode) { @@ -350,7 +350,7 @@ constructor( withContext(ioDispatcher) { val settings = settingsRepository.getGeneralSettings() val autoTunnelSettings = autoTunnelSettingsRepository.getAutoTunnelSettings() - val defaultTunnel = tunnelsRepository.getStartTunnel() + val defaultTunnel = tunnelsRepository.getDefaultTunnel() if (autoTunnelSettings.startOnBoot) return@withContext restoreAutoTunnel(autoTunnelSettings) if (settings.isRestoreOnBootEnabled) { diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/TunnelConfigDao.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/TunnelConfigDao.kt index 2eb6f6e5..d0847540 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/TunnelConfigDao.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/TunnelConfigDao.kt @@ -50,23 +50,27 @@ interface TunnelConfigDao { @Query( """ - SELECT * FROM tunnel_config - ORDER BY - CASE WHEN is_primary_tunnel = 1 THEN 0 ELSE 1 END, - position ASC - LIMIT 1""" + SELECT * FROM tunnel_config + WHERE name != '${TunnelConfig.GLOBAL_CONFIG_NAME}' + ORDER BY + CASE WHEN is_primary_tunnel = 1 THEN 0 ELSE 1 END, + position ASC + LIMIT 1 + """ ) suspend fun getDefaultTunnel(): TunnelConfig? @Query( """ - SELECT * FROM tunnel_config - ORDER BY - CASE WHEN is_Active = 1 THEN 0 - WHEN is_primary_tunnel = 1 THEN 1 - ELSE 2 END, - position ASC - LIMIT 1""" + SELECT * FROM tunnel_config + WHERE name != '${TunnelConfig.GLOBAL_CONFIG_NAME}' + ORDER BY + CASE WHEN is_Active = 1 THEN 0 + WHEN is_primary_tunnel = 1 THEN 1 + ELSE 2 END, + position ASC + LIMIT 1 + """ ) suspend fun getStartTunnel(): TunnelConfig? diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/DataStoreAppStateRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/DataStoreAppStateRepository.kt index 487dfba6..26b5091f 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/DataStoreAppStateRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/DataStoreAppStateRepository.kt @@ -55,6 +55,8 @@ class DataStoreAppStateRepository( pref[DataStoreManager.locationDisclosureShown] ?: false, isBatteryOptimizationDisableShown = pref[DataStoreManager.batteryDisableShown] ?: false, + shouldShowDonationSnackbar = + pref[DataStoreManager.shouldShowDonationSnackbar] ?: false, ) } catch (e: IllegalArgumentException) { Timber.e(e) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedLabel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedLabel.kt index ad7e3ed6..73041857 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedLabel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedLabel.kt @@ -17,11 +17,11 @@ import androidx.compose.ui.unit.dp import com.zaneschepke.wireguardautotunnel.R @Composable -fun GettingStartedLabel(onClick: (url: String) -> Unit) { +fun GettingStartedLabel(onClick: (url: String) -> Unit, modifier: Modifier = Modifier) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, - modifier = Modifier.padding(top = 100.dp).fillMaxSize(), + modifier = modifier.padding(top = 100.dp).fillMaxSize(), ) { val url = stringResource(id = R.string.docs_url) val gettingStarted = buildAnnotatedString { diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt index bd156d8b..c7b1a0da 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt @@ -59,7 +59,12 @@ fun TunnelList( flingBehavior = ScrollableDefaults.flingBehavior(), ) { if (sharedState.tunnels.isEmpty()) { - item { GettingStartedLabel(onClick = { context.openWebUrl(it) }) } + item { + GettingStartedLabel( + onClick = { context.openWebUrl(it) }, + modifier = Modifier.animateItem(), + ) + } } items(sharedState.tunnels, key = { it.id }) { tunnel -> val tunnelState = @@ -81,6 +86,7 @@ fun TunnelList( } SurfaceRow( + modifier = Modifier.animateItem(), leading = { Icon( Icons.Rounded.Circle, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a5ed6c3..69aa0111 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -434,7 +434,7 @@ Info Already donated Disables future donation prompts - Thanks for using WG Tunnel! If you can, please consider + Thanks for using WG Tunnel! If you are able, please consider supporting the project to keep it free and improving. diff --git a/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/AndroidNetworkMonitor.kt b/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/AndroidNetworkMonitor.kt index 3a97ef1f..a1126549 100644 --- a/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/AndroidNetworkMonitor.kt +++ b/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/AndroidNetworkMonitor.kt @@ -415,7 +415,8 @@ class AndroidNetworkMonitor( if (vpnActive) underlyingCaps ?: defaultCaps else defaultCaps // ensure validated internet connectivity - // there is a known issue where Android will still report cellular connectivity if the + // there is a known issue where Android will still report cellular connectivity if + // the // interface is not disabled and there is no connectivity (denoted by the '!') val isValidated = capsForValidation.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)