Add material 3 high contrast theme

This commit is contained in:
MM20 2025-06-10 18:41:18 +02:00
parent e503a003e0
commit 5525609355
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
5 changed files with 100 additions and 0 deletions

View File

@ -11,6 +11,7 @@ import de.mm20.launcher2.preferences.ui.UiSettings
import de.mm20.launcher2.themes.BlackAndWhiteThemeId import de.mm20.launcher2.themes.BlackAndWhiteThemeId
import de.mm20.launcher2.themes.DefaultThemeId import de.mm20.launcher2.themes.DefaultThemeId
import de.mm20.launcher2.themes.Colors import de.mm20.launcher2.themes.Colors
import de.mm20.launcher2.themes.HighContrastThemeId
import de.mm20.launcher2.themes.ThemeRepository import de.mm20.launcher2.themes.ThemeRepository
import de.mm20.launcher2.themes.toLegacyJson import de.mm20.launcher2.themes.toLegacyJson
import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.R
@ -32,6 +33,7 @@ class ColorSchemesSettingsScreenVM : ViewModel(), KoinComponent {
val selectedColors = uiSettings.colors.map { val selectedColors = uiSettings.colors.map {
when(it) { when(it) {
ColorsDescriptor.Default -> DefaultThemeId ColorsDescriptor.Default -> DefaultThemeId
ColorsDescriptor.HighContrast -> HighContrastThemeId
ColorsDescriptor.BlackAndWhite -> BlackAndWhiteThemeId ColorsDescriptor.BlackAndWhite -> BlackAndWhiteThemeId
is ColorsDescriptor.Custom -> UUID.fromString(it.id) is ColorsDescriptor.Custom -> UUID.fromString(it.id)
} }
@ -49,6 +51,7 @@ class ColorSchemesSettingsScreenVM : ViewModel(), KoinComponent {
fun selectTheme(colors: Colors) { fun selectTheme(colors: Colors) {
uiSettings.setColors(when(colors.id) { uiSettings.setColors(when(colors.id) {
DefaultThemeId -> ColorsDescriptor.Default DefaultThemeId -> ColorsDescriptor.Default
HighContrastThemeId -> ColorsDescriptor.HighContrast
BlackAndWhiteThemeId -> ColorsDescriptor.BlackAndWhite BlackAndWhiteThemeId -> ColorsDescriptor.BlackAndWhite
else -> ColorsDescriptor.Custom(colors.id.toString()) else -> ColorsDescriptor.Custom(colors.id.toString())
}) })

View File

@ -428,6 +428,7 @@
<string name="preference_theme_dark">Dark</string> <string name="preference_theme_dark">Dark</string>
<string name="preference_screen_colors">Color scheme</string> <string name="preference_screen_colors">Color scheme</string>
<string name="preference_colors_default">Default</string> <string name="preference_colors_default">Default</string>
<string name="preference_colors_high_contrast">High contrast</string>
<string name="preference_colors_bw">Black and White</string> <string name="preference_colors_bw">Black and White</string>
<string name="preference_custom_colors_corepalette">Color palette</string> <string name="preference_custom_colors_corepalette">Color palette</string>
<string name="preference_mdy_color_source">Source for dynamic colors</string> <string name="preference_mdy_color_source">Source for dynamic colors</string>

View File

@ -212,6 +212,10 @@ sealed interface ColorsDescriptor {
@SerialName("default") @SerialName("default")
data object Default : ColorsDescriptor data object Default : ColorsDescriptor
@Serializable
@SerialName("high_contrast")
data object HighContrast : ColorsDescriptor
@Serializable @Serializable
@SerialName("bw") @SerialName("bw")
data object BlackAndWhite : ColorsDescriptor data object BlackAndWhite : ColorsDescriptor

View File

@ -4,6 +4,7 @@ import java.util.UUID
val DefaultThemeId = UUID(0L, 0L) val DefaultThemeId = UUID(0L, 0L)
val HighContrastThemeId = UUID(0L, 2L)
val BlackAndWhiteThemeId = UUID(0L, 1L) val BlackAndWhiteThemeId = UUID(0L, 1L)
val ExtraRoundShapesId = UUID(0L, 1L) val ExtraRoundShapesId = UUID(0L, 1L)
val CutShapesId = UUID(0L, 2L) val CutShapesId = UUID(0L, 2L)
@ -87,6 +88,83 @@ val DefaultDarkColorScheme = ColorScheme<Color>(
scrim = ColorRef(CorePaletteColor.Neutral, 0), scrim = ColorRef(CorePaletteColor.Neutral, 0),
) )
val HighContrastLightColorScheme = ColorScheme<Color>(
primary = ColorRef(CorePaletteColor.Primary, 20),
onPrimary = ColorRef(CorePaletteColor.Primary, 100),
primaryContainer = ColorRef(CorePaletteColor.Primary, 30),
onPrimaryContainer = ColorRef(CorePaletteColor.Primary, 100),
secondary = ColorRef(CorePaletteColor.Secondary, 20),
onSecondary = ColorRef(CorePaletteColor.Secondary, 100),
secondaryContainer = ColorRef(CorePaletteColor.Secondary, 30),
onSecondaryContainer = ColorRef(CorePaletteColor.Secondary, 100),
tertiary = ColorRef(CorePaletteColor.Tertiary, 20),
onTertiary = ColorRef(CorePaletteColor.Tertiary, 100),
tertiaryContainer = ColorRef(CorePaletteColor.Tertiary, 30),
onTertiaryContainer = ColorRef(CorePaletteColor.Tertiary, 100),
error = ColorRef(CorePaletteColor.Error, 20),
onError = ColorRef(CorePaletteColor.Error, 100),
errorContainer = ColorRef(CorePaletteColor.Error, 30),
onErrorContainer = ColorRef(CorePaletteColor.Error, 100),
surfaceDim = ColorRef(CorePaletteColor.Neutral, 87),
surface = ColorRef(CorePaletteColor.Neutral, 98),
surfaceBright = ColorRef(CorePaletteColor.Neutral, 98),
surfaceContainerLowest = ColorRef(CorePaletteColor.Neutral, 100),
surfaceContainerLow = ColorRef(CorePaletteColor.Neutral, 96),
surfaceContainer = ColorRef(CorePaletteColor.Neutral, 94),
surfaceContainerHigh = ColorRef(CorePaletteColor.Neutral, 92),
surfaceContainerHighest = ColorRef(CorePaletteColor.Neutral, 90),
onSurface = ColorRef(CorePaletteColor.Neutral, 0),
onSurfaceVariant = ColorRef(CorePaletteColor.NeutralVariant, 0),
outline = ColorRef(CorePaletteColor.NeutralVariant, 20),
outlineVariant = ColorRef(CorePaletteColor.NeutralVariant, 30),
inverseSurface = ColorRef(CorePaletteColor.Neutral, 20),
inverseOnSurface = ColorRef(CorePaletteColor.Neutral, 100),
inversePrimary = ColorRef(CorePaletteColor.Primary, 80),
surfaceVariant = ColorRef(CorePaletteColor.NeutralVariant, 90),
surfaceTint = ColorRef(CorePaletteColor.Primary, 20),
background = ColorRef(CorePaletteColor.Neutral, 98),
onBackground = ColorRef(CorePaletteColor.Neutral, 0),
scrim = ColorRef(CorePaletteColor.Neutral, 0),
)
val HighContrastDarkColorScheme = ColorScheme<Color>(
primary = ColorRef(CorePaletteColor.Primary, 95),
onPrimary = ColorRef(CorePaletteColor.Primary, 0),
primaryContainer = ColorRef(CorePaletteColor.Primary, 80),
onPrimaryContainer = ColorRef(CorePaletteColor.Primary, 0),
secondary = ColorRef(CorePaletteColor.Secondary, 95),
onSecondary = ColorRef(CorePaletteColor.Secondary, 0),
secondaryContainer = ColorRef(CorePaletteColor.Secondary, 80),
onSecondaryContainer = ColorRef(CorePaletteColor.Secondary, 0),
tertiary = ColorRef(CorePaletteColor.Tertiary, 95),
onTertiary = ColorRef(CorePaletteColor.Tertiary, 0),
tertiaryContainer = ColorRef(CorePaletteColor.Tertiary, 80),
onTertiaryContainer = ColorRef(CorePaletteColor.Tertiary, 0),
error = ColorRef(CorePaletteColor.Error, 95),
onError = ColorRef(CorePaletteColor.Error, 0),
errorContainer = ColorRef(CorePaletteColor.Error, 80),
onErrorContainer = ColorRef(CorePaletteColor.Error, 0),
surfaceDim = ColorRef(CorePaletteColor.Neutral, 6),
surface = ColorRef(CorePaletteColor.Neutral, 6),
surfaceBright = ColorRef(CorePaletteColor.Neutral, 24),
surfaceContainerLowest = ColorRef(CorePaletteColor.Neutral, 4),
surfaceContainerLow = ColorRef(CorePaletteColor.Neutral, 10),
surfaceContainer = ColorRef(CorePaletteColor.Neutral, 12),
surfaceContainerHigh = ColorRef(CorePaletteColor.Neutral, 17),
surfaceContainerHighest = ColorRef(CorePaletteColor.Neutral, 22),
onSurface = ColorRef(CorePaletteColor.Neutral, 100),
onSurfaceVariant = ColorRef(CorePaletteColor.NeutralVariant, 100),
outline = ColorRef(CorePaletteColor.NeutralVariant, 95),
outlineVariant = ColorRef(CorePaletteColor.NeutralVariant, 80),
inverseSurface = ColorRef(CorePaletteColor.Neutral, 90),
inverseOnSurface = ColorRef(CorePaletteColor.Neutral, 0),
inversePrimary = ColorRef(CorePaletteColor.Primary, 20),
surfaceVariant = ColorRef(CorePaletteColor.NeutralVariant, 30),
surfaceTint = ColorRef(CorePaletteColor.Primary, 95),
background = ColorRef(CorePaletteColor.Neutral, 6),
onBackground = ColorRef(CorePaletteColor.Neutral, 100),
scrim = ColorRef(CorePaletteColor.Neutral, 0),
)
val BlackAndWhiteLightColorScheme = ColorScheme<Color?>( val BlackAndWhiteLightColorScheme = ColorScheme<Color?>(
primary = StaticColor(0xFF000000.toInt()), primary = StaticColor(0xFF000000.toInt()),

View File

@ -34,6 +34,7 @@ class ThemeRepository(
fun getColors(id: UUID): Flow<Colors?> { fun getColors(id: UUID): Flow<Colors?> {
if (id == DefaultThemeId) return flowOf(getDefaultColors()) if (id == DefaultThemeId) return flowOf(getDefaultColors())
if (id == HighContrastThemeId) return flowOf(getHighContrastColors())
if (id == BlackAndWhiteThemeId) return flowOf(getBlackAndWhiteColors()) if (id == BlackAndWhiteThemeId) return flowOf(getBlackAndWhiteColors())
return database.themeDao().getColors(id).map { it?.let { Colors(it) } }.flowOn(Dispatchers.Default) return database.themeDao().getColors(id).map { it?.let { Colors(it) } }.flowOn(Dispatchers.Default)
} }
@ -52,6 +53,7 @@ class ThemeRepository(
fun getColorsOrDefault(theme: ColorsDescriptor?): Flow<Colors> { fun getColorsOrDefault(theme: ColorsDescriptor?): Flow<Colors> {
return when(theme) { return when(theme) {
is ColorsDescriptor.HighContrast -> flowOf(getHighContrastColors())
is ColorsDescriptor.BlackAndWhite -> flowOf(getBlackAndWhiteColors()) is ColorsDescriptor.BlackAndWhite -> flowOf(getBlackAndWhiteColors())
is ColorsDescriptor.Custom -> { is ColorsDescriptor.Custom -> {
val id = UUID.fromString(theme.id) val id = UUID.fromString(theme.id)
@ -64,6 +66,7 @@ class ThemeRepository(
private fun getBuiltInColors(): List<Colors> { private fun getBuiltInColors(): List<Colors> {
return listOf( return listOf(
getDefaultColors(), getDefaultColors(),
getHighContrastColors(),
getBlackAndWhiteColors(), getBlackAndWhiteColors(),
) )
} }
@ -79,6 +82,17 @@ class ThemeRepository(
) )
} }
private fun getHighContrastColors(): Colors {
return Colors(
id = HighContrastThemeId,
builtIn = true,
name = context.getString(R.string.preference_colors_high_contrast),
corePalette = EmptyCorePalette,
lightColorScheme = HighContrastLightColorScheme,
darkColorScheme = HighContrastDarkColorScheme,
)
}
private fun getBlackAndWhiteColors(): Colors { private fun getBlackAndWhiteColors(): Colors {
return Colors( return Colors(
id = BlackAndWhiteThemeId, id = BlackAndWhiteThemeId,