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 lblTg: TextView
|
||||||
private lateinit var lblTalkerTitle: TextView
|
private lateinit var lblTalkerTitle: TextView
|
||||||
private lateinit var lblTalker: TextView
|
private lateinit var lblTalker: TextView
|
||||||
|
private lateinit var lblDuplex: TextView
|
||||||
private lateinit var lblPttHint: TextView
|
private lateinit var lblPttHint: TextView
|
||||||
private lateinit var lblTxState: TextView
|
private lateinit var lblTxState: TextView
|
||||||
private lateinit var lblConnectHint: TextView
|
private lateinit var lblConnectHint: TextView
|
||||||
@@ -131,6 +132,7 @@ class MainActivity : Activity(), SvxService.Listener {
|
|||||||
lblSubtitle = findViewById(R.id.lbl_subtitle)
|
lblSubtitle = findViewById(R.id.lbl_subtitle)
|
||||||
lblTalkerTitle = findViewById(R.id.lbl_talker_title)
|
lblTalkerTitle = findViewById(R.id.lbl_talker_title)
|
||||||
lblTalker = findViewById(R.id.lbl_talker)
|
lblTalker = findViewById(R.id.lbl_talker)
|
||||||
|
lblDuplex = findViewById(R.id.lbl_duplex)
|
||||||
lblPttHint = findViewById(R.id.lbl_ptt_hint)
|
lblPttHint = findViewById(R.id.lbl_ptt_hint)
|
||||||
lblTxState = findViewById(R.id.lbl_tx_state)
|
lblTxState = findViewById(R.id.lbl_tx_state)
|
||||||
lblConnectHint = findViewById(R.id.lbl_connect_hint)
|
lblConnectHint = findViewById(R.id.lbl_connect_hint)
|
||||||
@@ -236,6 +238,7 @@ class MainActivity : Activity(), SvxService.Listener {
|
|||||||
}
|
}
|
||||||
lblPttHint.text = getString(R.string.ptt_talking)
|
lblPttHint.text = getString(R.string.ptt_talking)
|
||||||
lblTxState.text = getString(R.string.status_big_talking)
|
lblTxState.text = getString(R.string.status_big_talking)
|
||||||
|
showDuplex(getString(R.string.duplex_tx), R.color.danger, null)
|
||||||
svc?.startTx()
|
svc?.startTx()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,6 +249,7 @@ class MainActivity : Activity(), SvxService.Listener {
|
|||||||
lblTxState.text =
|
lblTxState.text =
|
||||||
if (connected) getString(R.string.status_big_connected)
|
if (connected) getString(R.string.status_big_connected)
|
||||||
else getString(R.string.status_big_disconnected)
|
else getString(R.string.status_big_disconnected)
|
||||||
|
hideDuplex()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -407,15 +411,14 @@ class MainActivity : Activity(), SvxService.Listener {
|
|||||||
// Во время своей передачи группу не меняем.
|
// Во время своей передачи группу не меняем.
|
||||||
if (!pttButton.isPressed2) {
|
if (!pttButton.isPressed2) {
|
||||||
svc?.selectGroup(tg)
|
svc?.selectGroup(tg)
|
||||||
lblTalkerTitle.text = getString(R.string.talker_mon, callsign, tg)
|
|
||||||
lblTalkerTitle.setTextColor(getColor(R.color.text_secondary))
|
|
||||||
lblTalker.text = callsign
|
|
||||||
}
|
}
|
||||||
resetMonitorIdle()
|
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))
|
lblTalkerTitle.setTextColor(getColor(R.color.text_secondary))
|
||||||
lblTalker.text = callsign
|
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)
|
micMeter.setLevel(level)
|
||||||
} else { // SRC_SPEAKER
|
} else { // SRC_SPEAKER
|
||||||
rxMeter.setLevel(level)
|
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) {
|
if (monitoring && connected && level > 0.03f) {
|
||||||
resetMonitorIdle()
|
resetMonitorIdle()
|
||||||
@@ -504,6 +511,26 @@ class MainActivity : Activity(), SvxService.Listener {
|
|||||||
mainHandler.postDelayed(task, MONITOR_IDLE_MS)
|
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) {
|
override fun onError(detail: String) {
|
||||||
mainHandler.post {
|
mainHandler.post {
|
||||||
toast(detail)
|
toast(detail)
|
||||||
|
|||||||
@@ -205,6 +205,17 @@
|
|||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:ellipsize="end" />
|
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
|
<Space
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
|
|||||||
@@ -41,7 +41,9 @@
|
|||||||
<string name="monitor_off">Обычный режим</string>
|
<string name="monitor_off">Обычный режим</string>
|
||||||
<string name="btn_monitor_on">Мониторинг групп включен (нажмите, чтобы выключить)</string>
|
<string name="btn_monitor_on">Мониторинг групп включен (нажмите, чтобы выключить)</string>
|
||||||
<string name="status_monitoring">Мониторинг: %1$s</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_disconnected">DISCONNECTED</string>
|
||||||
<string name="status_big_connected">CONNECTED</string>
|
<string name="status_big_connected">CONNECTED</string>
|
||||||
<string name="status_big_talking">ПЕРЕДАЧА</string>
|
<string name="status_big_talking">ПЕРЕДАЧА</string>
|
||||||
@@ -69,7 +71,6 @@
|
|||||||
<string name="btn_disconnect">Отключиться</string>
|
<string name="btn_disconnect">Отключиться</string>
|
||||||
|
|
||||||
<string name="talker_none">—</string>
|
<string name="talker_none">—</string>
|
||||||
<string name="talker_now">Последний: %1$s</string>
|
|
||||||
<string name="talker_on_tg">группа %1$d</string>
|
<string name="talker_on_tg">группа %1$d</string>
|
||||||
|
|
||||||
<string name="ptt_hint">Удерживайте кнопку, чтобы говорить</string>
|
<string name="ptt_hint">Удерживайте кнопку, чтобы говорить</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user