From 2c6946cc767cf04683dfae8aad1f44e5eb3cf09d Mon Sep 17 00:00:00 2001 From: Zane Schepke Date: Thu, 18 Sep 2025 05:15:03 -0400 Subject: [PATCH] fix: delete button hidden bug closes #945 --- .../currentBackStackEntryAsNavbarState.kt | 27 +++++++------------ .../viewmodel/SharedAppViewModel.kt | 16 ++++++++--- app/src/main/res/values/strings.xml | 3 ++- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt index 3bda1494..3ac78bd4 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt @@ -17,7 +17,6 @@ import androidx.navigation.toRoute import com.zaneschepke.wireguardautotunnel.R import com.zaneschepke.wireguardautotunnel.ui.common.button.ActionIconButton import com.zaneschepke.wireguardautotunnel.ui.navigation.Route -import com.zaneschepke.wireguardautotunnel.ui.navigation.Route.Config import com.zaneschepke.wireguardautotunnel.ui.sideeffect.LocalSideEffect import com.zaneschepke.wireguardautotunnel.ui.state.NavbarState import com.zaneschepke.wireguardautotunnel.viewmodel.SharedAppViewModel @@ -74,17 +73,12 @@ fun NavHostController.currentBackStackEntryAsNavbarState( } } - val disableDelete by - rememberSaveable(sharedState.selectedTunnels) { - mutableStateOf(sharedState.selectedTunnels.any { it.isActive }) - } - val selectedCount by rememberSaveable(sharedState.selectedTunnels) { mutableIntStateOf(sharedState.selectedTunnels.size) } - return produceState(initialValue = NavbarState(), route, selectedCount, disableDelete) { + return produceState(initialValue = NavbarState(), route, selectedCount) { value = when (route) { Route.AdvancedAutoTunnel -> @@ -232,7 +226,7 @@ fun NavHostController.currentBackStackEntryAsNavbarState( sharedViewModel.postSideEffect(LocalSideEffect.Modal.QR) } ActionIconButton(Icons.Rounded.Edit, R.string.edit_tunnel) { - navigate(Config(route.id)) + navigate(Route.Config(route.id)) } } }, @@ -271,16 +265,13 @@ fun NavHostController.currentBackStackEntryAsNavbarState( sharedViewModel.copySelectedTunnel() } } - - if (!disableDelete) { - ActionIconButton( - Icons.Rounded.Delete, - R.string.delete_tunnel, - ) { - sharedViewModel.postSideEffect( - LocalSideEffect.Modal.DeleteTunnels - ) - } + ActionIconButton( + Icons.Rounded.Delete, + R.string.delete_tunnel, + ) { + sharedViewModel.postSideEffect( + LocalSideEffect.Modal.DeleteTunnels + ) } } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt index 01a712ff..ce2f2f70 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt @@ -27,18 +27,19 @@ import com.zaneschepke.wireguardautotunnel.util.LocaleUtil import com.zaneschepke.wireguardautotunnel.util.StringValue import com.zaneschepke.wireguardautotunnel.util.extensions.saveTunnelsUniquely import dagger.hilt.android.lifecycle.HiltViewModel +import java.io.File +import java.time.Instant +import javax.inject.Inject +import javax.inject.Provider import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.viewmodel.container import rikka.shizuku.Shizuku import xyz.teamgravity.pin_lock_compose.PinManager -import java.io.File -import java.time.Instant -import javax.inject.Inject -import javax.inject.Provider @HiltViewModel class SharedAppViewModel @@ -227,6 +228,13 @@ constructor( } fun deleteSelectedTunnels() = intent { + val activeTunIds = tunnelManager.activeTunnels.firstOrNull()?.map { it.key } + if (state.selectedTunnels.any { activeTunIds?.contains(it.id) == true }) + return@intent postSideEffect( + GlobalSideEffect.Snackbar( + StringValue.StringResource(R.string.delete_active_message) + ) + ) tunnelRepository.delete(state.selectedTunnels.toList()) clearSelectedTunnels() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c9bed790..0f835af0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -82,7 +82,7 @@ The app is not detecting any location services enabled on your device. Depending on the device, this could cause the untrusted wifi feature to fail to read the wifi name. Would you like to continue anyways? Auto-tunnel service Delete tunnel - Are you sure you would like to delete this tunnel? + Are you sure you would like to delete the selected tunnels? Yes All No email app detected @@ -432,4 +432,5 @@ Unfortunately, due to Google\'s policies, donation links are not allowed in the Play Store version of this app. Please browse the project\'s webpages to find where to donate. + Cannot delete active tunnel.