android: add level-triggered radio and inline activation settings

This commit is contained in:
evgeny committed 2026-10-09 00:06:55 +02:00
1 parent 44af542f61
commit fddbba217d
14 files changed
+575 -127

No files matched your search

@@ -0,0 +1,70 @@
package com.utun.chat.data
import org.junit.Assert.*
import org.junit.Test
class RadioAutoSettingsTest {
@Test fun validatesWholeThresholdPairAndBothModes() {
for (mode in listOf(RadioAutoSettings.VAD, RadioAutoSettings.LEVEL)) {
val settings = RadioAutoSettings(mode = mode)
assertTrue(settings.valid())
assertTrue(settings.copy(levelOn = 0, levelOff = -90).valid())
assertFalse(settings.copy(levelOn = -45, levelOff = -45).valid())
assertFalse(settings.copy(levelOn = -50, levelOff = -40).valid())
assertFalse(settings.copy(levelOff = -91).valid())
assertFalse(settings.copy(levelOn = 1).valid())
assertFalse(settings.copy(hangoverMs = 49).valid())
assertFalse(settings.copy(hangoverMs = 2001).valid())
assertFalse(settings.copy(vadThreshold = 96).valid())
assertFalse(settings.copy(vadGain = 0).valid())
}
assertFalse(RadioAutoSettings(mode = RadioAutoSettings.OFF).valid())
assertFalse(RadioAutoSettings(mode = 3).valid())
}
@Test fun nativeSnapshotHasExplicitModeAndSignedThresholds() {
val settings = RadioAutoSettings(true, RadioAutoSettings.LEVEL, -40, -60, 500, 70, 20)
assertArrayEquals(intArrayOf(1, 2, -40, -60, 500, 70, 20), settings.nativeValues())
assertEquals(0, settings.copy(enabled = false).nativeValues()[0])
}
@Test fun monitorNeverEnablesTransmissionAndReleasesCaptureWhenHidden() {
for (mode in listOf(RadioAutoSettings.VAD, RadioAutoSettings.LEVEL)) {
val settings = RadioAutoSettings(mode = mode)
assertNull(radioCaptureMode(true, true, true, settings, manual = false, monitor = false))
assertEquals(RadioAutoSettings.OFF, radioCaptureMode(true, true, true, settings, manual = false, monitor = true))
assertNull(radioCaptureMode(true, false, true, settings, manual = false, monitor = true))
assertNull(radioCaptureMode(false, true, true, settings, manual = true, monitor = true))
}
}
@Test fun bothDetectorsShareScreenAndBackgroundGatesWithManualOverride() {
for (mode in listOf(RadioAutoSettings.VAD, RadioAutoSettings.LEVEL)) {
val settings = RadioAutoSettings(enabled = true, mode = mode)
assertEquals(mode, radioCaptureMode(true, true, true, settings, manual = false, monitor = false))
assertNull(radioCaptureMode(true, true, false, settings, manual = false, monitor = false))
assertNull(radioCaptureMode(true, false, true, settings, manual = false, monitor = false))
assertEquals(RadioAutoSettings.OFF, radioCaptureMode(true, false, false, settings, manual = true, monitor = false))
assertEquals(RadioAutoSettings.OFF, radioCaptureMode(true, true, false, settings, manual = false, monitor = true))
assertEquals(mode, radioCaptureMode(true, true, true, settings, manual = true, monitor = true))
}
}
@Test fun foregroundIsUnlimitedAndEveryBackgroundPeriodGetsNewWindow() {
val duration = 15 * 60 * 1000L
val window = RadioVadWindow(duration)
window.setForeground(true, 100)
window.setEnabled(true, 100)
assertTrue(window.isAllowed(2 * 60 * 60 * 1000L))
window.setForeground(false, 8_000_000)
assertTrue(window.isAllowed(8_000_000 + duration - 1))
assertFalse(window.isAllowed(8_000_000 + duration))
window.setForeground(true, 9_000_000)
window.setForeground(false, 10_000_000)
assertEquals(duration, window.timeLeftMs(10_000_000))
window.close()
assertFalse(window.isAllowed(10_000_001))
window.restart(10_000_100)
assertTrue(window.isAllowed(10_000_101))
}
}