Cocosations

A fork of the Conversations XMPP client for Android. It shows at which stage a call failed and why, and measures audio quality in both directions.

attributes

role
maintainer
repo
https://github.com/tzx1z/cocosations

Problem

When a call fails, Conversations shows a short end state such as "Could not connect call". It does not say which stage failed: the user's server, the contact's server, the contact's device or the media connection. Audio quality during a call is not shown either.

Solution

The call screen shows a progress bar of four stages: own server, federation, the contact's device and media. The failed stage turns red, and the reason appears below it: no response from the user's server, remote-server-not-found, the contact is offline or declined the call, ICE failed.

Each call gets a report that opens from the call screen, the chat or the contact's profile: XMPP error conditions, signaling delays per step (JMI, Jingle), the contact's client and its features (XEP-0115, XEP-0092), the Jingle end reason, the STUN/TURN response (XEP-0215), ICE candidates and pairs, the media route (direct or via TURN), a NAT type estimate, a recommendation and a timeline. Reports are kept in a call journal with filters and are exported as text or JSON.

  • Audio quality in both directions from WebRTC getStats(): loss, jitter, RTT, bitrate and MOS by a simplified E-model (ITU-T G.107), charts on the call screen, a short tone when the media connection is lost and restored
  • Channel check without a call: two PeerConnections on the device send a voice-like packet stream through the user's own TURN server over UDP, TCP and TLS and show delay, jitter, loss and MOS, for example before a call through a VPN or a proxy
  • Last activity of contacts from XEP-0319, XEP-0256 and XEP-0012 in the contact list, the chat list, the chat header and the profile; publishing own activity is off by default
  • Optional: incoming audio calls through the system Phone app, so they can be answered from a watch, a headset or a car
  • Installs next to Conversations with its own application ID and adds no permissions, trackers or third-party services

Stack

Java, Android SDK, WebRTC, XMPP: Jingle, JMI, XEP-0215 and others. Gradle with JDK 25, release builds in a Podman container with the same JDK and NDK as the F-Droid buildserver. GPL-3.0, like Conversations.

Outcome

Release 2.20.4.1 is published in the fdroid.inkov.dev repository and on GitHub. The build is set up to be reproducible: APKs are built from the release tag in the environment of the F-Droid buildserver, and the recipe in the fdroiddata format can be submitted to f-droid.org without changes.

The Java packages stay as in upstream, and the fork's resources live in files with the cocosations_ prefix, so new Conversations releases merge without mass conflicts.

Installation

Through F-Droid from the inkov.dev repository, which publishes the author's Android apps. On a phone with F-Droid installed, the link opens F-Droid with the repository address and key fingerprint filled in.

Add to F-Droid

fdroid_repo

fingerprint
1B4D3D289AC970F53860490E7AAA8B40E8810DFA149E3CA66FB93FB18E5738CE
apk_cert
015df71201ff6e6ca0db7b666bd4ae4fb24386199e80e4475f70a4c6233eb78f

To add the repository manually: F-Droid - Settings - Repositories - "+". The APKs are signed with the author's key, the repository index with a separate repository key. The repository keeps only the latest version, older ones are on the GitHub releases page.

All projects