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.
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).
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.
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.