Cocosations

Форк XMPP-клиента Conversations для Android. Показывает, на каком этапе и почему звонок не соединился, и измеряет качество звука в обе стороны.

attributes

role
автор форка
repo
https://github.com/tzx1z/cocosations

Задача

Когда звонок не соединяется, Conversations показывает короткий статус вроде «Невозможно установить соединение». Он не сообщает, на каком этапе произошел сбой: свой сервер, сервер собеседника, устройство собеседника или медиасоединение. Качество звука во время звонка тоже не видно.

Решение

На экране звонка прогресс-бар из четырех этапов: свой сервер, федерация, устройство собеседника и медиа. Этап со сбоем выделяется красным, под ним выводится причина: нет ответа своего сервера, remote-server-not-found, собеседник не в сети или отклонил звонок, ICE failed.

Для каждого звонка сохраняется отчет, он открывается с экрана звонка, из чата или профиля контакта: условия ошибок XMPP, задержки сигналинга по шагам (JMI, Jingle), клиент собеседника и его возможности (XEP-0115, XEP-0092), причина завершения из Jingle, ответ STUN/TURN (XEP-0215), кандидаты и пары ICE, маршрут медиа (напрямую или через TURN), оценка типа NAT, рекомендация и хронология событий. Отчеты хранятся в журнале звонков с фильтрами и выгружаются текстом или в JSON.

  • Качество звука в обе стороны по WebRTC getStats(): потери, jitter, RTT, битрейт и MOS по упрощенной E-model (ITU-T G.107), графики на экране звонка, короткий сигнал при разрыве и восстановлении медиасоединения
  • Проверка канала без звонка: две PeerConnection на устройстве передают поток пакетов с параметрами голоса через свой TURN-сервер по UDP, TCP и TLS и показывают задержку, jitter, потери и MOS, например перед звонком через VPN или прокси
  • Последняя активность контактов по XEP-0319, XEP-0256 и XEP-0012 в списке контактов, списке чатов, заголовке чата и профиле; публикация своей активности по умолчанию выключена
  • По желанию входящие аудиозвонки показывает системное приложение «Телефон», поэтому ответить на них можно с часов, гарнитуры или в машине
  • Устанавливается рядом с Conversations со своим Application ID и не добавляет разрешений, трекеров и обращений к сторонним сервисам

Стек

Java, Android SDK, WebRTC, XMPP: Jingle, JMI, XEP-0215 и другие. Gradle и JDK 25, релизные сборки в контейнере Podman с теми же JDK и NDK, что на buildserver F-Droid. Лицензия GPL-3.0, как у Conversations.

Результат

Выпуск 2.20.4.1 опубликован в репозитории fdroid.inkov.dev и в релизах GitHub. Сборка настроена как воспроизводимая: APK собираются из тега выпуска в окружении buildserver F-Droid, а рецепт в формате fdroiddata подается в f-droid.org без изменений.

Java-пакеты оставлены как в upstream, ресурсы форка лежат в файлах с префиксом cocosations_, поэтому новые версии Conversations вливаются без массовых конфликтов.

Установка

Через F-Droid из репозитория inkov.dev, в нем публикуются Android-приложения автора. На телефоне с установленным F-Droid ссылка откроет F-Droid с уже заполненными адресом репозитория и отпечатком ключа.

Добавить в F-Droid

fdroid_repo

fingerprint
1B4D3D289AC970F53860490E7AAA8B40E8810DFA149E3CA66FB93FB18E5738CE
apk_cert
015df71201ff6e6ca0db7b666bd4ae4fb24386199e80e4475f70a4c6233eb78f

Добавить вручную: F-Droid - Настройки - Репозитории - «+». APK подписаны ключом автора, индекс репозитория подписан отдельным ключом репозитория. В репозитории хранится только последняя версия, предыдущие лежат на странице релизов GitHub.

Все проекты