10 KiB
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(и legacyREAD_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перед архивацией. - Архивировать изменение после выполнения требований ревью проекта.
- Проверить архивированный результат (обновлённые основные спеки).