2.3 KiB
Themes
A theme is a Palette (ui/Theme.kt): a dark background scale (background, surface,
surfaceVariant, line, line2), two text colours, and the accent: primary / signal
(flat accent, also Material's primary), primary2 (the darker or second accent) and
onPrimary. PrimaryButton and the launch flood already draw a gradient from primary to
primary2. The choice is stored as an id (SessionPrefs.theme) and picked in Setup › Launcher.
Gradient theme
Themes.GRADIENT is the one theme whose colours the person picks: a primary and a secondary,
kept in SessionPrefs.gradientColors and in Themes.gradientColors, a Compose state, so a change
restyles the whole app at once. App.onCreate loads the saved colours; code outside a composition
uses Themes.current(context).
ThemeColors.palette builds the full palette from the two colours: primary becomes
primary / signal, secondary becomes primary2, the background scale is a dark neutral tinted with
the primary's hue (plain grey for a grey primary), and onPrimary is dark or white by the
luminance of the pair. A colour too dark to show on the dark background is lifted
(ThemeColors.readable) rather than refused.
Setup shows Primary and Secondary under the theme when Gradient is chosen, each a small colour
square. It opens ColorPickerDialog: a wheel (hue and saturation, touch), hue / saturation /
brightness sliders (they work with a controller) and a hex box, with the old and new colour side by
side. OK applies it.
Inner Gamer theme
Themes.INNER_GAMER is an RGB theme: the accent walks round the colour wheel. It sits just above
Gradient in the list, and Setup shows a Speed slider (1 to 10, SessionPrefs.rgbSpeed) under the
theme while it is chosen.
Themes.innerGamer(hue) builds the palette for one hue through ThemeColors.palette, so button text
keeps the same contrast along the gradient at every hue. DroidDeckTheme runs one
rememberInfiniteTransition while Inner Gamer is chosen, so the system's animation clock drives it.
Compose applies Android's animator scale to it, and the colour holds still when animations are off
in the app (Motion.scale) or in Android's own settings. The hue is written to Themes.rgbHue in 3° steps, which restyles the
app only when the colour visibly moves; a slow cycle costs few recompositions.