From a4c7899ffbd3b593c0e34b017e98bfd2b2c31898 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 14:02:25 +0100 Subject: [PATCH] Keep native member query failures distinct from valid empty snapshots --- .../app/src/main/java/com/utun/chat/data/NativeLib.kt | 8 +++++--- .../main/java/com/utun/chat/viewmodel/ChatViewModel.kt | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/NativeLib.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/NativeLib.kt index 4352f05c..cc7c8a0f 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/NativeLib.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/NativeLib.kt @@ -215,7 +215,8 @@ object NativeLib { } /* ── Channel members ── */ - fun getChannelMembers(channelId: String): String = nativeGetChannelMembers(channelId) ?: "[]" + fun getChannelMembers(channelId: String): String = + checkNotNull(nativeGetChannelMembers(channelId)) { "Member snapshot unavailable channel=$channelId" } /** Асинхронный live-снимок; ответ — событие MEMBER_LIST. */ fun requestMemberList(channelId: String): Boolean = nativeRequestMemberList(channelId) fun requestGroupAvatar(id: Long, group: Long): Boolean = nativeAvatarOperation(0, id, group, 0, 0, null, null, null) @@ -244,7 +245,8 @@ object NativeLib { private external fun nativeFileTransfer(id: Long, group: Long, server: Long, owner: Long, remote: ByteArray, local: ByteArray, upload: Boolean, version: ByteArray): Boolean private external fun nativeFileCancel(id: Long): Boolean - fun getMemberDetail(channelId: String, nodeId: Long): String = nativeGetMemberDetail(channelId, nodeId) ?: "{}" + fun getMemberDetail(channelId: String, nodeId: Long): String = + checkNotNull(nativeGetMemberDetail(channelId, nodeId)) { "Member detail unavailable channel=$channelId node=$nodeId" } fun setMemberNick(channelId: String, nodeId: Long, nick: String) { nativeSetMemberNick(channelId, nodeId, nick) } fun toggleMemberRadioMute(channelId: String, nodeId: Long): Boolean = nativeToggleMemberRadioMute(channelId, nodeId) fun isChannelOwner(channelId: String): Boolean = nativeIsChannelOwner(channelId) @@ -254,7 +256,7 @@ object NativeLib { } fun transferAdmin(channelId: String, nodeId: Long) { nativeTransferAdmin(channelId, nodeId) } fun deleteChannel(channelId: String) { nativeDeleteChannel(channelId) } - fun getMemberLinks(nodeId: Long): String = nativeGetMemberLinks(nodeId) ?: "{}" + fun getMemberLinks(nodeId: Long): String = checkNotNull(nativeGetMemberLinks(nodeId)) { "Member links unavailable node=$nodeId" } /* ── Local sockets (for auto-mode display) ── */ fun requestLocalSockets() = nativeRequestLocalSockets() 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 21daf39c..335f362f 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 @@ -28,7 +28,7 @@ import org.json.JSONArray private val IMAGE_EXTENSIONS = setOf("jpg", "jpeg", "png", "gif", "bmp", "webp") -/** UI-снимки каналов/PM, выбор беседы и подтверждения локальных отправок. Все изменения состояния — на main. +/** UI-снимки каналов/PM, выбор беседы и подтверждения локальных отправок. События и команды UI обрабатываются на main. * Тяжёлые чтения идут через repository на IO; revision/instance guards отбрасывают устаревшие ответы. * Команда JNI подтверждает лишь очередь: commit отправки сверяется по уникальному request ID события. * Настройки/сброс БД принадлежат Application; media/controllers также переживают UI и освобождаются по ACK.