From 0209bcf5d386cd064dfe5b5fba0ffc19c6632e30 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 26 Sep 2026 19:12:07 +0300 Subject: [PATCH] =?UTF-8?q?android:=20=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=E2=80=94=20=D0=B5=D0=B4=D0=B8=D0=BD=D1=8B=D0=B9=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B6=D0=B8=D0=BC=20per-=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB,=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=B3=D0=B0=D1=81=D0=BD=D0=B5=D1=82=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=B5/=D0=B7?= =?UTF-8?q?=D0=B0=D1=85=D0=BE=D0=B4=D0=B5=20=D0=B2=20=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=BF=D0=BF=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/utun/chat/MainActivity.kt | 2 +- .../com/utun/chat/viewmodel/ChatViewModel.kt | 39 +++++++++++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt index 057fe18d..3a8d5aac 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/MainActivity.kt +++ b/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.VideoRecord -> 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.Call -> screen = screenBeforeCall ?: Screen.ChannelList else -> screen = Screen.ChannelList diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt index 559086e2..3ad0095e 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt @@ -67,6 +67,9 @@ class ChatViewModel : ViewModel() { private var radioToggleCount = 0 + /* рация: активный канал (null = выключена). Одна рация — один канал. */ + private var radioChannelId: String? = null + private var callStartedMs = 0L private var callIncomingAtMs = 0L @@ -509,6 +512,7 @@ class ChatViewModel : ViewModel() { if (data.size < 1 + cl) return val chId = String(data, 1, cl) LogManager.addLog("INFO", "VM", "CHANNEL_DELETED ch=$chId") + if (radioChannelId == chId) turnRadioOff() if (_currentChannel.value?.id == chId) { _currentChannel.value = null _messages.value = emptyList() @@ -741,21 +745,28 @@ class ChatViewModel : ViewModel() { fun toggleRadio() { val ch = _currentChannel.value ?: return val groupId = ch.id.toULongOrNull()?.toLong() ?: return - val next = !_radioActive.value + val wasOnHere = radioChannelId == ch.id + val next = !wasOnHere radioToggleCount++ val caller = Throwable().stackTrace.drop(1).take(8) .joinToString(" <- ") { "${it.className.substringAfterLast('.')}.${it.methodName}:${it.lineNumber}" } LogManager.addLog("DEBUG", "RADIO_DBG", "toggleRadio#$radioToggleCount next=$next prevActive=${_radioActive.value} " + + "radioChannelId=$radioChannelId cur=${ch.id} " + "thread=${Thread.currentThread().name} t=${System.currentTimeMillis()} caller=$caller") - NativeLib.radioSetActive(groupId, next) - _radioActive.value = 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) } else { - _radioTalking.value = null + radioChannelId = null + NativeLib.radioSetActive(groupId, false) radioAudio.stop() + _radioTalking.value = null } + _radioActive.value = next syncRadioOverlay() LogManager.addLog("INFO", "VM", "toggleRadio -> ${if (next) "on" else "off"} group=$groupId") } @@ -770,23 +781,25 @@ class ChatViewModel : ViewModel() { radioAudio.talkEnd() } - fun radioOff() { - if (!_radioActive.value && !radioAudio.isActive()) return - val ch = _currentChannel.value ?: return - val groupId = ch.id.toULongOrNull()?.toLong() ?: return - NativeLib.radioSetActive(groupId, false) + /* Полностью выключить рацию (используется при удалении активного канала). */ + private fun turnRadioOff() { + val chId = radioChannelId ?: return + chId.toULongOrNull()?.toLong()?.let { NativeLib.radioSetActive(it, false) } + radioChannelId = null _radioActive.value = false _radioTalking.value = null radioAudio.stop() + syncRadioOverlay() } private fun syncRadioOverlay() { val ctx = ChatApplication.instance val overlayEnabled = ctx.configProvider.getRadioOverlay() + val radioOn = radioChannelId != null 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()}") - if (_radioActive.value && overlayEnabled) + if (radioOn && overlayEnabled) RadioOverlayService.start(ctx) else RadioOverlayService.stop(ctx) @@ -863,8 +876,9 @@ class ChatViewModel : ViewModel() { fun selectChannel(channel: Channel) { val r = repo ?: return - radioOff() /* рацию выключаем при переключении канала */ _currentChannel.value = channel + _radioActive.value = (radioChannelId == channel.id) + if (radioChannelId != channel.id) _radioTalking.value = null _soundOn.value = NativeLib.getSoundOnMessage(channel.id) NotificationSound.setMuted(channel.id, !_soundOn.value) r.connectChannel(channel.id) @@ -1028,6 +1042,7 @@ class ChatViewModel : ViewModel() { val r = repo ?: return LogManager.addLog("INFO", "VM", "deleteChannel ch=$channelId") r.deleteChannel(channelId) + if (radioChannelId == channelId) turnRadioOff() if (_currentChannel.value?.id == channelId) { _currentChannel.value = null _messages.value = emptyList()