Skip to content

The Binder grows, turns pages with arrows, and looks like a CD binder - #117

Merged
StaticHumStudio merged 7 commits into
masterfrom
feat/220w3-binder-v2
Nov 5, 2026
Merged

StaticHumStudio merged 7 commits into
masterfrom
feat/220w3-binder-v2

Conversation

@StaticHumStudio

Copy link
Copy Markdown
Owner

Jeff: the Binder was too small to be useful, needed arrows, should come in a few sizes, and should look more like a binder.

  • Resizable from 2x1 up to about 5x4, default 4x2. Each size lays out its own page from the space the launcher reports (one or two discs per side, one or two rows, titles and a page count when there is room).
  • Arrows turn the page both ways and wrap. Fling still works, and the arrows pick up where a fling left off. (RemoteViews drops showNext/showPrevious from partial updates, so each page carries its own arrows that redraw the Binder on their target page.)
  • CD binder look: covers printed on discs with rim, hub and spindle hole, clear sleeves with a thumb notch, a stitched spine, a padded cover with a stitch line. The eye is out of the first pocket, so every pocket is a book. It shows only on a closed (locked or empty) Binder.
  • Cold start no longer briefly reads as signed out (small change in SettingsManager, also helps the Nine Lives widget).

Checks

  • 2,052 JVM tests, 0 failures, 28 new.
  • Codex (Sol 6.1, high): four rounds. Five real bugs found and fixed (disc taps dead on Android 11 and 12, a 50 book library overflowing the widget bitmap limit on Android 16, landscape using the portrait layout, doubled art memory on refresh, an arrow tap waiting behind a slow cover download). Round four clean.
  • Emulator, Android 16: all nine sizes, arrows, fling, tap to play, locked and empty faces, reconfigure, a 50 book library. Android 11: arrows and tap to play.

Known: on Android 15 and up the Binder is portrait only (avoids an Android bug that mismatched discs and titles after a resize with both layouts). With 20 books or fewer, a fling past the last page then back can draw the page off until the next turn.

🤖 Generated with Claude Code

https://claude.ai/code/session_014XfNSe18pmZggK4TswCohg

StaticHumStudio and others added 7 commits November 5, 2026 08:47
…nd holds discs in sleeves

Every size gets its own page: one disc each side of a stitched spine on a
one row Binder, titles and full size arrows under the discs from two rows,
and up to eight discs a page at 4x3. The page holds as many pockets as fit
while each disc stays at least 60dp. The default is 4x2.

Covers are printed on discs with a hub and spindle hole, in clear sleeves
with a thumb notch and a faint sheen, on a padded cover with a stitch line.
The eye leaves the first pocket, so every pocket is a book. A closed Binder
(locked, signed out, empty) shows the eye pressed into its cover.

Each page carries arrows that know the page they turn to, through the tap
template and WidgetActionActivity, then a full update with setDisplayedChild.
showNext and showPrevious cannot work here: Android drops them from a
partial update. Fling still turns pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XfNSe18pmZggK4TswCohg
A pocket is added to its page as a nested layout, and Android keeps a fill
in intent on a nested layout's root as a tag without wiring a click to it,
so taps on discs did nothing. The tap target is now a child of that root.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XfNSe18pmZggK4TswCohg
loadSettings said it was loaded before it had read the auth token, so a
widget redraw in a fresh process saw no token and drew the signed out face
for a second or two. On the Binder that also threw away an arrow's page
turn. isLoaded now flips after the token is published. The page turn waits
up to 8 s, longer than the updater's own wait for settings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XfNSe18pmZggK4TswCohg
…eir ends, and covers fit Android 16's budget

Review round 1 fixes, plus two found on the emulator.

Taps: every pocket slot now sits in the page's own layout (two rows of two
each side, hidden when a size does not use them). Android 11 and 12 never
pass the collection flag to nested RemoteViews, so a tap on a disc added
with addView did nothing there.

Budget: Android 16 can gather every page of a stack into one update, with a
bitmap cap of about 90% of six bytes per screen pixel, shared by the stacks.
Disc art now shrinks in 16 px steps until all fifty books fit 80% of that.

Landscape: the launcher gets a portrait and a landscape stack, each with
the layout for its own reported size.

Short Binders: StackView fakes its loop below six pages, and a fling past
the end left the stack half drawn. Five pages or fewer use a stack that
stops at its ends. The arrows still wrap.

Resizes: a drag across sizes redraws once it settles, redraws never
overlap, and the factory never mixes two layouts in one page. Overlapping
redraws were seen to leave discs out of step with their titles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XfNSe18pmZggK4TswCohg
Review round 2 fix. On Android 16 a data refresh gathers the pages again
into the saved views while the old bitmaps are still held, so two copies
count against the widget's bitmap cap for a moment, and an update over the
cap is refused and the saved views cleared. The disc art budget now counts
both copies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XfNSe18pmZggK4TswCohg
…ck, so discs always match their titles

On Android 15 and up the framework can gather a stack's pages into the
update itself. Two things went wrong there on the emulator: a portrait
and landscape pair of stacks drew discs from the other stack's pages under
the right titles after a resize, and a data refresh kept the old bitmaps
alongside the new ones against the widget's cap.

So from Android 15 the Binder is one stack laid out for the portrait size,
and it never sends a data refresh. Each stack's adapter intent carries a
fingerprint of what it draws (books, titles, cover versions, which covers
are on disk, tap choice, layout, art size), so changed contents build
afresh in the update and unchanged ones keep their place. Covers are
fetched before the fingerprint, except on a page turn, which never waits on
the network. Android 14 and below keep the pair and the data refresh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XfNSe18pmZggK4TswCohg
Review round 3 fix. From Android 15 a redraw fetched covers while holding
the Binder's draw lock, and Android runs the stack's factory inside the
update, which fetched again. With a slow server an arrow tap could wait out
its 8 s and be dropped. Covers are now fetched before the lock, and there
the factory only reads what is on disk.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XfNSe18pmZggK4TswCohg
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-05T15:17:37.230835Z 946dd81 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@StaticHumStudio
StaticHumStudio merged commit 96bee67 into master Nov 5, 2026
1 check 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