Package-level declarations

Types

Link copied to clipboard
fun interface AvatarProvider

Resolves an avatar for a remote participant's host-supplied peerId (passed to SerenadaCore.join). The call UI renders the returned avatar cover-fit, cropped to a circle above the participant's name when their remote video track is off.

Link copied to clipboard
sealed class AvatarSource

Image payload returned by an AvatarProvider.

Link copied to clipboard
Link copied to clipboard
data class CallUiState(val phase: <Error class: unknown class> = CallPhase.Idle, val roomId: String? = null, val localCid: String? = null, val statusMessageResId: Int? = null, val errorMessageResId: Int? = null, val errorMessageText: String? = null, val isHost: Boolean = false, val participantCount: Int = 0, val callStartedAtMs: Long? = null, val localAudioEnabled: Boolean = true, val localVideoEnabled: Boolean = true, val localCameraEnabled: Boolean = true, val localContent: <Error class: unknown class>? = null, val localDisplayName: String? = null, val localAudioLevel: Float = 0.0f, val remoteParticipants: List<<Error class: unknown class>> = emptyList(), val connectionStatus: <Error class: unknown class> = ConnectionStatus.Connected, val isSignalingConnected: Boolean = false, val iceConnectionState: String = "NEW", val connectionState: String = "NEW", val signalingState: String = "STABLE", val activeTransport: String? = null, val webrtcStatsSummary: String = "", val realtimeCallStats: <Error class: unknown class>? = null, val isFrontCamera: Boolean = true, val isScreenSharing: Boolean = false, val localCameraMode: <Error class: unknown class> = LocalCameraMode.SELFIE, val availableCameraModes: List<<Error class: unknown class>> = app.serenada.core.DEFAULT_CAMERA_MODES, val isFlashAvailable: Boolean = false, val isFlashEnabled: Boolean = false, val remoteContentCid: String? = null, val remoteContentType: String? = null, val independentContentEnabled: Boolean = false, val videoMediaEnabled: Boolean = true)
Link copied to clipboard
data class ContentLocalParticipant(val cid: String, val isScreenSharing: Boolean = false, val cameraMode: <Error class: unknown class> = LocalCameraMode.SELFIE, val content: <Error class: unknown class>? = null)

Subset of local participant state this module reads.

Link copied to clipboard

mode distinguishes the independent content stream from the legacy single-video-as-content fallback.

Link copied to clipboard
data class ContentRemoteParticipant(val cid: String, val content: <Error class: unknown class>? = null, val supportsIndependentContentVideo: Boolean = false)

Subset of a remote participant this module reads.

Link copied to clipboard
data class ContentScene(val primary: ResolvedContent?, val local: ResolvedContent?, val remotes: List<ResolvedContent>)

Full content resolution for a render: per-owner resolved content plus the chosen primary. Callers render a content tile per sharer (design: per-peer/per-participant content) from local + remotes.

Link copied to clipboard

The call phases during which the content-stage layout may render. Mirrors the subset of app.serenada.core.call.CallPhase the call UI treats as an active call; kept local so this helper stays free of Compose/Android types and is JVM-unit-testable. Every other app.serenada.core.call.CallPhase maps to Other (never renders the content stage).

Link copied to clipboard
data class FrontlineIndependentContent(val ownerCid: String, val isLocal: Boolean, val type: <Error class: unknown class>, val loading: Boolean, val waitingForParticipants: Boolean)

The Frontline call UI's INDEPENDENT-content decision for one render.

Link copied to clipboard
data class ResolveContentInput(val local: ContentLocalParticipant?, val remotes: List<ContentRemoteParticipant>, val independentContentEnabled: Boolean, val localVideoMediaEnabled: Boolean, val remoteContentHasMedia: (String) -> Boolean = { true }, val localContentHasMedia: () -> Boolean = { true }, val remoteContentOrder: List<String> = emptyList())

Inputs to the content resolver for one render.

Link copied to clipboard
data class ResolvedContent(val ownerCid: String, val isLocal: Boolean, val type: <Error class: unknown class>, val mode: ContentMode, val hasMedia: Boolean, val loading: Boolean, val waitingForParticipants: Boolean)

