- Replace raw FFI with proper `jni` crate for string marshalling - Wire QUIC transport in engine: connect to relay, crypto handshake (CallOffer/CallAnswer, X25519+Ed25519), send/recv MediaPackets - Feed received packets into jitter buffer (was previously ignored) - Add connect screen UI with CALL button (idle state) and in-call controls (mute, speaker, hang up, live stats) - Hardcode relay 172.16.81.125:4433, room "android" - Add comprehensive docs in docs/android/: architecture.md (8 mermaid diagrams), build-guide.md, debugging.md, maintenance.md, roadmap.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
42 lines
2.2 KiB
Markdown
42 lines
2.2 KiB
Markdown
# WarzonePhone Android Client
|
|
|
|
The WZP Android client is a native VoIP application built with Kotlin/Jetpack Compose on top of a Rust audio engine. It connects to WZP relay servers over QUIC, providing encrypted voice calls with adaptive quality, forward error correction, and acoustic echo cancellation.
|
|
|
|
## Quick Start
|
|
|
|
1. **Build**: `cd android && ./gradlew assembleRelease` (requires NDK 26.1, cargo-ndk)
|
|
2. **Install**: `adb install app/build/outputs/apk/release/app-release.apk`
|
|
3. **Run**: Open "WZ Phone", tap **CALL** to connect to the hardcoded relay
|
|
4. **Relay**: Must be running at the configured address (default `172.16.81.125:4433`)
|
|
|
|
## Current State (April 2025)
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| QUIC transport to relay | Working |
|
|
| Crypto handshake (X25519 + Ed25519) | Working |
|
|
| Opus 24k encoding/decoding | Working |
|
|
| Oboe audio I/O (48kHz mono) | Working |
|
|
| AEC / AGC signal processing | Working |
|
|
| RaptorQ FEC | Wired (repair symbols not sent yet) |
|
|
| Jitter buffer | Working |
|
|
| Adaptive quality switching | Codec-ready, not network-driven yet |
|
|
| Authentication (featherChat) | Skipped (relay has no --auth-url) |
|
|
| Media encryption (ChaCha20-Poly1305) | Session derived but not applied to packets |
|
|
| Foreground service / wake locks | Implemented, not started from UI |
|
|
|
|
## Documentation Index
|
|
|
|
- [Architecture](architecture.md) - System design, data flow diagrams, thread model
|
|
- [Build Guide](build-guide.md) - Build environment setup, dependencies, signing
|
|
- [Debugging](debugging.md) - Crash diagnosis, logcat filters, common issues
|
|
- [Maintenance](maintenance.md) - Code map, dependency management, upgrade paths
|
|
- [Roadmap](roadmap.md) - Planned work and known gaps
|
|
|
|
## Key Design Decisions
|
|
|
|
- **Rust native engine**: All audio processing, codecs, FEC, crypto, and networking run in Rust. Kotlin is UI-only.
|
|
- **Lock-free audio**: SPSC ring buffers with atomic ordering between Oboe C++ callbacks and the Rust codec thread. No mutexes in the audio path.
|
|
- **cargo-ndk**: The native library (`libwzp_android.so`) is cross-compiled for `arm64-v8a` using cargo-ndk, invoked automatically by Gradle's `cargoNdkBuild` task.
|
|
- **Single-activity Compose**: One `CallActivity` hosts all UI via Jetpack Compose with `CallViewModel` as the state holder.
|