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

63 lines
10 KiB
Markdown

# Tasks
## 1. Предпосылки
- [x] 1.1 Убрать правило `data/` из `.gitignore` и убедиться, что `git status` показывает файлы `android/app/src/main/java/com/galo/android/data/**` (проверка: `git status --porcelain` и `git check-ignore` больше не игнорируют их)
- [x] 1.2 Проверить, что проект Android собирается и тесты проходят после включения слоя данных в git (проверка: `cd android && ./gradlew test lintDebug`)
## 2. Сервер: контрольная сумма оригинала
- [x] 2.1 Добавить контрольную сумму оригинала в данные фото (модели, запросы, ответы) на существующем `objects.checksum`, без миграций БД (проверка: юнит-тест на сопоставление и на одинаковое содержимое)
- [x] 2.2 Убедиться, что контрольная сумма присутствует и в одиночной выдаче фото, и в листинге альбома (проверка: интеграционный тест ответов `GET /api/photos/:id` и `GET /api/albums/:id/photos`)
## 3. Источник MediaStore, индекс и просмотр (режим A)
- [x] 3.1 Добавить права `READ_MEDIA_IMAGES`/`READ_MEDIA_VIDEO` (и legacy `READ_EXTERNAL_STORAGE`) и запрос доступа; проверить поведение при предоставленном и непредоставленном доступе
- [x] 3.2 Реализовать источник альбомов устройства (bucket'ы) и их содержимого через MediaStore (проверка: тест перечисления на подготовленном наборе)
- [x] 3.3 Добавить в Room индекс содержимого синхронизируемого альбома, провенанс загрузок и связь с серверным альбомом; проверить миграцию схемы
- [x] 3.4 Реализовать генерацию превью на устройстве (фото и постер видео, длинная сторона ~1600, q80) в приватный кэш (проверка: тест размеров и наличия файлов кэша)
- [x] 3.5 Сделать смешанный список альбомов (серверные + устройства) с пометкой источника и указателем связи (проверка: UI-тест списка и связанной пары)
- [x] 3.6 Сделать экран альбома устройства с сеткой и настройками синхронизации по свайпу вправо (только выбор режима; целевой альбом выбирается при включении) (проверка: UI-тест открытия и панели)
- [x] 3.7 Реализовать режим A: просмотр альбома локально без запросов к серверу (проверка: тест, что при режиме A исходящих запросов по альбому нет)
- [x] 3.8 Описать в `android/README.md` доступ к альбомам устройства, права и режим A (проверка: описанные команды/шаги соответствуют поведению)
## 4. Идентичность и синхронизация изменений (режим B)
- [x] 4.1 Реализовать content-hash уходящего содержимого и сопоставление с контрольной суммой сервера, чтобы не загружать уже имеющееся (проверка: тест повторной синхронизации без новых загрузок)
- [x] 4.2 Реализовать движок обнаружения изменений на устройстве (`getGeneration`/`ContentObserver`) — добавление, удаление вне приложения, переименование, перенос, изменение содержимого (проверка: тесты на каждый вид изменения)
- [x] 4.3 Подключить синхронизацию изменений к существующей очереди `UploadRepository`/`UploadWorker` (проверка: интеграционный тест загрузки нового содержимого в целевой альбом)
- [x] 4.4 Реализовать политику удалений «только собственные загрузки» (проверка: тесты на удаление своей загрузки и на сохранение чужих фото)
- [x] 4.5 Реализовать синхронизацию переименования, переноса и правки контента (как новая загрузка + удаление устаревшей) (проверка: тесты на `PATCH`/move и на замену контента)
- [x] 4.6 Реализовать отражение серверных изменений (SSE + `?since=`) в локальном представлении без изменения оригиналов на устройстве (проверка: тесты нового фото с другого устройства и удаления на сервере)
- [x] 4.7 Включить автоматическую синхронизацию: observer в foreground и периодический WorkManager с ограничением сети из настроек (проверка: тест, что при «только Wi-Fi» синхронизация не стартует на сотовой сети)
- [x] 4.8 Описать в `android/README.md` режим B, дедуп и правила фоновой синхронизации (проверка: описание соответствует реализованному поведению)
## 5. Разгрузка места (режим C)
- [x] 5.1 Реализовать разгрузку фото: автоматическая перезапись файла превью с сохранением даты съёмки и места в альбоме (широкий доступ к файлам запрашивается при включении режима) (проверка: тест/ручная проверка сохранения `_ID`, даты и папки)
- [x] 5.2 Реализовать разгрузку видео как постер: удаление видео-записи и вставка постера-картинки в ту же папку (проверка: тест типа и расположения записи)
- [x] 5.3 Реализовать автоматическую разгрузку после успешной загрузки, без отдельного действия в настройках альбома (проверка: тест, что исходный ассет после загрузки становится превью)
- [x] 5.4 Писать и читать EXIF-метку провенанса (`server_album`, `server_photo`, `original_hash`, `device`, `mode`) на разгруженных превью и постерах (проверка: тест записи и чтения метки)
- [x] 5.5 Реализовать восстановление связи и провенанса из метки после переустановки, с безопасным поведением при утрате метки (проверка: тест восстановления и тест «неопознанный элемент не удаляется и не перезагружается»)
- [x] 5.6 Описать в `android/README.md` режим C, широкий доступ к файлам, постер видео и метку провенанса (проверка: описание соответствует поведению)
## 6. Обратимость и переходы режимов
- [x] 6.1 Реализовать возврат оригиналов из режима C на устройство с проверкой свободного места (проверка: тест возврата и предупреждения при нехватке места)
- [x] 6.2 Реализовать предупреждения при выходе из C и при отказе от возврата (проверка: UI-тест текста предупреждения)
- [x] 6.3 Реализовать отвязку альбома и выключение синхронизации без удаления фото с сервера (проверка: тест, что серверные фото остаются)
- [x] 6.4 Реализовать и проверить переходы A↔B↔C, включая безопасный повторный выбор цели после переустановки (проверка: тесты переходов, отсутствие дублей при возврате с оригиналом)
- [x] 6.5 Описать в `android/README.md` обратимость, отвязку и переходы режимов (проверка: описание соответствует поведению)
## 7. Интеграция
- [x] 7.1 Прогнать сквозной сценарий на устройстве против запущенного galo: A → B → C → возврат, включая разгрузку и переустановку (проверка: ручной сценарий выполняется без потери и без дублей)
- [x] 7.2 Убедиться, что весь набор проверок клиента проходит (проверка: `cd android && ./gradlew test lintDebug assembleDebug`)
- [x] 7.3 Убедиться, что серверные тесты проходят с новым полем (проверка: `go test ./...` в `backend`)
## Workflow follow-up
- Запустить `openspec validate add-phone-album-sync --strict` перед архивацией.
- Архивировать изменение после выполнения требований ревью проекта.
- Проверить архивированный результат (обновлённые основные спеки).