@startuml fig_01_start_sync ' Увеличенный растр для вставки в отчёт (Word / печать) scale 3 title Wallenc — старт приложения и параллельная синхронизация (проектное решение; фоновая синхронизация к реализации) end title skinparam defaultFontName "DejaVu Sans" skinparam activity { BackgroundColor #F8F8F8 BorderColor #333333 DiamondBackgroundColor #E8F4FF } skinparam noteBackgroundColor #FFFDE7 skinparam noteBorderColor #F9A825 start :Старт приложения (Android); :Инициализация Room, загрузка метаданных vault; if (Есть сохранённые vault?) then (нет) :Экран «первый запуск» / создание локального vault; else (да) endif if (Нужен удалённый провайдер и нет учётной записи?) then (да) :Экран удалённых vault / OAuth Яндекс; else (нет) endif partition "**Основной поток (UI)**" { :(A) Главный экран: список локальных и удалённых vault; :Действия пользователя (открыть, зашифровать, содержимое…); } fork partition "**Фон: синхронизация (по таймеру)**" #E8F5E9 { note right **Проектная механика (не реализовано в коде)** • Таймер / WorkManager Android • Таблица в Room: UUID **storage_id** для очереди синхронизации • Для каждого storage — **история коммитов** (аналог git): дерево/цепочка снимков • Сервис: сравнение коммитов локально vs удалённо → вычисление diff • Применение изменений → **одинаковое зашифрованное содержимое** на клиенте и у провайдера (ключи на сервер не передаются) end note :По срабатыванию таймера: запуск **SyncService** / Worker; :Чтение из БД списка **UUID storage** из очереди; while (Есть необработанный UUID?) is (да) :Загрузить историю **коммитов** для этого Storage (локально + у провайдера); :Найти расхождения (common ancestor / merge); :Свести содержимое к единому состоянию; :Обновить очередь / метаданные синхронизации; endwhile (нет) } end fork stop @enduml