diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 121329c5b..396879d07 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -178,6 +178,7 @@ object PreferKey { const val disableMangaScale = "disableMangaScale" const val firebaseEnable = "firebaseEnable" const val cPrimary = "colorPrimary" + const val customContrast = "customContrast" const val cAccent = "colorAccent" const val customMode = "customMode" const val paletteStyle = "paletteStyle" diff --git a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt index c9436dbb2..c527320ee 100644 --- a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt +++ b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfig.kt @@ -47,6 +47,10 @@ object ThemeConfig { postEvent(EventBus.RECREATE, "") } + var customContrast by prefDelegate(PreferKey.customContrast, "Default") { + postEvent(EventBus.RECREATE, "") + } + var launcherIcon by prefDelegate(PreferKey.launcherIcon, "ic_launcher") var showDiscovery by prefDelegate(PreferKey.showDiscovery, true) @@ -68,4 +72,4 @@ object ThemeConfig { fun hasImageBg(isDark: Boolean): Boolean = !(if (isDark) bgImageDark else bgImageLight).isNullOrBlank() -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt index a8747b89e..bc7ae497d 100644 --- a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt @@ -213,12 +213,12 @@ fun ThemeConfigScreen( onClick = { showLauncherIconPicker = true } ) SwitchSettingItem( - title = "预见性返回手势", - description = "启用系统预见性返回手势", + title = stringResource(R.string.predictive_back), + description = stringResource(R.string.predictive_back_summary), checked = ThemeConfig.isPredictiveBackEnabled, onCheckedChange = { ThemeConfig.isPredictiveBackEnabled = it - context.toastOnUi("重启以应用") + context.toastOnUi(R.string.restart_to_apply) } ) SliderSettingItem( @@ -239,14 +239,14 @@ fun ThemeConfigScreen( } if (selectedTheme == "12") { - SplicedColumnGroup(title = "自定义主题") { + SplicedColumnGroup(title = stringResource(R.string.custom_theme)) { ClickableSettingItem( title = stringResource(R.string.seed_color), option = if (primaryColorValue.intValue != 0) "#${ Integer.toHexString( primaryColorValue.intValue ).uppercase() - }" else "点击选择", + }" else stringResource(R.string.click_to_select), onClick = { showColorPicker = true }, trailingContent = { if (primaryColorValue.intValue != 0) { @@ -271,6 +271,13 @@ fun ThemeConfigScreen( entryValues = stringArrayResource(R.array.paletteStyle_value), onValueChange = { ThemeConfig.paletteStyle = it } ) + DropdownListSettingItem( + title = stringResource(R.string.preferred_contrast), + selectedValue = ThemeConfig.customContrast, + displayEntries = stringArrayResource(R.array.customContrast), + entryValues = stringArrayResource(R.array.customContrast_value), + onValueChange = { ThemeConfig.customContrast = it } + ) } } @@ -325,9 +332,9 @@ fun ThemeConfigScreen( ) } - SplicedColumnGroup(title = "Compose 相关") { + SplicedColumnGroup(title = stringResource(R.string.compose_related)) { SwitchSettingItem( - title = "使用折叠应用栏", + title = stringResource(R.string.use_flexible_top_bar), checked = ThemeConfig.useFlexibleTopAppBar, onCheckedChange = { ThemeConfig.useFlexibleTopAppBar = it } ) @@ -469,6 +476,7 @@ fun ThemeConfigScreen( } ) } + } @OptIn(ExperimentalMaterial3ExpressiveApi::class) diff --git a/app/src/main/java/io/legado/app/ui/theme/CustomColorScheme.kt b/app/src/main/java/io/legado/app/ui/theme/CustomColorScheme.kt index 0ec59d6a6..d66972174 100644 --- a/app/src/main/java/io/legado/app/ui/theme/CustomColorScheme.kt +++ b/app/src/main/java/io/legado/app/ui/theme/CustomColorScheme.kt @@ -1,30 +1,16 @@ package io.legado.app.ui.theme -import android.app.UiModeManager -import android.content.Context -import android.os.Build import androidx.compose.material3.ColorScheme import androidx.compose.ui.graphics.Color -import androidx.core.content.getSystemService -import com.materialkolor.Contrast import com.materialkolor.PaletteStyle import com.materialkolor.dynamicColorScheme class CustomColorScheme( - context: Context, seed: Int, style: PaletteStyle, ) : BaseColorScheme() { - private val contrastLevel: Double = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - context.getSystemService() - ?.contrast - ?.toDouble() - ?: Contrast.Default.value - } else { - Contrast.Default.value - } + private val contrastLevel: Double = ThemeResolver.resolveContrastLevel() override val lightScheme: ColorScheme = dynamicColorScheme( seedColor = Color(seed), diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt index c4de80e21..c2fd91861 100644 --- a/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt +++ b/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt @@ -65,7 +65,7 @@ object ThemeManager { } AppThemeMode.CUSTOM -> { - CustomColorScheme(context, context.primaryColor, style) + CustomColorScheme(context.primaryColor, style) .getColorScheme(darkTheme) } diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeResolver.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeResolver.kt index e84c37f83..a392cef7a 100644 --- a/app/src/main/java/io/legado/app/ui/theme/ThemeResolver.kt +++ b/app/src/main/java/io/legado/app/ui/theme/ThemeResolver.kt @@ -1,6 +1,8 @@ package io.legado.app.ui.theme +import com.materialkolor.Contrast import com.materialkolor.PaletteStyle +import io.legado.app.ui.config.themeConfig.ThemeConfig object ThemeResolver { @@ -37,4 +39,12 @@ object ThemeResolver { } } + fun resolveContrastLevel(): Double { + return try { + Contrast.valueOf(ThemeConfig.customContrast).value + } catch (e: Exception) { + Contrast.Default.value + } + } + } diff --git a/app/src/main/res/values-zh-rCN/arrays.xml b/app/src/main/res/values-zh-rCN/arrays.xml index cea6fa5e8..cb0015f52 100644 --- a/app/src/main/res/values-zh-rCN/arrays.xml +++ b/app/src/main/res/values-zh-rCN/arrays.xml @@ -214,5 +214,11 @@ 仅封面 + + 默认 + 较强 + 最强 + + 所有版本 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a9e8c36c6..b420a0a22 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -25,6 +25,24 @@ 无法跳转至设置界面 手动输入 + 偏好对比度 + 来源:系统对比度 + 来源:手动输入 + 当前生效值:%1$s + 系统对比度:%1$s + 系统对比度 + 手动值 [-1, 1] + 请输入 -1 到 1 之间的有效数字 + 预见性返回手势 + 启用系统预见性返回手势 + 重启以应用 + 自定义主题 + 点击选择 + Compose 相关 + 使用折叠应用栏 + 滑块 + 输入 + 手动值:%1$s 请输入目录路径 目录路径无效 目录路径不能为空 @@ -1390,4 +1408,4 @@ 选择文本时震动 重新同步远程书籍 离字间距 - \ No newline at end of file + diff --git a/app/src/main/res/values/array_values.xml b/app/src/main/res/values/array_values.xml index aedd13258..28fce4cd8 100644 --- a/app/src/main/res/values/array_values.xml +++ b/app/src/main/res/values/array_values.xml @@ -131,4 +131,10 @@ 3 + + Default + Medium + High + + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 6dc424b80..7007950a2 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -299,5 +299,11 @@ Unlabeled + + Default + High + Maximum + + 所有版本 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a5e8782f4..208e33ff3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,6 +26,24 @@ Cannot jump to Settings. Manual Input + Preferred contrast + Source: System contrast + Source: Manual input + Current effective value: %1$s + System contrast: %1$s + System contrast + Manual value [-1, 1] + Enter a valid number between -1 and 1 + Predictive Back Gestures + Enable system predictive back gestures + Restart to apply + Custom Theme + Click to select + Compose Related + Use flexible top app bar + Slider + Input + Manual value: %1$s Enter directory path Invalid directory path Directory path cannot be empty