Возврат из переноса в копии скачивает оригиналы с сервера, но ход нигде не отражался: карточка умела показывать только загрузку, а восстановление шло в области экрана и обрывалось при уходе с него. Добавлен RestoreCoordinator: выполняет восстановление в области приложения (уход с экрана больше не прерывает), ведёт ход «альбом -> восстановлено из всего» и защищает от одновременного запуска по одному альбому. RestoreManager сообщает ход по каждому элементу и вынесен за интерфейс AlbumRestorer; SyncCheck ходит через координатора и, как и раньше, дожидается завершения. Карточка альбома показывает «Копии — восстановление N%» (пульсирует), экран альбома устройства — строку «Восстановление оригиналов: X из Y» с полосой. Изменение OpenSpec: android-album-restore-progress.
53 lines
3.7 KiB
Markdown
53 lines
3.7 KiB
Markdown
# Proposal
|
||
|
||
## Why
|
||
|
||
При возврате из режима переноса в копии (`MOVE → COPY`) приложение скачивает оригиналы с
|
||
сервера и записывает их поверх превью, но **никак не показывает ход**. Карточка альбома умеет
|
||
показывать только загрузку (upload-джобы), которых при этом переходе не возникает, поэтому
|
||
третья строка молчит, а операция идёт.
|
||
|
||
Дополнительно восстановление запускается в области экрана (`viewModelScope`): стоит уйти с
|
||
экрана альбома устройства — и оно обрывается на середине, хотя пользователь именно затем и
|
||
уходит в список, чтобы посмотреть ход.
|
||
|
||
(Для альбома с потерянными копиями восстановление и не начнётся: такие элементы в целевой
|
||
набор не входят — это отдельный случай, здесь не меняется.)
|
||
|
||
## What Changes
|
||
|
||
- Восстановление становится наблюдаемой операцией: приложение ведёт счётчик «готово из
|
||
всего» по каждому альбому устройства.
|
||
- Восстановление выполняется в области приложения, а не экрана: уход с экрана альбома не
|
||
прерывает его.
|
||
- Карточка альбома показывает ход: `Копии — восстановление N%` (и пульсирует, пока идёт).
|
||
- Экран альбома устройства также показывает ход восстановления.
|
||
- **BREAKING**: нет. Загрузка, разгрузка и режимы не меняются; добавляется только видимость
|
||
и устойчивость уже существующей операции.
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
|
||
_Нет — поведение относится к существующим способностям._
|
||
|
||
### Modified Capabilities
|
||
|
||
- `phone-album-sync`: восстановление оригиналов выполняется до конца независимо от ухода с
|
||
экрана и сообщает ход (сколько элементов восстановлено из скольких).
|
||
- `android-client`: карточка альбома и экран альбома устройства показывают ход
|
||
восстановления оригиналов.
|
||
|
||
## Impact
|
||
|
||
- **Код (Android):** `data/sync/RestoreManager` (обратный вызов хода, интерфейс исполнителя),
|
||
новый `data/sync/RestoreCoordinator` (область приложения + прогресс по альбомам),
|
||
`di/AppContainer` (создание координатора), `data/sync/SyncCheck` (восстановление через
|
||
координатора), `ui/devicealbum/DeviceAlbumViewModel` (запуск через координатора, ход в
|
||
состоянии) и `DeviceAlbumScreen` (строка хода), `domain/sync/AlbumSyncProgress` и
|
||
`ui/albums/AlbumsViewModel`/`AlbumsScreen` (ход на карточке).
|
||
- **Схема Room:** без изменений.
|
||
- **API и бэкенд:** не затрагиваются.
|
||
- **Веб-клиент:** не затрагивается.
|
||
- **Не затрагивается:** восстановление потерянных копий из корзины сервера.
|