Новое требование в phone-album-sync о потере/возврате серверной копии у разгруженного превью, требование в android-client о метке потерянного элемента и действии удаления с устройства.
56 lines
4.1 KiB
Markdown
56 lines
4.1 KiB
Markdown
# Proposal
|
|
|
|
## Why
|
|
|
|
В режиме переноса (C) на устройстве остаётся только превью, а оригинал живёт на
|
|
сервере. Если серверное фото исчезает из целевого альбома (удалено с другого
|
|
устройства, из web или из экрана серверного альбома), приложение этого не
|
|
замечает: локальный индекс продолжает держать `serverPhotoId`, элемент
|
|
показывается с обычным значком облака, а при открытии оригинал бесконечно не
|
|
загружается. Пользователь не видит, что связи с сервером больше нет, и не может
|
|
этот элемент убрать или перезалить.
|
|
|
|
## What Changes
|
|
|
|
- Новое локальное состояние ассета **ORPHANED**: превью на устройстве есть, а
|
|
серверного фото в целевом альбоме больше нет.
|
|
- Определение состояния при проверке синхронизации: `serverPhotoId` элемента
|
|
сверяется с живыми фото альбома; отсутствие переводит элемент в `ORPHANED`,
|
|
повторное появление — обратно в `PREVIEW`.
|
|
- Метка элемента в сетке: для `ORPHANED` показывается перечёркнутое облако
|
|
вместо обычного.
|
|
- Действие `ORPHANED`-элемента — «Удалить с устройства»: удаляет превью-файл и
|
|
запись индекса, сервер не затрагивается (его копии уже нет). Серверные
|
|
атрибуты (теги, обложка, серверное удаление) для такого элемента недоступны.
|
|
- Возврат оригинала: если содержимое с исходным hash снова появляется на
|
|
телефоне (в этом же альбоме или в другом альбоме устройства), элемент
|
|
заливается заново; в режиме C он снова проходит обычный цикл разгрузки.
|
|
- Автоматическое поведение остаётся консервативным: файл-превью не удаляется и
|
|
не перезаливается без участия пользователя, превью не выдаётся за оригинал.
|
|
|
|
## Capabilities
|
|
|
|
### New Capabilities
|
|
|
|
Нет.
|
|
|
|
### Modified Capabilities
|
|
|
|
- `phone-album-sync`: отражение серверных изменений распространяется на
|
|
разгруженные превью (элемент становится `ORPHANED`, файл сохраняется), добавляется
|
|
действие удаления с устройства и повторная заливка вернувшегося оригинала.
|
|
- `android-client`: метка перенесённого элемента получает состояние
|
|
«перечёркнутое облако», а шит элемента — действие «Удалить с устройства» для
|
|
потерявших серверную копию.
|
|
|
|
## Impact
|
|
|
|
- Android-клиент: `domain/model/Sync.kt` (`LocalAssetState`),
|
|
`domain/sync/GallerySyncPolicy.kt`, `data/sync/SyncPlan.kt`,
|
|
`data/sync/SyncCoordinator.kt`, `data/sync/SyncCheck.kt`,
|
|
`ui/devicealbum/DeviceAlbumViewModel.kt`, `ui/devicealbum/DeviceAlbumScreen.kt`,
|
|
`domain/attributes/PhotoAttributeSource.kt`.
|
|
- Удаление превью — через MediaStore delete-consent (элемент галереи не
|
|
принадлежит приложению), переиспользуется существующий путь согласия.
|
|
- Серверный API и схема БД не меняются.
|