Android: support small screens (Light Phone 3, 1080x1240) as well as normal ones (Pixel 7) #51
Closed
opened 2026-08-18 05:58:15 +00:00 by logan
·
3 comments
No Branch/Tag Specified
main
fix/146-stub-etxtbsy
fix/175-wizard-follows-the-library
fix/231-setter-rollback
fix/197-duplicate-column-label
docs/225-fixtures-wav-tags
docs/220-skill-check-scope
test/217-fixture-names-in-queue-selection
fix/216-riff-parse-allocation
fix/170-queue-header-action-names
fix/210-nav-sheet-scroll-affordance
docs/50-readme-landing-page
feat/65-art-prefetch-ahead
feat/71-more-as-a-bottom-sheet
feat/54-native-touch-feel
feat/67-entity-links-into-menus
test/196-visual-tier-gates
fix/138-ui-test-storage-leak
fix/104-wav-tags-read
fix/207-sheet-scroll-affordance
fix/204-ui-visual-update-filter
pi-agent-backlog-automation
63-touch-model-phase-2
63-android-touch-model
186-touch-targets-settings
186-touch-targets-page-header
187-seek-bar-hit-area
189-190-explore-correctness
135-android-underrun-instrumentation
51-android-small-screens
fix/171-phone-queue-scrim
fix/137-touch-only-affordances
fix/154-nested-css-check
feat/58-mini-player-progress-line
fix/66-album-page-scrolls-as-one
60-context-menu-action-sheet
64-android-system-volume
59-slim-the-mini-player
55-queue-as-a-screen
feat/57-drop-the-android-top-bar
feat/62-jobs-as-a-notification
fix/53-seek-bar-never-moves
fix/159-android-task-app-id
fix/52-android-activity-recreation-restarts-the-process
fix/150-expand-button-under-the-art
feat/42-inline-volume-and-centred-transport
fix/156-queue-selection-fixture-order
fix/151-fuse-the-scroll-guard-and-the-write
fix/43-queue-panel-selection
fix/143-top-bar-fits-its-window
feat/27-jobs-into-settings
feat/25-configurable-sidebar-tabs
feat/6-global-back-forward
fix/72-active-view-broadcast
fix/69-page-header-action-overflow
fix/quick-wins-batch
fix/118-in-library-clear
fix/61-mini-player-plain-text
fix/68-hover-affordances-pointer
fix/119-dev-headless-port
fix/130-issue-claim-user
fix/131-codegen-check-scope
feat/28-autotag-match-on-album
feat/17-demote-version-selector
feat/38-ownership-visibility
ci/115-manual-release
feat/34-icon-language
feat/7-full-tracklist-toggle
fix/16-tagwriter-totals
fix/unclaim-ca-certs
fix/unclaim-shell
ci/unclaim-on-close
docs/closing-keyword
docs/retire-stale-planning-docs
docs/issue-driven-workflow
integration/small-fixes
fix/small-issue-batch
fix/queue-toggle-state
fix/drag-count-badge
fix/album-card-year
fix/album-tracklist-heading
fix/seek-bar-clock-width
fix/explore-art-scanner-requests
chore/workflow-guardrails
v0.7.0
v0.6.0
v0.5.0
v0.4.0
v0.3.1
v0.3.0
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0
v0.0.1
v0.0.0
Labels
Clear labels
Area/Design
Area/Downloads
Area/Explore
Area/Library-UI
Area/Metadata
Area/Packaging
Area/Player
Area/Queue
Area/Settings
Area/Shell-Nav
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Platform/Android
Platform/Desktop
Breaking change that won't be backward compatible
Something is not working
Documentation changes
Improve existing functionality
New functionality
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Medium
3
The priority is medium
Priority
Low
4
The priority is low
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
3
This issue won't be fixed
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
In Progress
Somebody is actively working on this right now
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: yonlu/yellowjacket#51
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Report
The app needs to work on small screens like the Light Phone 3 (1080x1240) and on normal-sized phones like a Pixel 7. The full-screen Now Playing view is the worst case.
Findings
popover="manual"for), nolight-dark(), no relative colour syntax.make android-inspectandmake android-evalask the real page over raw CDP.<bottom-nav>, and the shell measures exactly 320px in a 320px viewport. Vertical space is the untested axis — 439 CSS px tall with a 4em header and a 4em bottom bar leaves very little.Direction
Treat short viewports as a first-class case: audit every view at ~424x439, and give
now-playing-viewa layout that survives it (art shrinks or is dropped below a height threshold; controls never scroll off). Related Android issues — removing the top bar, slimming the transport, the progress line on the nav border — all buy back vertical space and should be sequenced together.Auditing every view at 424x439 on the attached Light Phone III (TLP301,
Android 14 / SDK 34, WebView Chrome 113), now that every Phase 3 item
that buys vertical space has landed — #62, #57, #55, #59, #61, #56, #58.
#73 says to verify this umbrella after those, and that condition is
satisfied for the first time.
Shape I am working to, so it is on the record before the code is:
and reproductions. #51 becomes the index that links them, rather than
a list of observations in a comment.
supported size — are bugs, not findings, and get fixed in this PR
where the fix is cheap and unambiguous.
child issue is closed, or it stays open behind its own children forever.
The one named design question is
now-playing-view: #172 closed handingit here explicitly — whether the art gets a floor (a
min-height, withthe block scrolling) or whether the screen reflows below some height.
The other named device, a Pixel 7 (~412x869), is not attached. Anything
about tall phones will be reasoned and said to be unverified rather than
claimed.
Audited on the device, and the umbrella has a null result plus two
children. PR #188.
Reference device: TLP301 (Light Phone III), Android 14 / SDK 34, arm64,
WebView Chrome 113, 424x439 CSS px, with a real 1,577-track
library scanned from the phone.
What the audit did not find
All ten primary views plus the queue, walked with a probe that descends
open shadow roots:
documentElement.scrollWidthis 424 against a 424 viewport on everyview. No horizontal overflow anywhere.
a scrollable ancestor that can bring it back.
reaches the control.
So plan 018's promise holds at this size and the width work of #57,
#62, #55 and #59 is intact. This issue's own Findings expected that
("the phone layout kicks in below 600px … vertical space is the
untested axis") and the measurement agrees: what was left was vertical,
and it was
now-playing-view.What it did find, filed rather than folded in
floor. #56 sized the playback controls for a thumb and nothing else
was resized: the sort direction arrow is 28x21, the sort select
23px tall, and
search-trigger— which #57 created for a phone — is40x40. Twelve controls measured, on every view.
primary seeking affordance.
Neither is a reachability failure, which is why they are children
rather than blockers of this one.
Now Playing: the art was a crop, not a small square
Before anything else, a defect underneath the question #172 handed
over.
aspect-ratiois specified not to re-derive the width whenmax-heightclamps the height — unlike an intrinsic ratio, which ispreserved under both bounds. So
width: min(100%, 60vh)kept its widthwhile the height was clipped and
object-fit: covercropped a squarecover into the band:
That is what #172's "39px of art" actually looked like — the missing
half of that measurement is that the 39px were 263 wide.
And it was never only this phone. The leftover exceeds the width
only above ~843px of viewport, so every height from ~500 to ~843 — most
phones, any short window — drew a crop too. The new spec fails on the
old build at 424x439 (
263x39), 390x700 (358x315) and 900x500(
300x36), and passes at 412x869, which is the boundary landingexactly where the arithmetic says it should.
The fix was chosen by measuring Chrome 113 itself at five column
heights rather than by reasoning about the spec.
The design question, answered: reflow
The stacked budget is fixed — 48px header, 143px transport since #64,
78px names, 68px padding and gaps — so the art gets
height - 386.#172 named two options and a floor on the art scrolls the transport off
the bottom, which contradicts this issue's own Direction ("controls
never scroll off") and plan 018's matrix. So below 500px the art and
the names share a row, where the art is bounded by the row's height
rather than the column's leftover.
500 is where the two layouts cross rather than a round number: in a
row the art is
height - 296and the names hold 176px at exactly 500;stacked, the art is
height - 386and passes 176px at 562. Keyed onheight alone, not on the phone's width, because it answers vertical
room — a 900x450 window has the same problem and the same fix.
It degrades rather than breaking: with a job band up (103px of the
screen) the art is a 41px square and the transport still does not move.
Before — 264x53, cropped:
After — 143x143:
With a job band, the worst realistic case — 41px square, transport intact:
Not verified
A Pixel 7. This issue names it and none was attached. What is
asserted at 412x869 is the layout that viewport should get — the
column, with a square art — not that device. The tall-phone case is
also the one where the placeholder needed a second bound
(
max-height: calc(100vw - 2rem)), so it is the case most worthre-checking if one is ever plugged in.
The placeholder path, and a correction about what had been verified.
The first device verification above was run against a build that was
missing two of the final declarations — I had rebuilt the APK after the
art rule and then made three more edits without redeploying. The 143px
figure was measured with a real cover, which that build already handled
correctly, so it stands; but the no-cover path had not actually
been checked on the device.
It has been now, on the shipped code. A track with no embedded art
(105 of the 1,577 in the test library):
min-widthauto0pxmax-height100%392.31pxBoth new declarations are doing the job they were added for. This is the
part that would have shipped broken twice over: a non-replaced box has
no intrinsic size, so the rule that fixes the image collapses the
placeholder to its icon (13x58), and once it is height-driven a flex
item's automatic minimum is its content, so the icon's width becomes a
floor the moment the row is shorter than the icon — which is precisely
what a job band does to this screen.
The empty state (nothing loaded at all) is unchanged by this — it is a
separate render branch that the
.stackwrapper does not touch — and iscovered by
now-playing-view.test.tsin the component tier.