Release/v1.5.0 - #463
Conversation
Co-authored-by: Uri Tauber <uritaube@gmail.com>
…reader#2689) Relocate STR_SUNLIGHT_FADING_FIX from the touch reader controls group to the front button orientation group in the settings filter logic. Sunlight fix was accidentally being hidden on non-touch where it should have been hidden on touch instead. Closes crosspoint-reader#2030
Keep loaded font data (intervals/glyphs/bitmaps/kern) across PrewarmScopes instead of clearing it. This allows idle prewarm of page N+1 to serve the actual page turn with zero SD reads when the mini cache already covers all requested codepoints. Add miniMetadataOnly flag to track bitmap availability and miniHysteresisPending to limit underuse hysteresis evaluation to once per rebuild. Remove freeStyleMiniKern call that was forcing reallocation every page.
## Summary Address request crosspoint-reader#2659 --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**< NO >**_
…eader#2665) Co-authored-by: Julia Nguyen <julia@uxj.io>
Co-authored-by: Julia Nguyen <julia@uxj.io>
Co-authored-by: Julia Nguyen <julia@uxj.io>
Tighten horizontal insets from 4 to 2 pixels to prevent wide labels like "Controls" from truncating to ellipsis at large UI scales. The four equal slots share the tab band, so reducing the pill width allows more room for label text while maintaining vertical padding for proper pill height.
Co-authored-by: Julia Nguyen <julia@uxj.io>
Co-authored-by: Julia Nguyen <julia@uxj.io>
…t-reader#2707) (cherry picked from commit 1d98ce1)
Implement SOF-based USB host detection for ESP32-S3 boards without VBUS pin (X4 Pro) by monitoring USB-Serial-JTAG frame counter. Add periodic battery percentage polling every 60 seconds when USB is connected to trigger display updates as battery charges. (cherry picked from commit 3c4377e)
Adapted for CrossInk from upstream commit cc96e3c (crosspoint-reader#2850).
Adapted for CrossInk from upstream commit 53232ee (crosspoint-reader#2830).
Adapted for CrossInk from upstream commit 046827f (crosspoint-reader#2781), preserving the arena-backed layout path and sparse ruby cache format.
Adapted for CrossInk from upstream commit c507e54 (crosspoint-reader#2834). CrossInk already validates obfuscated payloads, so this retains that format while adding synchronized snapshots, thread-safe key initialization, and bounded decoding.
Adapted for CrossInk from upstream commit e00f595 (crosspoint-reader#2880). The OTA path buffers the complete chip-ID header before its first flash write.
There was a problem hiding this comment.
💡 Codex Review
On hardware where reading the device ID or starting ESP-NOW fails, this literal is stored in errorMessage_ and rendered directly on the error screen; the same activity has several other literal setError(...) calls for storage, timeout, and queue failures. These messages therefore remain English regardless of the selected device language. Add translation keys and pass the corresponding tr(STR_*) values for every user-visible failure in this activity.
AGENTS.md reference: AGENTS.md:L51-L51
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| CROSSINK_RELEASE_VERSION: ${{ env.RELEASE_VERSION }} | ||
| run: pio run -j1 -e default -e sticky |
There was a problem hiding this comment.
Write the requested version into the active PlatformIO key
When workflow_dispatch supplies a version different from the checked-in value, the preceding sed still searches for the removed crossink_version key, so I verified that it leaves platformio.ini byte-for-byte unchanged. The newly added Sticky build then uses its hardcoded ${crossink.version}-sticky runtime version even though the artifact is named with ${RELEASE_VERSION}, causing OTA comparisons and diagnostics to report a different version from the released binary name. Update [crossink].version or make the Sticky environment consume the release variable before building. (sed --help confirms -i edits the input file in place; the exact substitution was tested against this file.)
AGENTS.md reference: AGENTS.md:L106-L106
Useful? React with 👍 / 👎.
| "dictionary-development", | ||
| "file-formats", |
There was a problem hiding this comment.
Keep linked reference pages reachable in the public build
These entries are removed from both navigation and static route generation, but public pages still link to them: docs/dictionary.md:185 targets dictionary-development.md, and docs/data-cache.md:81 targets file-formats.md. After the Pages workflow builds the Astro site, those links resolve to ungenerated HTML files and return 404; either retain routes for linked pages or rewrite the links to a reachable location.
Useful? React with 👍 / 👎.
| - `fs_/` - sample SD card contents (books, sleep images, themes) used by the simulator | ||
| - `nix/` - Nix/NixOS development shell definitions | ||
| - `managed_components/` - ESP-IDF managed component dependencies, fetched automatically during build | ||
| - [`SCOPE.md`](./SCOPE.md), [`GOVERNANCE.md`](./GOVERNANCE.md), [`CHANGELOG.md`](./CHANGELOG.md) - project scope, community principles, and release history |
There was a problem hiding this comment.
Remove the link to the deleted governance file
This newly added repository-layout entry links to GOVERNANCE.md, while the same commit deletes that file and repo-wide search finds no replacement. Anyone following the README link therefore gets a 404; remove the entry or point it to the document that now contains the community guidance.
Useful? React with 👍 / 👎.
| for (const node of chunk) partContainer.appendChild(partDoc.importNode(node, true)); | ||
| out[partPath] = safeSerialize(partDoc, content); | ||
| splitSections[path].push(partPath); |
There was a problem hiding this comment.
Rewrite anchors when splitting XHTML sections
When optimization splits a long chapter, IDs in later chunks move from chapter.xhtml to generated paths such as chapter__ci_section_002.xhtml, but this code only emits the chunks and updates the OPF spine; it never rewrites references based on where each ID moved. Consequently, TOC, subchapter, and footnote links such as chapter.xhtml#later-anchor still target the first part, where the anchor no longer exists. This affects any optimized EPUB with a post-split anchor, and section splitting is enabled by default in the conversion options.
Useful? React with 👍 / 👎.
| Use the X4 Pro environment to enable its touch, frontlight, and Home-key behavior: | ||
|
|
||
| ```sh | ||
| pio run -e x4-pro-simulator -t run_simulator | ||
| ``` |
There was a problem hiding this comment.
Restore the documented X4 Pro simulator environment
The documented command cannot run in this revision: I checked every tracked PlatformIO configuration and platformio.ini defines simulator, simulator-X3, and sticky-simulator, but no x4-pro-simulator environment. The environment existed earlier in the release history and was removed during release preparation while this documentation remained, so developers cannot exercise the newly documented Home-key and frontlight behavior; either restore the environment or remove/update the command and associated H-key claim.
Useful? React with 👍 / 👎.
| startActivityForResult(std::make_unique<DictionaryDefinitionActivity>( | ||
| renderer, mappedInput, controller.getFoundWord(), controller.getFoundLocation(), | ||
| true, cachePath, controller.getRecordHistory(), controller.getLookupWord(), | ||
| DictionaryLookupController::toHistStatus(controller.getFoundStatus()), nullptr, | ||
| nullptr, dictionaryFontFamilyName, dictionaryFontPointSize), |
There was a problem hiding this comment.
Make history-definition allocation fallible
On an ESP32-C3 with a fragmented or low internal heap, selecting a word from lookup history reaches this std::make_unique allocation for the relatively large DictionaryDefinitionActivity. Because firmware exceptions are disabled, the underlying bare new aborts on allocation failure instead of returning an error, rebooting the reader rather than using the existing memory-error flow. Allocate with makeUniqueNoThrow and handle nullptr, as the word-selection path already does for the same activity.
AGENTS.md reference: AGENTS.md:L55-L56
Useful? React with 👍 / 👎.
| // Add Access-Control-Allow-* headers to every response so web-based clients | ||
| // and PWAs on other origins can use the HTTP API. Preflight OPTIONS requests | ||
| // are answered in handleNotFound(). | ||
| server->enableCORS(true); |
There was a problem hiding this comment.
Restrict cross-origin access to the unauthenticated API
While the device web server is active, this enables cross-origin reads for arbitrary websites even though the inspected route table has no authentication: /api/files and /download expose SD-card contents, and the same server registers settings, credential, upload, and deletion endpoints. A malicious page visited by a user who is connected to the reader AP or shares its LAN can therefore access the reader API from the browser rather than being stopped by the same-origin policy. Use an explicit trusted-origin/authentication scheme instead of globally enabling CORS.
Useful? React with 👍 / 👎.
| } else if (s.valuePtr) { | ||
| doc["value"] = static_cast<int>(enumDisplayIndexForRawValue(s, SETTINGS.*(s.valuePtr))); |
There was a problem hiding this comment.
Derive the SD-font selection from its own size list
When an SD font is selected, the response replaces the option labels with that family's available sizes but still computes value using the base built-in raw values [10, 12, 14, 16]. For a family exposing [8, 9, 10, 12], a saved 10-point size is consequently returned as index 0 and the web page displays 8 points as selected. Compute the display index against selectedSdFamily->availableSizes() so the settings portal reports the active size correctly.
Useful? React with 👍 / 👎.
New
Settings > Reader > Font Optionsor from inside a book withBook Options > Font OptionsIncrementalorFull Sectionindexing globally or per book. Incremental indexing prepares a few pages ahead while Full Section indexing (the old default behavior and will remain the default) prepares the entire section/chapter from the beginning.Full Sectionindexing if you generally don't have issues with EPUBs rendering.Send to Nearby Device. On the receiving device, navigate toFile Transfer >Word Spacingsetting has been added toSettings > Reader > Font Options > Word Spacing. This allows you to set the spacing between words up to 5 levels.Settings > System > Device.Changed
Download Font Size Rangenow displays the font point-size ranges: 8–12pt, 10–16pt, 14–20pt, and 8–20pt, replacing the old build names it corresponded to.Download Alloption has been removed to avoid excessive screen ghosting after very long Wi-Fi usage (downloading all fonts takes a very long time and is not recommended); fonts can still be downloaded individually or updated together.Fixed
Full Sectionindexing (fixes Books re-index in every chapter (1.4-tiny) #383)WIFI_STOREis only loaded insideWifiSelectionActivity, so any other consumer sees an empty credential list #421