From e549000e5aad1034ba254198ea1217634a0c7bf0 Mon Sep 17 00:00:00 2001 From: eliotcougar Date: Fri, 31 Jul 2026 05:34:05 +0300 Subject: [PATCH] Use typed server menu actions and explicit delete dialogs (#5975) * Use typed server actions and explicit dialogs * Add ConfirmDialog --------- Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com> --- .../main/java/com/v2ray/ang/compose/Dialog.kt | 66 +++++++++++++++++-- .../com/v2ray/ang/ui/main/MainActivity.kt | 2 - .../java/com/v2ray/ang/ui/main/MainDialogs.kt | 26 +++----- .../com/v2ray/ang/ui/main/MainImportMenu.kt | 51 +++++++++----- .../java/com/v2ray/ang/ui/main/MainScreen.kt | 15 ++--- .../ang/ui/routing/RoutingEditActivity.kt | 8 +-- .../v2ray/ang/ui/server/BaseServerActivity.kt | 8 +-- .../com/v2ray/ang/ui/server/ServerActivity.kt | 8 +-- .../ui/server/ServerCustomConfigActivity.kt | 8 +-- .../ang/ui/server/ServerGroupActivity.kt | 8 +-- .../ang/ui/server/ServerProxyChainActivity.kt | 37 ++++++----- .../ang/ui/subscription/SubEditActivity.kt | 8 +-- .../ang/ui/subscription/SubSettingActivity.kt | 8 +-- .../ang/ui/userasset/UserAssetActivity.kt | 8 +-- .../ang/ui/userasset/UserAssetUrlActivity.kt | 8 +-- .../app/src/main/res/values-ar/strings.xml | 31 ++++----- .../app/src/main/res/values-bn/strings.xml | 31 ++++----- .../src/main/res/values-bqi-rIR/strings.xml | 31 ++++----- .../app/src/main/res/values-fa/strings.xml | 31 ++++----- .../app/src/main/res/values-ru/strings.xml | 31 ++++----- .../app/src/main/res/values-vi/strings.xml | 31 ++++----- .../src/main/res/values-zh-rCN/strings.xml | 31 ++++----- .../src/main/res/values-zh-rTW/strings.xml | 31 ++++----- V2rayNG/app/src/main/res/values/strings.xml | 31 ++++----- .../v2ray/ang/ui/main/MainImportMenuTest.kt | 43 ++++++++++++ 25 files changed, 343 insertions(+), 248 deletions(-) create mode 100644 V2rayNG/app/src/test/java/com/v2ray/ang/ui/main/MainImportMenuTest.kt diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/compose/Dialog.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/compose/Dialog.kt index 5d384077..8b72f07e 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/compose/Dialog.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/compose/Dialog.kt @@ -10,11 +10,13 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.text.selection.TextSelectionColors import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults @@ -22,37 +24,87 @@ import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton 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.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp +import com.v2ray.ang.R @Composable fun ConfirmDialog( title: String? = null, message: String, - confirmText: String, - dismissText: String, + confirmText: String = stringResource(android.R.string.ok), + dismissText: String? = stringResource(android.R.string.cancel), + confirmIcon: @Composable (() -> Unit)? = null, onConfirm: () -> Unit, onDismiss: () -> Unit ) { + val confirmFocusRequester = remember { FocusRequester() } + val dismissFocusRequester = remember { FocusRequester() } + + LaunchedEffect(dismissText) { + if (dismissText != null) dismissFocusRequester.requestFocus() + else confirmFocusRequester.requestFocus() + } + AlertDialog( onDismissRequest = onDismiss, title = title?.let { { Text(it) } }, text = { Text(message, style = MaterialTheme.typography.bodyMedium) }, confirmButton = { - TextButton(onClick = { onConfirm(); onDismiss() }) { Text(confirmText) } + TextButton( + onClick = { onConfirm(); onDismiss() }, + modifier = Modifier.focusRequester(confirmFocusRequester) + ) { + confirmIcon?.invoke() + if (confirmIcon != null) Spacer(Modifier.width(8.dp)) + Text(confirmText) + } }, - dismissButton = { - TextButton(onClick = onDismiss) { Text(dismissText) } + dismissButton = dismissText?.let { text -> + { + TextButton( + onClick = onDismiss, + modifier = Modifier.focusRequester(dismissFocusRequester) + ) { + Text(text) + } + } }, containerColor = MaterialTheme.colorScheme.surface ) } +@Composable +fun DeleteConfirmDialog( + message: String, + onConfirm: () -> Unit, + onDismiss: () -> Unit, +) { + ConfirmDialog( + message = message, + confirmText = stringResource(R.string.action_delete), + confirmIcon = { + Icon( + painter = painterResource(R.drawable.ic_delete_24dp), + contentDescription = null, + modifier = Modifier.size(18.dp) + ) + }, + onConfirm = onConfirm, + onDismiss = onDismiss + ) +} + data class InputField( val label: String, val value: String, @@ -121,14 +173,14 @@ fun QRCodeDialog( text = { Image( bitmap = bitmap.asImageBitmap(), - contentDescription = "QR Code", + contentDescription = stringResource(R.string.title_qr_code), modifier = Modifier .fillMaxWidth() .aspectRatio(1f) ) }, confirmButton = { - TextButton(onClick = onDismiss) { Text(stringResource(android.R.string.ok)) } + TextButton(onClick = onDismiss) { Text(stringResource(R.string.action_close)) } }, containerColor = MaterialTheme.colorScheme.surface ) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainActivity.kt index a72200c5..5907294e 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainActivity.kt @@ -118,8 +118,6 @@ class MainActivity : HelperBaseComponentActivity() { } }, onNavigate = { route -> navigateTo(route) }, - shareMethodEntries = resources.getStringArray(R.array.share_method).toList(), - shareMethodMoreEntries = resources.getStringArray(R.array.share_method_more).toList() ) } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainDialogs.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainDialogs.kt index 2969f99b..75254142 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainDialogs.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainDialogs.kt @@ -3,7 +3,7 @@ package com.v2ray.ang.ui.main import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.v2ray.ang.R -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog @Composable fun MainDialogs( @@ -21,38 +21,30 @@ fun MainDialogs( onConfirmRemove: (String) -> Unit, ) { if (showDelAllConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_visible_profiles), onConfirm = onConfirmDelAll, onDismiss = onDismissDelAll ) } if (showDelDuplicateConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_duplicate_profiles), onConfirm = onConfirmDelDuplicate, onDismiss = onDismissDelDuplicate ) } if (showDelInvalidConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_invalid_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_invalid_profiles), onConfirm = onConfirmDelInvalid, onDismiss = onDismissDelInvalid ) } if (showRemoveConfirm != null) { val guid = showRemoveConfirm - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_profile), onConfirm = { onConfirmRemove(guid) }, onDismiss = onDismissRemove ) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainImportMenu.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainImportMenu.kt index 1ecd1c93..3523bf24 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainImportMenu.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainImportMenu.kt @@ -1,5 +1,6 @@ package com.v2ray.ang.ui.main +import androidx.annotation.StringRes import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -10,6 +11,25 @@ import com.v2ray.ang.dto.entities.ProfileItem import com.v2ray.ang.enums.EConfigType import com.v2ray.ang.extension.isComplexType +internal enum class ServerMenuAction( + @StringRes val labelRes: Int, + val isShareAction: Boolean, + val supportsComplexProfiles: Boolean, +) { + ShareQRCode(R.string.share_method_qrcode, isShareAction = true, supportsComplexProfiles = false), + ShareClipboard(R.string.share_method_clipboard, isShareAction = true, supportsComplexProfiles = false), + ShareFullContent(R.string.share_method_full_content, isShareAction = true, supportsComplexProfiles = true), + Edit(R.string.action_edit, isShareAction = false, supportsComplexProfiles = true), + Delete(R.string.action_delete, isShareAction = false, supportsComplexProfiles = true), +} + +internal fun serverMenuActions( + isComplexProfile: Boolean, + includeManagementActions: Boolean, +): List = ServerMenuAction.entries.filter { action -> + (includeManagementActions || action.isShareAction) && (!isComplexProfile || action.supportsComplexProfiles) +} + @Composable fun ImportMenuContent( onAction: (MainAction) -> Unit @@ -122,29 +142,24 @@ fun ShareMethodDialog( guid: String, profile: ProfileItem, more: Boolean, - shareMethodEntries: List, - shareMethodMoreEntries: List, onDismiss: () -> Unit, - onAction: (MainAction) -> Unit + onAction: (MainAction) -> Unit, + onRemove: (String) -> Unit, ) { - val isCustom = profile.configType.isComplexType() - val (shareOptions, skip) = if (more) { - val options = if (isCustom) shareMethodMoreEntries.takeLast(3) else shareMethodMoreEntries - options to if (isCustom) 2 else 0 - } else { - val options = if (isCustom) shareMethodEntries.takeLast(1) else shareMethodEntries - options to if (isCustom) 2 else 0 - } + val menuActions = serverMenuActions( + isComplexProfile = profile.configType.isComplexType(), + includeManagementActions = more, + ) SelectListDialog( - options = shareOptions, + options = menuActions.map { stringResource(it.labelRes) }, onSelected = { index, _ -> onDismiss() - when (index + skip) { - 0 -> onAction(MainAction.ShareQRCode(guid)) - 1 -> onAction(MainAction.ShareClipboard(guid)) - 2 -> onAction(MainAction.ShareFullContent(guid)) - 3 -> onAction(MainAction.EditServer(guid, profile)) - 4 -> onAction(MainAction.RemoveServer(guid)) + when (menuActions[index]) { + ServerMenuAction.ShareQRCode -> onAction(MainAction.ShareQRCode(guid)) + ServerMenuAction.ShareClipboard -> onAction(MainAction.ShareClipboard(guid)) + ServerMenuAction.ShareFullContent -> onAction(MainAction.ShareFullContent(guid)) + ServerMenuAction.Edit -> onAction(MainAction.EditServer(guid, profile)) + ServerMenuAction.Delete -> onRemove(guid) } }, onDismiss = onDismiss diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainScreen.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainScreen.kt index 30b00a5f..2d1e947f 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainScreen.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainScreen.kt @@ -41,8 +41,6 @@ fun MainScreen( mainViewModel: MainViewModel, onAction: (MainAction) -> Unit, onNavigate: (String) -> Unit, - shareMethodEntries: List, - shareMethodMoreEntries: List ) { val uiState by mainViewModel.uiState.collectAsStateWithLifecycle() val groups = uiState.groups @@ -65,6 +63,9 @@ fun MainScreen( var showRemoveConfirm by remember { mutableStateOf(null) } var shareTarget by remember { mutableStateOf?>(null) } + val removeServer: (String) -> Unit = { guid -> + if (confirmRemove) showRemoveConfirm = guid else onAction(MainAction.RemoveServer(guid)) + } val pagerState = rememberPagerState( initialPage = 0, @@ -177,10 +178,9 @@ fun MainScreen( guid = guid, profile = profile, more = more, - shareMethodEntries = shareMethodEntries, - shareMethodMoreEntries = shareMethodMoreEntries, onDismiss = { shareTarget = null }, - onAction = onAction + onAction = onAction, + onRemove = removeServer, ) } if (shareQRCodeBitmap != null) { @@ -282,10 +282,7 @@ fun MainScreen( onMoreServer = { guid, profile -> shareTarget = Triple(guid, profile, true) }, - onRemoveServer = { guid -> - if (confirmRemove) showRemoveConfirm = guid - else onAction(MainAction.RemoveServer(guid)) - }, + onRemoveServer = removeServer, contentPadding = PaddingValues( start = 0.dp, top = 0.dp, diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingEditActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingEditActivity.kt index bf6ad67f..4ed2e20d 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingEditActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingEditActivity.kt @@ -35,7 +35,7 @@ import com.v2ray.ang.AppConfig.BUILTIN_OUTBOUND_TAGS import com.v2ray.ang.AppConfig.TAG_PROXY import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.FormDropdownField import com.v2ray.ang.compose.FormTextField import com.v2ray.ang.compose.SettingsSwitchItem @@ -293,10 +293,8 @@ fun RoutingEditScreen( } if (showDeleteConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_routing_rule), onConfirm = onDelete, onDismiss = { showDeleteConfirm = false } ) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/BaseServerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/BaseServerActivity.kt index cce8f296..0a5570c5 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/BaseServerActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/BaseServerActivity.kt @@ -33,7 +33,7 @@ import com.v2ray.ang.AppConfig.REALITY import com.v2ray.ang.AppConfig.TLS import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.FormDropdownField import com.v2ray.ang.compose.FormTextField import com.v2ray.ang.compose.SettingsSwitchItem @@ -474,10 +474,8 @@ abstract class BaseServerActivity : BaseComponentActivity() { ) } if (showDeleteDialog) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_profile), onConfirm = { showDeleteDialog = false deleteServer(editGuid) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerActivity.kt index 20f5e35f..f57cd399 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerActivity.kt @@ -35,7 +35,7 @@ import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_ADDRESS_V4 import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_MTU import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.FormDropdownField import com.v2ray.ang.compose.FormTextField import com.v2ray.ang.compose.SettingsSwitchItem @@ -515,10 +515,8 @@ fun ServerScreen( } } if (showDeleteDialog) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_profile), onConfirm = { showDeleteDialog = false; onDelete() }, onDismiss = { showDeleteDialog = false } ) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerCustomConfigActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerCustomConfigActivity.kt index 2dfba3e4..086e30e8 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerCustomConfigActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerCustomConfigActivity.kt @@ -56,7 +56,7 @@ import androidx.compose.ui.unit.sp import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.FormTextField import com.v2ray.ang.compose.horizontalScrollbar import com.v2ray.ang.compose.verticalScrollbar @@ -477,10 +477,8 @@ fun ServerCustomConfigScreen( } if (showDeleteConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_profile), onConfirm = { showDeleteConfirm = false onDelete() diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerGroupActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerGroupActivity.kt index 4e807dc2..1c31d89d 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerGroupActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerGroupActivity.kt @@ -27,7 +27,7 @@ import com.v2ray.ang.AppConfig.BUILTIN_OUTBOUND_TAGS import com.v2ray.ang.AppConfig.TAG_PROXY import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.FormDropdownField import com.v2ray.ang.compose.FormTextField import com.v2ray.ang.compose.SettingsSwitchItem @@ -302,10 +302,8 @@ fun ServerGroupScreen( } if (showDeleteConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_policy_group), onConfirm = onDelete, onDismiss = { showDeleteConfirm = false } ) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerProxyChainActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerProxyChainActivity.kt index 30894881..43308f53 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerProxyChainActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerProxyChainActivity.kt @@ -36,7 +36,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.FormDropdownField import com.v2ray.ang.compose.FormTextField import com.v2ray.ang.compose.reorderableDragHandle @@ -198,10 +198,9 @@ fun ProxyChainScreen( onDelete: () -> Unit ) { var remarks by rememberSaveable { mutableStateOf(initialRemarks) } - var members by rememberSaveable { mutableStateOf(initialMembers.toList()) } - // Member remarks may be blank or duplicated, so they cannot serve as stable Compose keys. - var memberKeys by rememberSaveable { mutableStateOf(List(initialMembers.size) { UUID.randomUUID().toString() }) } - var showDeleteConfirm by remember { mutableStateOf(false) } + var members by rememberSaveable { mutableStateOf(initialMembers.toMutableList()) } + var showProfileDeleteConfirm by remember { mutableStateOf(false) } + var memberToDeleteIndex by rememberSaveable { mutableStateOf(null) } val showDelete = editGuid.isNotEmpty() && !isRunning val lazyListState = rememberLazyListState() @@ -225,7 +224,7 @@ fun ProxyChainScreen( onBackClick = onBackClick, actions = { if (showDelete) { - IconButton(onClick = { showDeleteConfirm = true }) { + IconButton(onClick = { showProfileDeleteConfirm = true }) { Icon(painterResource(R.drawable.ic_delete_24dp), contentDescription = stringResource(R.string.menu_item_del_config)) } } @@ -309,8 +308,8 @@ fun ProxyChainScreen( modifier = Modifier.weight(1f) ) IconButton(onClick = { - members = members.toMutableList().also { it.removeAt(index) } - memberKeys = memberKeys.toMutableList().also { it.removeAt(index) } + if (member.isBlank()) members = members.toMutableList().also { it.removeAt(index) } + else memberToDeleteIndex = index }) { Icon( painterResource(R.drawable.ic_delete_24dp), @@ -324,13 +323,21 @@ fun ProxyChainScreen( } } - if (showDeleteConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), - onConfirm = { showDeleteConfirm = false; onDelete() }, - onDismiss = { showDeleteConfirm = false } + if (showProfileDeleteConfirm) { + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_profile), + onConfirm = { showProfileDeleteConfirm = false; onDelete() }, + onDismiss = { showProfileDeleteConfirm = false } + ) + } + memberToDeleteIndex?.let { index -> + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_proxy_chain_member), + onConfirm = { + members = members.toMutableList().also { it.removeAt(index) } + memberToDeleteIndex = null + }, + onDismiss = { memberToDeleteIndex = null } ) } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubEditActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubEditActivity.kt index 9f9de6a2..f2ea7424 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubEditActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubEditActivity.kt @@ -27,7 +27,7 @@ import androidx.lifecycle.lifecycleScope import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.FormDropdownField import com.v2ray.ang.compose.FormTextField import com.v2ray.ang.compose.SettingsSwitchItem @@ -241,10 +241,8 @@ fun SubEditScreen( } if (showDeleteConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_subscription_group), onConfirm = onDelete, onDismiss = { showDeleteConfirm = false } ) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubSettingActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubSettingActivity.kt index 7f4b09a8..37cbdbba 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubSettingActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubSettingActivity.kt @@ -41,7 +41,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.ItemDivider import com.v2ray.ang.compose.QRCodeDialog import com.v2ray.ang.compose.ReorderableListItem @@ -274,10 +274,8 @@ fun SubSettingScreen( } if (removeTarget != null) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_subscription_group), onConfirm = { onRemoveSub(removeTarget!!) removeTarget = null diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetActivity.kt index 3f6c01b1..372f697f 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetActivity.kt @@ -46,7 +46,7 @@ import androidx.lifecycle.lifecycleScope import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.ItemDivider import com.v2ray.ang.compose.SettingsListItem import com.v2ray.ang.compose.verticalScrollbar @@ -344,10 +344,8 @@ fun UserAssetScreen( if (deleteTargetGuid != null) { val guid = deleteTargetGuid!! val assetName = assets.find { it.guid == guid }?.assetUrl?.remarks ?: "" - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm) + "\n$assetName", - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_asset_file, assetName), onConfirm = { onRemoveAsset(guid) }, onDismiss = { deleteTargetGuid = null } ) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetUrlActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetUrlActivity.kt index b160efb5..1fab8e67 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetUrlActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetUrlActivity.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.unit.dp import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.compose.AppTopBar -import com.v2ray.ang.compose.ConfirmDialog +import com.v2ray.ang.compose.DeleteConfirmDialog import com.v2ray.ang.compose.FormTextField import com.v2ray.ang.dto.entities.AssetUrlItem import com.v2ray.ang.extension.toast @@ -186,10 +186,8 @@ fun UserAssetUrlScreen( } if (showDeleteConfirm) { - ConfirmDialog( - message = stringResource(R.string.del_config_comfirm), - confirmText = stringResource(android.R.string.ok), - dismissText = stringResource(android.R.string.cancel), + DeleteConfirmDialog( + message = stringResource(R.string.confirm_delete_asset_source), onConfirm = onDelete, onDismiss = { showDeleteConfirm = false } ) diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index f22e869c..9b4fd1dd 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -39,8 +39,16 @@ الكتابة يدويًا [Trojan] الكتابة يدويًا [Wireguard] Type manually[Hysteria2] - تأكيد الحذف؟ - Please test before deleting! Confirm delete ? + هل أنت متأكد من أنك تريد حذف جميع ملفات التعريف المعروضة حاليًا؟ + هل أنت متأكد من أنك تريد حذف جميع ملفات التعريف المكررة المعروضة حاليًا؟ + يرجى اختبار ملفات التعريف أولًا. هل أنت متأكد من أنك تريد حذف جميع ملفات التعريف غير الصالحة المعروضة حاليًا؟ + هل أنت متأكد من أنك تريد حذف ملف التعريف هذا؟ + هل أنت متأكد من أنك تريد حذف مجموعة السياسات هذه؟ + هل أنت متأكد من أنك تريد حذف هذا العضو من سلسلة الوكلاء؟ + هل أنت متأكد من أنك تريد حذف قاعدة التوجيه هذه؟ + هل أنت متأكد من أنك تريد حذف مجموعة الاشتراك هذه؟ + هل أنت متأكد من أنك تريد حذف ملف الأصول \"%1$s\"؟ + هل أنت متأكد من أنك تريد حذف مصدر الأصول هذا؟ ملاحظات العنوان المنفذ @@ -408,19 +416,12 @@ Password Remote directory (optional) - - رمز استجابة سريعة (QRcode) - تصدير إلى الحافظة - تصدير التكوين الكامل إلى الحافظة - - - - QRcode - Export to clipboard - Export full configuration to clipboard - Edit - Delete - + رمز استجابة سريعة (QRcode) + تصدير إلى الحافظة + تصدير التكوين الكامل إلى الحافظة + تعديل + حذف + إغلاق رمز استجابة سريعة (QRcode) diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml index 1781ad8b..3813b379 100644 --- a/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -39,8 +39,16 @@ ম্যানুয়ালি টাইপ করুন [Trojan] ম্যানুয়ালি টাইপ করুন [Wireguard] Type manually[Hysteria2] - মুছে ফেলুন নিশ্চিত করুন? - Please test before deleting! Confirm delete ? + আপনি কি বর্তমানে প্রদর্শিত সব প্রোফাইল মুছে ফেলতে চান? + আপনি কি বর্তমানে প্রদর্শিত সব সদৃশ প্রোফাইল মুছে ফেলতে চান? + প্রথমে প্রোফাইলগুলো পরীক্ষা করুন। আপনি কি বর্তমানে প্রদর্শিত সব অবৈধ প্রোফাইল মুছে ফেলতে চান? + আপনি কি এই প্রোফাইলটি মুছে ফেলতে চান? + আপনি কি এই পলিসি গ্রুপটি মুছে ফেলতে চান? + আপনি কি এই প্রক্সি চেইন সদস্যটিকে মুছে ফেলতে চান? + আপনি কি এই রাউটিং নিয়মটি মুছে ফেলতে চান? + আপনি কি এই সাবস্ক্রিপশন গ্রুপটি মুছে ফেলতে চান? + আপনি কি \"%1$s\" অ্যাসেট ফাইলটি মুছে ফেলতে চান? + আপনি কি এই অ্যাসেট উৎসটি মুছে ফেলতে চান? মন্তব্য ঠিকানা পোর্ট @@ -407,19 +415,12 @@ Password Remote directory (optional) - - QR কোড - ক্লিপবোর্ডে রপ্তানি করুন - পূর্ণ কনফিগারেশন ক্লিপবোর্ডে রপ্তানি করুন - - - - QRcode - Export to clipboard - Export full configuration to clipboard - Edit - Delete - + QR কোড + ক্লিপবোর্ডে রপ্তানি করুন + পূর্ণ কনফিগারেশন ক্লিপবোর্ডে রপ্তানি করুন + সম্পাদনা + মুছুন + বন্ধ করুন QR কোড diff --git a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml index f15cee20..904e2d2f 100644 --- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml +++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml @@ -39,8 +39,16 @@ ٱووردن [Trojan] ٱووردن [Wireguard] ٱووردن [Hysteria2] - پاک بۊ؟ - پؽش ز پاک کردن، پینگ بگرین! الن اخۊین پاک کۊنین؟ + آیا مطمئن هستید که می‌خواهید همه پروفایل‌های نمایش‌داده‌شده را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید همه پروفایل‌های تکراری نمایش‌داده‌شده را حذف کنید؟ + لطفاً ابتدا پروفایل‌ها را آزمایش کنید. آیا مطمئن هستید که می‌خواهید همه پروفایل‌های نامعتبر نمایش‌داده‌شده را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این پروفایل را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این گروه سیاست را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این عضو زنجیره پراکسی را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این قانون مسیریابی را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این گروه اشتراک را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید فایل دارایی \"%1$s\" را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این منبع دارایی را حذف کنید؟ نیشتنا نشۊوی پورت @@ -413,19 +421,12 @@ رزم دایرکتوری ره دیر (اختیاری) - - QRcode - و در کشیڌن من کلیپ بورد - و در کشیڌن پوی کانفیگ من کلیپ بورد - - - - QRcode - و در کشیڌن من کلیپ بورد - و در کشیڌن پوی کانفیگ من کلیپ بورد - آلشت - پاک کردن - + QRcode + و در کشیڌن من کلیپ بورد + و در کشیڌن پوی کانفیگ من کلیپ بورد + آلشتکاری + پاک کردن + بستن QRcode diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index 3d898333..868580fe 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -39,8 +39,16 @@ افزودن [Trojan] افزودن [Wireguard] افزودن [Hysteria2] - از حذف این کانفیگ اطمینان دارید؟ - لطفاً قبل از حذف، پینگ بگیرید! آیا از حذف اطمینان دارید؟ + آیا مطمئن هستید که می‌خواهید همه پروفایل‌های نمایش‌داده‌شده را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید همه پروفایل‌های تکراری نمایش‌داده‌شده را حذف کنید؟ + لطفاً ابتدا پروفایل‌ها را آزمایش کنید. آیا مطمئن هستید که می‌خواهید همه پروفایل‌های نامعتبر نمایش‌داده‌شده را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این پروفایل را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این گروه سیاست را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این عضو زنجیره پراکسی را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این قانون مسیریابی را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این گروه اشتراک را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید فایل دارایی \"%1$s\" را حذف کنید؟ + آیا مطمئن هستید که می‌خواهید این منبع دارایی را حذف کنید؟ ملاحظات نشانی پورت @@ -404,19 +412,12 @@ پسورد دایرکتوری راه دور (اختیاری) - - QRcode - خروجی گرفتن در کلیپ‌ بورد - خروجی گرفتن کانفیگ کامل در کلیپ بورد - - - - QRcode - صادر کردن به کلیپ بورد - صادر کردن پیکربندی کامل به کلیپ بورد - ویرایش کردن - حذف کردن - + QRcode + خروجی گرفتن در کلیپ‌ بورد + خروجی گرفتن کانفیگ کامل در کلیپ بورد + ویرایش + حذف + بستن QRcode diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml index 32080251..c14382e8 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -39,8 +39,16 @@ Добавить Trojan Добавить WireGuard Добавить Hysteria2 - Подтверждаете удаление? - Выполните проверку перед удалением! Подтверждаете удаление? + Вы уверены, что хотите удалить все отображаемые профили? + Вы уверены, что хотите удалить все отображаемые дубликаты профилей? + Сначала проверьте профили. Вы уверены, что хотите удалить все отображаемые недействительные профили? + Вы уверены, что хотите удалить этот профиль? + Вы уверены, что хотите удалить эту группу политик? + Вы уверены, что хотите удалить этот элемент цепочки прокси? + Вы уверены, что хотите удалить это правило маршрутизации? + Вы уверены, что хотите удалить эту группу подписки? + Вы уверены, что хотите удалить файл ресурсов \"%1$s\"? + Вы уверены, что хотите удалить этот источник ресурсов? Название Адрес Порт @@ -420,19 +428,12 @@ Пароль Удалённый путь (необязательно) - - QR-код - Экспорт в буфер обмена - Экспорт конфигурации в буфер обмена - - - - QR-код - Экспорт в буфер обмена - Экспорт конфигурации в буфер обмена - Изменить - Удалить - + QR-код + Экспорт в буфер обмена + Экспорт конфигурации в буфер обмена + Изменить + Удалить + Закрыть QR-код diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml index 2d3dcea7..88611121 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -39,8 +39,16 @@ Nhập thủ công [Trojan] Nhập thủ công [WireGuard] Type manually[Hysteria2] - Xác nhận xóa? - Please test before deleting! Confirm delete ? + Bạn có chắc muốn xóa tất cả cấu hình đang hiển thị không? + Bạn có chắc muốn xóa tất cả cấu hình trùng lặp đang hiển thị không? + Vui lòng kiểm tra các cấu hình trước. Bạn có chắc muốn xóa tất cả cấu hình không hợp lệ đang hiển thị không? + Bạn có chắc muốn xóa cấu hình này không? + Bạn có chắc muốn xóa nhóm chính sách này không? + Bạn có chắc muốn xóa thành viên này khỏi chuỗi proxy không? + Bạn có chắc muốn xóa quy tắc định tuyến này không? + Bạn có chắc muốn xóa nhóm đăng ký này không? + Bạn có chắc muốn xóa tệp tài nguyên \"%1$s\" không? + Bạn có chắc muốn xóa nguồn tài nguyên này không? Tên cấu hình Địa chỉ Cổng @@ -409,19 +417,12 @@ Password Remote directory (optional) - - Xuất ra mã QR (Chụp màn hình để lưu) - Sao chép vào Clipboard - Sao chép thành cấu hình tùy chỉnh - - - - QRcode - Export to clipboard - Export full configuration to clipboard - Edit - Delete - + Xuất ra mã QR (Chụp màn hình để lưu) + Sao chép vào Clipboard + Sao chép thành cấu hình tùy chỉnh + Chỉnh sửa + Xoá + Đóng Xuất gói ra mã QR (Chụp màn hình để lưu) diff --git a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml index ac3ad0a8..82075c63 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -39,8 +39,16 @@ 添加 [Trojan] 添加 [Wireguard] 添加 [Hysteria2] - 确认删除? - 删除前请先测试!确认删除? + 确定要删除当前显示的所有配置吗? + 确定要删除当前显示的所有重复配置吗? + 请先测试配置。确定要删除当前显示的所有无效配置吗? + 确定要删除此配置吗? + 确定要删除此策略组吗? + 确定要删除此代理链成员吗? + 确定要删除此路由规则吗? + 确定要删除此订阅组吗? + 确定要删除资源文件“%1$s”吗? + 确定要删除此资源来源吗? 别名 (remarks) 地址 (address) 端口 (port) @@ -423,19 +431,12 @@ 密码 远程文件夹名(可选) - - 二维码 - 导出至剪贴板 - 导出完整配置至剪贴板 - - - - 二维码 - 导出至剪贴板 - 导出完整配置至剪贴板 - 编辑 - 删除 - + 二维码 + 导出至剪贴板 + 导出完整配置至剪贴板 + 编辑 + 删除 + 关闭 二维码 diff --git a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml index ba16e00f..a2efafcc 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -39,8 +39,16 @@ 新增 [Trojan] 新增 [Wireguard] 新增 [Hysteria2] - 確定刪除? - 刪除前請先測試!確認刪除? + 確定要刪除目前顯示的所有設定檔嗎? + 確定要刪除目前顯示的所有重複設定檔嗎? + 請先測試設定檔。確定要刪除目前顯示的所有無效設定檔嗎? + 確定要刪除此設定檔嗎? + 確定要刪除此策略組嗎? + 確定要刪除此代理鏈成員嗎? + 確定要刪除此路由規則嗎? + 確定要刪除此訂閱群組嗎? + 確定要刪除資源檔案「%1$s」嗎? + 確定要刪除此資源來源嗎? 備註 位址 埠 @@ -421,19 +429,12 @@ 密碼 遠端目錄(可選) - - 二維碼 - 匯出至剪貼簿 - 匯出完整設定至剪貼簿 - - - - QR Code - 匯出至剪貼簿 - 匯出完整設定至剪貼簿 - 編輯 - 刪除 - + 二維碼 + 匯出至剪貼簿 + 匯出完整設定至剪貼簿 + 編輯 + 刪除 + 關閉 二維碼 diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index 6d4c77f5..b8c8b9a4 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -40,8 +40,16 @@ Add [Trojan] Add [Wireguard] Add [Hysteria2] - Confirm delete ? - Please test before deleting! Confirm delete ? + Are you sure you want to delete all profiles currently shown? + Are you sure you want to delete all duplicate profiles currently shown? + Please test the profiles first. Are you sure you want to delete all invalid profiles currently shown? + Are you sure you want to delete this profile? + Are you sure you want to delete this policy group? + Are you sure you want to delete this chain member? + Are you sure you want to delete this routing rule? + Are you sure you want to delete this subscription group? + Are you sure you want to delete the asset file \"%1$s\"? + Are you sure you want to delete this asset source? remarks address port @@ -429,19 +437,12 @@ Password Remote directory (optional) - - QRcode - Export to clipboard - Export full config to clipboard - - - - QRcode - Export to clipboard - Export full config to clipboard - Edit - Delete - + QRcode + Export to clipboard + Export full config to clipboard + Edit + Delete + Close QRcode diff --git a/V2rayNG/app/src/test/java/com/v2ray/ang/ui/main/MainImportMenuTest.kt b/V2rayNG/app/src/test/java/com/v2ray/ang/ui/main/MainImportMenuTest.kt new file mode 100644 index 00000000..82da4af5 --- /dev/null +++ b/V2rayNG/app/src/test/java/com/v2ray/ang/ui/main/MainImportMenuTest.kt @@ -0,0 +1,43 @@ +package com.v2ray.ang.ui.main + +import org.junit.Assert.assertEquals +import org.junit.Test + +class MainImportMenuTest { + + @Test + fun regularShareMenuContainsOnlyShareActions() { + val expected = listOf( + ServerMenuAction.ShareQRCode, + ServerMenuAction.ShareClipboard, + ServerMenuAction.ShareFullContent, + ) + assertEquals(expected, serverMenuActions(isComplexProfile = false, includeManagementActions = false)) + } + + @Test + fun regularMoreMenuContainsEveryActionInDisplayOrder() { + assertEquals( + ServerMenuAction.entries, + serverMenuActions(isComplexProfile = false, includeManagementActions = true), + ) + } + + @Test + fun complexShareMenuContainsOnlyFullContent() { + assertEquals( + listOf(ServerMenuAction.ShareFullContent), + serverMenuActions(isComplexProfile = true, includeManagementActions = false), + ) + } + + @Test + fun complexMoreMenuRetainsManagementActions() { + val expected = listOf( + ServerMenuAction.ShareFullContent, + ServerMenuAction.Edit, + ServerMenuAction.Delete, + ) + assertEquals(expected, serverMenuActions(isComplexProfile = true, includeManagementActions = true)) + } +}