When downloading a book via OPDS, a directory picker now lets the user
choose the save location instead of always saving to the SD root. Each
OPDS server has a configurable default download path (persisted in
opds.json) that the picker opens to. Falls back to "/" if the saved
path no longer exists on disk.
- Add DirectoryPickerActivity (browse-only directory view with "Save Here")
- Add PICKING_DIRECTORY state to OpdsBookBrowserActivity
- Add downloadPath field to OpdsServer with JSON serialization
- Add Download Path setting to OPDS server edit screen
- Extract sortFileList() to StringUtils for shared use
- Add i18n strings: STR_SAVE_HERE, STR_SELECT_FOLDER, STR_DOWNLOAD_PATH
Made-with: Cursor
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