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

4.1 KiB

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