feat(android): статус синхронизации на карточке и безопасная разгрузка

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

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

Изменения OpenSpec: android-album-card-sync-status, safe-album-offload.
This commit is contained in:
iu
2026-10-16 18:36:51 +03:00
parent 98aaa3156a
commit 1eb1177273
36 changed files with 1855 additions and 81 deletions
@@ -0,0 +1,73 @@
# Spec Delta
## MODIFIED Requirements
### Requirement: Подпись карточки альбома
Карточка альбома SHALL показывать в первой строке имя альбома, а для связанной пары — со
стрелкой имя связанного серверного альбома, и только когда имена различаются. Вторая строка
SHALL показывать значками расположение содержимого и число элементов: значок карты памяти для
локального без синхронизации, значки карты памяти и облака для режимов копий и переноса; для
серверного альбома — значок облака. Третья строка SHALL называть режим синхронизации
(«Копии» или «Перенос») и SHALL отсутствовать у выключенной синхронизации и у серверного
альбома.
#### Scenario: Локальный без синхронизации
- **WHEN** показан локальный альбом без синхронизации
- **THEN** вторая строка показывает значок карты памяти и число элементов, а третьей строки нет
#### Scenario: Режим копий
- **WHEN** локальный альбом синхронизируется в режиме копий
- **THEN** вторая строка показывает значки карты памяти и облака и число элементов, а третья называет режим «Копии»
#### Scenario: Режим переноса
- **WHEN** локальный альбом синхронизируется в режиме переноса
- **THEN** вторая строка показывает значки карты памяти и облака и число элементов, а третья называет режим «Перенос»
#### Scenario: Серверный альбом
- **WHEN** показан серверный альбом
- **THEN** вторая строка показывает значок облака и число фото, а третьей строки нет
#### Scenario: Разные имена связанной пары
- **WHEN** имя локального альбома не совпадает с именем связанного серверного
- **THEN** первая строка показывает «имя → имя серверного»
#### Scenario: Одинаковые имена
- **WHEN** имена совпадают
- **THEN** стрелка и имя серверного не показываются
## ADDED Requirements
### Requirement: Прогресс операции загрузки
Для альбома устройства с включённой синхронизацией (копии или перенос) карточка SHALL
показывать ход загрузки в третьей строке: процент, пока есть работающие загрузки (текст
пульсирует); число ожидающих без активной работы; отдельные состояния ожидания Wi-Fi и
ошибки; в простое — только метку режима. Процент SHALL считаться по альбому и SHALL NOT
убывать при завершении отдельных файлов.
#### Scenario: Идёт копирование
- **WHEN** у альбома в режиме копий есть хотя бы одна работающая загрузка
- **THEN** третья строка показывает «Копии <процент>%», и текст пульсирует
#### Scenario: Идёт перенос
- **WHEN** у альбома в режиме переноса есть хотя бы одна работающая загрузка
- **THEN** третья строка показывает «Перенос <процент>%», и текст пульсирует
#### Scenario: Очередь без активной работы
- **WHEN** загрузки альбома ожидают, но ни одна не работает
- **THEN** третья строка показывает число ожидающих, и пульсации нет
#### Scenario: Ожидание Wi-Fi
- **WHEN** загрузки ждут только из-за ограничения «только Wi-Fi»
- **THEN** третья строка сообщает ожидание Wi-Fi, и пульсации нет
#### Scenario: Ошибка
- **WHEN** последняя попытка загрузки файла провалилась
- **THEN** третья строка показывает ошибку выделенным цветом, и пульсации нет
#### Scenario: Простой
- **WHEN** незавершённых загрузок нет
- **THEN** третья строка показывает только метку режима
#### Scenario: Монотонность
- **WHEN** один файл завершается, пока остальные ещё загружаются
- **THEN** показанный процент не уменьшается