Repository navigation
Restyle Android and complete collection and article parity - #41
Conversation
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configuration
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. Comment |
There was a problem hiding this comment.
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 sRGBmix()andreadableColor()helpers,PinakesColorsexposed throughLocalPinakesColors, 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:
BookCoverdraws a 3D book with fitted (uncropped) artwork.BookCardGridsupports 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
DigitalFileCardper audio or e-book file. - Auth screens: login, registration, forgot-password and onboarding now share the
AuthFormwash and card. - Dark-mode fix:
LoanCalendarandStatusLinenow follow the in-app dark preference instead ofisSystemInDarkTheme(). - Tests:
ThemePaletteTestchecks contrast across all seven palettes, andRestylingUiTestadds Compose device tests.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
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
darkin dark mode to 3:1 againstsurfacewhile it keeps 4.5:1 with white text.ThemePaletteTestnow covers this and also checks text onsoft. - Home: Split out
HomeContentand movedheroQueryabove the phaseCrossfade, so a search draft now survives Loading → Content. Loading now scrolls, and Empty is now aLazyColumn. Added two device tests for this. - Book detail: Shown the
·separator before the year only when there is a publisher. ReplacedGenreChipwith aGenrePathrow (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.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ 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.surfaceonEditProfileDialogandChangePasswordDialog. Thesoftfield fill now differs from the dialog in both light and dark mode. The review text field inBookReviewsSectionsits on asurfaceContainerLowcard, not a dialog, so it never had this problem. - Docs: Updated the DESIGN.md inputs section to say the two dialogs use
surfaceexplicitly.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ 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
GenderFieldandDateFieldtoshapes.smallwith asurfaceVariant(soft) fill, which matchesPinakesTextField. Before this, theirsurfaceContainerLowfill was the same colour as thesurfacecontainer ofEditProfileDialog, so they had no visible edge at rest. Now they stand out from the dialog in both light and dark mode.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ 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,coverUrland the published-resource fields toStandaloneArticle.publicResourceAddressneedshas_public_resourceand a non-blank address.publicResourceUrlis set only for an HTTP(S) URI with a host, the same checkpublicPdfUrluses. - 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 returnsnullby default.PeriodicalsRepositorybuilds it frominstanceOrigin, as the Book Club poll links already do, so the bearer token never goes into a URL. - Article list: Changed
StandaloneArticleRowto aRowwith a compactBookCoverand 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.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ 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 throughANDROID_HOME/ANDROID_SDK_ROOTorPATHand starts the AVD in the background. On macOS it also runscaffeinate -i -w <pid>, which ties the power assertion to that emulator. If the emulator exits with an error,set -eand the finalwaitreturn that error code. OnINT/TERMthe script stops the emulator and exits with 130 or 143. TheEXITtrap always ends thecaffeinateprocess. - 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.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
ℹ️ 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 frombookPlaceholderTone(title), a UTF-8 byte hash that matches the browser. The placeholder clears its own semantics, so the image'scontentDescriptionannounces the title once. ThroughonToneit 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 serverplaceholder.{jpg,png,svg}file name as no artwork. It ignores case, query and fragment, so real files such asplaceholder-history.jpgstill load.BookCoveruses it to build the image request. Book detail uses it to decide whether the cover can be zoomed. - Callers: Changed
BookCard,BookCardGridand book detail to passauthorandpublishertoBookCover. - Tests and docs: Added
BookPlaceholderTestfor 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.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ 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
contentDescriptionfromSubcomposeAsyncImageto the outerBookCoverbox and set the image's description tonull. Coil only applies the image description to successful content, so before this change a loading or failed cover, which shows the clearedBookPlaceholder, 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 olduseUnmergedTree = trueassertion didn't test what TalkBack sees.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
ℹ️ 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,CollectionsSourceandCollectionsRepositoryfor the archives and desiderata endpoints. Added thearchivesanddesideratahealth flags toInstanceFeatures. AddedCollectionPager, which keeps a separate, generation-guarded cursor for each collection. - Desiderata and donations: Added the Desiderata list, the wanted-book detail and
DonationScreen.DonationViewModelkeeps the draft and asubmission_idinSavedStateHandle. It marks the send as uncertain before it posts, and before resending it checksofferStatus, 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.searchArticleschecks thearticle_filterscapability and returnsupgrade_requiredif the server lacks it. Issue detail lists its catalogued articles. - Book detail: Showed every
digital_attachmentsentry, one audio player at a time. Made author chips open that author's works. Addedgenre_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,CollectionsUiTestand the new strings in all four languages. Bumped the version to 1.6.0 (17). Updated README, STATUS, DESIGN andUWE-PARITY.md.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ 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_citekey ("Cite", "Cita", "Citer", "Zitieren") for theCitationButtonbutton and dialog title, so book pages no longer say "Cite this article". - Home error copy:
HomeViewModelnow stores the server message as is. A blank message still shows the Error state, because the phase checkserror != null, andHomeContentfalls back to the localizedR.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, andSearchScreensearches them again once the debounced query is applied. - Catalog pagination: Changed
SearchViewModel.loadMoreto page withappliedFiltersrather thanfilters(). Before this, unapplied changes in the filter sheet leaked into the next-page request. - Home destinations: Changed the collection links from a horizontally scrolling
Rowto aFlowRow, 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 andUWE-PARITY.md.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ 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.fieldslist now skips theextententry when the top-levelrecord.extentis not blank, because theMetadatarow already shows it in that case. If the top-level value is blank,Metadatahides its row and theextentfield still appears, so the value is never lost.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
ℹ️ No code changes since the last review. I found one small wording fix in
STATUS.mdand 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/*.jsonfiles. 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.mdand 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.mdwith the backend and plugin versions it needs, and moved the existing text under a new "Bundle workflow" heading.
claude-opus-5-5 | 𝕏

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.mdrecords backend/plugin dependencies, signing and remaining store gates;_contract/MOBILE_API_SPEC.mdandSTATUS.mdreflect 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.