Files
Aletheia/docs/release-2.40.md
T

8.6 KiB

Aletheia 2.40 — результат реализации аудита

Дата проверки: 6 сентября 2026. Android versionCode: 51.

Реализовано

  • Библиотека: фильтры остаются доступны при пустой выдаче; очистка сбрасывает запрос и выбранный фильтр (BookshelfFragment.kt).
  • База версии 9: источник каталога, уникальность пары источник/ID, индексированный поиск; отдельные обновления метаданных, позиции чтения, карты страниц и позиции аудио (AppDatabaseHelper.kt, BookRepository.kt). Старым записям без известного источника сервер не приписывается.
  • FB2 передаётся XML-парсеру исходным потоком с учётом декларации кодировки (BookParserService.kt).
  • Общие загрузки на уровне приложения: каталог и карточка получают один результат, прогресс привязан к книге; закрытие экрана не отменяет импорт (BookDownloads.kt).
  • Каталог: избранное с сохранёнными метаданными, настоящая навигация по доступным OPDS-разделам, подборка из каталога, различение источников в карточках. Если сервер не предоставляет раздел, приложение сообщает об этом. Старое избранное с неизвестным источником показано отдельно, без подстановки другой книги (CatalogFavorites.kt, QBooksLibraryFragment.kt).
  • Плеер и таймер сна перенесены в MediaSessionService; перемотка использует безопасные вычисления; кнопки имеют смысловые подписи, таймер показывает оставшееся время (AudioPlaybackService.kt, PlaybackMath.kt, AudioBookPlayerActivity.kt).
  • Готовые M4A сохраняются в постоянном каталоге приложения, существующие файлы переносятся из кэша; добавлен экспорт через системный диалог сохранения (AudioBookRepository.kt, BookshelfFragment.kt).
  • HTTP-ошибки разделены на окончательные и временные, число повторов ограничено. Удаление сохраняет идентификатор серверного задания в устойчивую очередь очистки до подтверждения; позднее завершение загрузки не восстанавливает удалённую запись (AudioRetryPolicy, AudioJobCleanup, AudioBookGenerationService).
  • Из APK удалён общий токен. Добавлены одноразовое подключение устройства, хранение полномочий через Android Keystore, серверная проверка владельца задания и отзыв устройств. Публичный health больше не сообщает ID задания (AudioDeviceCredentials.kt, device_auth.py, audiobook_service.py).
  • Синтез выполняется отдельным процессом; его завершение не перезапускает HTTP API (worker_runner.py).
  • Из ReaderActivity выделены сохранение состояния и действия с выделенным текстом; сохранены существующие ReaderStateCoordinator и ReaderWebController. Это первый этап постепенного разделения Activity, а не полная переработка всех панелей.
  • Ключ подписи перенесён в %USERPROFILE%\.aletheia\signing, удалён из рабочего дерева Git; сценарий сборки использует внешнее хранилище. История Git не переписана и по-прежнему содержит прежние версии файлов ключа.
  • Сценарии подготовки и публикации проверяют коды завершения, подпись и SHA-256. Перед публикацией выполняются резервное копирование SQLite и integrity_check.

Проверки

Проверка Результат и источник
Kotlin/JVM 38 тестов, 0 ошибок и падений; app/build/test-results/testDebugUnitTest/TEST-*.xml, artifacts/release-final-2.40.log
Android API 35, эмулятор 8 тестов, PASS; artifacts/instrumentation-2.40.log
Сервер 6 тестов, PASS; artifacts/server-tests-2.40.log
Android lint 0 ошибок, 369 предупреждений; app/build/reports/lint-results-debug.txt
Области нажатия scripts/test-accessibility-layout.ps1: PASS
Release assembleRelease: PASS; artifacts/release-final-2.40.log
Обновление APK Установка 2.39 → adb install -r 2.40 на эмуляторе: Success; запуск MainActivity: Status ok

Восемь Android-тестов проверяют: таймер при выключенном экране; перенос аудиофайла из кэша; миграцию базы 8→9; сохранение позиции аудио при обновлении задания; сохранение позиции чтения при обновлении метаданных; независимость одинаковых ID разных источников; одну загрузку для двух экранов при отмене наблюдателя; восстановление библиотеки после пустого фильтра.

Физический телефон и TalkBack не проверялись. Полный сценарий восстановления EPUB/FB2 после поворота и смены шрифта не проверен на устройстве в этом выпуске; имеющиеся JVM-тесты проверяют парсер и координатор состояния, а не весь WebView-сценарий.

Публикация

  • Argus: stable/android, версия 2.40, пакет aletheia-2.40-51.apk.
  • Публичный manifest.
  • Скачать APK.
  • SHA-256 локального и повторно скачанного публичного APK: c3df0b3d0e6afeda5fe22986cbf4165fab394689c382044b927bdd7c33cdec83.
  • SHA-256 сертификата обеих версий: f4a74d73540d3ea7f092012d50e798d0fbb9c61d3f00483163dc22b04acda764.
  • Резервная копия БД Аргуса: /mnt/data/argus/backups/argus-before-aletheia-kotlin-2.40-0D2D1C6B-7666-4967-95E2-30876538ADF3.db.
  • Журнал публикации: artifacts/publication-2.40.log.

Незавершённое развёртывание аудиосервиса

CMP 192.168.0.112 не отвечает по SSH (тайм-аут); публичный /aletheia-tts/health возвращает HTTP 502. Серверные изменения проверены локальными тестами, но не развёрнуты на CMP. Синтез на GPU и подключение реального устройства по новому протоколу не подтверждены.

Подготовлен архив artifacts/aletheia-audiobook-service-2.40.tar.gz. После восстановления доступа нужны резервная копия jobs.db3, обновление службы по server/audiobook/README.md, проверка публичного маршрута и подключение устройства одноразовым кодом. Старый общий токен новая версия APK не использует; без обновления CMP создание новых аудиокниг недоступно. Чтение и воспроизведение уже сохранённых файлов работают локально.