Browse Source

android: рация — единый режим per-канал, не гаснет при выходе/заходе в группу

proxy
evgeny 5 days ago
parent
commit
0209bcf5d3
  1. 2
      tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt
  2. 39
      tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt

2
tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt

@ -149,7 +149,7 @@ class MainActivity : ComponentActivity() {
Screen.MemberList -> screen = Screen.Chat Screen.MemberList -> screen = Screen.Chat
Screen.VideoRecord -> screen = Screen.Chat Screen.VideoRecord -> screen = Screen.Chat
Screen.PhotoRecord -> screen = Screen.Chat Screen.PhotoRecord -> screen = Screen.Chat
Screen.Chat -> { vm.radioOff(); screen = Screen.ChannelList } Screen.Chat -> screen = Screen.ChannelList
Screen.Dm -> { vm.closeDm(); screen = Screen.ChannelList } Screen.Dm -> { vm.closeDm(); screen = Screen.ChannelList }
Screen.Call -> screen = screenBeforeCall ?: Screen.ChannelList Screen.Call -> screen = screenBeforeCall ?: Screen.ChannelList
else -> screen = Screen.ChannelList else -> screen = Screen.ChannelList

39
tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt

@ -67,6 +67,9 @@ class ChatViewModel : ViewModel() {
private var radioToggleCount = 0 private var radioToggleCount = 0
/* рация: активный канал (null = выключена). Одна рация — один канал. */
private var radioChannelId: String? = null
private var callStartedMs = 0L private var callStartedMs = 0L
private var callIncomingAtMs = 0L private var callIncomingAtMs = 0L
@ -509,6 +512,7 @@ class ChatViewModel : ViewModel() {
if (data.size < 1 + cl) return if (data.size < 1 + cl) return
val chId = String(data, 1, cl) val chId = String(data, 1, cl)
LogManager.addLog("INFO", "VM", "CHANNEL_DELETED ch=$chId") LogManager.addLog("INFO", "VM", "CHANNEL_DELETED ch=$chId")
if (radioChannelId == chId) turnRadioOff()
if (_currentChannel.value?.id == chId) { if (_currentChannel.value?.id == chId) {
_currentChannel.value = null _currentChannel.value = null
_messages.value = emptyList() _messages.value = emptyList()
@ -741,21 +745,28 @@ class ChatViewModel : ViewModel() {
fun toggleRadio() { fun toggleRadio() {
val ch = _currentChannel.value ?: return val ch = _currentChannel.value ?: return
val groupId = ch.id.toULongOrNull()?.toLong() ?: return val groupId = ch.id.toULongOrNull()?.toLong() ?: return
val next = !_radioActive.value val wasOnHere = radioChannelId == ch.id
val next = !wasOnHere
radioToggleCount++ radioToggleCount++
val caller = Throwable().stackTrace.drop(1).take(8) val caller = Throwable().stackTrace.drop(1).take(8)
.joinToString(" <- ") { "${it.className.substringAfterLast('.')}.${it.methodName}:${it.lineNumber}" } .joinToString(" <- ") { "${it.className.substringAfterLast('.')}.${it.methodName}:${it.lineNumber}" }
LogManager.addLog("DEBUG", "RADIO_DBG", LogManager.addLog("DEBUG", "RADIO_DBG",
"toggleRadio#$radioToggleCount next=$next prevActive=${_radioActive.value} " + "toggleRadio#$radioToggleCount next=$next prevActive=${_radioActive.value} " +
"radioChannelId=$radioChannelId cur=${ch.id} " +
"thread=${Thread.currentThread().name} t=${System.currentTimeMillis()} caller=$caller") "thread=${Thread.currentThread().name} t=${System.currentTimeMillis()} caller=$caller")
NativeLib.radioSetActive(groupId, next)
_radioActive.value = next
if (next) { if (next) {
radioChannelId?.takeIf { it != ch.id }?.toULongOrNull()?.toLong()
?.let { NativeLib.radioSetActive(it, false) } /* выключаем старый канал */
radioChannelId = ch.id
NativeLib.radioSetActive(groupId, true)
radioAudio.start(groupId) radioAudio.start(groupId)
} else { } else {
_radioTalking.value = null radioChannelId = null
NativeLib.radioSetActive(groupId, false)
radioAudio.stop() radioAudio.stop()
_radioTalking.value = null
} }
_radioActive.value = next
syncRadioOverlay() syncRadioOverlay()
LogManager.addLog("INFO", "VM", "toggleRadio -> ${if (next) "on" else "off"} group=$groupId") LogManager.addLog("INFO", "VM", "toggleRadio -> ${if (next) "on" else "off"} group=$groupId")
} }
@ -770,23 +781,25 @@ class ChatViewModel : ViewModel() {
radioAudio.talkEnd() radioAudio.talkEnd()
} }
fun radioOff() { /* Полностью выключить рацию (используется при удалении активного канала). */
if (!_radioActive.value && !radioAudio.isActive()) return private fun turnRadioOff() {
val ch = _currentChannel.value ?: return val chId = radioChannelId ?: return
val groupId = ch.id.toULongOrNull()?.toLong() ?: return chId.toULongOrNull()?.toLong()?.let { NativeLib.radioSetActive(it, false) }
NativeLib.radioSetActive(groupId, false) radioChannelId = null
_radioActive.value = false _radioActive.value = false
_radioTalking.value = null _radioTalking.value = null
radioAudio.stop() radioAudio.stop()
syncRadioOverlay()
} }
private fun syncRadioOverlay() { private fun syncRadioOverlay() {
val ctx = ChatApplication.instance val ctx = ChatApplication.instance
val overlayEnabled = ctx.configProvider.getRadioOverlay() val overlayEnabled = ctx.configProvider.getRadioOverlay()
val radioOn = radioChannelId != null
LogManager.addLog("DEBUG", "RADIO_DBG", LogManager.addLog("DEBUG", "RADIO_DBG",
"syncRadioOverlay active=${_radioActive.value} overlayEnabled=$overlayEnabled " + "syncRadioOverlay radioOn=$radioOn channel=$radioChannelId overlayEnabled=$overlayEnabled " +
"isShown=${RadioOverlayService.isShown.value} t=${System.currentTimeMillis()}") "isShown=${RadioOverlayService.isShown.value} t=${System.currentTimeMillis()}")
if (_radioActive.value && overlayEnabled) if (radioOn && overlayEnabled)
RadioOverlayService.start(ctx) RadioOverlayService.start(ctx)
else else
RadioOverlayService.stop(ctx) RadioOverlayService.stop(ctx)
@ -863,8 +876,9 @@ class ChatViewModel : ViewModel() {
fun selectChannel(channel: Channel) { fun selectChannel(channel: Channel) {
val r = repo ?: return val r = repo ?: return
radioOff() /* рацию выключаем при переключении канала */
_currentChannel.value = channel _currentChannel.value = channel
_radioActive.value = (radioChannelId == channel.id)
if (radioChannelId != channel.id) _radioTalking.value = null
_soundOn.value = NativeLib.getSoundOnMessage(channel.id) _soundOn.value = NativeLib.getSoundOnMessage(channel.id)
NotificationSound.setMuted(channel.id, !_soundOn.value) NotificationSound.setMuted(channel.id, !_soundOn.value)
r.connectChannel(channel.id) r.connectChannel(channel.id)
@ -1028,6 +1042,7 @@ class ChatViewModel : ViewModel() {
val r = repo ?: return val r = repo ?: return
LogManager.addLog("INFO", "VM", "deleteChannel ch=$channelId") LogManager.addLog("INFO", "VM", "deleteChannel ch=$channelId")
r.deleteChannel(channelId) r.deleteChannel(channelId)
if (radioChannelId == channelId) turnRadioOff()
if (_currentChannel.value?.id == channelId) { if (_currentChannel.value?.id == channelId) {
_currentChannel.value = null _currentChannel.value = null
_messages.value = emptyList() _messages.value = emptyList()

Loading…
Cancel
Save