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>
26 lines
1.2 KiB
TOML
26 lines
1.2 KiB
TOML
[versions]
|
|
agp = "9.4.1"
|
|
kotlin = "2.4.20"
|
|
composeBom = "2026.09.00"
|
|
activityCompose = "1.13.0"
|
|
lifecycle = "2.11.0"
|
|
bouncycastle = "1.86"
|
|
ini4j = "0.5.1"
|
|
oboe = "1.11.0"
|
|
|
|
[libraries]
|
|
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" }
|
|
androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" }
|
|
androidx-compose-material3 = { module = "androidx.compose.material3:material3" }
|
|
androidx-compose-ui = { module = "androidx.compose.ui:ui" }
|
|
androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycle" }
|
|
androidx-lifecycle-service = { module = "androidx.lifecycle:lifecycle-service", version.ref = "lifecycle" }
|
|
bouncycastle = { module = "org.bouncycastle:bcprov-jdk18on", version.ref = "bouncycastle" }
|
|
ini4j = { module = "org.ini4j:ini4j", version.ref = "ini4j" }
|
|
oboe = { module = "com.google.oboe:oboe", version.ref = "oboe" }
|
|
|
|
[plugins]
|
|
android-application = { id = "com.android.application", version.ref = "agp" }
|
|
android-library = { id = "com.android.library", version.ref = "agp" }
|
|
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|