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 396879d07..bfc49a24d 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -182,6 +182,7 @@ object PreferKey { const val cAccent = "colorAccent" const val customMode = "customMode" const val paletteStyle = "paletteStyle" + const val materialVersion = "materialVersion" const val composeEngine = "composeEngine" const val containerOpacity = "containerOpacity" const val enableBlur = "enableBlur" 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 c527320ee..ba3a11553 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 @@ -17,6 +17,8 @@ object ThemeConfig { var paletteStyle by prefDelegate(PreferKey.paletteStyle, "tonalSpot") + var materialVersion by prefDelegate(PreferKey.materialVersion, "material3") + var appTheme by prefDelegate(PreferKey.appTheme, "0") var themeMode by prefDelegate(PreferKey.themeMode, "0") 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 bc7ae497d..8554a77d0 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 @@ -278,6 +278,13 @@ fun ThemeConfigScreen( entryValues = stringArrayResource(R.array.customContrast_value), onValueChange = { ThemeConfig.customContrast = it } ) + DropdownListSettingItem( + title = stringResource(R.string.material_version), + selectedValue = ThemeConfig.materialVersion, + displayEntries = stringArrayResource(R.array.materialVersion), + entryValues = stringArrayResource(R.array.materialVersion_value), + onValueChange = { ThemeConfig.materialVersion = it } + ) } } @@ -476,7 +483,6 @@ fun ThemeConfigScreen( } ) } - } @OptIn(ExperimentalMaterial3ExpressiveApi::class) @@ -759,7 +765,8 @@ private fun getThemeColorPalette( value: String, isDark: Boolean, isAmoled: Boolean, - paletteStyle: String? + paletteStyle: String?, + materialVersion: String? = null ): ThemeColorPalette { val appThemeMode = ThemeResolver.resolveThemeMode(value) val colorScheme = ThemeManager.getColorScheme( @@ -767,7 +774,8 @@ private fun getThemeColorPalette( mode = appThemeMode, darkTheme = isDark, isAmoled = isAmoled, - paletteStyle = paletteStyle + paletteStyle = paletteStyle, + materialVersion = materialVersion ) return ThemeColorPalette( @@ -784,7 +792,8 @@ private fun getThemeColors( value: String, isDark: Boolean, isAmoled: Boolean, - paletteStyle: String? + paletteStyle: String?, + materialVersion: String? = null ): ThemeColors { val appThemeMode = ThemeResolver.resolveThemeMode(value) val colorScheme = ThemeManager.getColorScheme( @@ -792,7 +801,8 @@ private fun getThemeColors( mode = appThemeMode, darkTheme = isDark, isAmoled = isAmoled, - paletteStyle = paletteStyle + paletteStyle = paletteStyle, + materialVersion = materialVersion ) return ThemeColors( diff --git a/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt b/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt index a47a60a05..76a21a88a 100644 --- a/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt +++ b/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt @@ -21,15 +21,17 @@ fun AppTheme( val appThemeMode = ThemeResolver.resolveThemeMode(ThemeConfig.appTheme) val isPureBlack = ThemeConfig.isPureBlack val paletteStyle = ThemeConfig.paletteStyle + val materialVersion = ThemeConfig.materialVersion val colorScheme = - remember(context, appThemeMode, darkTheme, isPureBlack, paletteStyle) { + remember(context, appThemeMode, darkTheme, isPureBlack, paletteStyle, materialVersion) { ThemeManager.getColorScheme( context = context, mode = appThemeMode, darkTheme = darkTheme, isAmoled = isPureBlack, - paletteStyle = paletteStyle + paletteStyle = paletteStyle, + materialVersion = materialVersion ) } 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 d66972174..b46f51054 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 @@ -4,20 +4,25 @@ import androidx.compose.material3.ColorScheme import androidx.compose.ui.graphics.Color import com.materialkolor.PaletteStyle import com.materialkolor.dynamicColorScheme +import io.legado.app.ui.theme.ThemeResolver.resolveColorSpecVersion class CustomColorScheme( seed: Int, style: PaletteStyle, + colorSpec: ThemeColorSpec = ThemeColorSpec.SPEC_2021, ) : BaseColorScheme() { private val contrastLevel: Double = ThemeResolver.resolveContrastLevel() + private val specVersion = resolveColorSpecVersion(colorSpec) + override val lightScheme: ColorScheme = dynamicColorScheme( seedColor = Color(seed), isDark = false, isAmoled = false, style = style, - contrastLevel = contrastLevel + contrastLevel = contrastLevel, + specVersion = specVersion ) override val darkScheme: ColorScheme = dynamicColorScheme( @@ -25,6 +30,7 @@ class CustomColorScheme( isDark = true, isAmoled = false, style = style, - contrastLevel = contrastLevel + contrastLevel = contrastLevel, + specVersion = specVersion ) } diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeColorSpec.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeColorSpec.kt new file mode 100644 index 000000000..e21d12603 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/theme/ThemeColorSpec.kt @@ -0,0 +1,6 @@ +package io.legado.app.ui.theme + +enum class ThemeColorSpec(val displayName: String) { + SPEC_2021("Material 3 (2021)"), + SPEC_2025("Expressive (2025)") +} \ No newline at end of file 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 c2fd91861..561b4d48c 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 @@ -8,6 +8,7 @@ import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.ui.graphics.Color import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.theme.ThemeResolver.resolvePaletteStyle +import io.legado.app.ui.theme.ThemeResolver.resolveThemeColorSpec import io.legado.app.ui.theme.colorScheme.AugustColorScheme import io.legado.app.ui.theme.colorScheme.CarlottaColorScheme import io.legado.app.ui.theme.colorScheme.ElinkColorScheme @@ -45,10 +46,12 @@ object ThemeManager { darkTheme: Boolean, isAmoled: Boolean, paletteStyle: String?, + materialVersion: String? = null, forceOpaque: Boolean = false ): ColorScheme { val style = resolvePaletteStyle(paletteStyle) + val colorSpec = resolveThemeColorSpec(materialVersion) val actualMode = if (forceOpaque && mode == AppThemeMode.Transparent) { AppThemeMode.WH } else { 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 a392cef7a..44b3d8fd1 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 @@ -2,6 +2,7 @@ package io.legado.app.ui.theme import com.materialkolor.Contrast import com.materialkolor.PaletteStyle +import com.materialkolor.dynamiccolor.ColorSpec import io.legado.app.ui.config.themeConfig.ThemeConfig object ThemeResolver { @@ -47,4 +48,19 @@ object ThemeResolver { } } + fun resolveThemeColorSpec(value: String?): ThemeColorSpec { + return when (value) { + "material3" -> ThemeColorSpec.SPEC_2021 + "material3Expressive" -> ThemeColorSpec.SPEC_2025 + else -> ThemeColorSpec.SPEC_2021 + } + } + + fun resolveColorSpecVersion(colorSpec: ThemeColorSpec): ColorSpec.SpecVersion { + return when (colorSpec) { + ThemeColorSpec.SPEC_2025 -> ColorSpec.SpecVersion.SPEC_2025 + ThemeColorSpec.SPEC_2021 -> ColorSpec.SpecVersion.SPEC_2021 + } + } + } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b420a0a22..4d787ca37 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1389,6 +1389,7 @@ 颜色样式 反转音量键翻页方向 调色板样式 + 颜色规格 这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。 启用控件模糊 总是使用下划线表示强调文本 diff --git a/app/src/main/res/values/array_values.xml b/app/src/main/res/values/array_values.xml index 28fce4cd8..01970a0b9 100644 --- a/app/src/main/res/values/array_values.xml +++ b/app/src/main/res/values/array_values.xml @@ -98,6 +98,11 @@ content + + material3 + material3Expressive + + material salt diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 7007950a2..76edcad94 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -212,7 +212,12 @@ Content - + + Material 3 (2021) + Material 3 Expressive (2025) + + + Material Design SaltUI Miuix diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 208e33ff3..4bc2d3a93 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1393,6 +1393,7 @@ 颜色样式 反转音量键翻页方向 调色板样式 + 颜色规格 这里的选项仅可以控制使用Compose重写的界面。对于禁用的选项,会在日后实现时开放,现在仅作占位。 启用控件模糊 总是使用下划线表示强调文本