Show 'Говорит TG..' + callsign + RX/TX duplex indicator
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user