feat: add directory picker for OPDS downloads with per-server default path

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
This commit is contained in:
cottongin
2026-03-02 04:28:57 -05:00
parent 2aa13ea2de
commit 42011d5977
20 changed files with 363 additions and 72 deletions

View File

@@ -422,6 +422,9 @@ enum class StrId : uint16_t {
STR_DELETE_SERVER,
STR_DELETE_CONFIRM,
STR_OPDS_SERVERS,
STR_SAVE_HERE,
STR_SELECT_FOLDER,
STR_DOWNLOAD_PATH,
// Sentinel - must be last
_COUNT
};

View File

@@ -350,3 +350,6 @@ STR_NO_SERVERS: "Žádné OPDS servery nejsou nakonfigurovány"
STR_DELETE_SERVER: "Smazat server"
STR_DELETE_CONFIRM: "Smazat tento server?"
STR_OPDS_SERVERS: "OPDS servery"
STR_SAVE_HERE: "Uložit zde"
STR_SELECT_FOLDER: "Vybrat složku"
STR_DOWNLOAD_PATH: "Cesta ke stažení"

View File

@@ -386,3 +386,6 @@ STR_NO_SERVERS: "No OPDS servers configured"
STR_DELETE_SERVER: "Delete Server"
STR_DELETE_CONFIRM: "Delete this server?"
STR_OPDS_SERVERS: "OPDS Servers"
STR_SAVE_HERE: "Save Here"
STR_SELECT_FOLDER: "Select Folder"
STR_DOWNLOAD_PATH: "Download Path"

View File

@@ -350,3 +350,6 @@ STR_NO_SERVERS: "Aucun serveur OPDS configuré"
STR_DELETE_SERVER: "Supprimer le serveur"
STR_DELETE_CONFIRM: "Supprimer ce serveur ?"
STR_OPDS_SERVERS: "Serveurs OPDS"
STR_SAVE_HERE: "Enregistrer ici"
STR_SELECT_FOLDER: "Sélectionner un dossier"
STR_DOWNLOAD_PATH: "Chemin de téléchargement"

View File

@@ -350,3 +350,6 @@ STR_NO_SERVERS: "Keine OPDS-Server konfiguriert"
STR_DELETE_SERVER: "Server löschen"
STR_DELETE_CONFIRM: "Diesen Server löschen?"
STR_OPDS_SERVERS: "OPDS-Server"
STR_SAVE_HERE: "Hier speichern"
STR_SELECT_FOLDER: "Ordner auswählen"
STR_DOWNLOAD_PATH: "Download-Pfad"

View File

@@ -350,3 +350,6 @@ STR_NO_SERVERS: "Nenhum servidor OPDS configurado"
STR_DELETE_SERVER: "Excluir servidor"
STR_DELETE_CONFIRM: "Excluir este servidor?"
STR_OPDS_SERVERS: "Servidores OPDS"
STR_SAVE_HERE: "Salvar aqui"
STR_SELECT_FOLDER: "Selecionar pasta"
STR_DOWNLOAD_PATH: "Caminho de download"

View File

@@ -325,3 +325,6 @@ STR_NO_SERVERS: "Niciun server OPDS configurat"
STR_DELETE_SERVER: "Șterge serverul"
STR_DELETE_CONFIRM: "Ștergi acest server?"
STR_OPDS_SERVERS: "Servere OPDS"
STR_SAVE_HERE: "Salvează aici"
STR_SELECT_FOLDER: "Selectează dosar"
STR_DOWNLOAD_PATH: "Cale descărcare"

View File

@@ -350,3 +350,6 @@ STR_NO_SERVERS: "Нет настроенных серверов OPDS"
STR_DELETE_SERVER: "Удалить сервер"
STR_DELETE_CONFIRM: "Удалить этот сервер?"
STR_OPDS_SERVERS: "Серверы OPDS"
STR_SAVE_HERE: "Сохранить здесь"
STR_SELECT_FOLDER: "Выбрать папку"
STR_DOWNLOAD_PATH: "Путь загрузки"

View File

@@ -350,3 +350,6 @@ STR_NO_SERVERS: "No hay servidores OPDS configurados"
STR_DELETE_SERVER: "Eliminar servidor"
STR_DELETE_CONFIRM: "¿Eliminar este servidor?"
STR_OPDS_SERVERS: "Servidores OPDS"
STR_SAVE_HERE: "Guardar aquí"
STR_SELECT_FOLDER: "Seleccionar carpeta"
STR_DOWNLOAD_PATH: "Ruta de descarga"

View File

@@ -350,3 +350,6 @@ STR_NO_SERVERS: "Inga OPDS-servrar konfigurerade"
STR_DELETE_SERVER: "Ta bort server"
STR_DELETE_CONFIRM: "Ta bort denna server?"
STR_OPDS_SERVERS: "OPDS-servrar"
STR_SAVE_HERE: "Spara här"
STR_SELECT_FOLDER: "Välj mapp"
STR_DOWNLOAD_PATH: "Nedladdningssökväg"