Add connected nodes list dialog (v1.0.4)

- Tap callsign on main screen shows dialog with connected nodes
- SvxService tracks node list: ServerInfo + NODE_JOINED/NODE_LEFT events
- Bump to 1.0.4
This commit is contained in:
ua1zbe
2026-08-14 13:05:05 +03:00
parent fc224e3e09
commit ea36319fe3
4 changed files with 36 additions and 9 deletions

View File

@@ -11,8 +11,8 @@ android {
applicationId = "ru.ua1zbe.svxremote"
minSdk = 26
targetSdk = 34
versionCode = 5
versionName = "1.0.3"
versionCode = 6
versionName = "1.0.4"
}
buildTypes {

View File

@@ -107,6 +107,8 @@ class MainActivity : Activity(), SvxService.Listener {
lblTg.setOnClickListener { showGroupsDialog() }
lblCallsign.setOnClickListener { showNodesDialog() }
connectZone.setOnClickListener {
if (connected) {
svc?.disconnect()
@@ -341,6 +343,18 @@ class MainActivity : Activity(), SvxService.Listener {
mainHandler.postDelayed({ connect() }, 500)
}
private fun showNodesDialog() {
val nodes = (svc?.nodeList() ?: emptyList()).sorted()
if (nodes.isEmpty()) {
toast(getString(R.string.toast_nodes_empty))
return
}
AlertDialog.Builder(this)
.setTitle(getString(R.string.nodes_title, nodes.size))
.setItems(nodes.toTypedArray(), null)
.show()
}
private fun showGroupsDialog() {
val groups = (settings.groups + settings.talkGroup).distinct()
if (groups.isEmpty()) {

View File

@@ -111,9 +111,26 @@ class SvxService : Service(), ReflectorClient.Callbacks {
}
override fun onServerInfo(info: MsgParser.ServerInfo) {
synchronized(nodeSet) {
nodeSet.clear()
nodeSet.addAll(info.nodes)
}
listener?.onServerInfo(info)
}
private val nodeSet = LinkedHashSet<String>()
/** Текущий список подключенных узлов (копия для UI). */
fun nodeList(): List<String> = synchronized(nodeSet) { nodeSet.toList() }
override fun onNodeJoined(callsign: String) {
synchronized(nodeSet) { nodeSet.add(callsign) }
}
override fun onNodeLeft(callsign: String) {
synchronized(nodeSet) { nodeSet.remove(callsign) }
}
override fun onTalkerStart(tg: Long, callsign: String) {
updateNotification(getString(R.string.notif_talking, callsign))
listener?.onTalkerStart(tg, callsign)
@@ -124,12 +141,6 @@ class SvxService : Service(), ReflectorClient.Callbacks {
listener?.onTalkerStop(tg, callsign)
}
override fun onNodeJoined(callsign: String) {
}
override fun onNodeLeft(callsign: String) {
}
override fun onAudioPacket(packet: ByteArray, seq: Int) {
engine.onAudioPacket(packet)
}

View File

@@ -12,8 +12,10 @@
<string name="pref_groups">Группы для переключения (через запятую)</string>
<string name="select_tg">Выбор группы</string>
<string name="toast_groups_empty">Добавьте группы в настройках</string>
<string name="nodes_title">Узлы в сети (%1$d)</string>
<string name="toast_nodes_empty">Нет подключенных узлов</string>
<string name="btn_save">Сохранить</string>
<string name="app_version">SVXhomyak — v1.0.3</string>
<string name="app_version">SVXhomyak — v1.0.4</string>
<string name="saved">Сохранено</string>
<string name="pref_callsign_hint">например UA1ZBE</string>