Skip to content

Restyle Android and complete collection and article parity - #41

Merged
fabiodalez-dev merged 14 commits into
mainfrom
fix/restyling-2026
Oct 9, 2026
Merged

fabiodalez-dev merged 14 commits into
mainfrom
fix/restyling-2026

Conversation

@fabiodalez-dev

@fabiodalez-dev fabiodalez-dev commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Updates the Android client to the 2026 Pinakes design and current catalogue features, preserving Home, Catalog, Library, Wishlist and Profile in the bottom navigation.

Adds native Archives and library Desiderata (separate from personal wishlist), verified-account donation proposals with consent and durable retry/process-death recovery, analytic articles in catalog search and issue details, shared-author identity navigation, complete anthology metadata, five citation styles with rich clipboard and RIS/MARCXML links. Books show every digital attachment and publisher; Home and Catalog support author sorting and genre navigation reaches every depth. Staff cataloguing opens existing protected PHP pages. Legacy missing-cover images receive the shared typeset binding; original artwork remains complete and accessible.

Requires the coordinated server changes in Pinakes #458 (Mobile API 1.5.0, Desiderata 1.2.0, Emeroteca 1.13.0, Archives 1.5.1) for new collection capabilities. Old servers remain usable and unsupported analytic filters request an upgrade. No production deployment or store release is included.

Validation: 185 unit tests and 19 Compose tests pass on Android 15; debug and R8 release builds pass; Lint has zero errors (98 existing warnings). The matching PHP contracts include 50 database checks and 9 HTTP route/manifest checks. Request-by-request evidence and remaining external requests are in docs/UWE-PARITY.md.

The macOS emulator launcher keeps a power assertion scoped to its PID. Headless Android 15 runs the device tests; older GUI AVDs still exhibit system/startup stalls. This change does not claim a production-device ANR fix or suppress Sentry reports.

Release candidate: Android 1.6.0 (versionCode 17), coordinated with PHP 0.8.0-rc.2 in Pinakes #462. docs/PLAY-RELEASES.md records backend/plugin dependencies, signing and remaining store gates; _contract/MOBILE_API_SPEC.md and STATUS.md reflect the implemented API extensions, five navigation destinations and 622 keys per app locale. Browser/Android comparison is preserved with disposable QA records.

Review status: the existing Pullfrog findings are fixed. CodeRabbit automatic review is skipped for this Android repository due to its stars threshold; its successful status is not presented as an executed review.

Final-head validation: all 3 checks pass on 06d55f997aeb3bf90415b047fa28a11fdfacbc54. All 11 inline review threads are resolved, including the latest Pullfrog wording correction. CodeRabbit’s skipped automatic review remains a review limitation.

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: a3ae929d-9be6-4cc2-a6a0-8d79c2872b21
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The new resting style for text fields removes their only visible boundary. On the sign-in, registration and onboarding cards, and in the profile dialogs, an unfocused field now looks identical to the surface around it.

Reviewed changes

I reviewed the full restyle in 709250c: theme tokens, fonts, shared components, the home, catalog, detail and auth screens, i18n, and the new tests.

  • Theme system: ThemePalette, the sRGB mix() and readableColor() helpers, PinakesColors exposed through LocalPinakesColors, and light/dark M3 schemes derived from the palette.
  • Typography: Inter is replaced by Geist (UI) and Fraunces (headings). The static TTFs and their OFL licences are bundled.
  • Book artwork: BookCover draws a 3D book with fitted (uncropped) artwork. BookCardGrid supports classic and tinted styles, with optional sampling of the cover tone.
  • Home and catalog: the home screen gets a hero with search and a cover fan, and search hands its query to the catalog tab. The catalog gains a grid/list toggle and keeps sort, filters and pagination.
  • Book detail: adds the kicker row, author chips, a grouped availability box, quick facts, and one DigitalFileCard per audio or e-book file.
  • Auth screens: login, registration, forgot-password and onboarding now share the AuthForm wash and card.
  • Dark-mode fix: LoanCalendar and StatusLine now follow the in-app dark preference instead of isSystemInDarkTheme().
  • Tests: ThemePaletteTest checks contrast across all seven palettes, and RestylingUiTest adds Compose device tests.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread app/src/main/java/com/pinakes/app/ui/components/TextFields.kt
