Карточка альбома устройства получает третью строку: метку режима («Копии»/ «Перенос») и ход загрузки. Процент считается как (uploaded + running) / total для обоих синхронизируемых режимов, пульсирует только при активной загрузке, показывает очередь, ожидание Wi-Fi и ошибку. В режиме переноса карточка показывает и карту памяти, и облако — режимы различает метка, а не значки. Разгрузка оригиналов теперь требует подтверждённой серверной копии в текущем целевом альбоме: устаревший serverPhotoId перепроверяется по альбому, смена цели переносит уже загруженные фото и отклоняется, если перенести нельзя. Потеря серверной копии видна на карточке и на экране альбома, автозатирания превью нет. Изменения OpenSpec: android-album-card-sync-status, safe-album-offload.
5.0 KiB
5.0 KiB
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, принимая живой набор серверных фото, и добавить исход «копии нет»;OffloadManagerSHALL отказываться от разгрузки без живой копии — проверить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
- Заархивировать изменение после прохождения ревью проекта.
- Проверить результат архивации.