Files
2026-10-13 17:10:50 +03:00

10 KiB

Tasks

1. Предпосылки

  • 1.1 Убрать правило data/ из .gitignore и убедиться, что git status показывает файлы android/app/src/main/java/com/galo/android/data/** (проверка: git status --porcelain и git check-ignore больше не игнорируют их)
  • 1.2 Проверить, что проект Android собирается и тесты проходят после включения слоя данных в git (проверка: cd android && ./gradlew test lintDebug)

2. Сервер: контрольная сумма оригинала

  • 2.1 Добавить контрольную сумму оригинала в данные фото (модели, запросы, ответы) на существующем objects.checksum, без миграций БД (проверка: юнит-тест на сопоставление и на одинаковое содержимое)
  • 2.2 Убедиться, что контрольная сумма присутствует и в одиночной выдаче фото, и в листинге альбома (проверка: интеграционный тест ответов GET /api/photos/:id и GET /api/albums/:id/photos)

3. Источник MediaStore, индекс и просмотр (режим A)

  • 3.1 Добавить права READ_MEDIA_IMAGES/READ_MEDIA_VIDEO (и legacy READ_EXTERNAL_STORAGE) и запрос доступа; проверить поведение при предоставленном и непредоставленном доступе
  • 3.2 Реализовать источник альбомов устройства (bucket'ы) и их содержимого через MediaStore (проверка: тест перечисления на подготовленном наборе)
  • 3.3 Добавить в Room индекс содержимого синхронизируемого альбома, провенанс загрузок и связь с серверным альбомом; проверить миграцию схемы
  • 3.4 Реализовать генерацию превью на устройстве (фото и постер видео, длинная сторона ~1600, q80) в приватный кэш (проверка: тест размеров и наличия файлов кэша)
  • 3.5 Сделать смешанный список альбомов (серверные + устройства) с пометкой источника и указателем связи (проверка: UI-тест списка и связанной пары)
  • 3.6 Сделать экран альбома устройства с сеткой и настройками синхронизации по свайпу вправо (только выбор режима; целевой альбом выбирается при включении) (проверка: UI-тест открытия и панели)
  • 3.7 Реализовать режим A: просмотр альбома локально без запросов к серверу (проверка: тест, что при режиме A исходящих запросов по альбому нет)
  • 3.8 Описать в android/README.md доступ к альбомам устройства, права и режим A (проверка: описанные команды/шаги соответствуют поведению)

4. Идентичность и синхронизация изменений (режим B)

  • 4.1 Реализовать content-hash уходящего содержимого и сопоставление с контрольной суммой сервера, чтобы не загружать уже имеющееся (проверка: тест повторной синхронизации без новых загрузок)
  • 4.2 Реализовать движок обнаружения изменений на устройстве (getGeneration/ContentObserver) — добавление, удаление вне приложения, переименование, перенос, изменение содержимого (проверка: тесты на каждый вид изменения)
  • 4.3 Подключить синхронизацию изменений к существующей очереди UploadRepository/UploadWorker (проверка: интеграционный тест загрузки нового содержимого в целевой альбом)
  • 4.4 Реализовать политику удалений «только собственные загрузки» (проверка: тесты на удаление своей загрузки и на сохранение чужих фото)
  • 4.5 Реализовать синхронизацию переименования, переноса и правки контента (как новая загрузка + удаление устаревшей) (проверка: тесты на PATCH/move и на замену контента)
  • 4.6 Реализовать отражение серверных изменений (SSE + ?since=) в локальном представлении без изменения оригиналов на устройстве (проверка: тесты нового фото с другого устройства и удаления на сервере)
  • 4.7 Включить автоматическую синхронизацию: observer в foreground и периодический WorkManager с ограничением сети из настроек (проверка: тест, что при «только Wi-Fi» синхронизация не стартует на сотовой сети)
  • 4.8 Описать в android/README.md режим B, дедуп и правила фоновой синхронизации (проверка: описание соответствует реализованному поведению)

5. Разгрузка места (режим C)

  • 5.1 Реализовать разгрузку фото: автоматическая перезапись файла превью с сохранением даты съёмки и места в альбоме (широкий доступ к файлам запрашивается при включении режима) (проверка: тест/ручная проверка сохранения _ID, даты и папки)
  • 5.2 Реализовать разгрузку видео как постер: удаление видео-записи и вставка постера-картинки в ту же папку (проверка: тест типа и расположения записи)
  • 5.3 Реализовать автоматическую разгрузку после успешной загрузки, без отдельного действия в настройках альбома (проверка: тест, что исходный ассет после загрузки становится превью)
  • 5.4 Писать и читать EXIF-метку провенанса (server_album, server_photo, original_hash, device, mode) на разгруженных превью и постерах (проверка: тест записи и чтения метки)
  • 5.5 Реализовать восстановление связи и провенанса из метки после переустановки, с безопасным поведением при утрате метки (проверка: тест восстановления и тест «неопознанный элемент не удаляется и не перезагружается»)
  • 5.6 Описать в android/README.md режим C, широкий доступ к файлам, постер видео и метку провенанса (проверка: описание соответствует поведению)

6. Обратимость и переходы режимов

  • 6.1 Реализовать возврат оригиналов из режима C на устройство с проверкой свободного места (проверка: тест возврата и предупреждения при нехватке места)
  • 6.2 Реализовать предупреждения при выходе из C и при отказе от возврата (проверка: UI-тест текста предупреждения)
  • 6.3 Реализовать отвязку альбома и выключение синхронизации без удаления фото с сервера (проверка: тест, что серверные фото остаются)
  • 6.4 Реализовать и проверить переходы A↔B↔C, включая безопасный повторный выбор цели после переустановки (проверка: тесты переходов, отсутствие дублей при возврате с оригиналом)
  • 6.5 Описать в android/README.md обратимость, отвязку и переходы режимов (проверка: описание соответствует поведению)

7. Интеграция

  • 7.1 Прогнать сквозной сценарий на устройстве против запущенного galo: A → B → C → возврат, включая разгрузку и переустановку (проверка: ручной сценарий выполняется без потери и без дублей)
  • 7.2 Убедиться, что весь набор проверок клиента проходит (проверка: cd android && ./gradlew test lintDebug assembleDebug)
  • 7.3 Убедиться, что серверные тесты проходят с новым полем (проверка: go test ./... в backend)

Workflow follow-up

  • Запустить openspec validate add-phone-album-sync --strict перед архивацией.
  • Архивировать изменение после выполнения требований ревью проекта.
  • Проверить архивированный результат (обновлённые основные спеки).