From 5aa9145361c82811bc080e75abea9bdf3da88ee3 Mon Sep 17 00:00:00 2001 From: Zane Schepke Date: Fri, 25 Apr 2025 00:04:30 -0400 Subject: [PATCH] fix: single click in select mode closes #739 --- .../ui/common/ExpandingRowListItem.kt | 38 ++++++++----------- .../ui/screens/main/components/TunnelList.kt | 11 +++++- .../screens/main/components/TunnelRowItem.kt | 4 +- .../ui/screens/support/SupportScreen.kt | 6 ++- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ExpandingRowListItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ExpandingRowListItem.kt index 332613d2..a7056738 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ExpandingRowListItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ExpandingRowListItem.kt @@ -2,22 +2,21 @@ package com.zaneschepke.wireguardautotunnel.ui.common import androidx.compose.animation.animateContentSize import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.indication import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.ripple import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.text.style.TextOverflow @@ -44,32 +43,25 @@ fun ExpandingRowListItem( modifier = Modifier.animateContentSize() .clip(RoundedCornerShape(8.dp)) + .background( + if (isSelected) MaterialTheme.colorScheme.primary.copy(alpha = 0.1f) + else Color.Transparent + ) .then( if (!isTv) { Modifier.combinedClickable( - onClick = onClick, - onLongClick = { - haptic.performHapticFeedback(HapticFeedbackType.LongPress) - onHold() - }, - onDoubleClick = onDoubleClick, - ) - .indication( - interactionSource = interactionSource, - indication = ripple(), - ) + interactionSource = interactionSource, + indication = ripple(), + onClick = onClick, + onLongClick = { + haptic.performHapticFeedback(HapticFeedbackType.LongPress) + onHold() + }, + onDoubleClick = onDoubleClick, + ) } else Modifier ) ) { - LaunchedEffect(isSelected) { - if (isSelected) { - interactionSource.emit(PressInteraction.Press(Offset.Zero)) - } else { - interactionSource.emit( - PressInteraction.Release(PressInteraction.Press(Offset.Zero)) - ) - } - } Column { Row( modifier = Modifier.fillMaxWidth().padding(horizontal = 12.dp), diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelList.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelList.kt index b538e673..37ab4cac 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelList.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelList.kt @@ -18,6 +18,7 @@ import com.zaneschepke.wireguardautotunnel.core.tunnel.getValueById import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.ui.Route +import com.zaneschepke.wireguardautotunnel.ui.navigation.LocalIsAndroidTV import com.zaneschepke.wireguardautotunnel.ui.navigation.LocalNavController import com.zaneschepke.wireguardautotunnel.ui.state.AppUiState import com.zaneschepke.wireguardautotunnel.util.extensions.openWebUrl @@ -35,6 +36,7 @@ fun TunnelList( onToggleTunnel: (TunnelConf, Boolean) -> Unit, viewModel: AppViewModel, ) { + val isTv = LocalIsAndroidTV.current val context = LocalContext.current val navController = LocalNavController.current val collator = Collator.getInstance(Locale.getDefault()) @@ -71,8 +73,12 @@ fun TunnelList( tunnel = tunnel, tunnelState = tunnelState, onClick = { - navController.navigate(Route.TunnelOptions(tunnel.id)) - viewModel.handleEvent(AppEvent.ClearSelectedTunnels) + if (selectedTunnels.isNotEmpty() && !isTv) { + viewModel.handleEvent(AppEvent.ToggleSelectedTunnel(tunnel)) + } else { + navController.navigate(Route.TunnelOptions(tunnel.id)) + viewModel.handleEvent(AppEvent.ClearSelectedTunnels) + } }, onDoubleClick = { viewModel.handleEvent(AppEvent.ToggleTunnelStatsExpanded(tunnel.id)) @@ -81,6 +87,7 @@ fun TunnelList( viewModel.handleEvent(AppEvent.ToggleSelectedTunnel(it)) }, onSwitchClick = { checked -> onToggleTunnel(tunnel, checked) }, + isTv = isTv, ) } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelRowItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelRowItem.kt index 1bb01310..0c896216 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelRowItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelRowItem.kt @@ -26,7 +26,6 @@ import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.ui.common.ExpandingRowListItem import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch -import com.zaneschepke.wireguardautotunnel.ui.navigation.LocalIsAndroidTV import com.zaneschepke.wireguardautotunnel.util.extensions.asColor @Composable @@ -40,9 +39,8 @@ fun TunnelRowItem( onDoubleClick: () -> Unit, onToggleSelectedTunnel: (TunnelConf) -> Unit, onSwitchClick: (Boolean) -> Unit, + isTv: Boolean, ) { - val isTv = LocalIsAndroidTV.current - val leadingIconColor = remember(state) { if (state.status.isUp()) tunnelState.statistics.asColor() else Color.Gray diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt index 8e501300..d79cb4b9 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt @@ -121,7 +121,11 @@ fun SupportScreen(viewModel: SupportViewModel = hiltViewModel(), appViewModel: A ) UpdateSection( onUpdateCheck = { - if (BuildConfig.DEBUG || BuildConfig.VERSION_NAME.contains("beta") || BuildConfig.FLAVOR == "google") + if ( + BuildConfig.DEBUG || + BuildConfig.VERSION_NAME.contains("beta") || + BuildConfig.FLAVOR == "google" + ) return@UpdateSection context.showToast(R.string.update_check_unsupported) context.showToast(R.string.checking_for_update) viewModel.handleUpdateCheck()