# Incoming & Outgoing Calls

The Stream SDK provides basic incoming and outgoing call UI with the [RingingCallContent](/video/docs/android/ui-components/call/ringing-call/) component. We can break this component down into:

- `CallBackground`: The `CallBackground` component is a versatile component designed to wrap the content of an incoming or outgoing call and its participants.
- `headerContent`: Content shown for the call header, which is built with `CallAppBar`.
- `detailsContent`: Content shown for call details, such as call participant information.
- `controlsContent`: Content shown for controlling call, such as accepting a call or declining a call.

Each component can be used independently, so you can build your own incoming and outgoing call screens:

```kotlin
@Composable
fun MyIncomingCallScreen() {
    val participants by call.state.participants.collectAsStateWithLifecycle()
    val isCameraEnabled by call.camera.isEnabled.collectAsStateWithLifecycle()
    val isVideoType = true

    CallBackground(
        modifier = modifier,
    ) {
        Column {
            CallAppBar(
                call = call,
                onBackPressed = { },
                onCallAction = { }
            )

            IncomingCallDetails( // or OutgoingCallDetails
                modifier = Modifier
                    .align(Alignment.CenterHorizontally)
                    .padding(top = topPadding),
                isVideoType = isVideoType,
                participants = participants,
            )

            IncomingCallControls( // or OutgoingCallControls
                modifier = Modifier
                    .align(Alignment.BottomCenter)
                    .padding(bottom = VideoTheme.dimens.spacingL),
                isVideoCall = isVideoType,
                isCameraEnabled = isCameraEnabled,
                onCallAction = onCallAction
            )
        }
    }
}
```

You can replace each component with your own custom implementation.

`CallBackground`, `IncomingCallDetails`, and `OutgoingCallDetails` component will show an incoming or outgoing call screen in different states depending on the number of participants and their information, such as if they have an avatar.

| One to one (Incoming)                                                    | Group (Incoming)                                                 | One to one (Outgoing)                                                    | Group (Outgoing)                                                 |
| ------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------- |
| ![OneToOneIncoming](/data/docs/video/android/_assets/incoming_call_one_to_one.png) | ![GroupIncoming](/data/docs/video/android/_assets/incoming_call_group.png) | ![OneToOneOutgoing](/data/docs/video/android/_assets/outgoing_call_one_to_one.png) | ![GroupOutgoing](/data/docs/video/android/_assets/outgoing_call_group.png) |

## Ringing State

You can observe the `ringingState` flow and configure the UI depending on its value. Use the code below to do this:

```kotlin
@Composable
fun MyRingingCallScreen() {
    val ringingState by call.state.ringingState.collectAsStateWithLifecycle()

    when (ringingState) {
        is RingingState.Incoming -> {
            if (!(ringingState as RingingState.Incoming).acceptedByMe) {
                // Render your incoming call screen.
            }
        }
        is RingingState.Outgoing -> {
            if (!(ringingState as RingingState.Outgoing).acceptedByCallee) {
                // Render your outgoing call screen.
            }
        }
        is RingingState.RejectedByAll -> {
            // Render a rejected call screen.
        }
        is RingingState.TimeoutNoAnswer -> {
            // Render a timeout no answer call screen.
        }
        else -> {
            // Ringing call is accepted. Render a call screen here or navigate to a call screen.
        }
    }
}
```

This way you'll be able to render your own composable or navigate to a different screen depending on the call state.

## Sounds

The SDK plays sounds for incoming and outgoing calls. Read [here](/video/docs/android/advanced/incoming-calls/ringing/#ringing-sounds) for more details.


---

This page was last updated at 2026-03-13T13:17:53.709Z.

For the most recent version of this documentation, visit [https://getstream.io/video/docs/android/ui-cookbook/incoming-and-outgoing-call/](https://getstream.io/video/docs/android/ui-cookbook/incoming-and-outgoing-call/).