While the app is out of sight, a poke or a private message posts a
notification; a message's one gathers the conversation, takes a reply
inline and opens its chat. The notifications are silent, as the sound
pack already plays TeamSpeak's own sound for either.
The build bundles the sound packs of the TeamSpeak 3 client found next
to the checkout (or at ts3.client.dir / TS3_CLIENT_DIR), unpacked into
the profile once per app version. Sound Settings picks the pack and its
volume, and speech packs talk through the phone's text-to-speech.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The session moves from the connection screen's ViewModel into an
app-wide SessionController, and a foreground service keeps the process
running while connected:
- Its notification shows the server and status and offers Mute, Deafen
and Disconnect.
- It declares microphone use only once the microphone is handed to the
connection, as Android requires that permission to be granted then.
- It holds a low-latency Wi-Fi lock and a CPU wake lock, since voice
goes out every 20 ms.
- When the system moves to another network, the session reconnects to
where it was, as its socket stays bound to the old one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
android/ builds core and ts3j from the same sources as the desktop's
Maven build, so the app shares all of the client's logic:
- audio: Oboe streams behind AudioCapture/AudioPlayback, with a lock-free
ring between the real-time callback and the blocking Java side, and
libopus 1.5.2 built with the NDK behind OpusCodec. Speakers are mixed
onto one stream. Capture uses the VoiceRecognition preset, leaving
noise suppression and gain to the client's own processing.
- app: a plain connection screen to try the port out - connect,
microphone, mute, deafen, channel chat and a log - until the real UI.
Targets Android 13 and up (minSdk 33) on arm64 and x86_64.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>