Skip to content

Develop - #7

Merged
EarMaster merged 5 commits into
mainfrom
develop
Aug 7, 2026
Merged

EarMaster merged 5 commits into
mainfrom
develop

Conversation

@EarMaster

Copy link
Copy Markdown
Owner

No description provided.

EarMaster and others added 5 commits August 6, 2026 18:37
A Phoniebox library is largely ripped CDs and home-made folders, so much
of it carries no embedded artwork — and the favourites tab and album grid
were walls of identical grey discs, no use to the child this app is
pointed at, who navigates by picture rather than by reading.

Thirty-two covers ship in res/drawable-nodpi and one is assigned per
folder, album or track name, so the same name draws the same picture on
every screen and after a reinstall. Artwork the box does have still wins.
nodpi rather than plain drawable because these are art scaled to whatever
slot they land in: in drawable/ they would be treated as mdpi and
upscaled some 3.5x in memory on an xxhdpi phone.

The hash is FNV-1a, not String.hashCode. The latter is stable across
hosts and versions, which is the property that matters, but it is not
mixed: modulo 32 keeps only its low five bits, and for the runs a library
is full of (Folge 01, Folge 02, ...) those move with the last character.
Forty such folders come out as 14 distinct covers in a visibly repeating
pattern against FNV-1a's 28. The mapping is frozen and pinned to values
by FallbackCoverArtTest: changing the hash, the folding or the size of
the set reshuffles artwork users have come to recognise, and no golden
would notice — the fixtures would simply re-record.

A null cover URL had meant two things: "no artwork" and "nobody has
finished asking yet". Drawing a stand-in on every null would have put a
picture on screen a second before the real cover replaced it, on every
track change and across a whole album grid at once. CoverArt now takes
coverPending, supplied by PlayerRepository for the player and mini player
and by a settled-id set in the favourites and library view models.

A stream has no folder whatever PlayerStatus.folder says — that property
is the file path minus its last segment, which for a stream URL is the
server, so every station on one host would have shared a picture.
coverNameOf drops to the album and artist tags there.

FakeCoverArt now serves these same covers instead of drawing its own, so
the goldens and the store screenshots show what the product shows. That
gives up the 3:2 landscape source that let a golden fail visibly on a
stretched or letterboxed cover; those regressions still fail the test,
since a golden is a byte comparison, but reading the diff is now the way
to see what went wrong.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The favourites shot no longer has an empty tile in it: the folder the box
has no artwork for now draws a stand-in like the rest.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The goldens are baselines a maintainer accepts rather than a contract the
code must satisfy, so "the UI changed" is information rather than a
defect. A golden can also differ for reasons unrelated to the change
under review — a Robolectric or Skia bump, an image decoder that rounds
differently on another host — and a check that goes red for those becomes
a check that gets clicked past.

continue-on-error leaves the job green; a PR annotation and a step
summary say what moved and how to accept or reject it. The diff upload
now keys on the step's outcome rather than failure(), because with
continue-on-error the job never enters a failed state and the triptych
would otherwise be silently dropped — the one artifact the job exists to
produce.

This changes the reporting only. Screenshots was never among main's
required status checks (Build, Unit Tests, Lint, Analyze), so a mismatch
could not block a merge before this either.

The cost is not hedged in the comments or in AGENTS.md: nothing else in
CI looks at pixels, so a genuine visual regression now merges green
unless somebody reads the warning. If that stops happening, the honest
fix is to make the job blocking again rather than keep a check nobody
acts on.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@EarMaster EarMaster closed this Aug 6, 2026
@EarMaster EarMaster reopened this Aug 6, 2026
@EarMaster EarMaster closed this Aug 7, 2026
@EarMaster EarMaster reopened this Aug 7, 2026
@EarMaster
EarMaster merged commit 7e63698 into main Aug 7, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant