Files
iu 98aaa3156a chore(openspec): архивировать add-orphaned-preview-handling и синхронизировать спеки
Новое требование в phone-album-sync о потере/возврате серверной копии у
разгруженного превью, требование в android-client о метке потерянного элемента
и действии удаления с устройства.
2026-10-16 14:13:01 +03:00

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 и схема БД не меняются.