@startuml fig_01_start_sync !include _gost-theme.inc.puml ' Увеличенный растр для вставки в отчёт (Word / печать) scale 3 start :Старт приложения (Android); :Инициализация Room, загрузка метаданных vault; if (Есть LocalVault / storage?) then (нет) :Первый запуск; else (да) endif if (Нужен удалённый провайдер и нет учётной записи?) then (да) :Экран удалённых vault / OAuth Яндекс; else (нет) endif partition "**Основной поток (UI)**" { :(A) Main: LocalVault — список storage, вкладка удалённых — список IVault; :Действия с **storage** (шифрование, открытие, файлы…); } fork partition "**Фон: синхронизация (по таймеру)**" #E8F5E9 { note right **Реализовано:** StorageSyncEngine, журнал изменений по путям, merge ревизий • Room: DbStorageSyncGroup (UUID группы) • WorkManager / debounce — запуск sync • Ключи шифрования провайдеру не передаются Подробный алгоритм — гл. 4, рис. 35 end note :Запуск sync (Worker / debounce); :StorageSyncEngine.syncAllGroups; while (Есть группа синхронизации?) is (да) :Слияние журналов → победитель по пути; :findSourceStorage → applyEntry на отстающие Storage; endwhile (нет) } end fork stop @enduml