Skip to content

Android: Native CallContent renders behind gesture navigation bar on edge-to-edge displays #103

@gabides

Description

@gabides

Summary

When using WindowCompat.setDecorFitsSystemWindows(window, false) (required for Capacitor 8 edge-to-edge support), the native CallContent Compose UI renders behind the Android gesture navigation bar. Participant name labels and network quality indicators at the bottom of video tiles are hidden behind the gesture nav bar.

Root cause

setOverlayContent renders CallContent inside a VideoTheme block without any window inset handling. On Android 10+ with gesture navigation, WindowInsets.navigationBars has a non-zero bottom value, but the Compose content is not padded to account for it.

Proposed fix

Wrap CallContent in a Box with windowInsetsPadding(WindowInsets.navigationBars) in StreamCallPlugin.kt:

// Add imports:
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.windowInsetsPadding

// In setOverlayContent(), wrap CallContent:
Box(modifier = Modifier.windowInsetsPadding(WindowInsets.navigationBars)) {
    CallContent(
        call = activeCall,
        enableInPictureInPicture = false,
        onBackPressed = {},
        controlsContent = { /* Empty to disable native controls */ },
        appBarContent = { /* Empty to disable app bar with stop call button */ },
        layout = CallUIController.layoutType.value,
        videoRenderer = { ... },
        floatingVideoRenderer = { ... }
    )
} // end Box

This pushes the entire call UI above the gesture navigation bar so participant labels, network indicators, and other bottom-anchored elements remain visible and tappable.

Tested on

  • Android 15 with gesture navigation (3-button nav bar height = 0, gesture nav bar height ≈ 48dp)
  • Capacitor 8 with WindowCompat.setDecorFitsSystemWindows(window, false)

Workaround

Currently applying this change via patch-package on our end.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions