- Remove redundant path request code from call_manager.py - LXST's
Telephony.call() already handles path discovery correctly
- Move AIDL call operations to IO dispatcher to prevent ANR when
LXST blocks for path discovery (up to 70s)
- Add retry mechanism in CallViewModel for CallManager initialization
(retries up to 10x with 1s delay after fresh install)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
LXST's Mixer.unmute() has a bug where unmute(True) sets self.muted=True
instead of self.muted=False (inverted logic). This caused the unmute
button to not work - calling unmute_transmit() actually kept audio muted.
Changes:
- call_manager.py: Use telephone.mute_transmit(muted) with explicit
True/False instead of separate mute_transmit()/unmute_transmit() calls
- KotlinAudioBridge: Remove software mute (LXST handles at codec level)
- ReticulumServiceBinder: Improve logging for mute state changes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Complete voice call implementation for Android with cross-process support:
- Add call AIDL interface (IReticulumService/IReticulumServiceCallback)
- Implement ServiceReticulumProtocol for call IPC to :reticulum process
- Add ReticulumServiceBinder call methods bridging to Python CallManager
- Wire KotlinAudioBridge to Chaquopy audio backend for audio streaming
- Add incoming call notifications with IPC broadcast to UI process
- Fix microphone recording by adding FOREGROUND_SERVICE_MICROPHONE
- Support mute/unmute via software mute in audio bridge
- Add libopus native dependency for Opus codec support
Audio routing now works correctly between devices with earpiece default.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>