|
@@ -3,7 +3,7 @@
|
|
|
A calm, configurable Android car dashboard launcher, built with Flutter.
|
|
A calm, configurable Android car dashboard launcher, built with Flutter.
|
|
|
|
|
|
|
|
CarDash replaces the tablet home screen with one landscape page: a large clock,
|
|
CarDash replaces the tablet home screen with one landscape page: a large clock,
|
|
|
-battery and Wi-Fi status, the main media-volume control, and up to 16 buttons —
|
|
|
|
|
|
|
+battery and Wi-Fi status, a now-playing media card, and up to 16 buttons —
|
|
|
**Navigation**, **Music**, **Radio**, **Settings**, **All apps**, plus any apps
|
|
**Navigation**, **Music**, **Radio**, **Settings**, **All apps**, plus any apps
|
|
|
you pin from All Apps. The first three can be shown, hidden and assigned to
|
|
you pin from All Apps. The first three can be shown, hidden and assigned to
|
|
|
installed apps. External apps open full-screen using the normal Android launcher
|
|
installed apps. External apps open full-screen using the normal Android launcher
|
|
@@ -27,6 +27,8 @@ Also: [Home with top-right Settings](docs/screenshots/home-16.png) ·
|
|
|
[app picker](docs/screenshots/app-picker.png) ·
|
|
[app picker](docs/screenshots/app-picker.png) ·
|
|
|
[Settings · accent & buttons](docs/screenshots/settings-buttons.png) ·
|
|
[Settings · accent & buttons](docs/screenshots/settings-buttons.png) ·
|
|
|
[Settings · Car data](docs/screenshots/settings-car-data.png) ·
|
|
[Settings · Car data](docs/screenshots/settings-car-data.png) ·
|
|
|
|
|
+[Settings · Media access](docs/screenshots/settings-media.png) ·
|
|
|
|
|
+[Now playing](docs/screenshots/home-now-playing.png) ·
|
|
|
[Blue accent](docs/screenshots/settings-blue-accent.png) ·
|
|
[Blue accent](docs/screenshots/settings-blue-accent.png) ·
|
|
|
[user-app icon on Home](docs/screenshots/home-user-icon.png) ·
|
|
[user-app icon on Home](docs/screenshots/home-user-icon.png) ·
|
|
|
[pinned-app menu](docs/screenshots/home-app-menu.png) ·
|
|
[pinned-app menu](docs/screenshots/home-app-menu.png) ·
|
|
@@ -48,10 +50,13 @@ Also: [Home with top-right Settings](docs/screenshots/home-16.png) ·
|
|
|
Settings toggle fetches the current temperature from Open-Meteo using the
|
|
Settings toggle fetches the current temperature from Open-Meteo using the
|
|
|
device location. The row reads `Outside, 7°C` for OBD or `Sofia, 7°C` for
|
|
device location. The row reads `Outside, 7°C` for OBD or `Sofia, 7°C` for
|
|
|
weather, and turns red below 3°C. No network/selection means no row.
|
|
weather, and turns red below 3°C. No network/selection means no row.
|
|
|
-- **Media volume and playback** — the circled ring is now a play/pause button;
|
|
|
|
|
- slider, step and mute controls remain. If audio is paused it resumes, and if
|
|
|
|
|
- nothing is playing it opens the assigned Music app. While CarDash is in front,
|
|
|
|
|
- the hardware volume keys are routed to the same media stream.
|
|
|
|
|
|
|
+- **Now-playing media card** — the circular ring shows song progress around a
|
|
|
|
|
+ play/pause button. The song title and artist scroll along the bottom; paused
|
|
|
|
|
+ audio stops the scroll and holds its position. When nothing is playing it
|
|
|
|
|
+ reads **Nothing playing**. The volume slider, −/+, and Mute pill remain.
|
|
|
|
|
+- **Now-playing access** — Settings → Media grants Android notification access,
|
|
|
|
|
+ used only to read the active media session’s title, duration and position.
|
|
|
|
|
+ CarDash never reads or stores notification content.
|
|
|
- **Configurable home buttons** — switches in Settings show or hide Navigation,
|
|
- **Configurable home buttons** — switches in Settings show or hide Navigation,
|
|
|
Music and Radio. **All apps** is always the last button; **Settings** now sits
|
|
Music and Radio. **All apps** is always the last button; **Settings** now sits
|
|
|
next to Wi-Fi in the top-right status area and is no longer a grid tile.
|
|
next to Wi-Fi in the top-right status area and is no longer a grid tile.
|
|
@@ -160,13 +165,15 @@ first run shows a one-time tip pointing to this setting.
|
|
|
| Settings → Car data | Pick a paired ELM327 or None |
|
|
| Settings → Car data | Pick a paired ELM327 or None |
|
|
|
| Settings → Car data → Location temperature | Enable GPS weather fallback |
|
|
| Settings → Car data → Location temperature | Enable GPS weather fallback |
|
|
|
| Temperature row | OBD ambient, or location weather when OBD has none |
|
|
| Temperature row | OBD ambient, or location weather when OBD has none |
|
|
|
-| Settings | Theme, accent, battery, home buttons, default-home role, PIN |
|
|
|
|
|
|
|
+| Settings | Theme, accent, media access, battery, home buttons, default-home role, PIN |
|
|
|
| All apps | Search every launchable app; tap to open, hold to pin |
|
|
| All apps | Search every launchable app; tap to open, hold to pin |
|
|
|
| Music tile while media is active | Shows the selected app icon + equalizer |
|
|
| Music tile while media is active | Shows the selected app icon + equalizer |
|
|
|
|
|
+| Circular ring | Song progress; tap the centre to play/pause |
|
|
|
|
|
+| Song title at the card bottom | Scrolls only while playing; holds when paused |
|
|
|
| Screen | Stays awake while CarDash is in front |
|
|
| Screen | Stays awake while CarDash is in front |
|
|
|
-| Volume ring / mute | Toggle media mute |
|
|
|
|
|
|
|
+| Mute pill | Toggle media mute |
|
|
|
| Slider or − / + | Set media volume |
|
|
| Slider or − / + | Set media volume |
|
|
|
-| Hardware volume keys | Adjust the dashboard's media volume; the ring follows |
|
|
|
|
|
|
|
+| Hardware volume keys | Adjust the dashboard's media volume; the slider follows |
|
|
|
|
|
|
|
|
The app hides the Android status and navigation bars while CarDash is in the
|
|
The app hides the Android status and navigation bars while CarDash is in the
|
|
|
foreground. Swipe from an edge to reveal them temporarily; they hide again when
|
|
foreground. Swipe from an edge to reveal them temporarily; they hide again when
|
|
@@ -184,6 +191,12 @@ the app resumes.
|
|
|
- Settings is always available from the gear next to Wi-Fi.
|
|
- Settings is always available from the gear next to Wi-Fi.
|
|
|
- Home role status and shortcut to the system prompt.
|
|
- Home role status and shortcut to the system prompt.
|
|
|
|
|
|
|
|
|
|
+**Media**
|
|
|
|
|
+- Notification access for the now-playing title, duration and progress.
|
|
|
|
|
+- Read-only: CarDash does not read notification content.
|
|
|
|
|
+- Without access the ring stays empty and the card shows a generic Playing /
|
|
|
|
|
+ Nothing playing state.
|
|
|
|
|
+
|
|
|
**Car data**
|
|
**Car data**
|
|
|
- OBD-II adapter dropdown: None plus paired Bluetooth Classic devices.
|
|
- OBD-II adapter dropdown: None plus paired Bluetooth Classic devices.
|
|
|
- Connection status and a Find/Allow action for Bluetooth permission.
|
|
- Connection status and a Find/Allow action for Bluetooth permission.
|
|
@@ -217,8 +230,8 @@ docs/ implementation plan, design notes
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
- Flutter owns all UI. Kotlin exposes package enumeration/launching, the HOME
|
|
- Flutter owns all UI. Kotlin exposes package enumeration/launching, the HOME
|
|
|
- role, battery/Wi-Fi, media volume, Bluetooth OBD and one-shot location over
|
|
|
|
|
- method channels.
|
|
|
|
|
|
|
+ role, battery/Wi-Fi, media volume, active media metadata, Bluetooth OBD and
|
|
|
|
|
+ one-shot location over method channels.
|
|
|
- The OBD layer is read-only, Bluetooth Classic SPP, bonded devices only. A
|
|
- The OBD layer is read-only, Bluetooth Classic SPP, bonded devices only. A
|
|
|
worker thread serializes ELM327 requests; Flutter polls the latest snapshot.
|
|
worker thread serializes ELM327 requests; Flutter polls the latest snapshot.
|
|
|
- `SettingsRepository` is the only persistence path. Controllers are
|
|
- `SettingsRepository` is the only persistence path. Controllers are
|
|
@@ -236,17 +249,19 @@ flutter test
|
|
|
./tool/check.sh
|
|
./tool/check.sh
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-The 33 tests cover PIN hashing/persistence, settings persistence, theme/accent,
|
|
|
|
|
|
|
+The 41 tests cover PIN hashing/persistence, settings persistence, theme/accent,
|
|
|
dark accent tinting, battery visibility, first-run state, slot visibility,
|
|
dark accent tinting, battery visibility, first-run state, slot visibility,
|
|
|
pinned apps, custom labels/icons, the 16-button cap, the dense shortcut grid,
|
|
pinned apps, custom labels/icons, the 16-button cap, the dense shortcut grid,
|
|
|
-the equalizer animation, OBD economy, the OBD card, media-key playback and the
|
|
|
|
|
-play/pause ring. Native package
|
|
|
|
|
|
|
+the equalizer animation, OBD economy, the OBD card, media-key playback, media
|
|
|
|
|
+metadata/progress, the marquee and the play/pause ring. Native package
|
|
|
enumeration, the HOME role, volume, app launching and PIN flows were verified on
|
|
enumeration, the HOME role, volume, app launching and PIN flows were verified on
|
|
|
API 35 and API 29 emulators. Location permission, reverse geocoding and the
|
|
API 35 and API 29 emulators. Location permission, reverse geocoding and the
|
|
|
-Open-Meteo fallback were verified live on the API 35 emulator. The OBD hardware
|
|
|
|
|
-path compiles and is covered by the parser/economy design, but no ELM327 adapter
|
|
|
|
|
-is available on this machine; socket behavior still needs a car test. Release
|
|
|
|
|
-0.7.0 is installed on the emulator and the physical Android 17 HyperOS tablet.
|
|
|
|
|
|
|
+Open-Meteo fallback were verified live on the API 35 emulator. Now-playing
|
|
|
|
|
+title, artist, progress and pause/resume were verified against a live Chrome
|
|
|
|
|
+MediaSession. The OBD hardware path compiles and is covered by the parser/economy
|
|
|
|
|
+design, but no ELM327 adapter is available on this machine; socket behavior still
|
|
|
|
|
+needs a car test. Release
|
|
|
|
|
+0.8.0 is installed on the emulator and the physical Android 17 HyperOS tablet.
|
|
|
|
|
|
|
|
## Troubleshooting the emulator
|
|
## Troubleshooting the emulator
|
|
|
|
|
|
|
@@ -276,10 +291,12 @@ Android 15 AVD is left running headlessly after development; use
|
|
|
the 29 stylized choices.
|
|
the 29 stylized choices.
|
|
|
- **Accent-tinted dark theme** — dark canvas, surfaces and borders blend toward
|
|
- **Accent-tinted dark theme** — dark canvas, surfaces and borders blend toward
|
|
|
the selected accent, so Blue no longer shows a green base.
|
|
the selected accent, so Blue no longer shows a green base.
|
|
|
-- **Media equalizer** reacts to system media activity, not a per-app media
|
|
|
|
|
- session. Android does not expose the playing package to a normal launcher
|
|
|
|
|
- without notification access; adding that permission is deliberately out of
|
|
|
|
|
- scope for now.
|
|
|
|
|
|
|
+- **Media equalizer** reacts to system media activity. The now-playing title and
|
|
|
|
|
+ progress use the active Android MediaSession, which requires the special
|
|
|
|
|
+ notification-access grant in Settings → Media.
|
|
|
|
|
+- **Notification access is used only for media metadata.** CarDash does not read
|
|
|
|
|
+ notification text or store track history. Revoke it in Android settings at any
|
|
|
|
|
+ time; the ring and title then fall back to an empty/generic state.
|
|
|
- **Screen-on** applies while CarDash is the foreground window. Android can
|
|
- **Screen-on** applies while CarDash is the foreground window. Android can
|
|
|
still sleep while another app is in front.
|
|
still sleep while another app is in front.
|
|
|
- **Onboarding hint** is anchored to process start and disappears after two
|
|
- **Onboarding hint** is anchored to process start and disappears after two
|
|
@@ -292,8 +309,10 @@ Android 15 AVD is left running headlessly after development; use
|
|
|
theme. Default restores the pinned app's own icon.
|
|
theme. Default restores the pinned app's own icon.
|
|
|
- **Play/pause uses Android media keys.** It resumes a paused session when one
|
|
- **Play/pause uses Android media keys.** It resumes a paused session when one
|
|
|
responds; if nothing is playing, it opens the app assigned to the Music slot
|
|
responds; if nothing is playing, it opens the app assigned to the Music slot
|
|
|
- (or asks you to choose one). Android does not expose a public paused-state API
|
|
|
|
|
- to a normal launcher, so the ring shows Play whenever audio is inactive.
|
|
|
|
|
|
|
+ (or asks you to choose one). The ring shows Play whenever audio is inactive.
|
|
|
|
|
+- **Song progress/title require notification access.** Without it, Android does
|
|
|
|
|
+ not expose MediaSession metadata to a normal launcher; the card still controls
|
|
|
|
|
+ playback and shows Nothing playing or Playing.
|
|
|
- **OBD-II is a subset**: Bluetooth Classic SPP only, paired devices only,
|
|
- **OBD-II is a subset**: Bluetooth Classic SPP only, paired devices only,
|
|
|
read-only. Speed, throttle, MAF economy and ambient temperature are implemented;
|
|
read-only. Speed, throttle, MAF economy and ambient temperature are implemented;
|
|
|
RPM, coolant, voltage, MIL/DTCs, fuel level and BLE/Wi-Fi adapters are not.
|
|
RPM, coolant, voltage, MIL/DTCs, fuel level and BLE/Wi-Fi adapters are not.
|
|
@@ -324,7 +343,6 @@ numerals and quiet line icons. It is not a copy of that UI.
|
|
|
|
|
|
|
|
- Optional compact now-playing control beside the volume card.
|
|
- Optional compact now-playing control beside the volume card.
|
|
|
- Real-car ELM327 soak test (speed/throttle/MAF/ambient).
|
|
- Real-car ELM327 soak test (speed/throttle/MAF/ambient).
|
|
|
-- Exact per-app media detection via notification access, if desired.
|
|
|
|
|
- Release signing configuration.
|
|
- Release signing configuration.
|
|
|
- Real-device soak test on an Android 10 car tablet.
|
|
- Real-device soak test on an Android 10 car tablet.
|
|
|
|
|
|