d851168a46
- Send hangup/reject to peer when WebRTC init or PeerConnection creation fails, so remote phone stops ringing instead of timing out after 60s - Throw on null PeerConnection from factory to fail fast instead of silently no-oping all subsequent WebRTC operations - Start foreground service during IncomingCall to protect ringtone playback from being killed on Android 14+ - Make cleanup() idempotent with AtomicBoolean guard to prevent double disposal when Ended state and ViewModel.onCleared race - Replace mutableMapOf with ConcurrentHashMap for videoSenders accessed from UI and WebRTC callback threads - Add @Volatile to peerConnection, videoPausedByProximity, and foregroundServiceStarted for cross-thread visibility - Capture peerConnection into local variable in dispose() to prevent TOCTOU race between close() and null assignment - Replace leaked MainScope() in CallNotificationReceiver with structured CoroutineScope that is cancelled after work completes - Remove self-wraps in group answer/reject to avoid wasting bandwidth sending encrypted messages to ourselves - Move startTimeout inside stateMutex in initiateCall for consistency https://claude.ai/code/session_017HrFJNxD6zrGwiZ3s69xTh