From d969b277e1fdfb6eb38256e38e7648d8f1013062 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 10:45:19 +0100 Subject: [PATCH] Assign a registered event ID to Android group avatar snapshots --- src/chat/chat_event.h | 1 + .../app/src/main/java/com/utun/chat/data/AvatarProtocol.kt | 6 ++++-- tools/chatgui-android/jni_bridge/android_jni_bridge.c | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/chat/chat_event.h b/src/chat/chat_event.h index 731fbb03..880d696f 100644 --- a/src/chat/chat_event.h +++ b/src/chat/chat_event.h @@ -92,6 +92,7 @@ extern "C" { #define CHAT_EVT_RADIO_CALL 65 /* [id:8LE][group:8LE][peer:8LE][state:1][reason:1][incoming:1], radio_call.h */ #define CHAT_EVT_CALL_PHONE_BUSY 66 /* [id:8LE][reserved:1]; вызывающий выбирает продолжить либо завершить */ #define CHAT_EVT_MSG_UPDATED 67 /* [channel_len:1][channel][message_id:32] — правка после commit, без unread/звука */ +#define CHAT_EVT_GROUP_AVATAR_SNAPSHOT 68 /* Только Android JNI: id/group/version:8LE, hash:32, can_edit/failed:1, size:2LE, image:size. */ // ── Подключение получателя событий ── diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarProtocol.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarProtocol.kt index e4b03d29..3f81f707 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarProtocol.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarProtocol.kt @@ -5,12 +5,14 @@ import java.nio.ByteOrder /** * Декодирование локальных JNI-событий аватаров: 49 — файловый ответ, 50 — прогресс передачи, - * 51/52 — результат публикации ссылки профиля/аватара группы, 53 — снимок аватара группы. + * 51/52 — результат публикации ссылки профиля/аватара группы, 68 — снимок аватара группы. * Числа LE; UID и request ID хранят исходные 64 бита в Long, включая старший бит. * Файловые события разбирает общий MemberFilesProtocol; неверный формат бросает исключение. * Здесь проверяется framing: SHA256 байтов и геометрию изображения проверяют AvatarAssets/AvatarRepository. */ object AvatarProtocol { + /** CHAT_EVT_GROUP_AVATAR_SNAPSHOT из chat_event.h; отдельный номер от FEEDBACK_CHANGED=53. */ + const val GROUP_SNAPSHOT_EVENT = 68 /** Лимит пользовательского WebP-превью, не оригинала. */ const val MAX_USER = 1024 * 1024 const val MAX_GROUP = 16 * 1024 @@ -30,7 +32,7 @@ object AvatarProtocol { fun hash(bytes: ByteArray): String = bytes.joinToString("") { "%02x".format(it.toInt() and 255) } private fun buffer(data: ByteArray) = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN) - /** Снимок 53: canEdit — наличие локального приватного ключа; failed — ошибка чтения core. + /** Снимок GROUP_SNAPSHOT_EVENT: canEdit — наличие локального приватного ключа; failed — ошибка чтения core. * Пустое image допустимо при отсутствии/удалении аватара; окончательный допуск публикации проверяет core. */ data class Group(val id: Long, val group: Long, val version: Long, val hash: String, val canEdit: Boolean, val failed: Boolean, val image: ByteArray) diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.c b/tools/chatgui-android/jni_bridge/android_jni_bridge.c index 25cd95d9..eb52b25b 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.c +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.c @@ -3163,7 +3163,7 @@ JNIEXPORT void JNICALL Java_com_utun_chat_data_NativeLib_nativeRadioTalkEnd( utun_bridge_radio_talk_end((uint64_t)groupId); } -/* Снимок читается в потоке ядра; локальное JNI-событие 53 не меняет сетевой протокол. +/* Снимок читается в потоке ядра; CHAT_EVT_GROUP_AVATAR_SNAPSHOT — локальное JNI-событие, не сетевой протокол. * id/group/version:8LE, hash:32, can_edit/failed:1, size:2LE, data:size. */ static void android_avatar_snapshot(void* arg) { struct group_avatar_gui_request* req = arg; @@ -3188,7 +3188,7 @@ static void android_avatar_snapshot(void* arg) { if (size) memcpy(event + 60, record.data, size); DEBUG_DEBUG(DEBUG_CATEGORY_CHAT, "Android avatar: snapshot group=%s id=%llu version=%llu size=%zu edit=%d failed=%d", channel, (unsigned long long)req->id, (unsigned long long)record.version, size, can_edit, failed); - jni_on_event(53, event, (int)(60 + size)); + jni_on_event(CHAT_EVT_GROUP_AVATAR_SNAPSHOT, event, (int)(60 + size)); u_free(event); u_free(req); }