Skip to main content
Wire Android supports end-to-end encrypted voice and video calls for both 1:1 conversations and group conversations. Calls are powered by the Wire AVS (Audio-Video Signaling) library.

AVS Library

The open-source build of Wire Android links against the open-source AVS library. The binary available on the Google Play Store links against a version of AVS that includes proprietary improvements for call quality. See the README for details.

Call Types

1:1 Voice Call

Encrypted audio call between two users. Initiated from a direct conversation.

1:1 Video Call

Encrypted video call between two users with front/back camera switching.

Group Voice Call

Conference call across a group conversation with multiple participants.

Group Video Call

Multi-party video call with a participant grid view and fullscreen support.

Incoming Calls

When a call arrives, a full-screen incoming call screen is displayed showing:
  • Caller name and avatar (1:1 calls)
  • Group conversation name and the name of who initiated the call (group calls)
  • Accept and Decline buttons
  • Options to toggle microphone and camera before answering
Answering a call requires the RECORD_AUDIO permission. If the permission has been permanently denied, a dialog guides the user to grant it from system settings.

Ongoing Call Controls

During an active call, the control bar provides:
ControlDescription
MicrophoneMute / unmute the local microphone
CameraEnable / disable the local camera
SpeakerToggle between earpiece, speakerphone, and connected audio devices
In-call reactionsOpen the emoji reaction panel (when enabled)
Hang upEnd the call

Constant Bitrate (CBR)

When force_constant_bitrate_calls is true (default: false), calls use a constant audio bitrate. An indicator is shown in the call top bar when CBR is active. CBR is only available for 1:1 calls.

Fullscreen Participant View

In a multi-participant video call, double-tapping a participant tile promotes it to fullscreen. A toast guides users on this interaction the first time it is available. Tapping the back button or the fullscreen tile returns to the grid view. Participants with active video are sorted to the top of the grid. When all remote videos are disabled, participants are sorted alphabetically.

Picture-in-Picture

Picture-in-picture (PiP) support is controlled by the picture_in_picture_enabled flag (default: false).
When picture_in_picture_enabled is true and the device supports PiP (Android 8.0+), pressing the home button or back button during an active call enters PiP mode instead of ending the call. The PiP window shows the ongoing video feed and allows the user to continue using other apps. In PiP mode:
  • The call controls bar is hidden
  • The floating self-user tile is shown when there are multiple participants
  • The app re-enters full call view when the user taps the PiP window

In-Call Reactions

In-call reactions are controlled by the call_reactions_enabled flag (default: true).
When enabled, a reactions button appears in the call control bar. Tapping it opens a panel of quick-pick emoji. Users can also open a full emoji picker for any emoji.
  • Selected emoji float across the call screen as an animation visible to the local user
  • Reactions from remote participants appear as floating emoji overlays attributed to the sender
  • Recent reactions are shown on each participant’s video tile
  • The reaction queue holds up to 300 reactions with throttled playback to avoid visual overload

Meetings

Meetings support is controlled by the meetings_enabled flag (default: false, enabled in the dev flavor).
When meetings_enabled is true, a meetings entry point is surfaced in the app navigation.

Audio Device Management

The speaker button cycles through available audio output devices:
  • Earpiece — default for 1:1 calls
  • Speakerphone — built-in loudspeaker
  • Bluetooth — headsets and speakers connected via Bluetooth
The app observes speaker state in real time via ObserveSpeakerUseCase and reflects changes immediately in the UI.

Required Android Permissions

The following Android permissions are required for calling features:
PermissionPurpose
RECORD_AUDIOCapture microphone audio during calls
CAMERACapture video during video calls
BLUETOOTH / BLUETOOTH_CONNECTUse Bluetooth audio devices
MANAGE_OWN_CALLSIntegrate with the Android telecom framework for call management
Permissions are requested at runtime when first needed. If a permission is permanently denied, a dialog explains the requirement and links to system settings.

Call Quality Monitoring

The app continuously monitors call quality data via ObserveCallQualityDataUseCase. A call details panel (accessible from the top bar when call_quality_menu_enabled is true) shows quality metrics. Quality polling switches to a faster interval while the quality panel is open.

Verification Status in Calls

The call top bar shows MLS and Proteus verification icons for the conversation. This allows users to confirm the end-to-end verified status of the call without leaving the call screen.

Build docs developers (and LLMs) love