Files
iu 1eb1177273 feat(android): статус синхронизации на карточке и безопасная разгрузка
Карточка альбома устройства получает третью строку: метку режима («Копии»/
«Перенос») и ход загрузки. Процент считается как (uploaded + running) / total
для обоих синхронизируемых режимов, пульсирует только при активной загрузке,
показывает очередь, ожидание Wi-Fi и ошибку. В режиме переноса карточка
показывает и карту памяти, и облако — режимы различает метка, а не значки.

Разгрузка оригиналов теперь требует подтверждённой серверной копии в текущем
целевом альбоме: устаревший serverPhotoId перепроверяется по альбому, смена
цели переносит уже загруженные фото и отклоняется, если перенести нельзя.
Потеря серверной копии видна на карточке и на экране альбома, автозатирания
превью нет.

Изменения OpenSpec: android-album-card-sync-status, safe-album-offload.
2026-10-16 18:36:51 +03:00

5.0 KiB
Raw Permalink Blame History

Tasks

1. Доверие к живой серверной копии в планировщике

  • 1.1 В SyncPlanner.plan учитывать только идентификаторы фото, присутствующих в целевом альбоме (значения serverChecksums): устаревшая запись ведёт к дедупу или повторной загрузке, а удаление серверных фото ограничивается живым набором; покрыть SyncPlannerTest случаями «копия пропала, оригинал локально», «копия пропала, локально превью» и «чужое фото не удаляется» (cd android && ./gradlew :app:testDebugUnitTest --tests "*SyncPlannerTest").
  • 1.2 Проверить сценарии координатора: устаревший serverPhotoId при локальном оригинале ставит загрузку в очередь, а не разгружает, и не порождает удаление чужого фото (cd android && ./gradlew :app:testDebugUnitTest --tests "*SyncCoordinatorTest").

2. Защищённая разгрузка

  • 2.1 Изменить AssetOffloader.offload, принимая живой набор серверных фото, и добавить исход «копии нет»; OffloadManager SHALL отказываться от разгрузки без живой копии — проверить OffloadManagerTest (cd android && ./gradlew :app:testDebugUnitTest --tests "*OffloadManagerTest").
  • 2.2 Передать живой набор в разгрузку из SyncCoordinator.offloadUploaded, из UploadWorker.recordProvenance (только что созданное фото) и из DeviceAlbumViewModel.freeSpace (набор из текущего целевого альбома, при ошибке — без разгрузки); покрыть SyncCoordinatorTest случаем «копия не подтверждена — разгрузки нет» (cd android && ./gradlew :app:testDebugUnitTest --tests "*SyncCoordinatorTest").

3. Перенос копий при смене целевого альбома

  • 3.1 Добавить в SyncCoordinator операцию смены цели: перенести фото провенанса в новый альбом, перечитать новый альбом и переключить связь только при подтверждённом переносе; при отказе связь не менять и вернуть результат с числом непереносимых фото; покрыть SyncCoordinatorTest тремя сценариями (перенос удался, прежний альбом недоступен, часть копий не переносится) (cd android && ./gradlew :app:testDebugUnitTest --tests "*SyncCoordinatorTest").
  • 3.2 Перевести DeviceAlbumViewModel.setTarget и createAlbum на новую операцию и показать отказ пользователю; покрыть DeviceAlbumViewModel тестом либо тестом экрана, что при отказе связь сохраняется (cd android && ./gradlew :app:testDebugUnitTest --tests "*DeviceAlbum*").

4. Видимость потерянной серверной копии

  • 4.1 Добавить в SyncDao/SyncRepository счётчик ассетов в состоянии «потеряна копия» по альбомам и юнит-тест на него (cd android && ./gradlew :app:testDebugUnitTest --tests "*SyncRepositoryTest").
  • 4.2 Расширить AlbumSyncProgress числом потерянных копий так, чтобы это состояние перекрывало прогресс и выделялось цветом; покрыть AlbumSyncProgressTest и связать со счётчиком в AlbumsViewModel (cd android && ./gradlew :app:testDebugUnitTest --tests "*AlbumSyncProgressTest" --tests "*AlbumsViewModelTest").
  • 4.3 Показать предупреждение с числом потерянных копий на экране альбома устройства и на карточке в списке; покрыть AlbumsContentTest и DeviceAlbumContentTest, убедившись, что автоматического удаления превью нет (cd android && ./gradlew :app:testDebugUnitTest --tests "*AlbumsContentTest" --tests "*DeviceAlbumContentTest").

5. Интеграционная проверка

  • 5.1 Прогнать весь Android-набор и собрать debug-APK (cd android && ./gradlew test :app:assembleDebug).

Workflow follow-up

  • Заархивировать изменение после прохождения ревью проекта.
  • Проверить результат архивации.