Assign a registered event ID to Android group avatar snapshots

This commit is contained in:
evgeny committed 2026-10-28 11:36:13 +01:00
1 parent e91987d241
commit d969b277e1
3 files changed
+7 -4

No files matched your search

+1
View File
@@ -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. */
// ── Подключение получателя событий ──
@@ -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)
@@ -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);
}