feat(android): показывать ход восстановления оригиналов
Возврат из переноса в копии скачивает оригиналы с сервера, но ход нигде не отражался: карточка умела показывать только загрузку, а восстановление шло в области экрана и обрывалось при уходе с него. Добавлен RestoreCoordinator: выполняет восстановление в области приложения (уход с экрана больше не прерывает), ведёт ход «альбом -> восстановлено из всего» и защищает от одновременного запуска по одному альбому. RestoreManager сообщает ход по каждому элементу и вынесен за интерфейс AlbumRestorer; SyncCheck ходит через координатора и, как и раньше, дожидается завершения. Карточка альбома показывает «Копии — восстановление N%» (пульсирует), экран альбома устройства — строку «Восстановление оригиналов: X из Y» с полосой. Изменение OpenSpec: android-album-restore-progress.
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# 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 и бэкенд:** не затрагиваются.
|
||||
- **Веб-клиент:** не затрагивается.
|
||||
- **Не затрагивается:** восстановление потерянных копий из корзины сервера.
|
||||
Reference in New Issue
Block a user