Update Theme.kt SnackBar.kt MainImportMenu.kt
This commit is contained in:
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) }
|
||||
|
||||
Reference in new issue
Block a user