From d0c055fec914336780d8d575330c6bb9a2d49697 Mon Sep 17 00:00:00 2001 From: ua1zbe Date: Fri, 14 Aug 2026 13:32:41 +0300 Subject: [PATCH] Show talk group next to nodes in list (v1.0.4) - SvxService tracks node->TG mapping learned from talker events - Own callsign always shown with its current TG - Protocol carries no TG in join/leave, so others appear once they talk --- .../main/java/ru/ua1zbe/svxremote/MainActivity.kt | 13 ++++++++++--- .../main/java/ru/ua1zbe/svxremote/SvxService.kt | 15 ++++++++++++--- app/src/main/res/values/strings.xml | 1 + 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt b/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt index 38ca800..6ced49c 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt @@ -400,14 +400,21 @@ class MainActivity : Activity(), SvxService.Listener { } private fun showNodesDialog() { - val nodes = (svc?.nodeList() ?: emptyList()).sorted() + val nodes = svc?.nodeList().orEmpty() if (nodes.isEmpty()) { toast(getString(R.string.toast_nodes_empty)) return } + val myCs = settings.callsign.trim() + val items = nodes + .map { (cs, tg) -> + val t = tg ?: if (cs.equals(myCs, ignoreCase = true)) settings.talkGroup else null + if (t != null) getString(R.string.node_with_tg, cs, t) else cs + } + .sorted() AlertDialog.Builder(this) - .setTitle(getString(R.string.nodes_title, nodes.size)) - .setItems(nodes.toTypedArray(), null) + .setTitle(getString(R.string.nodes_title, items.size)) + .setItems(items.toTypedArray(), null) .show() } diff --git a/app/src/main/java/ru/ua1zbe/svxremote/SvxService.kt b/app/src/main/java/ru/ua1zbe/svxremote/SvxService.kt index 21798e6..e8d55fd 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/SvxService.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/SvxService.kt @@ -121,9 +121,12 @@ class SvxService : Service(), ReflectorClient.Callbacks { } private val nodeSet = LinkedHashSet() + private val nodeTgs = HashMap() - /** Текущий список подключенных узлов (копия для UI). */ - fun nodeList(): List = synchronized(nodeSet) { nodeSet.toList() } + /** Текущий список узлов и известные группы (копия для UI). */ + fun nodeList(): List> = synchronized(nodeSet) { + nodeSet.map { it to nodeTgs[it] } + } override fun onNodeJoined(callsign: String, tg: Long?) { synchronized(nodeSet) { nodeSet.add(callsign) } @@ -131,11 +134,17 @@ class SvxService : Service(), ReflectorClient.Callbacks { } override fun onNodeLeft(callsign: String, tg: Long?) { - synchronized(nodeSet) { nodeSet.remove(callsign) } + synchronized(nodeSet) { + nodeSet.remove(callsign) + nodeTgs.remove(callsign) + } listener?.onNodeLeft(callsign, tg) } override fun onTalkerStart(tg: Long, callsign: String) { + synchronized(nodeSet) { + if (callsign in nodeSet) nodeTgs[callsign] = tg + } updateNotification(getString(R.string.notif_talking, callsign)) listener?.onTalkerStart(tg, callsign) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 207aa33..9ee4c4b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,6 +18,7 @@ Подключился: %1$s%2$s Отключился: %1$s%2$s (группа %1$d) + %1$s — TG%2$d Сохранить SVXhomyak — v1.0.4 Сохранено