Files
crosspoint-reader-mod/chat-summaries/2026-02-26_18-46-summary.md
cottongin dfbc931c14 mod: Phase 1 - bring forward mod-exclusive files with ActivityManager migration
Brings ~55 mod-exclusive files to the upstream-based mod/master-resync branch:

Activities (migrated to new ActivityManager pattern):
- Clock/Time: SetTimeActivity, SetTimezoneOffsetActivity, NtpSyncActivity
- Dictionary: DictionaryDefinitionActivity, DictionarySuggestionsActivity,
  DictionaryWordSelectActivity, LookedUpWordsActivity
- Bookmark: EpubReaderBookmarkSelectionActivity
- Book management: BookManageMenuActivity, EndOfBookMenuActivity
- OPDS: OpdsServerListActivity, OpdsSettingsActivity
- Utility: DirectoryPickerActivity, NumericStepperActivity

Utilities (unchanged):
- BookManager, BookSettings, BookmarkStore, BootNtpSync
- Dictionary, LookupHistory, TimeSync, OpdsServerStore

Libraries: PlaceholderCover, TableData, ChapterXPathIndexer
Scripts: inject_mod_version, generate_book_icon, preview_placeholder_cover
Docs: KOReader sync XPath mapping

Migration changes:
- ActivityWithSubactivity -> Activity base class
- Callback constructors -> finish()/setResult() pattern
- enterNewActivity() -> startActivityForResult()
- Activity::RenderLock&& -> RenderLock&&

These files won't compile yet - they reference mod settings and I18n
strings that will be added in subsequent phases.

Made-with: Cursor
2026-03-07 15:10:00 -05:00

3.0 KiB

Port Upstream PRs #1207 and #1209

Task

Ported two upstream PRs from crosspoint-reader/crosspoint-reader to the fork:

  • PR #1207: fix: use HTTPClient::writeToStream for downloading files from OPDS
  • PR #1209: feat: Support for multiple OPDS servers

Cherry-picking was not possible due to significant divergences (WiFiClient vs NetworkClient naming, i18n changes, binary vs JSON settings, missing JsonSettingsIO/ObfuscationUtils).

Changes Made

PR #1207 (2 files modified)

  • src/network/HttpDownloader.cpp — Added FileWriteStream class, replaced manual chunked download loop with HTTPClient::writeToStream, improved Content-Length handling and post-download validation
  • src/activities/browser/OpdsBookBrowserActivity.cpp — Truncated download status text to fit screen width

PR #1209 (6 files created, ~15 files modified, 2 files deleted)

New files:

  • src/OpdsServerStore.h / src/OpdsServerStore.cpp — Singleton store for up to 8 OPDS servers with MAC-based XOR+base64 password obfuscation and JSON persistence (self-contained — fork lacks JsonSettingsIO/ObfuscationUtils, so persistence was inlined)
  • src/activities/settings/OpdsServerListActivity.h / .cpp — Dual-mode activity: settings list (add/edit/delete) and server picker
  • src/activities/settings/OpdsSettingsActivity.h / .cpp — Individual server editor (name, URL, username, password, delete)

Modified files:

  • src/network/HttpDownloader.h / .cpp — Added per-call username/password parameters (default empty), removed global SETTINGS dependency
  • src/activities/browser/OpdsBookBrowserActivity.h / .cpp — Constructor accepts OpdsServer, uses server-specific credentials and URL, shows server name in header
  • src/activities/home/HomeActivity.h / .cpphasOpdsUrlhasOpdsServers, uses OPDS_STORE.hasServers()
  • src/main.cpp — Added OPDS_STORE loading on boot, server picker when multiple servers configured
  • src/activities/settings/SettingsActivity.cpp — Replaced CalibreSettingsActivity with OpdsServerListActivity
  • src/network/CrossPointWebServer.h / .cpp — Added REST endpoints: GET/POST /api/opds, POST /api/opds/delete
  • src/network/html/SettingsPage.html — Added OPDS server management UI (CSS + JS)
  • src/SettingsList.h — Removed legacy OPDS entries (opdsServerUrl, opdsUsername, opdsPassword)
  • 9 translation YAML files — Added STR_ADD_SERVER, STR_SERVER_NAME, STR_NO_SERVERS, STR_DELETE_SERVER, STR_DELETE_CONFIRM, STR_OPDS_SERVERS

Deleted files:

  • src/activities/settings/CalibreSettingsActivity.h / .cpp

Key Adaptation Decisions

  • Kept WiFiClient/WiFiClientSecure naming (fork hasn't adopted NetworkClient rename)
  • Inlined JSON persistence and MAC-based obfuscation directly into OpdsServerStore.cpp (fork lacks JsonSettingsIO and ObfuscationUtils libraries)
  • Legacy single-server settings auto-migrate to new opds.json on first boot

Build Status

Compilation verified: SUCCESS (RAM: 32.8%, Flash: 71.4%)