wifiSwitchRejoinService's decision moves into src/ui-touch/WifiSwitchRejoin.h
(same order of checks, same 4 s, same single shot); the service gathers the
Wi-Fi state and asks for the apply when it says so.
test/test_wifi_switch_rejoin.cpp drives it every 20 ms: the T-Deck case
(driver up after 300 ms, first join fails) rejoins once, 4 s after the
driver came up, never again; a join at 2.5 s or 3.98 s is left alone; a
scan from 1 s to 9 s holds it and the count restarts after (and nothing
fires if the scan's apply joins); switched off, no saved network, or a
driver that never starts: nothing; millis() wrap: still 4 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>