|
@@ -11,7 +11,8 @@ mechanism. No overlays, no root, no kiosk setup.
|
|
|
|
|
|
|
|
<p align="center">
|
|
<p align="center">
|
|
|
<em>Verified on Android 15 and Android 10 tablet emulators at 1280×800 and
|
|
<em>Verified on Android 15 and Android 10 tablet emulators at 1280×800 and
|
|
|
- 1024×600. Runs on a physical Android 17 HyperOS tablet. Landscape only.</em>
|
|
|
|
|
|
|
+ 1024×600. Runs on a physical Android 17 HyperOS tablet. OBD-II UI/parser is
|
|
|
|
|
+ implemented; the ELM327 socket path still needs a real-car test. Landscape only.</em>
|
|
|
</p>
|
|
</p>
|
|
|
|
|
|
|
|
## Screenshots
|
|
## Screenshots
|
|
@@ -25,6 +26,7 @@ Also: [16-button home](docs/screenshots/home-16.png) ·
|
|
|
[All apps](docs/screenshots/all-apps.png) ·
|
|
[All apps](docs/screenshots/all-apps.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) ·
|
|
|
[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) ·
|
|
@@ -39,6 +41,13 @@ Also: [16-button home](docs/screenshots/home-16.png) ·
|
|
|
- **Large clock and date** with the device's 12/24-hour preference.
|
|
- **Large clock and date** with the device's 12/24-hour preference.
|
|
|
- **Battery, charging and Wi-Fi** status, with one switch to hide the battery
|
|
- **Battery, charging and Wi-Fi** status, with one switch to hide the battery
|
|
|
level and charging bolt.
|
|
level and charging bolt.
|
|
|
|
|
+- **OBD-II car data** — optional Bluetooth Classic ELM327 adapter. Shows digital
|
|
|
|
|
+ speed, a throttle bar and rolling 5 km MAF economy, plus ambient temperature
|
|
|
|
|
+ when the adapter provides it.
|
|
|
|
|
+- **Location temperature fallback** — if OBD has no ambient value, an optional
|
|
|
|
|
+ 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
|
|
|
|
|
+ weather, and turns red below 3°C. No network/selection means no row.
|
|
|
- **Media volume** — ring, slider, step and mute controls. While CarDash is in
|
|
- **Media volume** — ring, slider, step and mute controls. While CarDash is in
|
|
|
front, the hardware volume keys are routed to the same media stream, so the
|
|
front, the hardware volume keys are routed to the same media stream, so the
|
|
|
dashboard and the keys always agree. This is the phone's media stream, not a
|
|
dashboard and the keys always agree. This is the phone's media stream, not a
|
|
@@ -71,9 +80,10 @@ Also: [16-button home](docs/screenshots/home-16.png) ·
|
|
|
- **Optional PIN** — four digits, stored as a salted PBKDF2 hash in
|
|
- **Optional PIN** — four digits, stored as a salted PBKDF2 hash in
|
|
|
Keystore-backed storage. It is requested **only when the launcher process
|
|
Keystore-backed storage. It is requested **only when the launcher process
|
|
|
cold-starts**, never when returning from an app.
|
|
cold-starts**, never when returning from an app.
|
|
|
-- **Standard Android home role** — no special overlays or permissions.
|
|
|
|
|
|
|
+- **Standard Android home role** — no overlay, kiosk or root.
|
|
|
- **Android 10+**, landscape-only, tablet-first (verified at 1280×800).
|
|
- **Android 10+**, landscape-only, tablet-first (verified at 1280×800).
|
|
|
-- No network permission, no accounts, no telemetry, no T&C screen.
|
|
|
|
|
|
|
+- No accounts, no telemetry, no T&C screen. Network access is used only for the
|
|
|
|
|
+ optional Open-Meteo temperature fallback.
|
|
|
|
|
|
|
|
## Requirements
|
|
## Requirements
|
|
|
|
|
|
|
@@ -83,6 +93,8 @@ Also: [16-button home](docs/screenshots/home-16.png) ·
|
|
|
- Android 10 (API 29) or newer device/emulator
|
|
- Android 10 (API 29) or newer device/emulator
|
|
|
- A landscape tablet or an emulator; the app locks itself to landscape
|
|
- A landscape tablet or an emulator; the app locks itself to landscape
|
|
|
- The prepared tablet AVDs use the **host GPU**; a working GPU driver is recommended
|
|
- The prepared tablet AVDs use the **host GPU**; a working GPU driver is recommended
|
|
|
|
|
+- Optional: a Bluetooth Classic ELM327 adapter already paired in Android
|
|
|
|
|
+- Optional: location access for the Open-Meteo temperature fallback
|
|
|
|
|
|
|
|
The Android application ID is `com.wasp.cardash_launcher`. Android package
|
|
The Android application ID is `com.wasp.cardash_launcher`. Android package
|
|
|
segments cannot contain hyphens, so the requested `com.wasp.cardash-launcher`
|
|
segments cannot contain hyphens, so the requested `com.wasp.cardash-launcher`
|
|
@@ -145,6 +157,9 @@ first run shows a one-time tip pointing to this setting.
|
|
|
| Settings → Home buttons switches | Show or hide Navigation, Music, Radio |
|
|
| Settings → Home buttons switches | Show or hide Navigation, Music, Radio |
|
|
|
| Long-press an app in All Apps | Add it to Home (up to 16 buttons) |
|
|
| Long-press an app in All Apps | Add it to Home (up to 16 buttons) |
|
|
|
| Long-press an added app on Home | Rename, Change icon or Remove |
|
|
| Long-press an added app on Home | Rename, Change icon or Remove |
|
|
|
|
|
+| Settings → Car data | Pick a paired ELM327 or None |
|
|
|
|
|
+| Settings → Car data → Location temperature | Enable GPS weather fallback |
|
|
|
|
|
+| Temperature row | OBD ambient, or location weather when OBD has none |
|
|
|
| Settings | Theme, accent, battery, home buttons, default-home role, PIN |
|
|
| Settings | Theme, accent, 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 |
|
|
@@ -168,6 +183,13 @@ the app resumes.
|
|
|
- Assign the app for each slot; Settings and All apps are fixed and last.
|
|
- Assign the app for each slot; Settings and All apps are fixed and last.
|
|
|
- Home role status and shortcut to the system prompt.
|
|
- Home role status and shortcut to the system prompt.
|
|
|
|
|
|
|
|
|
|
+**Car data**
|
|
|
|
|
+- OBD-II adapter dropdown: None plus paired Bluetooth Classic devices.
|
|
|
|
|
+- Connection status and a Find/Allow action for Bluetooth permission.
|
|
|
|
|
+- Location temperature toggle: “Show temperature from current location if no
|
|
|
|
|
+ OBD-II connected.” Enabling it asks for location permission.
|
|
|
|
|
+- Read-only note: CarDash never writes to the ECU.
|
|
|
|
|
+
|
|
|
**Security**
|
|
**Security**
|
|
|
- Set, change or remove a four-digit PIN.
|
|
- Set, change or remove a four-digit PIN.
|
|
|
- The PIN is requested only on a cold start. It does not re-lock when switching
|
|
- The PIN is requested only on a cold start. It does not re-lock when switching
|
|
@@ -184,22 +206,26 @@ lib/
|
|
|
core/ design tokens, theme controller, icons, shared widgets
|
|
core/ design tokens, theme controller, icons, shared widgets
|
|
|
data/ models, platform services, SettingsRepository (single source of truth)
|
|
data/ models, platform services, SettingsRepository (single source of truth)
|
|
|
features/
|
|
features/
|
|
|
- home/ home page, shortcut grid, volume card, controllers
|
|
|
|
|
|
|
+ home/ home page, shortcut grid, volume card, OBD/weather controllers
|
|
|
apps/ All Apps, app-picker sheet
|
|
apps/ All Apps, app-picker sheet
|
|
|
- settings/ General + Security
|
|
|
|
|
|
|
+ settings/ General, Car data + Security
|
|
|
lock/ PIN pad, cold-start lock screen
|
|
lock/ PIN pad, cold-start lock screen
|
|
|
-android/... MainActivity, LauncherBridge, SystemBridge (Kotlin)
|
|
|
|
|
|
|
+android/... MainActivity, LauncherBridge, SystemBridge, TelemetryBridge, ObdService
|
|
|
tool/ emulator, install, check scripts
|
|
tool/ emulator, install, check scripts
|
|
|
docs/ implementation plan, design notes
|
|
docs/ implementation plan, design notes
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-- Flutter owns all UI. Kotlin only exposes package enumeration/launching, the
|
|
|
|
|
- HOME role, battery/Wi-Fi and media volume over two `MethodChannel`s.
|
|
|
|
|
|
|
+- 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.
|
|
|
|
|
+- The OBD layer is read-only, Bluetooth Classic SPP, bonded devices only. A
|
|
|
|
|
+ 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
|
|
|
`ChangeNotifier`s injected with `provider`.
|
|
`ChangeNotifier`s injected with `provider`.
|
|
|
- External apps are separate activities; Android has no public API to embed
|
|
- External apps are separate activities; Android has no public API to embed
|
|
|
them inside the launcher. This app deliberately accepts full-screen launching
|
|
them inside the launcher. This app deliberately accepts full-screen launching
|
|
|
for maximum compatibility.
|
|
for maximum compatibility.
|
|
|
|
|
+- Full OBD/weather design and hardware notes: [docs/OBD_TEMPERATURE.md](docs/OBD_TEMPERATURE.md).
|
|
|
|
|
|
|
|
## Testing
|
|
## Testing
|
|
|
|
|
|
|
@@ -209,15 +235,16 @@ flutter test
|
|
|
./tool/check.sh
|
|
./tool/check.sh
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-The 23 tests cover PIN hashing/persistence, settings persistence, theme and
|
|
|
|
|
-accent resolution, battery visibility, first-run state, slot visibility, pinned
|
|
|
|
|
-apps, custom labels/icons, the 16-button cap, the dense shortcut grid and the
|
|
|
|
|
-equalizer animation. Native package enumeration, system/user app flags, the HOME
|
|
|
|
|
-role, volume, app launching and PIN flows were verified on API 35 and API 29
|
|
|
|
|
-emulators, including the release APK. The home-button, pinning, menu,
|
|
|
|
|
-custom-icon, user-icon and keep-awake flows were checked at 1280×800 and
|
|
|
|
|
-1024×600. Release 0.4.0 is installed on the emulator and the physical Android 17
|
|
|
|
|
-HyperOS tablet.
|
|
|
|
|
|
|
+The 30 tests cover PIN hashing/persistence, settings persistence, theme/accent,
|
|
|
|
|
+dark accent tinting, battery visibility, first-run state, slot visibility,
|
|
|
|
|
+pinned apps, custom labels/icons, the 16-button cap, the dense shortcut grid,
|
|
|
|
|
+the equalizer animation, OBD economy and the OBD card. Native package
|
|
|
|
|
+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
|
|
|
|
|
+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.6.0 is installed on the emulator and the physical Android 17 HyperOS tablet.
|
|
|
|
|
|
|
|
## Troubleshooting the emulator
|
|
## Troubleshooting the emulator
|
|
|
|
|
|
|
@@ -244,6 +271,8 @@ Android 15 AVD is left running headlessly after development; use
|
|
|
Apps show an original app icon by default; the predefined slot buttons,
|
|
Apps show an original app icon by default; the predefined slot buttons,
|
|
|
Settings and All apps stay stylized. A pinned icon can be replaced with the
|
|
Settings and All apps stay stylized. A pinned icon can be replaced with the
|
|
|
Default app icon or the 29 stylized choices.
|
|
Default app icon or the 29 stylized choices.
|
|
|
|
|
+- **Accent-tinted dark theme** — dark canvas, surfaces and borders blend toward
|
|
|
|
|
+ the selected accent, so Blue no longer shows a green base.
|
|
|
- **Media equalizer** reacts to system media activity, not a per-app media
|
|
- **Media equalizer** reacts to system media activity, not a per-app media
|
|
|
session. Android does not expose the playing package to a normal launcher
|
|
session. Android does not expose the playing package to a normal launcher
|
|
|
without notification access; adding that permission is deliberately out of
|
|
without notification access; adding that permission is deliberately out of
|
|
@@ -260,11 +289,19 @@ 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.
|
|
|
- **No global play/pause control.** Volume is on the home screen; playback
|
|
- **No global play/pause control.** Volume is on the home screen; playback
|
|
|
buttons live in the media app itself.
|
|
buttons live in the media app itself.
|
|
|
-- **No weather, Bluetooth, calls or climate** in this version.
|
|
|
|
|
|
|
+- **OBD-II is a subset**: Bluetooth Classic SPP only, paired devices only,
|
|
|
|
|
+ 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.
|
|
|
|
|
+- **Weather fallback** uses Open-Meteo and the device location. It requires
|
|
|
|
|
+ location permission and network access; if either is unavailable, the
|
|
|
|
|
+ temperature row is hidden. OBD ambient wins whenever present.
|
|
|
|
|
+- **Location data is not stored.** Only the selected adapter address and the
|
|
|
|
|
+ weather toggle are persisted.
|
|
|
- **`QUERY_ALL_PACKAGES`** is used to list all launchable apps. It is reasonable
|
|
- **`QUERY_ALL_PACKAGES`** is used to list all launchable apps. It is reasonable
|
|
|
for a launcher but requires a Play policy declaration if the app is ever
|
|
for a launcher but requires a Play policy declaration if the app is ever
|
|
|
distributed; this is a local/sideload build for now.
|
|
distributed; this is a local/sideload build for now.
|
|
|
-- **No internet permission.** The app does not fetch maps, weather or updates.
|
|
|
|
|
|
|
+- **Network access** is only for the optional Open-Meteo temperature fallback;
|
|
|
|
|
+ there are no accounts, ads, telemetry or update checks.
|
|
|
- The launcher cannot replace Android's lock screen. The PIN does not protect a
|
|
- The launcher cannot replace Android's lock screen. The PIN does not protect a
|
|
|
running session, by design.
|
|
running session, by design.
|
|
|
|
|
|
|
@@ -281,6 +318,7 @@ numerals and quiet line icons. It is not a copy of that UI.
|
|
|
## Roadmap
|
|
## Roadmap
|
|
|
|
|
|
|
|
- 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).
|
|
|
- Exact per-app media detection via notification access, if desired.
|
|
- 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.
|