- Detect silent WebSocket drops via 30s no-message timeout + 15s heartbeat
- Force reconnect in onAppBackground via foreground service context
- Reduce KeepAlive interval from 15min to 5min for faster background recovery
- Replace callback-based notification with direct NotificationHelper injection
- Suppress notifications during initial launch and when app is foregrounded
- 9 theme color presets (pink default) + Monet dynamic color (Android 12+)
- Full HSL-derived MD3 ColorScheme replacing stale purple-only scheme
- Inline markdown rendering for chat messages (bold, italic, code, links)
- Long-press copy on error/system messages
- Hidden root keep-alive toggle (5-tap) with system-level commands
- BootReceiver to reapply keep-alive and restart service on boot
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- ChatScreen: restructure to Box overlay layout so only input area
rises with IME, messages stay fixed. Add opaque background to input
area. Use reverseLayout with newest-first animation order.
- OverlayContent: remove all manual IME detection — system forces
adjust=pan on VoiceInteractionSession windows, so manual padding
caused double offset. Let system handle IME naturally.
- ChatRepositoryImpl: add messageRemovals flow to clean up wrapping
stream_end/response when review/multi_message items arrive later.
Track lastResponseId in both stream_end and response handlers.
- ChatViewModel/OverlayViewModel: fix dedup to check by message ID
only. Sort descending (newest first). Observe messageRemovals.
- NavGraph: keep all tabs composed with graphicsLayer alpha toggle —
prevents ChatScreen destruction and re-render on tab switch.
- CyreneVoiceInteractionSession: defer configureWindow via post()
to override system softInputMode flags.
- AndroidManifest: set windowSoftInputMode=adjustNothing on main
activity.
- Add WebSocketKeepAliveService for background connection persistence.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Reconnection: unlimited retries with capped backoff, forceReconnect on foreground
and manual refresh when offline
- Overlay: fix status bar coverage, remove scrim, fix IME layout (messages fixed
at top, only full-screen IME pushes input), handle process-kill by eager
ViewModel resolution with try-catch
- Profile: cache-first rendering, cloud refresh on each visit, silent fallback
to cache on failure
- Messages: fix message swallowing by tracking DB observer job and using atomic
StateFlow.update(), add dedicated isAssistantStreaming state for reliable
typing indicator
- History: history_response handler now emits to live message stream, HTTP
fallback waits for WS connection before requesting history
- Foreground: always request history on foreground to catch cross-device messages
- Log viewer: enhanced with All tab, auto-scroll, new categories (HTTP, voice, general),
added log points for app lifecycle and overlay events
- Settings: added About page with project link (https://git.yeij.top/AskaEth/Cyrene-For-Android)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>