> **Current status (2026-06-30):** **Phase 3 — Share tab carved: `S14` DONE (epic ADFA-1028, umbrella ADFA-4492).** `SyncFragment`'s mechanic was extracted into a clean, exportable stack: a pure `sync/domain` (rsyncd.conf/argv builders, progress parse, exit-code→outcome, `ShareConfig`, `TransferGuard`, `SyncCredentialValidator` — no `android.*`, JVM-tested), a `TransportEngine` port with `RsyncManager` as its adapter, platform adapters (`NetworkInterfaces`/`QrCodec`/`SecretStore`), and an Activity-scoped `SyncStateViewModel` + `SyncProgressRepository` so the probe/dry-run/transfer survive a configuration-change recreation (PRs #93/#94/#96/#98/#99/#104). Folded in and closed here: `S7` (hardcoded ports → `ShareConfig`), `S8`/`S9`/`S10` (concurrency/lifecycle), `S11` (rsync secret lifecycle), `S15`/`S16` (theming / magic-strings), the `EX1–EX6` export items, and **`D17`** (`ApkServer` now GET-only). **Residual — DONE (ADFA-4506):** the `SyncFragment` view was carved into per-area collaborators via the Controller/Host seam — `ArchCheckController` (#126), `ShareController` (rsync daemon + APK server together, #127) and `ReceiveController` (scan/probe/dry-run/transfer, #128) — leaving a thin ~261 LOC view (from ~810) that only wires the mode toggle, the QR scanner, system-protection and the hosts. No separate `SyncViewModel` was needed beyond the already-carved `SyncStateViewModel`/`SyncProgressRepository`. **Separately, real-world Share robustness (bug ADFA-4496, closed):** Wi-Fi network binding for the receive (#105), IP-under-QR transparency, a phantom-process SIGKILL (exit 137) safety net (#107), and an informed pre-flight + connection-failed hint (#109); the recurring "Connection Failed" was root-caused to **AP client-isolation** (a network condition), not the app. **Phase 3 remainder:** `F1` (`MainActivity` ~2,384 LOC) not carved; `D3` (central config/endpoints) not done.
0 commit comments