diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 69e3fce..b4d6f96 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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 { diff --git a/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt b/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt index e695c10..826db76 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt @@ -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()) { diff --git a/app/src/main/java/ru/ua1zbe/svxremote/SvxService.kt b/app/src/main/java/ru/ua1zbe/svxremote/SvxService.kt index 95c68bd..302684d 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/SvxService.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/SvxService.kt @@ -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() + + /** Текущий список подключенных узлов (копия для UI). */ + fun nodeList(): List = 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) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 90ac041..c2db9f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,8 +12,10 @@ Группы для переключения (через запятую) Выбор группы Добавьте группы в настройках + Узлы в сети (%1$d) + Нет подключенных узлов Сохранить - SVXhomyak — v1.0.3 + SVXhomyak — v1.0.4 Сохранено например UA1ZBE