Show 'Говорит TG..' + callsign + RX/TX duplex indicator

This commit is contained in:
ua1zbe
2026-08-18 16:22:41 +03:00
parent 2d85b0587b
commit 6cee5999b8
3 changed files with 48 additions and 9 deletions

View File

@@ -55,6 +55,7 @@ class MainActivity : Activity(), SvxService.Listener {
private lateinit var lblTg: TextView
private lateinit var lblTalkerTitle: TextView
private lateinit var lblTalker: TextView
private lateinit var lblDuplex: TextView
private lateinit var lblPttHint: TextView
private lateinit var lblTxState: TextView
private lateinit var lblConnectHint: TextView
@@ -131,6 +132,7 @@ class MainActivity : Activity(), SvxService.Listener {
lblSubtitle = findViewById(R.id.lbl_subtitle)
lblTalkerTitle = findViewById(R.id.lbl_talker_title)
lblTalker = findViewById(R.id.lbl_talker)
lblDuplex = findViewById(R.id.lbl_duplex)
lblPttHint = findViewById(R.id.lbl_ptt_hint)
lblTxState = findViewById(R.id.lbl_tx_state)
lblConnectHint = findViewById(R.id.lbl_connect_hint)
@@ -236,6 +238,7 @@ class MainActivity : Activity(), SvxService.Listener {
}
lblPttHint.text = getString(R.string.ptt_talking)
lblTxState.text = getString(R.string.status_big_talking)
showDuplex(getString(R.string.duplex_tx), R.color.danger, null)
svc?.startTx()
}
@@ -246,6 +249,7 @@ class MainActivity : Activity(), SvxService.Listener {
lblTxState.text =
if (connected) getString(R.string.status_big_connected)
else getString(R.string.status_big_disconnected)
hideDuplex()
}
})
@@ -407,15 +411,14 @@ class MainActivity : Activity(), SvxService.Listener {
// Во время своей передачи группу не меняем.
if (!pttButton.isPressed2) {
svc?.selectGroup(tg)
lblTalkerTitle.text = getString(R.string.talker_mon, callsign, tg)
lblTalkerTitle.setTextColor(getColor(R.color.text_secondary))
lblTalker.text = callsign
}
resetMonitorIdle()
} else {
lblTalkerTitle.text = getString(R.string.talker_now, callsign)
}
lblTalkerTitle.text = getString(R.string.talker_now, tg)
lblTalkerTitle.setTextColor(getColor(R.color.text_secondary))
lblTalker.text = callsign
if (!pttButton.isPressed2) {
showDuplex(getString(R.string.duplex_rx), R.color.accent, DUPLEX_RX_HIDE_MS)
}
}
}
@@ -483,6 +486,10 @@ class MainActivity : Activity(), SvxService.Listener {
micMeter.setLevel(level)
} else { // SRC_SPEAKER
rxMeter.setLevel(level)
// «RX» пока идёт голос; при своей передаче не показываем
if (!pttButton.isPressed2 && level > 0.03f) {
showDuplex(getString(R.string.duplex_rx), R.color.accent, DUPLEX_RX_HIDE_MS)
}
// Голос на текущей группе — откладываем возврат ко всем группам
if (monitoring && connected && level > 0.03f) {
resetMonitorIdle()
@@ -504,6 +511,26 @@ class MainActivity : Activity(), SvxService.Listener {
mainHandler.postDelayed(task, MONITOR_IDLE_MS)
}
// ---------- Индикатор RX/TX ----------
private val DUPLEX_RX_HIDE_MS = 1500L
private var duplexHideTask: Runnable? = null
private fun showDuplex(text: String, colorRes: Int, hideAfterMs: Long?) {
lblDuplex.text = text
lblDuplex.setTextColor(getColor(colorRes))
lblDuplex.visibility = View.VISIBLE
duplexHideTask?.let { mainHandler.removeCallbacks(it) }
if (hideAfterMs != null) {
val t = Runnable { lblDuplex.visibility = View.INVISIBLE }
duplexHideTask = t
mainHandler.postDelayed(t, hideAfterMs)
}
}
private fun hideDuplex() {
duplexHideTask?.let { mainHandler.removeCallbacks(it) }
lblDuplex.visibility = View.INVISIBLE
}
override fun onError(detail: String) {
mainHandler.post {
toast(detail)

View File

@@ -205,6 +205,17 @@
android:singleLine="true"
android:ellipsize="end" />
<!-- Индикация направления: RX (приём) / TX (передача) -->
<TextView
android:id="@+id/lbl_duplex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:gravity="center"
android:textSize="16sp"
android:textStyle="bold"
android:visibility="invisible" />
<Space
android:layout_width="match_parent"
android:layout_height="0dp"

View File

@@ -41,7 +41,9 @@
<string name="monitor_off">Обычный режим</string>
<string name="btn_monitor_on">Мониторинг групп включен (нажмите, чтобы выключить)</string>
<string name="status_monitoring">Мониторинг: %1$s</string>
<string name="talker_mon">Говорит: %1$s · TG%2$d</string>
<string name="talker_now">Говорит TG%1$d</string>
<string name="duplex_rx">RX</string>
<string name="duplex_tx">TX</string>
<string name="status_big_disconnected">DISCONNECTED</string>
<string name="status_big_connected">CONNECTED</string>
<string name="status_big_talking">ПЕРЕДАЧА</string>
@@ -69,7 +71,6 @@
<string name="btn_disconnect">Отключиться</string>
<string name="talker_none">—</string>
<string name="talker_now">Последний: %1$s</string>
<string name="talker_on_tg">группа %1$d</string>
<string name="ptt_hint">Удерживайте кнопку, чтобы говорить</string>