59a111914c
Adds the foundational network-state plumbing the audit called out: * ConnectivityObserver — Hilt singleton wrapping ConnectivityManager. Exposes a Flow<Boolean> sourced from registerNetworkCallback; emits false when the active network lacks INTERNET+VALIDATED capabilities (airplane mode, no carrier, captive portal) and true once a usable network appears. Seeded with the initial value so the banner doesn't flash before the first capability callback. * ConnectionErrorBanner — shell-level Compose banner that AnimatedVisibility- shrinks/expands based on the observer. Red errorContainer surface, CloudOff icon, "No connection — check Wi-Fi or mobile data." copy. Owns a tiny ConnectivityBannerViewModel that lifts the singleton's Flow into a lifecycle-scoped StateFlow. * ShellScaffold now invokes ConnectionErrorBanner() in the banner slot above the routed content. VersionTooOld / UpdateBanner will join the same slot in follow-up commits. ACCESS_NETWORK_STATE permission was already in the manifest. Downstream repositories can also collect ConnectivityObserver.online to gate retry loops once that wiring is needed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>