Files

2.3 KiB
Raw Permalink Blame History

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.