From 74e9e462bbe82d7a3f6d09ade756c7dfa4a0e60f Mon Sep 17 00:00:00 2001 From: zaneschepke Date: Wed, 24 Jun 2026 02:11:02 -0400 Subject: [PATCH] fix: app shortcuts crash closes #1302 --- .../core/orchestration/TunnelCoordinator.kt | 22 +++++++++++++++---- .../core/shortcut/ShortcutsActivity.kt | 7 +++--- .../core/tunnel/TunnelBackendProvider.kt | 9 -------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/orchestration/TunnelCoordinator.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/orchestration/TunnelCoordinator.kt index 66a7f64e..ff8723a3 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/orchestration/TunnelCoordinator.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/orchestration/TunnelCoordinator.kt @@ -117,7 +117,7 @@ class TunnelCoordinator( // enforce single tunnel, for now if (backendStatus.value.activeTunnels.isNotEmpty()) { - stopActiveTunnelsInternal() + stopActiveTunnelsInternal(source) } startTunnelInternal(config, source) @@ -131,7 +131,13 @@ class TunnelCoordinator( stopTunnelInternal(id, source) } - suspend fun stopActiveTunnels() = tunnelMutex.withLock { stopActiveTunnelsInternal() } + suspend fun stopActiveTunnels(source: TunnelActionSource = TunnelActionSource.USER) = + tunnelMutex.withLock { + if (source == TunnelActionSource.USER) { + _userOverrideFlow.tryEmit(Unit) + } + stopActiveTunnelsInternal(source) + } private suspend fun startTunnelInternal( tunnelConfig: TunnelConfig, @@ -218,7 +224,7 @@ class TunnelCoordinator( _actions.emit(TunnelActionEvent.Stopped(tunnelId = id, source = source)) } - stopActiveTunnelsInternal() + stopActiveTunnelsInternal(source) return@withLock } @@ -243,7 +249,15 @@ class TunnelCoordinator( .onFailure { _errors.emit(TunnelErrorEvent.from(it, id)) } } - private suspend fun stopActiveTunnelsInternal() { + private suspend fun stopActiveTunnelsInternal( + source: TunnelActionSource = TunnelActionSource.USER + ) { + val active = tunnelProvider.backendStatus.value.activeTunnels + + active.keys.forEach { id -> + _actions.emit(TunnelActionEvent.Stopped(tunnelId = id, source = source)) + } + tunnelProvider.stopActiveTunnels() } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/shortcut/ShortcutsActivity.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/shortcut/ShortcutsActivity.kt index 826200e8..56ce14c8 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/shortcut/ShortcutsActivity.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/shortcut/ShortcutsActivity.kt @@ -19,9 +19,8 @@ class ShortcutsActivity : ComponentActivity() { super.onCreate(savedInstanceState) - applicationScope.launch { - shortcutCoordinator.handle(intent) - finish() - } + finish() + + applicationScope.launch { shortcutCoordinator.handle(intent) } } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelBackendProvider.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelBackendProvider.kt index 85f3bbd4..9c68ac18 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelBackendProvider.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelBackendProvider.kt @@ -4,14 +4,11 @@ import com.zaneschepke.tunnel.Tunnel import com.zaneschepke.tunnel.backend.Backend import com.zaneschepke.tunnel.model.BackendMode import com.zaneschepke.tunnel.state.BackendStatus -import com.zaneschepke.wireguardautotunnel.domain.events.BackendCoreException -import com.zaneschepke.wireguardautotunnel.domain.events.BackendMessage import com.zaneschepke.wireguardautotunnel.domain.model.LockdownSettings import kotlin.concurrent.atomics.ExperimentalAtomicApi import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn @@ -52,10 +49,4 @@ class TunnelBackendProvider( override suspend fun disableLockDown(): Result { return backend.disableKillSwitch() } - - @OptIn(ExperimentalCoroutinesApi::class) - private val localErrorEvents = MutableSharedFlow>() - - @OptIn(ExperimentalCoroutinesApi::class) - private val localMessageEvents = MutableSharedFlow>() }