Resolved content presentation for a single owner.

Link copied to clipboard
data class ResolvedContentSource(val type: <Error class: unknown class>, val ownerCid: String, val mode: ContentMode)

The content-role input to the layout (app.serenada.core.layout.ContentSource), or null when no content tile should render. This is the render-logic seam that decides WHEN the content-stage layout fires — pure so it can be unit tested.

Link copied to clipboard
data class SerenadaCallFlowConfig(val uiVariant: SerenadaCallUiVariant = SerenadaCallUiVariant.Standard, val screenSharingEnabled: Boolean = true, val inviteControlsEnabled: Boolean = true, val debugOverlayEnabled: Boolean = false, val autoHideControls: Boolean = true, val snapshotEnabled: Boolean = false, val avatarProvider: AvatarProvider? = null, val videoEnabled: Boolean = true, val systemPictureInPictureEnabled: Boolean = false)
Link copied to clipboard
data class SerenadaCallFlowTheme(val accentColor: <Error class: unknown class> = Color(0xFF2F81F7), val backgroundColor: <Error class: unknown class> = Color(0xFF0D1117))
Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
data class SnapshotVideoParticipant(val cid: String, val videoEnabled: Boolean)
Link copied to clipboard
data class StageCameraParticipant(val cid: String, val isLocal: Boolean)

A participant whose camera/avatar tile the stage needs (local or remote).

Link copied to clipboard
data class StageTile(val id: String, val cid: String, val kind: StageTileKind, val isLocal: Boolean)

A derived stage tile. id is the stable string key fed to ComputeLayout.

Link copied to clipboard
data class StageTileKey(val cid: String, val kind: StageTileKind)

Identity of a single stage tile: a participant cid + which stream of theirs.

Link copied to clipboard

Properties

Functions

Link copied to clipboard

Derive the full ordered stream-keyed tile list for the stage.

fun frontlineRemoteScreenShareFullscreenActive(requestedSourceId: String?, currentSourceId: String?): Boolean

A Frontline remote screen-share full-screen request is valid only while the same source is still the current remote screen-share spotlight. If the stream ends or spotlight moves, the UI falls back to the framed view automatically.

Link copied to clipboard
fun frontlineRemoteScreenShareUsesFit(isRemoteScreenShare: Boolean, remoteVideoFitCover: Boolean): Boolean

Frontline remote screen shares always render with fit-style scaling. The legacy camera fit/cover preference still applies to remote camera tiles.

Link copied to clipboard

Parse a stage tile id back into its {cid, kind} key, or null if malformed. Uses lastIndexOf("::") so cids that themselves contain "::" round-trip.

Link copied to clipboard
fun pickPrimaryContent(local: ResolvedContent?, remotes: List<ResolvedContent>, remoteContentOrder: List<String>, independentContentEnabled: Boolean): ResolvedContent?

Pick the primary content owner among local + multiple simultaneous remote sharers.

Link copied to clipboard
fun pickStageSpotlightTileId(tiles: List<StageTile>, pinnedTile: StageTileKey?, contentPrimary: ResolvedContent?): String?

Resolve the spotlight (primary) tile id among the derived tiles.

Link copied to clipboard

The content-role input to the layout, or null when no content tile should render. See ResolvedContentSource for the gating rationale.

Link copied to clipboard

Resolve the Frontline INDEPENDENT content decision from a ContentScene. Pure so it can be unit tested without Compose. Returns null unless the chosen primary content is an INDEPENDENT screen-share track (the only case the new dedicated content path engages); every other case keeps the legacy single-video path.

Link copied to clipboard

Resolve content for the local participant.

Link copied to clipboard

Resolve content for every remote participant that is presenting.

