feat(nowplaying): 3-option wrong-match dialog + reachable Failed Matches
Two tightly related UX fixes to the flag flow shipped in 0.3.6 / 0.3.8.
Now Playing flag icon now opens a dialog with three explicit outcomes
instead of a silent database write:
- Find a better match — existing behavior (sets match_flagged, surfaces
in Failed Matches for replacement selection). - Delete from library — deletes file + track row, future sync may
re-queue. - Delete and block forever — deletes file + keeps tombstone row with
is_blacklisted = 1 so future syncs skip the identity across every
source (Spotify URI, YouTube ID, canonical match).
Player.skipNext() fires before the delete so ExoPlayer doesn't error
on a file that disappeared under it.
Sync tab's Failed Matches entry-point card was gated on unmatchedCount
only — a track flagged via Now Playing with zero concurrent unmatched
tracks had no way to reach the Failed Matches screen. Wires in
flaggedCount alongside unmatchedCount:
- SyncViewModel observes getFlaggedCount() into SyncUiState.flaggedCount.
- SyncScreen renders the review card when either count > 0. Card copy
adapts: "N couldn't be matched" / "N flagged as wrong match" /
"N need review · M unmatched · K flagged." - FailedMatchesHeader title + subtitle + count line switch between
"Unmatched Songs" / "Flagged Songs" / "Songs to Review" based on
which lists are populated.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
Install
Download the .apk below and open it on your Android device. If you've got a previous Stash release installed, this upgrades in place — your library, sync history, and settings are preserved.
Requires: Android 8.0 (API 26) or newer.
See the README for first-time setup.
Full Changelog: v0.3.8...v0.3.9