App 2.35.2: a round full-screen button; THEMES.md with every Overview style

The full-screen button's disc was an oval (an even inset in a 64 x 72 dp
area); the area is now a square 72 dp, pulled into the panel's padding
so the logo keeps its line. THEMES.md shows the twelve Overview styles,
each with and without the navigation (emulator, sample values), with
what inspired each; linked from README.md and AGENTS.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LhzAVaUyqcw5PkGjz4mWW6
This commit is contained in:
2026-10-25 21:17:23 +01:00
co-authored by Claude Opus 5.5
parent ee66e2f37f
commit 9ada281a50
32 changed files with 172 additions and 7 deletions
+1
View File
@@ -137,6 +137,7 @@ cd server && go vet ./... && go test ./... && govulncheck ./...
|---|---|
| `SPECS.md` | journal: architecture, status, signals the car lacks, to-dos, dated done-log |
| `README.md` | user-facing overview, install, setup, config file |
| `THEMES.md` | the Overview styles: two screenshots each (`screenshots/themes/`, sample values) and what inspired them |
| `OTA.md` | releases, the updater's checks, USB install |
| `FIRMWARE.md` | the head unit, firmware generations, display |
| `server/README.md`, `k8s/README.md` | API, configuration, deployment |
+11 -1
View File
@@ -26,6 +26,7 @@ APIs.
## Contents
- [Screenshots](#screenshots)
- [Overview styles](THEMES.md) (separate page)
- [How it fits together](#how-it-fits-together)
- [The app](#the-app)
- [Install on the car](#install-on-the-car)
@@ -38,6 +39,14 @@ APIs.
## Screenshots
**Overview styles:** the Overview comes in twelve looks, from an 80s fluorescent display to a
starship console and a watch face. [THEMES.md](THEMES.md) shows each one, with and without the
navigation, and what inspired it.
<p align="center">
<a href="THEMES.md"><img src="screenshots/themes/retro.png" width="900" alt="The Retro Overview style in full screen: turquoise seven-segment digits for speed, charge, range and usage, amber labels"></a>
</p>
Version 2.18.1 in the car's app window (1778×640 dp next to the MG4's own sidebar), full screen,
on the Android 9 emulator. There is no vehicle there, so every value shows as a dash. Every tab
fits the window without scrolling.
@@ -79,7 +88,7 @@ with the server using a token of its own, obtained by pairing with a phone (belo
| Tab | What it shows |
|---|---|
| **Overview** | Battery, range, power and speed; range, usage and energy since start; 5-minute averages of range, usage, power and speed; vehicle info (odometer, climate setpoint) and tyre pressures. Read five times a second. Looks to choose from in Settings → Overview style: Tiles, Gauges, Cockpit, Retro, Futuristic, Sci-fi, Cartoon, MG, Minimal, Terminal, Nixie tubes and Chronograph. A style with its own colours (Sci-fi, Cartoon, Nixie tubes, and Retro and Terminal with "Original") colours the whole app to match, e.g. turquoise for Retro. The small button next to the MG4 logo in the navigation hides the navigation for a full-width Overview; swipe in from the left edge (a faint handle marks it) to bring it back; with Settings → Full screen off, the car's own sidebar sits at that edge, so tap the small tab at the left edge (›) instead. Pages change only by the navigation, not by swiping sideways |
| **Overview** | Battery, range, power and speed; range, usage and energy since start; 5-minute averages of range, usage, power and speed; vehicle info (odometer, climate setpoint) and tyre pressures. Read five times a second. Looks to choose from in Settings → Overview style: Tiles, Gauges, Cockpit, Retro, Futuristic, Sci-fi, Cartoon, MG, Minimal, Terminal, Nixie tubes and Chronograph ([THEMES.md](THEMES.md) shows them all). A style with its own colours (Sci-fi, Cartoon, Nixie tubes, and Retro and Terminal with "Original") colours the whole app to match, e.g. turquoise for Retro. The small button next to the MG4 logo in the navigation hides the navigation for a full-width Overview; swipe in from the left edge (a faint handle marks it) to bring it back; with Settings → Full screen off, the car's own sidebar sits at that edge, so tap the small tab at the left edge (›) instead. Pages change only by the navigation, not by swiping sideways |
| **Consumption** | Lifetime, last 7 and 30 days, Trip A and B (distance, energy, average consumption and speed, SOC change), and a daily log of the last four months |
| **Charging** | The current session (SOC, voltage, current, power, energy into the battery and from the grid, time, cost) and its SOC/power curve |
| **Live data** | Live data on/off, ABRP credentials for sending directly from the car, upload frequency |
@@ -246,6 +255,7 @@ flake.nix dev shell, build-car, publish-car, car-emulator
| Document | What it covers |
|---|---|
| [THEMES.md](THEMES.md) | The Overview styles: screenshots and what inspired each |
| [SPECS.md](SPECS.md) | Journal of this fork: architecture, status, to-dos, done log |
| [OTA.md](OTA.md) | Publishing releases, the updater's checks, USB install |
| [FIRMWARE.md](FIRMWARE.md) | MG4 firmware generations and how the app reads each |
+8
View File
@@ -138,6 +138,14 @@ tyre pressures, GPS (lat, lon, elevation, heading) and the is_* flags. It does *
confirmed car facts, app structure, UI conventions, build/test/ship, documents. It replaces
upstream's EVABRPUploader text. The test emulator is now in the flake: `nix run .#car-emulator`
(Android 9 AOSP at 1920×720, 160 dpi; the car build installs as the system user — checked).
- 2026-10-25 — App 2.35.2: the full-screen button is round. Its disc was an even inset in a
64 × 72 dp (narrow: 64 × 76) area, so an oval; the area is now a square 72 × 72 dp (inset
18 dp, a 36 dp disc), pulled 8 dp into the panel's padding in the wide layout so "MG4" keeps
its line. **THEMES.md**: the twelve Overview styles, each with and without the navigation
(`screenshots/themes/`, 1920 × 720 from the emulator with sample values from a throwaway build,
never committed), with what inspired each and how it takes colour; linked from README.md
(Screenshots, Contents, Project documents) and AGENTS.md. Emulator: the round button, the
header with "MG4" on one line. Not tried on the car.
- 2026-10-25 — App 2.35.1: **Aviation removed** (owner's choice: `AviationView`, its palette and
string; a stored "AVIATION" opens Tiles). The Sci-fi palette for the app is now the lilac of
the console frame's lower elbow (`scifi_lilac` #CC99CC) instead of the orange of the upper one.
+145
View File
@@ -0,0 +1,145 @@
# Overview styles
The Overview can look twelve ways: pick one under **Settings → Overview style**. Every style shows
the same readings (battery, range, power, speed, gear, usage, trip, climate, odometer, time) and
shows "—" for anything the car did not answer, never a made-up zero.
Each style has two screenshots: with the navigation, and in the Overview's own full screen (the
button beside the MG4 logo; swipe in from the left edge to come back). They come from the test
emulator at the car's resolution with **sample values** (87 km/h in D, 76 %, 18.4 kW), since the
emulator has no car; on the car the values are live.
**Colours.** Most styles are drawn in the accent colour you pick from the MG4 paints (Settings →
Accent colour; shown here in Dynamic Red). Retro and Terminal can also show their original
colours, and Sci-fi, Cartoon and Nixie tubes always do; while one of those is shown, the whole app
(navigation, buttons, switches) takes on its colours too.
| Style | Look | Colours |
|---|---|---|
| [Tiles](#tiles) | the app's own cards | accent |
| [Gauges](#gauges) | analogue needles | accent |
| [Cockpit](#cockpit) | segment rings, power trace | accent |
| [Retro](#retro) | 80s fluorescent display | original or accent |
| [Futuristic](#futuristic) | holographic HUD, energy flow | accent |
| [Sci-fi](#sci-fi) | starship console | own |
| [Cartoon](#cartoon) | comic panels | own |
| [MG](#mg) | octagonal MG dials | accent |
| [Minimal](#minimal) | one big number | accent |
| [Terminal](#terminal) | green-screen shell | original or accent |
| [Nixie tubes](#nixie-tubes) | glowing glass tubes | own |
| [Chronograph](#chronograph) | a watch face | accent |
## Tiles
The app's original look, from the design it was forked from: glass cards on OLED black, one tile
per value, with the averages over the last five minutes and since the start, vehicle info (with
the lease allowance) and the tyre pressures on a little top view of the car. The most
information on one screen.
![Tiles with the navigation](screenshots/themes/tiles-panel.png)
![Tiles, full screen](screenshots/themes/tiles.png)
## Gauges
Three round instruments with needles, like a classic analogue dashboard: power on the left,
speed in the middle, charge on the right (E to F), and a strip below with gear, climate, time,
usage and a small battery. The needles glide to new values instead of jumping.
![Gauges with the navigation](screenshots/themes/gauges-panel.png)
![Gauges, full screen](screenshots/themes/gauges.png)
## Cockpit
After the digital clusters of modern EVs: rings of lit segments for battery, power and usage.
The power ring in the middle is centred on zero (regeneration lights up anticlockwise in green)
and carries the speed and gear inside it; along the bottom, a strip with the power of the last
two minutes.
![Cockpit with the navigation](screenshots/themes/cockpit-panel.png)
![Cockpit, full screen](screenshots/themes/cockpit.png)
## Retro
An 80s digital dashboard: a vacuum fluorescent display behind smoked glass, as in the
digital-instrument cars of that decade. Slanted seven-segment digits with the unlit segments
faintly visible, bar graphs for charge and power, amber labels and a lit P R N D. In its original
turquoise (shown) or in the accent colour.
![Retro with the navigation](screenshots/themes/retro-panel.png)
![Retro, full screen](screenshots/themes/retro.png)
## Futuristic
A holographic head-up display in hairlines: the battery as a capsule on the left, the speed in a
ring of dashes that turns with it on the right, and between them an energy channel in which
particles flow from the battery to the wheels while driving, and back in green while
regenerating, faster with more power.
![Futuristic with the navigation](screenshots/themes/futuristic-panel.png)
![Futuristic, full screen](screenshots/themes/futuristic.png)
## Sci-fi
A starship console, after the look of the computer screens in 90s science-fiction TV: rounded
"elbow" frames in orange and lilac, pill-shaped labels, condensed capitals and blocky bar graphs
on black. Below 20 % charge the frames turn red: red alert. The app takes on the lilac of the
lower frame.
![Sci-fi with the navigation](screenshots/themes/scifi-panel.png)
![Sci-fi, full screen](screenshots/themes/scifi.png)
## Cartoon
Comic panels in flat colours with thick ink outlines on a night-blue page: a battery with a face
(happy, unsure, then worried and sweating as it empties), a chunky speedometer whose needle
wobbles into place, and the "zap-o-meter" for power with a sound word: PURR, VROOM, ZOOM! or
RECHARGE! while regenerating.
![Cartoon with the navigation](screenshots/themes/cartoon-panel.png)
![Cartoon, full screen](screenshots/themes/cartoon.png)
## MG
After the classic MG dashboards, whose dials sat in octagonal bezels: three octagonal dials with
chrome rims and cream scales (battery, speed, power), needles in the accent colour, and a line of
odometer, trip, usage, climate and time separated by small octagons.
![MG with the navigation](screenshots/themes/mg-panel.png)
![MG, full screen](screenshots/themes/mg.png)
## Minimal
One number and almost nothing else: the speed, very large and thin, the gear above it, power as a
short line growing from the centre, and the battery as a hairline along the bottom edge. For calm
driving.
![Minimal with the navigation](screenshots/themes/minimal-panel.png)
![Minimal, full screen](screenshots/themes/minimal.png)
## Terminal
As if a shell printed the car's state: `watch -n 0.2 vehicle-status` on a green-phosphor screen
with faint scan lines, each value on a row with an ASCII bar, the gear as `[D]`, and a prompt with
a blinking cursor. A low battery turns its row amber. In green (shown) or in the accent colour.
![Terminal with the navigation](screenshots/themes/terminal-panel.png)
![Terminal, full screen](screenshots/themes/terminal.png)
## Nixie tubes
The glow of nixie tubes, the neon number displays of 50s to 70s lab instruments: orange digits in
glass tubes, the unlit numerals faintly behind the lit one, on a dark walnut panel with brass name
plates. Speed, gear and battery on top; power, range, usage and the time below.
![Nixie tubes with the navigation](screenshots/themes/nixie-panel.png)
![Nixie tubes, full screen](screenshots/themes/nixie.png)
## Chronograph
A watch face, after a chronograph wristwatch: a deep-blue dial with a steel bezel carrying the
speed scale, the long main hand for the speed, sub-dials for battery, power and usage, and the
gear in a date window. Engraved columns either side carry range, trip, time, climate and
odometer.
![Chronograph with the navigation](screenshots/themes/chronograph-panel.png)
![Chronograph, full screen](screenshots/themes/chronograph.png)
+2 -2
View File
@@ -34,8 +34,8 @@ android {
applicationId "com.stinnesbeck.nilsmg4"
minSdk 27
targetSdk 36
versionCode 136
versionName "2.35.1"
versionCode 137
versionName "2.35.2"
// Nothing about the server ships in the APK: its URL and ingest token are entered in
// the app's Server tab (ServerConfig), and the database is only reachable by the server.
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- The full-screen button in the navigation: a small dark disc inside its touch area. -->
<inset xmlns:android="http://schemas.android.com/apk/res/android" android:inset="16dp">
<!-- The full-screen button in the navigation: a small dark disc inside its square 72 dp touch
area (square, or the oval is not a circle). -->
<inset xmlns:android="http://schemas.android.com/apk/res/android" android:inset="18dp">
<shape android:shape="oval">
<solid android:color="#99121212" />
<stroke android:width="1dp" android:color="@color/ev_outline" />
@@ -10,7 +10,7 @@
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/design_brand" android:textAppearance="@style/Text.EV.Hero" android:textColor="?attr/evAccent" android:paddingStart="14dp" android:paddingTop="8dp" />
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/design_brand_caption" android:textAppearance="@style/Text.EV.Secondary" android:paddingStart="14dp" />
</LinearLayout>
<ImageButton android:id="@+id/overview_fullscreen" android:layout_width="64dp" android:layout_height="72dp" android:background="@drawable/bg_fullscreen_button" android:src="@drawable/ic_fullscreen" android:padding="22dp" android:scaleType="fitCenter" android:contentDescription="@string/overview_fullscreen_enter" />
<ImageButton android:id="@+id/overview_fullscreen" android:layout_width="72dp" android:layout_height="72dp" android:layout_marginEnd="-8dp" android:background="@drawable/bg_fullscreen_button" android:src="@drawable/ic_fullscreen" android:padding="26dp" android:scaleType="fitCenter" android:contentDescription="@string/overview_fullscreen_enter" />
</LinearLayout>
<com.google.android.material.button.MaterialButton android:id="@+id/tabVehicle" style="@style/Widget.EV.NavTab" android:layout_width="match_parent" android:layout_height="64dp" android:layout_marginBottom="6dp" android:text="@string/tab_vehicle" app:icon="@drawable/ic_tab_vehicle" />
<com.google.android.material.button.MaterialButton android:id="@+id/tabConsumption" style="@style/Widget.EV.NavTab" android:layout_width="match_parent" android:layout_height="64dp" android:layout_marginBottom="6dp" android:text="@string/tab_consumption" app:icon="@drawable/ic_tab_vehicle" />
+1 -1
View File
@@ -17,7 +17,7 @@
<com.google.android.material.button.MaterialButton android:id="@+id/tabServer" style="@style/Widget.EV.NavTab.Compact" android:layout_width="0dp" android:layout_height="76dp" android:layout_weight="1" android:text="@string/tab_server" app:icon="@drawable/ic_tab_server"/>
<com.google.android.material.button.MaterialButton android:id="@+id/tabSettings" style="@style/Widget.EV.NavTab.Compact" android:layout_width="0dp" android:layout_height="76dp" android:layout_weight="1" android:text="@string/tab_settings" app:icon="@drawable/ic_tab_service"/>
<com.google.android.material.button.MaterialButton android:id="@+id/tabLog" style="@style/Widget.EV.NavTab.Compact" android:layout_width="0dp" android:layout_height="76dp" android:layout_weight="1" android:text="@string/tab_log" app:icon="@drawable/ic_tab_log"/>
<ImageButton android:id="@+id/overview_fullscreen" android:layout_width="64dp" android:layout_height="76dp" android:background="@drawable/bg_fullscreen_button" android:src="@drawable/ic_fullscreen" android:padding="22dp" android:scaleType="fitCenter" android:contentDescription="@string/overview_fullscreen_enter"/>
<ImageButton android:id="@+id/overview_fullscreen" android:layout_width="72dp" android:layout_height="72dp" android:layout_gravity="center_vertical" android:background="@drawable/bg_fullscreen_button" android:src="@drawable/ic_fullscreen" android:padding="26dp" android:scaleType="fitCenter" android:contentDescription="@string/overview_fullscreen_enter"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB