Home / Changelog

What shipped in each release.

Notable user-facing changes and the engineering work behind them. Versions before v2.4.0 are catalogued in the project notes.

v3.0.0

2026-06-07

Feature drop — three user-facing additions, two quality fixes, and the first version-controlled Play Store listing.

Added

  • Mood combos on discovery. Pick up to three moods (e.g. Chill + Late-night). Stations matching more selected moods rank higher; flip the new Strict toggle to filter to stations matching every mood. The last combo persists as a Quick-pick chip.
  • M3U / PLS playlist import. Bulk-import station collections from a playlist file via Settings → Import M3U/PLS. Lenient parser, system file picker, automatic dedupe against favourites, snackbar summary.
  • Wear OS Tile. A watch-face Tile showing the current station, the live ICY artist/track, and a one-tap play/pause. Updates within seconds of state changes. Brings Wear OS reach to competitive parity with Spotify and Pocket Casts.

Fixed

  • Cast button now works. The Cast button on Now Playing opens the route-chooser dialog instead of doing nothing. Root cause was a missing FragmentManager host.
  • Android 15 / SDK 35 edge-to-edge. Cleared the Play Console advisory. The Shake overlay's Close button now uses safeDrawingPadding() so it clears the status bar on gesture-nav devices.
  • Shake-to-discover false positives. No longer fires on incidental bumps (phone set on desk, pocket transitions). New pattern matcher requires three+ acceleration spikes within 500 ms before triggering.

Marketing

  • First version-controlled Play Store listing copy and screenshots, plus a hand-coded SVG feature graphic.

v2.4.2

2026-05-27

Hotfix — v2.4.1 didn’t actually fix the station-open crash; this does.

Fixed

  • Opening any station crashed — turned out to be two bugs in the Cast button, both on the Now Playing path. MediaRouteButton's constructor relies on AppCompat's colorPrimary, which a pure-Material Android theme never defines, so the contrast check threw IllegalArgumentException. The previous fix used a ThemeOverlay that didn't supply colorPrimary. Real fix: a dedicated cast-button theme that sets an opaque colorPrimary, plus tinting the indicator drawable directly instead of casting MediaRouteButton to ImageView (it extends View).

v2.4.1

2026-05-25

Hotfix — crash on opening any station under certain OEM theme overlays (later confirmed incomplete; see v2.4.2).

Fixed

  • Theme-overlay crash on the Cast button under edge-to-edge on some OEM themes (observed: OnePlus 8 Pro / Android 11). Crashlytics: 11 events / 3 users in 24h on v2.4.0.

v2.4.0

2026-05-14

First release shipped via the autonomous Gradle Play Publisher pipeline. A single git tag v2.4.0; git push --tags produced a signed AAB, uploaded to Play Console internal track, then a workflow promoted to production at 100%.

Added

  • EPG programme guide coverage for Spain, Sweden, Norway, Canada and Australia (5 new feeds).
  • Crashlytics coroutine scope helper — uncaught throwables in long-lived coroutines now go to FirebaseCrashlytics.recordException instead of the JVM uncaught handler.

Fixed

  • SQLite UPSERT crash on pre-Android-11 devices — replaced UPSERT with a transactional INSERT OR IGNORE + UPDATE. Confirmed by a Crashlytics report from a Moto G7 Power user.
  • Onboarding bottom action buttons sat behind the Android 15 nav bar on gesture-nav devices. Added safeDrawingPadding().
  • AudioTrack write-on-released race in AmbientSoundPlayer.

Earlier versions (v1.0.0 — v2.3.0) are catalogued in internal release notes. Significant earlier milestones include initial Play Store launch, Android Auto support, Chromecast Cast wiring, and the Wear OS standalone build.