launchBrowser() hangs indefinitely on Chrome 145 in the Android
emulator. Replaced with chrome-command-line proxy flag + force-stop/
restart + connectOverCDP. A polling retry loop (max 15 s) handles
CDP startup variance.
proxy_service.dart: added _ensureCardOpen() which calls isCardAttached()
and re-runs _tryOpenCard() if the emulator socket was closed (e.g. after
a bridge restart). Called before makeCredential and getAssertion in all
three handler paths so the app reconnects automatically without restart.
playwright.config.js: global timeout 180 s → 60 s.
All 4 tests in k_phone_android.spec.js now pass (16 s total).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Three new specs in tests/:
- k_phone_portal.spec.js: portal UI flow (enroll/login/status/logout/delete)
- k_phone_proxy.spec.js: 4 serial proxy-routing tests via Node http module;
requires adb forward for emulator use
- k_phone_android.spec.js: same 4 tests with Chrome running inside the
Android emulator via playwright.android; no port-forward needed,
auto-skips if no ADB device found
All tests use card_emulator_bridge.py for instant FIDO2 auto-approval —
no physical card or fingerprint interaction required in emulator mode.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>