package calls.presentation.components import android.view.ViewGroup import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import org.webrtc.EglBase import org.webrtc.SurfaceViewRenderer import org.webrtc.VideoTrack @Composable fun VideoGrid( participants: Map, localVideoTrack: VideoTrack? ) { val eglBaseContext = remember { EglBase.create().eglBaseContext } val allVideoTracks = remember(participants, localVideoTrack) { listOfNotNull(localVideoTrack) + participants.values.filterNotNull() } LazyVerticalGrid( columns = GridCells.Fixed(if (allVideoTracks.size <= 2) 1 else 2), modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(8.dp) ) { items(allVideoTracks) { track -> Box( modifier = Modifier .padding(4.dp) .fillMaxWidth() .aspectRatio(if (allVideoTracks.size == 1) 0.6f else 1f) ) { VideoRenderer(videoTrack = track, eglBaseContext = eglBaseContext) } } } } @Composable fun VideoRenderer( videoTrack: VideoTrack, eglBaseContext: EglBase.Context ) { AndroidView( factory = { context -> SurfaceViewRenderer(context).apply { init(eglBaseContext, null) layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) } }, update = { view -> videoTrack.addSink(view) }, onRelease = { view -> videoTrack.removeSink(view) view.release() } ) }