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>