Update Theme.kt SnackBar.kt MainImportMenu.kt

This commit is contained in:
2dust committed 2026-07-23 17:12:23 +08:00
1 parent 3be230c024
commit c9e1501d39
3 files changed
+91 -150

No files matched your search

@@ -1,22 +1,15 @@
package com.v2ray.ang.compose
import android.content.Context
import androidx.annotation.StringRes
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHost
@@ -31,9 +24,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -46,6 +37,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.launch
import java.util.concurrent.atomic.AtomicInteger
import kotlin.time.Duration.Companion.milliseconds
enum class ToastType {
NORMAL, SUCCESS, ERROR, INFO
@@ -107,7 +99,7 @@ class AppSnackbarController(
if (currentShowTime != 0L) {
val elapsed = System.currentTimeMillis() - currentShowTime
if (elapsed < 500) {
delay(500 - elapsed)
delay((500 - elapsed).milliseconds)
}
}
@@ -128,30 +120,6 @@ class AppSnackbarController(
currentShowTime = System.currentTimeMillis()
}
}
fun showInfo(context: Context, @StringRes messageRes: Int, long: Boolean = false) {
show(context.getString(messageRes), ToastType.NORMAL, long)
}
fun showInfo(message: CharSequence, long: Boolean = false) {
show(message, ToastType.NORMAL, long)
}
fun showSuccess(context: Context, @StringRes messageRes: Int, long: Boolean = false) {
show(context.getString(messageRes), ToastType.SUCCESS, long)
}
fun showSuccess(message: CharSequence, long: Boolean = false) {
show(message, ToastType.SUCCESS, long)
}
fun showError(context: Context, @StringRes messageRes: Int, long: Boolean = false) {
show(context.getString(messageRes), ToastType.ERROR, long)
}
fun showError(message: CharSequence, long: Boolean = false) {
show(message, ToastType.ERROR, long)
}
}
val LocalAppSnackbar = staticCompositionLocalOf<AppSnackbarController> {
@@ -192,10 +160,8 @@ fun AppSnackbarBridge(
private val ToastCornerRadius = 24.dp
private val ToastHorizontalPad = 16.dp
private val ToastVerticalPad = 12.dp
private val ToastIconSize = 24.dp
private val ToastIconSpacing = 10.dp
private val ToastMaxLines = 8
private val ToastMaxWidthFraction = 0.75f
private const val ToastMaxLines = 8
private const val ToastMaxWidthFraction = 0.75f
private val ToastBottomOffset = 100.dp
@Composable
@@ -226,13 +192,6 @@ fun AppSnackbarHost(
ToastType.INFO -> toastInfoBg
}
val iconText = when (type) {
ToastType.SUCCESS -> "✓"
ToastType.ERROR -> "✕"
ToastType.INFO -> "ℹ"
ToastType.NORMAL -> null
}
Box(
modifier = Modifier
.fillMaxSize()
@@ -255,24 +214,6 @@ fun AppSnackbarHost(
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
if (iconText != null) {
Box(
modifier = Modifier
.size(ToastIconSize)
.clip(CircleShape)
.background(toastIconCircleBg),
contentAlignment = Alignment.Center
) {
Text(
text = iconText,
color = toastTextColor,
fontSize = 14.sp,
fontWeight = FontWeight.Bold
)
}
Spacer(modifier = Modifier.width(ToastIconSpacing))
}
Text(
text = data.visuals.message,
color = toastTextColor,
@@ -24,97 +24,97 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
private val LightColor = lightColorScheme(
primary = Color(0xFF000000), // Black 黑色
onPrimary = Color(0xFFFFFFFF), // White 白色
primaryContainer = Color(0xFFE0E0E0), // Light Gray 浅灰色
onPrimaryContainer = Color(0xFF000000), // Black 黑色
secondary = Color(0xFFf97910), // Orange 橙色
onSecondary = Color(0xFFFFFFFF), // White 白色
secondaryContainer = Color(0xFFFFE8D6), // Pale Orange 淡橙色
onSecondaryContainer = Color(0xFF2B1700), // Dark Brown 深棕色
tertiary = Color(0xFF009966), // Green 绿色
onTertiary = Color(0xFFFFFFFF), // White 白色
tertiaryContainer = Color(0xFFA0F2D0), // Light Green 浅绿色
onTertiaryContainer = Color(0xFF00201A), // Dark Teal 深蓝绿色
error = Color(0xFFBA1A1A), // Red 红色
errorContainer = Color(0xFFFFDAD6), // Light Red 浅红色
onError = Color(0xFFFFFFFF), // White 白色
onErrorContainer = Color(0xFF410002), // Dark Red 暗红色
background = Color(0xFFFFFFFF), // White 白色
onBackground = Color(0xFF1C1B1F), // Near Black 近黑色
surface = Color(0xFFFFFFFF), // White 白色
onSurface = Color(0xFF1C1B1F), // Near Black 近黑色
surfaceVariant = Color(0xFFE7E0EC), // Light Purple Gray 浅紫灰色
onSurfaceVariant = Color(0xFF49454F), // Dark Gray 深灰色
outline = Color(0xFF79747E), // Medium Gray 中灰色
outlineVariant = Color(0xFFCAC4D0), // Light Gray 浅灰色
inverseSurface = Color(0xFF313033), // Dark Gray 深灰色
inverseOnSurface = Color(0xFFF4EFF4), // Very Light Gray 极浅灰色
inversePrimary = Color(0xFFC0C0C0), // Silver Gray 银灰色
scrim = Color(0xFF000000), // Black 黑色
surfaceTint = Color(0xFF000000), // Black 黑色
surfaceContainerLowest = Color(0xFFFFFFFF), // White 白色
surfaceContainerLow = Color(0xFFF7F7F7), // Very Light Gray 极浅灰色
surfaceContainer = Color(0xFFF1F1F1), // Light Gray 浅灰色
surfaceContainerHigh = Color(0xFFEBEBEB), // Light Gray 浅灰色
surfaceContainerHighest = Color(0xFFE5E5E5), // Light Gray 浅灰色
primary = Color(0xFF000000), // Black
onPrimary = Color(0xFFFFFFFF), // White
primaryContainer = Color(0xFFE0E0E0), // Light Gray
onPrimaryContainer = Color(0xFF000000), // Black
secondary = Color(0xFFf97910), // Orange
onSecondary = Color(0xFFFFFFFF), // White
secondaryContainer = Color(0xFFFFE8D6), // Pale Orange
onSecondaryContainer = Color(0xFF2B1700), // Dark Brown
tertiary = Color(0xFF009966), // Green
onTertiary = Color(0xFFFFFFFF), // White
tertiaryContainer = Color(0xFFA0F2D0), // Light Green
onTertiaryContainer = Color(0xFF00201A), // Dark Teal
error = Color(0xFFBA1A1A), // Red
errorContainer = Color(0xFFFFDAD6), // Light Red
onError = Color(0xFFFFFFFF), // White
onErrorContainer = Color(0xFF410002), // Dark Red
background = Color(0xFFFFFFFF), // White
onBackground = Color(0xFF1C1B1F), // Near Black
surface = Color(0xFFFFFFFF), // White
onSurface = Color(0xFF1C1B1F), // Near Black
surfaceVariant = Color(0xFFE7E0EC), // Light Purple Gray
onSurfaceVariant = Color(0xFF49454F), // Dark Gray
outline = Color(0xFF79747E), // Medium Gray
outlineVariant = Color(0xFFCAC4D0), // Light Gray
inverseSurface = Color(0xFF313033), // Dark Gray
inverseOnSurface = Color(0xFFF4EFF4), // Very Light Gray
inversePrimary = Color(0xFFC0C0C0), // Silver Gray
scrim = Color(0xFF000000), // Black
surfaceTint = Color(0xFF000000), // Black
surfaceContainerLowest = Color(0xFFFFFFFF), // White
surfaceContainerLow = Color(0xFFF7F7F7), // Very Light Gray
surfaceContainer = Color(0xFFF1F1F1), // Light Gray
surfaceContainerHigh = Color(0xFFEBEBEB), // Light Gray
surfaceContainerHighest = Color(0xFFE5E5E5), // Light Gray
)
private val DarkColor = darkColorScheme(
primary = Color(0xFFC0C0C0), // Silver Gray 银灰色
onPrimary = Color(0xFF303030), // Dark Gray 深灰色
primaryContainer = Color(0xFF474747), // Gray 灰色
onPrimaryContainer = Color(0xFFE0E0E0), // Light Gray 浅灰色
secondary = Color(0xFFf97910), // Orange 橙色
onSecondary = Color(0xFF4E2600), // Dark Brown 深棕色
secondaryContainer = Color(0xFF6F3800), // Brown 棕色
onSecondaryContainer = Color(0xFFFFE8D6), // Pale Orange 淡橙色
tertiary = Color(0xFF83D6B5), // Mint Green 薄荷绿
onTertiary = Color(0xFF00382E), // Dark Teal 深蓝绿色
tertiaryContainer = Color(0xFF005143), // Teal 蓝绿色
onTertiaryContainer = Color(0xFFA0F2D0), // Light Green 浅绿色
error = Color(0xFFFFB4AB), // Light Red 浅红色
errorContainer = Color(0xFF93000A), // Dark Red 暗红色
onError = Color(0xFF690005), // Deep Red 深红色
onErrorContainer = Color(0xFFFFDAD6), // Light Red 浅红色
background = Color(0xFF1C1B1F), // Near Black 近黑色
onBackground = Color(0xFFE6E1E5), // Light Gray 浅灰色
surface = Color(0xFF1C1B1F), // Near Black 近黑色
onSurface = Color(0xFFE6E1E5), // Light Gray 浅灰色
surfaceVariant = Color(0xFF49454F), // Dark Gray 深灰色
onSurfaceVariant = Color(0xFFCAC4D0), // Light Gray 浅灰色
outline = Color(0xFF938F99), // Grayish Purple 灰紫色
outlineVariant = Color(0xFF49454F), // Dark Gray 深灰色
inverseSurface = Color(0xFFE6E1E5), // Light Gray 浅灰色
inverseOnSurface = Color(0xFF1C1B1F), // Near Black 近黑色
inversePrimary = Color(0xFF000000), // Black 黑色
scrim = Color(0xFF000000), // Black 黑色
surfaceTint = Color(0xFFC0C0C0), // Silver Gray 银灰色
surfaceContainerLowest = Color(0xFF0F0F12), // Near Black 近黑色
surfaceContainerLow = Color(0xFF1A191D), // Dark Gray 深灰色
surfaceContainer = Color(0xFF1E1D21), // Dark Gray 深灰色
surfaceContainerHigh = Color(0xFF282729), // Dark Gray 深灰色
surfaceContainerHighest = Color(0xFF333234), // Dark Gray 深灰色
primary = Color(0xFFC0C0C0), // Silver Gray
onPrimary = Color(0xFF303030), // Dark Gray
primaryContainer = Color(0xFF474747), // Gray
onPrimaryContainer = Color(0xFFE0E0E0), // Light Gray
secondary = Color(0xFFf97910), // Orange
onSecondary = Color(0xFF4E2600), // Dark Brown
secondaryContainer = Color(0xFF6F3800), // Brown
onSecondaryContainer = Color(0xFFFFE8D6), // Pale Orange
tertiary = Color(0xFF83D6B5), // Mint Green
onTertiary = Color(0xFF00382E), // Dark Teal
tertiaryContainer = Color(0xFF005143), // Teal
onTertiaryContainer = Color(0xFFA0F2D0), // Light Green
error = Color(0xFFFFB4AB), // Light Red
errorContainer = Color(0xFF93000A), // Dark Red
onError = Color(0xFF690005), // Deep Red
onErrorContainer = Color(0xFFFFDAD6), // Light Red
background = Color(0xFF1C1B1F), // Near Black
onBackground = Color(0xFFE6E1E5), // Light Gray
surface = Color(0xFF1C1B1F), // Near Black
onSurface = Color(0xFFE6E1E5), // Light Gray
surfaceVariant = Color(0xFF49454F), // Dark Gray
onSurfaceVariant = Color(0xFFCAC4D0), // Light Gray
outline = Color(0xFF938F99), // Grayish Purple
outlineVariant = Color(0xFF49454F), // Dark Gray
inverseSurface = Color(0xFFE6E1E5), // Light Gray
inverseOnSurface = Color(0xFF1C1B1F), // Near Black
inversePrimary = Color(0xFF000000), // Black
scrim = Color(0xFF000000), // Black
surfaceTint = Color(0xFFC0C0C0), // Silver Gray
surfaceContainerLowest = Color(0xFF0F0F12), // Near Black
surfaceContainerLow = Color(0xFF1A191D), // Dark Gray
surfaceContainer = Color(0xFF1E1D21), // Dark Gray
surfaceContainerHigh = Color(0xFF282729), // Dark Gray
surfaceContainerHighest = Color(0xFF333234), // Dark Gray
)
// Semantic Colors
val colorPing = Color(0xFF009966) // Green 绿色
val colorPingRed = Color(0xFFFF0099) // Pink Red 粉红色
val colorConfigType = Color(0xFFf97910) // Orange 橙色
val colorFabActive = Color(0xFFf97910) // Orange 橙色
val colorFabInactiveLight = Color(0xFF9C9C9C) // Gray 灰色
val colorFabInactiveDark = Color(0xFF646464) // Dark Gray 深灰色
val dividerColorLight = Color(0xFFE0E0E0) // Light Gray 浅灰色
val dividerColorDark = Color(0xFF424242) // Dark Gray 深灰色
val colorPing = Color(0xFF009966) // Green
val colorPingRed = Color(0xFFFF0099) // Pink Red
val colorConfigType = Color(0xFFf97910) // Orange
val colorFabActive = Color(0xFFf97910) // Orange
val colorFabInactiveLight = Color(0xFF9C9C9C) // Gray
val colorFabInactiveDark = Color(0xFF646464) // Dark Gray
val dividerColorLight = Color(0xFFE0E0E0) // Light Gray
val dividerColorDark = Color(0xFF424242) // Dark Gray
// Toast Colors 70%
val toastNormalBgLight = Color(0xB3353A3E) // Dark Gray 深灰色
val toastNormalBgDark = Color(0xB34A4F54) // Darker Gray 暗灰色
val toastSuccessBg = Color(0xB3388E3C) // Green 绿色
val toastErrorBg = Color(0xB3D50000) // Red 红色
val toastInfoBg = Color(0xB33F51B5) // Indigo Blue 靛蓝色
val toastIconCircleBg = Color(0x33FFFFFF) // Semi-transparent White 半透明白色
val toastTextColor = Color.White // White 白色
val toastNormalBgLight = Color(0xB3353A3E) // Dark Gray
val toastNormalBgDark = Color(0xB34A4F54) // Darker Gray
val toastSuccessBg = Color(0xB3388E3C) // Green
val toastErrorBg = Color(0xB3D50000) // Red
val toastInfoBg = Color(0xB33F51B5) // Indigo Blue
val toastIconCircleBg = Color(0x33FFFFFF) // Semi-transparent White
val toastTextColor = Color.White // White
object ThemeManager {
private val _themeMode = MutableStateFlow(
@@ -95,10 +95,6 @@ fun MoreMenuContent(
text = { Text(stringResource(R.string.title_export_all)) },
onClick = { onAction(MainAction.ExportAll) }
)
DropdownMenuItem(
text = { Text(stringResource(R.string.title_real_ping_all_server)) },
onClick = { onAction(MainAction.TestAllServers) }
)
DropdownMenuItem(
text = { Text(stringResource(R.string.title_locate_selected_config)) },
onClick = { onAction(MainAction.LocateSelectedServer) }
@@ -107,6 +103,10 @@ fun MoreMenuContent(
text = { Text(stringResource(R.string.title_sort_by_test_results)) },
onClick = { onAction(MainAction.SortByTestResults) }
)
DropdownMenuItem(
text = { Text(stringResource(R.string.title_real_ping_all_server)) },
onClick = { onAction(MainAction.TestAllServers) }
)
DropdownMenuItem(
text = { Text(stringResource(R.string.title_sub_update)) },
onClick = { onAction(MainAction.UpdateSubscriptions) }