Port two upstream PRs:
- PR #1207: Replace manual chunked download loop with
HTTPClient::writeToStream via a FileWriteStream adapter, improving
reliability for OPDS file downloads including chunked transfers.
- PR #1209: Add support for multiple OPDS servers with a new
OpdsServerStore (JSON persistence with MAC-based password obfuscation),
OpdsServerListActivity and OpdsSettingsActivity UIs, per-server
credentials passed to HttpDownloader, web UI management endpoints,
and migration from legacy single-server settings.
Made-with: Cursor
New "Auto Sync on Boot" toggle in Clock Settings. When enabled, a
background FreeRTOS task scans for saved WiFi networks at boot,
connects, syncs time via NTP, then tears down WiFi — all without
blocking boot or requiring user interaction. If no saved network is
found after two scan attempts (with a 3-second retry gap), it bails
silently.
Conflict guards (BootNtpSync::cancel()) added to all WiFi-using
activities so the background task cleans up before any user-initiated
WiFi flow. Also fixes clock not appearing in the header until a button
press by detecting the invalid→valid time transition after NTP sync.
Made-with: Cursor
Adds a "Sync Clock" action in Settings > Clock that connects to WiFi
(auto-connecting to saved networks or prompting for selection) and
performs a blocking NTP time sync. Shows the synced time on success
with an auto-dismiss countdown, or an error on failure.
Co-authored-by: Cursor <cursoragent@cursor.com>
- #1038 (partial): Add .erase() for consumed words in layoutAndExtractLines
to fix redundant early flush bug; fix wordContinues flag in hyphenateWordAtIndex
- #1037: Add combining mark handling for hyphenation (NFC-like precomposition)
and rendering (base glyph tracking in EpdFont, GfxRenderer including CCW)
- #1045: Shorten STR_FORGET_BUTTON labels across all 9 translation files
- #1019: Display file extensions in File Browser via getFileExtension helper
- Pull romanian.yaml from upstream/master (merged PR #987)
Co-authored-by: Cursor <cursoragent@cursor.com>