Link copied to clipboard
fun resolveStreamKeyedSnapshotSource(pinnedTile: StageTileKey?, localCid: String?, localVideoEnabled: Boolean, remotes: List<SnapshotVideoParticipant>): <Error class: unknown class>?
Link copied to clipboard
Link copied to clipboard
fun SerenadaCallFlow(url: String? = null, session: <Error class: unknown class>? = null, config: SerenadaCallFlowConfig = SerenadaCallFlowConfig(), theme: SerenadaCallFlowTheme = SerenadaCallFlowTheme(), roomName: String? = null, initialRemoteVideoFitCover: Boolean = true, independentContentEnabled: Boolean = false, videoMediaEnabled: Boolean = true, strings: Map<SerenadaString, String>? = null, onShareLink: () -> Unit? = null, onInviteToRoom: () -> Unit? = null, onRemoteVideoFitChanged: (Boolean) -> Unit? = null, onEndCall: () -> Unit? = null, onStartScreenShare: (<Error class: unknown class>) -> Unit? = null, onStopScreenShare: () -> Unit? = null, onSnapshotCaptured: (<Error class: unknown class>) -> Unit? = null, onSnapshotError: (<Error class: unknown class>) -> Unit? = null, onDismiss: () -> Unit = {})

Pre-built call flow that manages the full call lifecycle.

fun SerenadaCallFlow(uiState: CallUiState, roomId: String, roomShareUrl: String?, eglContext: <Error class: unknown class>, roomName: String? = null, rendererProvider: CallRendererProvider? = null, initialRemoteVideoFitCover: Boolean = true, config: SerenadaCallFlowConfig = SerenadaCallFlowConfig(), theme: SerenadaCallFlowTheme = SerenadaCallFlowTheme(), strings: Map<SerenadaString, String>? = null, availableAudioDevices: List<<Error class: unknown class>> = emptyList(), currentAudioDevice: <Error class: unknown class>? = null, onToggleAudio: () -> Unit, onToggleVideo: () -> Unit, onFlipCamera: () -> Unit, onToggleFlashlight: () -> Unit = {}, onLocalPinchZoom: (Float) -> Unit = {}, onEndCall: () -> Unit, onSelectAudioDevice: (<Error class: unknown class>) -> Unit = {}, onShareLink: () -> Unit? = null, onInviteToRoom: () -> Unit = {}, onRemoteVideoFitChanged: (Boolean) -> Unit? = null, onStartScreenShare: (<Error class: unknown class>) -> Unit = {}, onStopScreenShare: () -> Unit = {}, attachLocalRenderer: (<Error class: unknown class>, <Error class: unknown class>?) -> Unit, detachLocalRenderer: (<Error class: unknown class>) -> Unit, attachLocalSink: (<Error class: unknown class>) -> Unit, detachLocalSink: (<Error class: unknown class>) -> Unit, attachRemoteRenderer: (<Error class: unknown class>, <Error class: unknown class>?) -> Unit, detachRemoteRenderer: (<Error class: unknown class>) -> Unit, attachRemoteSinkForCid: (String, <Error class: unknown class>) -> Unit, detachRemoteSinkForCid: (String, <Error class: unknown class>) -> Unit, attachRemoteSink: (<Error class: unknown class>) -> Unit, detachRemoteSink: (<Error class: unknown class>) -> Unit, attachRemoteContentSinkForCid: (String, <Error class: unknown class>) -> Unit = { _, _ -> }, detachRemoteContentSinkForCid: (String, <Error class: unknown class>) -> Unit = { _, _ -> }, attachLocalContentSink: (<Error class: unknown class>) -> Unit = {}, detachLocalContentSink: (<Error class: unknown class>) -> Unit = {}, onSnapshotRequested: (<Error class: unknown class>) -> Unit? = null, onDismiss: () -> Unit = {})

Low-level call flow composable that takes explicit state and callbacks.

Link copied to clipboard
fun SerenadaTheme(theme: SerenadaCallFlowTheme = SerenadaCallFlowTheme(), content: () -> Unit)
Link copied to clipboard
fun shouldRenderContentStage(phase: ContentStagePhase, isMultiParty: Boolean, hasContentStageLayout: Boolean): Boolean

Decide WHEN the content-stage render branch fires, gated on the call phase. Pure so it can be unit tested without Compose. Mirrors web's shouldRenderContentStage.

Link copied to clipboard

Stable string id for a stage tile (the SceneParticipant.id fed to layout).

Link copied to clipboard

Structural, null-safe equality for two tile keys.