Commit graph

4 commits

Author SHA1 Message Date
torlando-tech
0ba904d28d fix: resolve call startup issues with retry and async IO
- 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>
2026-01-16 22:06:23 -05:00
torlando-tech
830853c829 fix: use mute_transmit() instead of unmute_transmit() for LXST calls
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>
2026-01-16 22:06:23 -05:00
torlando-tech
0c91aeb442 feat: implement LXST voice calls with multi-process IPC
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>
2026-01-16 22:06:23 -05:00
torlando-tech
fa59db20b8 feat: add LXST voice call support
Implement real-time voice calling over Reticulum using LXST Telephony:

- KotlinAudioBridge: Android AudioTrack/AudioRecord wrapper for Python
- chaquopy_audio_backend.py: Chaquopy-compatible replacement for Pyjnius soundcard
- CallBridge: Bidirectional state management between Python LXST and Kotlin UI
- call_manager.py: LXST Telephone wrapper with Kotlin callbacks

- VoiceCallScreen: Active call UI with mute/speaker controls
- IncomingCallScreen: Incoming call UI with pulsing animation
- CallViewModel: Call state management with Hilt DI
- Call button added to MessagingScreen TopAppBar

- CallNotificationHelper: Incoming/ongoing call notifications with full-screen intent
- CallActionReceiver: Notification action handling (answer/decline/end)
- AudioCoordinator: Audio focus, wake locks, proximity sensor

- RECORD_AUDIO for microphone access
- MODIFY_AUDIO_SETTINGS for audio routing
- USE_FULL_SCREEN_INTENT for incoming call overlay

Supports all LXST quality profiles (Opus/Codec2) for bandwidth-adaptive calls.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 22:04:40 -05:00