68 lines
2.0 KiB
Kotlin
68 lines
2.0 KiB
Kotlin
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<String, VideoTrack?>,
|
|
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()
|
|
}
|
|
)
|
|
}
|