OXYGENHUB
# 206d05a042e7 oxygenhub-android / app / src / main / java / io / oxygenhub / android / ui / theme / Theme.kt
3.2 KiB · last changed Light and dark in the hub's own colours, dynamic colour by default (refs #2) 11 days ago source blame history raw
1
package io.oxygenhub.android.ui.theme
2
3
import androidx.compose.foundation.isSystemInDarkTheme
4
import androidx.compose.material3.ColorScheme
5
import androidx.compose.material3.MaterialTheme
6
import androidx.compose.material3.darkColorScheme
7
import androidx.compose.material3.dynamicDarkColorScheme
8
import androidx.compose.material3.dynamicLightColorScheme
9
import androidx.compose.material3.lightColorScheme
10
import androidx.compose.runtime.Composable
11
import androidx.compose.runtime.Immutable
12
import androidx.compose.runtime.staticCompositionLocalOf
13
import androidx.compose.ui.graphics.Color
14
import androidx.compose.ui.platform.LocalContext
15
16
private val DarkColorScheme = darkColorScheme(
17
    primary = DarkAccent,
18
    onPrimary = DarkBackground,
19
    primaryContainer = DarkBand,
20
    onPrimaryContainer = Color.White,
21
    secondary = DarkAccent2,
22
    onSecondary = Color.White,
23
    tertiary = DarkWarn,
24
    background = DarkBackground,
25
    onBackground = DarkInk,
26
    surface = DarkBackground,
27
    onSurface = DarkInk,
28
    surfaceVariant = DarkSurfaceSoft,
29
    onSurfaceVariant = DarkMute,
30
    surfaceContainerLowest = DarkBackground,
31
    surfaceContainerLow = DarkSurface,
32
    surfaceContainer = DarkSurface,
33
    surfaceContainerHigh = DarkSurfaceSoft,
34
    surfaceContainerHighest = DarkSurfaceSoft,
35
    outline = DarkMute,
36
    outlineVariant = DarkLine,
37
    error = DarkBad,
38
)
39
40
private val LightColorScheme = lightColorScheme(
41
    primary = LightAccent,
42
    onPrimary = Color.White,
43
    primaryContainer = LightBand,
44
    onPrimaryContainer = Color.White,
45
    secondary = LightAccent2,
46
    onSecondary = Color.White,
47
    tertiary = LightWarn,
48
    background = LightBackground,
49
    onBackground = LightInk,
50
    surface = LightBackground,
51
    onSurface = LightInk,
52
    surfaceVariant = LightSurfaceSoft,
53
    onSurfaceVariant = LightMute,
54
    surfaceContainerLowest = LightSurface,
55
    surfaceContainerLow = LightSurface,
56
    surfaceContainer = LightSurface,
57
    surfaceContainerHigh = LightSurfaceSoft,
58
    surfaceContainerHighest = LightSurfaceSoft,
59
    outline = LightMute,
60
    outlineVariant = LightLine,
61
    error = LightBad,
62
)
63
64
/** Colours Material has no slot for: an open or closed state. */
65
@Immutable
66
data class StatusColors(val ok: Color, val bad: Color, val warn: Color)
67
68
val LocalStatusColors = staticCompositionLocalOf { StatusColors(LightOk, LightBad, LightWarn) }
69
70
@Composable
71
fun OxygenHubTheme(
72
    darkTheme: Boolean = isSystemInDarkTheme(),
73
    // Wallpaper colours (Android 12, the app's minimum, has them); the
74
    // hub's own palette when turned off.
75
    dynamicColor: Boolean = true,
76
    content: @Composable () -> Unit,
77
) {
78
    val colorScheme: ColorScheme = when {
79
        dynamicColor -> {
80
            val context = LocalContext.current
81
            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
82
        }
83
        darkTheme -> DarkColorScheme
84
        else -> LightColorScheme
85
    }
86
    val status = if (darkTheme) StatusColors(DarkOk, DarkBad, DarkWarn) else StatusColors(LightOk, LightBad, LightWarn)
87
    androidx.compose.runtime.CompositionLocalProvider(LocalStatusColors provides status) {
88
        MaterialTheme(colorScheme = colorScheme, typography = Typography, content = content)
89
    }
90
}