Comment thread app/src/main/java/com/pinakes/app/ui/components/TextFields.kt Outdated
Comment thread app/src/main/java/com/pinakes/app/ui/theme/Color.kt Outdated
Comment thread app/src/main/java/com/pinakes/app/ui/screens/home/HomeScreen.kt Outdated
Comment thread app/src/main/java/com/pinakes/app/ui/screens/detail/BookDetailScreen.kt Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The new soft field fill fixes the auth cards and screens. It doesn't fix the profile and review dialogs, because their default container is the same colour as the fill. In dark mode, those fields are still invisible at rest.

Reviewed changes

I reviewed what changed in 197d717 since the last review (611f7ea).

  • Text fields: Removed the outer focus ring from the outlined fields. Their resting fill is now surfaceVariant (soft), and Material's accent outline marks focus.
  • Dark action fill: Lifted dark in dark mode to 3:1 against surface while it keeps 4.5:1 with white text. ThemePaletteTest now covers this and also checks text on soft.
  • Home: Split out HomeContent and moved heroQuery above the phase Crossfade, so a search draft now survives Loading → Content. Loading now scrolls, and Empty is now a LazyColumn. Added two device tests for this.
  • Book detail: Shown the · separator before the year only when there is a publisher. Replaced GenreChip with a GenrePath row (grandparent › parent › name › subgenre).
  • Typography: Added PublicationTitleStyle (Fraunces 17/21) for publication titles in periodical, issue, article, review and club rows.
  • Docs: Updated DESIGN.md (inputs, dark fill pairing) and the README feature table and test counts.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread app/src/main/java/com/pinakes/app/ui/components/TextFields.kt

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found. The last open finding about field visibility is fixed, and I have resolved both related threads.

Reviewed changes

I reviewed what changed in 0703cd2 since the last review (197d717).

  • Profile dialogs: Set containerColor = MaterialTheme.colorScheme.surface on EditProfileDialog and ChangePasswordDialog. The soft field fill now differs from the dialog in both light and dark mode. The review text field in BookReviewsSection sits on a surfaceContainerLow card, not a dialog, so it never had this problem.
  • Docs: Updated the DESIGN.md inputs section to say the two dialogs use surface explicitly.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found. The profile date and gender selectors now look like the other fields in the dialog.

Reviewed changes

I reviewed what changed in 678d104 since the last review (0703cd2).

  • Profile selectors: Changed GenderField and DateField to shapes.small with a surfaceVariant (soft) fill, which matches PinakesTextField. Before this, their surfaceContainerLow fill was the same colour as the surface container of EditProfileDialog, so they had no visible edge at rest. Now they stand out from the dialog in both light and dark mode.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found. Article covers, subtitles and published resources follow the server data, and resource links open only when the address is HTTP(S) with a host.

Reviewed changes

I reviewed what changed in c6a485d since the last review (678d104).

  • Article model: Added subtitle, coverUrl and the published-resource fields to StandaloneArticle. publicResourceAddress needs has_public_resource and a non-blank address. publicResourceUrl is set only for an HTTP(S) URI with a host, the same check publicPdfUrl uses.
  • Article detail: Added the cover and subtitle and moved the PDF action above the metadata. A published resource is either a button (web URL) or selectable text (local archive reference), shown with its access conditions.
  • Website action: Added StandaloneArticlesSource.articleWebUrl(id), which returns null by default. PeriodicalsRepository builds it from instanceOrigin, as the Book Club poll links already do, so the bearer token never goes into a URL.
  • Article list: Changed StandaloneArticleRow to a Row with a compact BookCover and a subtitle line.
  • Tests and docs: Added StandaloneArticleUiTest (published, unpublished and local-reference cases) and contract tests for decoding and URL filtering. Added the four-language strings and updated README, STATUS and the article integration notes.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found. The new emulator launcher is development tooling only, and its signal handling and exit codes work correctly.

