From d02c55dbcd9fc913b84e04e6196da43955174994 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sun, 4 Oct 2026 19:18:00 +0200 Subject: [PATCH] Document web link handling, validation and Q8 verification --- doc/message_links.md | 36 ++++++++++++++++++++++++++++++++++++ doc/tasks.md | 13 +++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 doc/message_links.md diff --git a/doc/message_links.md b/doc/message_links.md new file mode 100644 index 00000000..08c77f1a --- /dev/null +++ b/doc/message_links.md @@ -0,0 +1,36 @@ +# Ссылки в сообщениях + +Android и Qt распознают `http://`, `https://` и `utun://` в обычном тексте +личных и групповых сообщений. HTTP/HTTPS нечувствительны к регистру схемы. +Ссылки выделяются цветом и подчёркиванием; длинные веб-адреса переносятся по ширине. +Сокращённая строка структурированного PM-приглашения сохраняет полный `utun://` адрес. + +Пробелы, управляющие символы, кавычки и угловые скобки отделяют ссылку от текста. +Конечные `. , ; : ! ?` и лишние закрывающие скобки удаляются из распознанного адреса. +Сбалансированные скобки в адресе, параметры, fragment и Unicode сохраняются. +Адреса без схемы не распознаются. Некорректные веб-адреса остаются обычным текстом. +Исходное сообщение в БД и протоколе не меняется. + +Разборщики возвращают диапазоны UTF-16 и полные адреса: +`tools/chatgui/src/message_links.cpp`, Android `data/MessageLinks.kt`. +Подсветка и нажатие используют эти диапазоны. Android подставляет emoji placeholders +только в обычный текст между ссылками: emoji внутри адреса остаётся частью полного URL. +Qt использует один QTextLayout для размеров, отрисовки, выделения и координат нажатия. +Перетаскивание выделяет текст без открытия ссылки. + +HTTP/HTTPS открываются из GUI системным обработчиком: Android `ACTION_VIEW`, +Qt `QDesktopServices::openUrl`. `utun://` запускает существующий JOIN. +Ошибки открытия показываются через перевод интерфейса и логируются. +Диагностика открытия содержит схему и host, без полного пути/query. + +Общие случаи: `tools/chatgui/tests/message_links_cases.tsv`. +Qt `test_invite_links` проверяет разбор, перенесённые веб-ссылки, смесь схем, +нажатие, drag/copy и сокращённые приглашения; `test_emoji_playback` — жесты приглашений. +Android `tests/test_message_links.kt` проверяет тот же TSV на классах из APK-сборки: + +```bash +cd tools/chatgui-android +./build.sh noinstall +kotlinc tests/test_message_links.kt -classpath app/build/tmp/kotlin-classes/debug -d /tmp/message-links-tests.jar +kotlin -classpath /tmp/message-links-tests.jar:app/build/tmp/kotlin-classes/debug Test_message_linksKt ../chatgui/tests/message_links_cases.tsv +``` diff --git a/doc/tasks.md b/doc/tasks.md index c7bf88b9..dd7ada5f 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -3,6 +3,19 @@ Сюда пишется список задач с короткой аннотацией. Если задача большая и имеет ТЗ - то ТЗ оформляется отдельным файлом, а сюда помещается аннотация и ссылка на ТЗ. ## Текущая задача +[+] **Открытие HTTP/HTTPS в сообщениях Android и Qt** — 04.10.2026: + общая обработка ссылок по диапазонам текста; веб-адреса открываются системным + обработчиком, `utun://` сохраняет JOIN и короткое отображение PM-приглашений. + Учтены Unicode, IPv6, скобки, пунктуация, параметры, fragment и emoji в адресах. + Qt использует одинаковый layout для отрисовки, размеров, нажатия и выделения. + Ошибки открытия переведены и логируются. Общие 15 случаев прошли в Android и Qt; + проверки нажатия/drag/copy и приглашений прошли. Чистые сборки Qt и APK — PASS. + `check.sh`: 124 passed, 0 failed, 1 skipped; proxy/burst/load — PASS. + APK установлен на Q8, проверено системное открытие HTTP и HTTPS через ACTION_VIEW, + приложение запущено. Логи: `/tmp/message-links-check.log`, + `/tmp/message-links-qt-final-tests.log`, `/tmp/message-links-android-tests.log`. + Контракт: `doc/message_links.md`. + [+] **Заголовок PM-приглашения и короткое отображение ссылки** — 04.10.2026: `ct=invite` содержит зашифрованные название группы и полную ссылку; GUI получает название через `tags.group_name` и добавляет заголовок из перевода интерфейса.