diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt index 6ee26f62..01d42506 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -58,6 +58,7 @@ object AppConfig { const val PREF_LANGUAGE = "pref_language" const val PREF_APP_LOCALE_MIGRATED = "pref_app_locale_migrated" const val PREF_UI_MODE_NIGHT = "pref_ui_mode_night" + const val PREF_DYNAMIC_COLOR = "pref_dynamic_color" const val PREF_IPV6_ENABLED = "pref_ipv6_enabled" const val PREF_PREFER_IPV6 = "pref_prefer_ipv6" const val PREF_PROXY_SHARING = "pref_proxy_sharing_enabled" diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsChangeManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsChangeManager.kt index c9d5f383..127842e4 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsChangeManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsChangeManager.kt @@ -19,6 +19,7 @@ object SettingsChangeManager { AppConfig.PREF_GROUP_ALL_DISPLAY, AppConfig.PREF_LANGUAGE, AppConfig.PREF_UI_MODE_NIGHT, + AppConfig.PREF_DYNAMIC_COLOR, AppConfig.PREF_IS_BOOTED, ) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/compose/Theme.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/compose/Theme.kt index 3a07ac22..6372ea83 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/compose/Theme.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/compose/Theme.kt @@ -1,11 +1,14 @@ package com.v2ray.ang.ui.compose import android.app.Activity +import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -15,6 +18,7 @@ import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.core.view.WindowCompat import com.v2ray.ang.AppConfig @@ -122,14 +126,26 @@ object ThemeManager { ) val themeMode: StateFlow = _themeMode.asStateFlow() + private val _dynamicColorEnabled = MutableStateFlow( + MmkvManager.decodeSettingsBool(AppConfig.PREF_DYNAMIC_COLOR, true) + ) + val dynamicColorEnabled: StateFlow = _dynamicColorEnabled.asStateFlow() + fun setThemeMode(mode: String) { MmkvManager.encodeSettings(AppConfig.PREF_UI_MODE_NIGHT, mode) _themeMode.value = mode } + fun setDynamicColorEnabled(enabled: Boolean) { + MmkvManager.encodeSettings(AppConfig.PREF_DYNAMIC_COLOR, enabled) + _dynamicColorEnabled.value = enabled + } + fun refresh() { _themeMode.value = MmkvManager.decodeSettingsString(AppConfig.PREF_UI_MODE_NIGHT, "0") ?: "0" + _dynamicColorEnabled.value = + MmkvManager.decodeSettingsBool(AppConfig.PREF_DYNAMIC_COLOR, true) } } @@ -150,7 +166,15 @@ fun AppTheme( darkTheme: Boolean = resolveDarkTheme(), content: @Composable () -> Unit ) { - val colorScheme = if (darkTheme) DarkColor else LightColor + val dynamicColor by ThemeManager.dynamicColorEnabled.collectAsState() + val context = LocalContext.current + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + darkTheme -> DarkColor + else -> LightColor + } val snackbarController = rememberAppSnackbarController() val view = LocalView.current diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/settings/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/settings/SettingsActivity.kt index 04b120a5..b9f84dc3 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/settings/SettingsActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/settings/SettingsActivity.kt @@ -1,5 +1,6 @@ package com.v2ray.ang.ui.settings +import android.os.Build import android.os.Bundle import androidx.activity.viewModels import androidx.compose.foundation.layout.Column @@ -13,6 +14,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold import androidx.compose.material3.ScaffoldDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -129,6 +131,7 @@ fun SettingsScreen( ) } var uiModeNight by rememberMmkvString(AppConfig.PREF_UI_MODE_NIGHT, "0") + var dynamicColor by rememberMmkvBool(AppConfig.PREF_DYNAMIC_COLOR, true) var ipv6Enabled by rememberMmkvBool(AppConfig.PREF_IPV6_ENABLED, false) var preferIpv6 by rememberMmkvBool(AppConfig.PREF_PREFER_IPV6, false) @@ -151,6 +154,14 @@ fun SettingsScreen( val effectiveLocalProxy = enableLocalProxy || localProxyForced val muxXudpConcurrencyInt = muxXudpConcurrency.toIntOrNull() ?: 8 + val dynamicColorSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + LaunchedEffect(dynamicColorSupported) { + if (!dynamicColorSupported && dynamicColor) { + dynamicColor = false + ThemeManager.setDynamicColorEnabled(false) + } + } + val languageEntries = stringArrayResource(R.array.language_select).toList() val languageValues = stringArrayResource(R.array.language_select_value).toList() val uiModeNightEntries = stringArrayResource(R.array.ui_mode_night).toList() @@ -227,6 +238,16 @@ fun SettingsScreen( SettingsChangeManager.makeSetupGroupTab() } ) + SettingsSwitchItem( + title = stringResource(R.string.title_pref_dynamic_color), + summary = stringResource(R.string.summary_pref_dynamic_color), + checked = dynamicColor, + enabled = dynamicColorSupported, + onCheckedChange = { + dynamicColor = it + ThemeManager.setDynamicColorEnabled(it) + } + ) SettingsListItem( title = stringResource(R.string.title_language), entries = languageEntries, diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index 82f87f12..e9744075 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -298,6 +298,8 @@ اللغة إعدادات واجهة المستخدم إعدادات وضع واجهة المستخدم ليلاً + تفعيل الألوان الديناميكية + يعمل فقط على أندرويد 12+ تمكين ميزة Hev TUN عند التمكين، سيستخدم TUN ‏hev-socks5-tunnel؛ وإلا فسيستخدم xray-core. مستوى سجل Hev TUN diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml index 5402b33a..0b934d8f 100644 --- a/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -298,6 +298,8 @@ ভাষা ইউআই সেটিংস ইউআই মোড সেটিংস + ডায়নামিক রঙ চালু করুন + শুধুমাত্র Android 12+ ডিভাইসে কাজ করে Hev TUN সুবিধা চালু করুন চালু থাকলে TUN hev-socks5-tunnel ব্যবহার করবে; অন্যথায় xray-core ব্যবহার করবে। Hev TUN লগ স্তর 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 5c45a7f7..cd586cc1 100644 --- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml +++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml @@ -298,6 +298,8 @@ زووݩ سامووا رابط منتوری سامووا حالت رابط منتوری + فعال‌سازی رنگ پویا + فقط روی اندروید ۱۲+ کار می‌کند و کار گرؽڌن ویژیی Hev TUN مجالی ک ره ونده بۊ، TUN ایا hev-socks5-tunnel ن و کار اگره؛ ٱر ره نوۊفته بۊ، همو xray-core ن و کار اگره. Hev TUN سئت گوزارشا diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index c940b160..6394b890 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -298,6 +298,8 @@ زبان تنظیمات رابط کاربری تنظیمات حالت رابط کاربری + فعال‌سازی رنگ پویا + فقط روی اندروید ۱۲+ کار می‌کند استفاده از Hev TUN اگر فعال باشد، تونل VPN از hev-socks5-tunnel استفاده می‌کند؛ در غیر این صورت از xray-core استفاده خواهد شد. سطح گزارش‌های Hev TUN diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml index 0566ed47..60214a1b 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -298,6 +298,8 @@ Язык Настройки интерфейса Тема интерфейса + Включить динамические цвета + Работает только на Android 12+ Использовать Hev TUN Если включено, TUN будет использовать hev-socks5-tunnel; иначе будет использован xray-core Уровень журналирования Hev TUN diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml index 0c818992..1bae7d30 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -298,6 +298,8 @@ Ngôn ngữ Cài đặt UI Cài đặt chế độ UI + Bật màu động + Chỉ hoạt động trên Android 12+ Dùng Hev TUN Khi bật, TUN sẽ dùng hev-socks5-tunnel; nếu không, TUN sẽ dùng xray-core. Mức nhật ký Hev TUN 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 e5009012..40211243 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -298,6 +298,8 @@ 语言 用户界面设置 深色模式 + 开启莫奈取色 + 仅在 Android 12+ 设备上工作 启用 Hev TUN 功能 选择启用后 TUN 将使用 hev-socks5-tunnel 否则使用 xray-core Hev TUN 日志级别 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 a87e8937..703cc41b 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -298,6 +298,8 @@ 語言 介面顯示設定 深色模式 + 開啟莫奈取色 + 僅在 Android 12+ 裝置上工作 啟用 Hev TUN 功能 啟用後,TUN 會使用 hev-socks5-tunnel;否則使用 xray-core。 Hev TUN 日誌層級 diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index de2672d1..81467cef 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -298,6 +298,8 @@ Language UI settings UI mode settings + Enable dynamic color + Only works on Android 12+ devices Use Hev TUN When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core. Hev TUN log level