|
|
@@ -18,7 +18,7 @@ the normal Android launcher mechanism. No overlays, no root, no kiosk setup.
|
|
|
## Download
|
|
|
|
|
|
- [Gogs release page](https://git.krasi.net/kkazakov/car-interface-android/releases) — published releases
|
|
|
-- [cardash-android-1.0.2.apk](releases/cardash-android-1.0.2.apk) — universal Android release
|
|
|
+- [cardash-android-1.0.3.apk](releases/cardash-android-1.0.3.apk) — universal Android release
|
|
|
- SHA-256 and build details: [releases/README.md](releases/README.md)
|
|
|
|
|
|
Gogs limits release attachments to 32 MB, so the 54 MB universal APK is linked
|
|
|
@@ -35,7 +35,6 @@ Also: [Home with top-right Settings](docs/screenshots/home-16.png) ·
|
|
|
[All apps](docs/screenshots/all-apps.png) ·
|
|
|
[app picker](docs/screenshots/app-picker.png) ·
|
|
|
[Settings · accent & buttons](docs/screenshots/settings-buttons.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) ·
|
|
|
[1280×720](docs/screenshots/home-1280x720.png) ·
|
|
|
@@ -63,17 +62,20 @@ live vehicle data.
|
|
|
- **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
|
|
|
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.
|
|
|
-- **GPS speed fallback** — when no OBD adapter is connected and precise location
|
|
|
- is already allowed, show speed from GPS; it reads 0 km/h when stationary.
|
|
|
- CarDash never prompts for this; GPS must be enabled and location previously
|
|
|
- allowed (for example through the weather toggle).
|
|
|
-- **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.
|
|
|
+- **OBD-II car data** — optional Bluetooth Classic ELM327 adapter. A dedicated
|
|
|
+ **OBD-II** Settings card holds the adapter status, paired-device picker and
|
|
|
+ Bluetooth actions. The live card shows speed, a throttle bar and rolling 5 km
|
|
|
+ MAF economy, plus ambient temperature when the adapter provides it.
|
|
|
+- **Speed card with source choice** — Settings → **Speed** shows or hides the
|
|
|
+ speed card and, while an adapter is selected, chooses OBD-II or GPS. GPS is
|
|
|
+ the fallback when OBD speed is off or unavailable; it reads 0 km/h when
|
|
|
+ stationary and never prompts for location by itself.
|
|
|
+- **Temperature row with source choice** — Settings → **Temperature** shows or
|
|
|
+ hides the outside temperature and, while an adapter is selected, chooses
|
|
|
+ OBD-II or GPS + weather. Enabling temperature asks for location permission
|
|
|
+ for the Open-Meteo fallback; if denied, OBD temperature still works. The row
|
|
|
+ reads `Outside, 7°C` for OBD or `Sofia, 7°C` for weather, and turns red below
|
|
|
+ 3°C.
|
|
|
- **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
|
|
|
@@ -109,8 +111,9 @@ live vehicle data.
|
|
|
across the whole interface.
|
|
|
- **Prevent CarDash from sleeping** — a Settings switch, on by default. Turn it off to use the system display timeout.
|
|
|
- **Night mode** — long-press an empty part of the Home background to go black with a very dim centered clock; tap anywhere to return. Long-presses on buttons and cards are unaffected.
|
|
|
-- **A short onboarding hint** — the long-press hint fades away two minutes after
|
|
|
- app start, then stays gone.
|
|
|
+- **A short onboarding hint** — the long-press hint is visible only during the
|
|
|
+ first ten minutes after a fresh installation, then stays gone. Upgraded
|
|
|
+ installs do not see it again.
|
|
|
- **Light / Dark / Automatic** theme. Automatic uses a fixed local-time window
|
|
|
(default 19:00–07:00), editable in Settings.
|
|
|
- **Optional PIN** — four digits, stored as a salted PBKDF2 hash in
|
|
|
@@ -196,11 +199,12 @@ first run shows a one-time tip pointing to this setting.
|
|
|
| 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 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 |
|
|
|
-| No OBD + allowed location + GPS on | Shows GPS speed above the volume card; 0 when stopped |
|
|
|
-| Temperature row | OBD ambient, or location weather when OBD has none |
|
|
|
-| Settings | Theme, accent, media access, battery, home buttons, default-home role, PIN |
|
|
|
+| Settings → OBD-II | Pick a paired ELM327 or None; open Bluetooth settings |
|
|
|
+| Settings → Speed | Show or hide the speed card; choose OBD-II or GPS source |
|
|
|
+| Settings → Temperature | Show or hide the temperature row; choose OBD-II or GPS + weather |
|
|
|
+| Speed card | OBD-II when connected, otherwise GPS; 0 km/h when stopped |
|
|
|
+| Temperature row | OBD ambient, or location weather when OBD is off/unavailable |
|
|
|
+| Settings | Theme, accent, media access, battery, home buttons, OBD/speed/temperature, default-home role, 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 |
|
|
|
| Circular ring | Song progress; tap the centre to play/pause |
|
|
|
@@ -233,14 +237,30 @@ the app resumes.
|
|
|
- Without access the ring stays empty and the card shows a generic Playing /
|
|
|
Nothing playing state.
|
|
|
|
|
|
-**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.
|
|
|
- If Bluetooth is off: **Open Bluetooth settings** to turn it on, then return
|
|
|
and the paired-device list refreshes automatically.
|
|
|
-- 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.
|
|
|
+- Read-only note: CarDash never writes to the ECU. Adapter settings only; speed
|
|
|
+ and temperature choices live in their own cards.
|
|
|
+
|
|
|
+**Speed**
|
|
|
+- One switch shows or hides the speed card on Home.
|
|
|
+- While an OBD-II adapter is selected, **Use OBD-II for speed** selects the
|
|
|
+ source. Off means GPS is used.
|
|
|
+- Without OBD (or with OBD speed unavailable), the GPS fallback is used when
|
|
|
+ precise location is already granted. It never prompts from this path and
|
|
|
+ reads 0 km/h when stationary.
|
|
|
+
|
|
|
+**Temperature**
|
|
|
+- One switch shows or hides the outside-temperature row below the clock.
|
|
|
+- While an OBD-II adapter is selected, **Use OBD-II for temperature** selects
|
|
|
+ the source. Off means GPS + the Open-Meteo weather provider is used.
|
|
|
+- Enabling temperature or choosing the weather source asks for location
|
|
|
+ permission and refreshes every 15 minutes. If permission is denied, OBD
|
|
|
+ temperature still works when available.
|
|
|
+- The row turns red below 3°C and hides when no fresh value exists.
|
|
|
|
|
|
**Updates**
|
|
|
- Non-blocking check against the public Gogs releases.
|
|
|
@@ -267,7 +287,7 @@ lib/
|
|
|
features/
|
|
|
home/ home page, shortcut grid, volume card, OBD/weather controllers
|
|
|
apps/ All Apps, app-picker sheet
|
|
|
- settings/ General, Car data + Security
|
|
|
+ settings/ General, OBD-II, Speed, Temperature + Security
|
|
|
lock/ PIN pad, cold-start lock screen
|
|
|
android/... MainActivity, LauncherBridge, SystemBridge, TelemetryBridge, ObdService
|
|
|
tool/ emulator, install, check scripts
|
|
|
@@ -294,23 +314,24 @@ flutter test
|
|
|
./tool/check.sh
|
|
|
```
|
|
|
|
|
|
-The 51 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 at 1280×800, 1280×720 and
|
|
|
-1024×600, the dense shortcut grid, the equalizer animation, OBD economy, the OBD
|
|
|
-card, media-key playback, media metadata/progress, the marquee, the play/pause
|
|
|
-ring, the keep-awake preference, the night overlay, GPS speed fallback and the
|
|
|
-update version/availability logic and the Settings update dot. 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. 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
|
|
|
-The 1.0.2 universal APK is built from this tree. The tablet is on 1.0.1 and
|
|
|
-will pick up 1.0.2 through Settings → Updates; the yellow dot appears when the
|
|
|
-new release is published. The emulator has verified the full in-app update path.
|
|
|
+The 63 tests cover PIN hashing/persistence, settings persistence, theme/accent,
|
|
|
+dark accent tinting, battery visibility, first-run state, the ten-minute
|
|
|
+onboarding hint, slot visibility, pinned apps, custom labels/icons, the
|
|
|
+16-button cap at 1280×800, 1280×720 and 1024×600, the dense shortcut grid, the
|
|
|
+equalizer animation, OBD economy, the OBD card, media-key playback, media
|
|
|
+metadata/progress, the marquee, the play/pause ring, the keep-awake preference,
|
|
|
+the night overlay, GPS speed fallback, speed/temperature source persistence,
|
|
|
+weather fallback, the update version/availability logic and the Settings update
|
|
|
+dot. 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.
|
|
|
+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
|
|
|
+The 1.0.3 universal APK is built from this tree and published; devices on 1.0.2
|
|
|
+will pick it up through Settings → Updates when the release is published. The
|
|
|
+emulator has verified the in-app update path.
|
|
|
|
|
|
## Troubleshooting the emulator
|
|
|
|
|
|
@@ -352,8 +373,9 @@ Android 15 AVD is left running headlessly after development; use
|
|
|
- **Night mode is a display overlay only.** It does not change panel brightness
|
|
|
or keep the screen awake by itself; the screen-on preference still applies.
|
|
|
Long-press on cards and buttons is reserved for their own actions.
|
|
|
-- **Onboarding hint** is anchored to process start and disappears after two
|
|
|
- minutes; it does not return until the next cold start.
|
|
|
+- **Onboarding hint** is anchored to the first launch after a fresh install and
|
|
|
+ disappears after ten minutes. It is migrated to expired for upgraded installs
|
|
|
+ and never returns.
|
|
|
- **No embedded third-party app UI.** Navigation/Music/Radio are launched in
|
|
|
their own full-screen windows.
|
|
|
- **Renaming changes the Home label only.** Android does not allow a launcher to
|
|
|
@@ -369,17 +391,18 @@ Android 15 AVD is left running headlessly after development; use
|
|
|
- **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.
|
|
|
-- **GPS speed fallback** requires precise location already granted and the GPS
|
|
|
- provider enabled; CarDash does not request permission from this path. OBD speed
|
|
|
- wins whenever an adapter is connected, and stale/no-fix GPS values are hidden.
|
|
|
+- **Speed source** is selectable only while an OBD adapter is selected. GPS
|
|
|
+ fallback requires precise location already granted and the GPS provider
|
|
|
+ enabled; CarDash does not request permission from this path. Stale/no-fix GPS
|
|
|
+ values are hidden.
|
|
|
- **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.
|
|
|
+- **Temperature source** is selectable only while an OBD adapter is selected.
|
|
|
+ Weather fallback uses Open-Meteo and the device location; it requires location
|
|
|
+ permission and network access, and hides the row when unavailable.
|
|
|
+- **Location data is not stored.** Only the selected adapter address, the
|
|
|
+ speed/temperature choices and the weather preference are persisted.
|
|
|
- **`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
|
|
|
distributed; this is a local/sideload build for now.
|