Reviewed changes

I reviewed what changed in 075c65c since the last review (c6a485d). No app code changed.

  • Emulator launcher: Added an executable tools/run-emulator.sh. It finds the emulator through ANDROID_HOME/ANDROID_SDK_ROOT or PATH and starts the AVD in the background. On macOS it also runs caffeinate -i -w <pid>, which ties the power assertion to that emulator. If the emulator exits with an error, set -e and the final wait return that error code. On INT/TERM the script stops the emulator and exits with 130 or 143. The EXIT trap always ends the caffeinate process.
  • Docs: Added a README section about running the standalone emulator on macOS and a STATUS bullet with the startup measurements. Both say that this only helps the development emulator and does not fix ANRs on real devices.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No critical issues. There is one small consistency suggestion inline.

Reviewed changes

I reviewed what changed in e188b9c since the last review (075c65c).

  • Typeset placeholder cover: Added BookPlaceholder. It draws a cloth binding with a ruled border, a faint texture and an arc, and sets the title in Fraunces. Author and publisher appear only on wide, non-compact covers. The binding colour comes from bookPlaceholderTone(title), a UTF-8 byte hash that matches the browser. The placeholder clears its own semantics, so the image's contentDescription announces the title once. Through onTone it reports its paper colour, which tinted cards then use.
  • Legacy placeholder filtering: Added bookCoverImageUrl. It trims the URL and treats a blank value or a server placeholder.{jpg,png,svg} file name as no artwork. It ignores case, query and fragment, so real files such as placeholder-history.jpg still load. BookCover uses it to build the image request. Book detail uses it to decide whether the cover can be zoomed.
  • Callers: Changed BookCard, BookCardGrid and book detail to pass author and publisher to BookCover.
  • Tests and docs: Added BookPlaceholderTest for the hash keys, URL filtering and ink contrast under the gloss, and a device test for the binding tone and the single announcement. Added a README and STATUS note that the emulator power assertion does not fix an unhealthy AVD.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread app/src/main/java/com/pinakes/app/ui/screens/home/HomeScreen.kt Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found. Cover titles are now announced while the artwork is loading and when the typeset fallback shows, not only after the image loads. The earlier suggestion about the home hero fan (HomeScreen.kt:205) is still open.

Reviewed changes

I reviewed what changed in dea547c since the last review (e188b9c).

  • Cover accessibility: Moved the title contentDescription from SubcomposeAsyncImage to the outer BookCover box and set the image's description to null. Coil only applies the image description to successful content, so before this change a loading or failed cover, which shows the cleared BookPlaceholder, had no announced title. Now the title is announced once in every state.
  • Device test: Changed the test so it checks that the author text is missing from the merged tree. The unmerged tree still contains nodes under clearAndSetSemantics, so the old useUnmergedTree = true assertion didn't test what TalkBack sees.

Pullfrog  | Fix it ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

@fabiodalez-dev fabiodalez-dev changed the title Restyle Android with the Pinakes 2026 design Restyle Android and complete collection and article parity Oct 8, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No critical issues. Three small behaviour and copy suggestions are inline. The earlier hero fan suggestion is fixed, and I have resolved that thread.

Reviewed changes

