Settings reference
All settings live in data/AppSettings.kt, backed by SharedPreferences
(omnicall_settings.xml). Every field is Compose state, so changes recompose
and persist immediately.
Profile
| Setting | Values | Default |
|---|---|---|
| Display name | free text | device model, else "You" |
| Avatar | monogram / preset (0–N) / cropped photo | monogram |
The display name is not editable on the Home screen - Home shows a read-only “You’ll join as {name}” card. Change it in Settings → Profile.
Appearance
| Setting | Values | Default |
|---|---|---|
| Theme | SYSTEM / LIGHT / DARK | SYSTEM |
Drives both the app’s Material 3 scheme and the call palette. The video backdrop stays black in all three.
Camera
| Setting | Values | Default |
|---|---|---|
| Default camera | Front / Back | Front |
| Mirror front camera | on / off | on (self-view only) |
Video resolution (VideoQuality)
| Preset | Capture | Encoder cap | Degradation |
|---|---|---|---|
| Auto | 960×540@30 (adaptive) | BWE-driven | drop resolution, hold FPS |
| Data Saver | 640×480@30 | 900 kbps | hold resolution, drop FPS |
| HD | 1280×720@30 | 2,500 kbps | ” |
| Full HD | 1920×1080@30 | 6,000 kbps | ” |
| 2K | 2560×1440@30 | 12,000 kbps | ” |
| 4K | 3840×2160@30 | 20,000 kbps | ” |
Presets the device’s cameras can’t capture are hidden
(CameraCapabilities).
Video codec (VideoCodec)
| Value | Label | Notes |
|---|---|---|
AV1 | AV1 | Best compression. Needs AV1 on both devices; often software-only. |
H265 | H.265 / HEVC | Efficient; hardware support is uneven. |
H264 | H.264 / AVC | Default. Universal hardware support; only codec a browser can receive. |
There is no “Auto” - it was removed because the outcome varied by device and made calls unpredictable. See media negotiation.
Screen sharing (ScreenShareResolution / ScreenShareFps)
| Resolution | Short edge | Base bitrate (30 fps) | 60 fps |
|---|---|---|---|
| HD | 720p | 2,800 kbps | ×5/3 |
| Full HD | 1080p | 6,000 kbps | ×5/3 |
| Native | full panel | 12,000 kbps | locked to 60 fps |
Aspect ratio is always preserved (the receiver letterboxes, never crops).
| Setting | Values | Default |
|---|---|---|
| Frame rate | 30 / 60 fps | native |
| Auto-rotate on screen share | on / off | off - when on, the viewer’s whole screen rotates to the sharer’s orientation |
Microphone
Mode (MicMode)
| Mode | Label | See |
|---|---|---|
DEFAULT | Standard | audio pipeline |
DENOISE | Voice Isolation | RNNoise + platform NS stacked |
RAW | Wide Spectrum | no processing, no AEC - needs headphones |
Once a call starts, the picker locks out modes in the other hardware group until the call ends.
Gain
| Setting | Range | Step | Default |
|---|---|---|---|
| Mic gain | 0–200 % | 10 % | 100 % |
| Overboost | raises ceiling to 500 % | - | off |
A post-AEC/NS output trim with a tanh soft-knee above ±26000. Exactly 100 % is
a no-op (raw signal). 0 % is silence - see the
footgun note.
Studio Microphone
| Setting | Effect |
|---|---|
| Wide Spectrum toggle | Shortcut to MicMode.RAW. Greyed out with a “needs headphones” hint when none are connected. |
Server
| Setting | Default |
|---|---|
| Signaling server URL | the hosted default (wss://…) |
Must be wss:// and point at the server root (trailing /).
“Reset to default” restores the bundled URL.
CallStats snapshot
The debug panel reads this data class:
data class CallStats(
sendResolution, recvResolution: String?, // "1280×720"
sendBitrateKbps, recvBitrateKbps: Int, // byte-delta approximation
sendFps, recvFps: Int,
rttMs: Int?,
videoCodec: String?,
packetLossPct: Double,
hardwareEncode, hardwareDecode: Boolean?, // null = not reported yet
audioCodec: String?,
audioSendBitrateKbps, audioRecvBitrateKbps: Int,
audioSampleRateHz: Int,
audioStereo: Boolean?,
cpuPercent: Int?, // this process, 0-100 across all cores
batteryTempC: Float?, // null if not reported
powerWatts: Float?, // |current| × voltage; null if unavailable
)