Cocosations
Форк XMPP-клиента Conversations для Android. Показывает, на каком этапе и почему звонок не соединился, и измеряет качество звука в обе стороны.
attributes
- role
- автор форка
Задача
Когда звонок не соединяется, 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 с уже заполненными адресом репозитория и отпечатком ключа.
fdroid_repo
- fingerprint
- 1B4D3D289AC970F53860490E7AAA8B40E8810DFA149E3CA66FB93FB18E5738CE
- apk_cert
- 015df71201ff6e6ca0db7b666bd4ae4fb24386199e80e4475f70a4c6233eb78f
Добавить вручную: F-Droid - Настройки - Репозитории - «+». APK подписаны ключом автора, индекс репозитория подписан отдельным ключом репозитория. В репозитории хранится только последняя версия, предыдущие лежат на странице релизов GitHub.