I reviewed what changed in 114f02b since the last review (dea547c).

  • Collections data layer: Added CollectionsApi, CollectionsSource and CollectionsRepository for the archives and desiderata endpoints. Added the archives and desiderata health flags to InstanceFeatures. Added CollectionPager, which keeps a separate, generation-guarded cursor for each collection.
  • Desiderata and donations: Added the Desiderata list, the wanted-book detail and DonationScreen. DonationViewModel keeps the draft and a submission_id in SavedStateHandle. It marks the send as uncertain before it posts, and before resending it checks offerStatus, so a retry cannot create a duplicate proposal.
  • Archives: Added the hierarchy list with level, date range and text filters. Added the record detail with ancestors, labelled fields, authorities, documents (PDFs open in the reader) and export links.
  • Analytic articles: Added the anthology, classification and holdings fields, author credits with IDs, keyword, genre and container links, and CitationButton, which copies server-formatted citations as HTML. searchArticles checks the article_filters capability and returns upgrade_required if the server lacks it. Issue detail lists its catalogued articles.
  • Book detail: Showed every digital_attachments entry, one audio player at a time. Made author chips open that author's works. Added genre_path, the publisher list, edition, place and citations.
  • Home and catalog: Added a sort menu on Home (newest, title, author) and links to the optional collections. Catalog search now shows article, desiderata and archive sections above the book results.
  • Tests and docs: Added CollectionsFlowTest, CollectionsUiTest and the new strings in all four languages. Bumped the version to 1.6.0 (17). Updated README, STATUS, DESIGN and UWE-PARITY.md.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread app/src/main/java/com/pinakes/app/ui/screens/home/HomeViewModel.kt Outdated
Comment thread app/src/main/java/com/pinakes/app/ui/screens/search/CollectionSearchViewModel.kt Outdated
Comment thread app/src/main/java/com/pinakes/app/ui/components/CitationButton.kt Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found. All three suggestions from the last review are fixed, and the catalog's "load more" now uses the filters that were actually applied.

Reviewed changes

I reviewed what changed in 32b105a since the last review (114f02b).

  • Citation label: Added a neutral citation_cite key ("Cite", "Cita", "Citer", "Zitieren") for the CitationButton button and dialog title, so book pages no longer say "Cite this article".
  • Home error copy: HomeViewModel now stores the server message as is. A blank message still shows the Error state, because the phase checks error != null, and HomeContent falls back to the localized R.string.home_error.
  • Catalog collection sections: Articles now load only when there is a query or a facet (author, author ID, publisher, genre or language), so the default browse-all landing shows books first. An author ID now also hides the wanted-book and archive sections. A new clear() hides all three sections while the typed query differs from the applied one, and SearchScreen searches them again once the debounced query is applied.
  • Catalog pagination: Changed SearchViewModel.loadMore to page with appliedFilters rather than filters(). Before this, unapplied changes in the filter sheet leaked into the next-page request.
  • Home destinations: Changed the collection links from a horizontally scrolling Row to a FlowRow, so the links wrap instead of being clipped.
  • Tests and docs: Added a unit test for browse-all, author ID, query and clear() behaviour. Updated the test counts in STATUS and UWE-PARITY.md.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found. The archive record detail now shows the extent only once.

Reviewed changes

I reviewed what changed in 6c4b745 since the last review (32b105a).

  • Archive record detail: The generic record.fields list now skips the extent entry when the top-level record.extent is not blank, because the Metadata row already shows it in that case. If the top-level value is blank, Metadata hides its row and the extent field still appears, so the value is never lost.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No code changes since the last review. I found one small wording fix in STATUS.md and left it as an inline suggestion.

Reviewed changes

I reviewed what changed in 7a62cba since the last review (6c4b745). Only documentation changed.

  • Status page: Changed the bottom navigation line to the five current destinations. Updated the i18n key count to 622, which matches all four i18n/*.json files. Reworded the supported-locales sentence.
  • API contract: Added an "Implemented extension: Mobile API 1.5.0 / Android 1.6.0" section to _contract/MOBILE_API_SPEC.md and changed the search-filters row to describe author identity and complete genre ancestry.
  • Release notes: Added a "Candidate 1.6.0 (17)" section to docs/PLAY-RELEASES.md with the backend and plugin versions it needs, and moved the existing text under a new "Bundle workflow" heading.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread STATUS.md Outdated
@fabiodalez-dev
fabiodalez-dev merged commit bf309e0 into main Oct 9, 2026
3 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