继续操作前请注册或者登录。
David Liu

comments for compose sample app

... ... @@ -62,6 +62,7 @@ class CallActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Obtain audio focus.
val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
with(audioManager) {
previousSpeakerphoneOn = isSpeakerphoneOn
... ... @@ -81,6 +82,7 @@ class CallActivity : AppCompatActivity() {
Timber.v { "Audio focus request failed" }
}
// Setup compose view.
setContent {
val room by viewModel.room.collectAsState()
val participants by viewModel.participants.collectAsState(initial = emptyList())
... ... @@ -134,6 +136,7 @@ class CallActivity : AppCompatActivity() {
) {
val (speakerView, audienceRow, buttonBar) = createRefs()
// Primary speaker view
Surface(modifier = Modifier.constrainAs(speakerView) {
top.linkTo(parent.top)
start.linkTo(parent.start)
... ... @@ -150,6 +153,8 @@ class CallActivity : AppCompatActivity() {
)
}
}
// Audience row to display all participants.
LazyRow(
modifier = Modifier
.constrainAs(audienceRow) {
... ... @@ -178,6 +183,7 @@ class CallActivity : AppCompatActivity() {
}
}
// Control bar for any switches such as mic/camera enable/disable.
Row(
modifier = Modifier
.padding(top = 10.dp, bottom = 20.dp)
... ... @@ -272,6 +278,7 @@ class CallActivity : AppCompatActivity() {
override fun onDestroy() {
super.onDestroy()
// release audio focus and revert audio settings.
val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
with(audioManager) {
isSpeakerphoneOn = previousSpeakerphoneOn
... ...
... ... @@ -23,6 +23,9 @@ import io.livekit.android.room.track.Track
import io.livekit.android.room.track.VideoTrack
import io.livekit.android.util.flow
/**
* Widget for displaying a participant.
*/
@Composable
fun ParticipantItem(
room: Room,
... ...
... ... @@ -14,6 +14,10 @@ import io.livekit.android.room.track.TrackPublication
import io.livekit.android.room.track.VideoTrack
import io.livekit.android.room.track.video.ComposeVisibility
/**
* Widget for displaying a VideoTrack. Handles the Compose <-> AndroidView interop needed to use
* [TextureViewRenderer].
*/
@Composable
fun VideoItem(
room: Room,
... ... @@ -23,6 +27,7 @@ fun VideoItem(
val videoSinkVisibility = remember(room, videoTrack) { ComposeVisibility() }
var boundVideoTrack by remember { mutableStateOf<VideoTrack?>(null) }
var view: TextureViewRenderer? by remember { mutableStateOf(null) }
fun cleanupVideoTrack() {
view?.let { boundVideoTrack?.removeRenderer(it) }
boundVideoTrack = null
... ... @@ -42,12 +47,14 @@ fun VideoItem(
videoTrack.addRenderer(view)
}
}
DisposableEffect(room, videoTrack) {
onDispose {
videoSinkVisibility.onDispose()
cleanupVideoTrack()
}
}
AndroidView(
factory = { context ->
TextureViewRenderer(context).apply {
... ... @@ -65,6 +72,9 @@ fun VideoItem(
)
}
/**
* This widget primarily serves as a way to observe changes in [videoTracks].
*/
@Composable
fun VideoItemTrackSelector(
room: Room,
... ...