04e99a8d24
Android Release / build-apk (push) Successful in 4m41s
Bug 1 (card_plugin): waste Draw-Three fan step was a fixed 0.28×card_width, chosen for the desktop gap ratio (H_GAP_DIVISOR=4). On Android (H_GAP_DIVISOR=32) the column spacing is only 1.031×card_width, so the same fraction pushed the top fanned card's centre past the waste column's right edge. Fix: derive fan_step from column spacing × 0.224 — preserves 0.28×cw on desktop while reducing to ≈0.231×cw on Android, keeping fanned cards within their column footprint. Adds regression test on 900×2000 portrait window. Bug 2 (safe_area): refresh_insets stored its retry counter as Local<u32>, making it impossible to re-arm after a background/foreground cycle. On resume the counter was already saturated so JNI was never re-queried; layouts computed with stale (zero) insets pushed the top card row up under the HUD. Fix: convert tries to SafeAreaPollTries Resource; add android::rearm_on_resumed which resets both counter and SafeAreaInsets on AppLifecycle::WillResume so the poller re-fires; add on_app_resumed (all platforms) which emits a synthetic WindowResized on WillResume to immediately trigger layout recomputation. Adds pure-function regression test in layout.rs pinning the suspend→resume invariant. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>