Browse Source

Test Android radio talk lifecycle and translate speaker status

master
evgeny 3 days ago
parent
commit
2c407540a0
  1. 3
      tools/chatgui-android/app/src/main/res/values-ru/strings.xml
  2. 3
      tools/chatgui-android/app/src/main/res/values/strings.xml
  3. 52
      tools/chatgui-android/app/src/test/java/com/utun/chat/data/RadioTalkStateTest.kt

3
tools/chatgui-android/app/src/main/res/values-ru/strings.xml

@ -48,6 +48,9 @@
<string name="radio_member_mute">Не слушать этого участника в рации</string>
<string name="radio_member_listen">Слушать этого участника в рации</string>
<string name="radio_member_mute_failed">Не удалось изменить настройку прослушивания рации</string>
<string name="radio_member_silent">Рация: молчит</string>
<string name="radio_member_speaking">Рация: говорит</string>
<string name="radio_member_muted">Рация: заглушён</string>
<string name="radio_notification">"Рация: PTT / автоматическая передача по голосу"</string>
<string name="overlay_stopped">"Плавающая кнопка остановлена"</string>
<string name="ongoing_call">"Текущий звонок"</string>

3
tools/chatgui-android/app/src/main/res/values/strings.xml

@ -48,6 +48,9 @@
<string name="radio_member_mute">Mute this member in radio</string>
<string name="radio_member_listen">Listen to this member in radio</string>
<string name="radio_member_mute_failed">Cannot change radio listening setting</string>
<string name="radio_member_silent">Radio: silent</string>
<string name="radio_member_speaking">Radio: speaking</string>
<string name="radio_member_muted">Radio: muted</string>
<string name="radio_notification">"Radio: PTT / automatic voice transmission"</string>
<string name="overlay_stopped">"Floating button stopped"</string>
<string name="ongoing_call">"Ongoing call"</string>

52
tools/chatgui-android/app/src/test/java/com/utun/chat/data/RadioTalkStateTest.kt

@ -0,0 +1,52 @@
package com.utun.chat.data
import org.junit.Assert.*
import org.junit.Test
import java.nio.ByteBuffer
import java.nio.ByteOrder
class RadioTalkStateTest {
private fun event(group: Long = 7, node: Long = 42, on: Boolean = true): RadioTalkEvent {
val bytes = ByteBuffer.allocate(19).order(ByteOrder.LITTLE_ENDIAN)
.putLong(group).putLong(node).putShort(65535.toShort()).put(if (on) 1.toByte() else 0.toByte()).array()
return requireNotNull(parseRadioTalkEvent(bytes))
}
@Test fun stopRemovesOnlyItsSourceAndMuteDoesNotSuppressSpeech() {
var state = RadioTalkState(7).onTalk(event()).onTalk(event(node = 43))
assertEquals(setOf(42L, 43L), state.speakers)
val muted = ChatMember(42, "Alice", radioMuted = true)
assertTrue(muted.radioMuted && muted.nodeId in state.speakers)
assertSame(state, state.onTalk(event()))
state = state.onTalk(event(on = false))
assertEquals(setOf(43L), state.speakers)
assertSame(state, state.onTalk(event(on = false)))
assertTrue(state.onTalk(event(node = 43, on = false)).speakers.isEmpty())
}
@Test fun activeGroupOwnsSpeakersIndependentlyOfDisplayedMemberSnapshots() {
val group = 0xfedcba9876543210uL.toLong()
val state = RadioTalkState(group).onTalk(event(group))
assertEquals(setOf(42L), state.speakers)
assertSame(state, state.onTalk(event(group = 8)))
assertSame(state, state.onTalk(event(group = 8, on = false)))
val refreshed = ChatMember(42, "Updated", radioActive = false, radioMuted = true)
assertTrue(refreshed.nodeId in state.speakers)
val switched = RadioTalkState(8)
assertSame(switched, switched.onTalk(event(group)))
val stopped = RadioTalkState()
assertSame(stopped, stopped.onTalk(event(group)))
assertTrue(RadioTalkState(group).speakers.isEmpty())
}
@Test fun malformedEventsCannotChangeTheSpeakerState() {
assertNull(parseRadioTalkEvent(null)); assertNull(parseRadioTalkEvent(ByteArray(18)))
assertNull(parseRadioTalkEvent(ByteArray(20))); assertNull(parseRadioTalkEvent(ByteArray(19)))
val bytes = ByteBuffer.allocate(19).order(ByteOrder.LITTLE_ENDIAN).putLong(7).putLong(42).putShort(1).put(2).array()
assertNull(parseRadioTalkEvent(bytes))
bytes[18] = 1
assertEquals(1, requireNotNull(parseRadioTalkEvent(bytes)).stream)
assertEquals(65535, event().stream)
assertNull(parseRadioTalkEvent(ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).putLong(0, 0).array()))
}
}
Loading…
Cancel
Save