davidliu

fix video not showing up sometimes for remote participants

@@ -250,7 +250,6 @@ open class Participant( @@ -250,7 +250,6 @@ open class Participant(
250 scope 250 scope
251 ) 251 )
252 } 252 }
253 -  
254 } 253 }
255 254
256 @Deprecated("Use Participant.events instead.") 255 @Deprecated("Use Participant.events instead.")
@@ -58,7 +58,6 @@ fun ParticipantItem( @@ -58,7 +58,6 @@ fun ParticipantItem(
58 VideoItemTrackSelector( 58 VideoItemTrackSelector(
59 room = room, 59 room = room,
60 participant = participant, 60 participant = participant,
61 - videoTracks = videoTracks,  
62 modifier = Modifier.fillMaxSize() 61 modifier = Modifier.fillMaxSize()
63 ) 62 )
64 } else { 63 } else {
@@ -9,9 +9,10 @@ import io.livekit.android.room.Room @@ -9,9 +9,10 @@ import io.livekit.android.room.Room
9 import io.livekit.android.room.participant.Participant 9 import io.livekit.android.room.participant.Participant
10 import io.livekit.android.room.track.RemoteVideoTrack 10 import io.livekit.android.room.track.RemoteVideoTrack
11 import io.livekit.android.room.track.Track 11 import io.livekit.android.room.track.Track
12 -import io.livekit.android.room.track.TrackPublication  
13 import io.livekit.android.room.track.VideoTrack 12 import io.livekit.android.room.track.VideoTrack
14 import io.livekit.android.room.track.video.ComposeVisibility 13 import io.livekit.android.room.track.video.ComposeVisibility
  14 +import io.livekit.android.util.flow
  15 +import kotlinx.coroutines.flow.map
15 16
16 /** 17 /**
17 * Widget for displaying a VideoTrack. Handles the Compose <-> AndroidView interop needed to use 18 * Widget for displaying a VideoTrack. Handles the Compose <-> AndroidView interop needed to use
@@ -84,13 +85,19 @@ fun VideoItem( @@ -84,13 +85,19 @@ fun VideoItem(
84 fun VideoItemTrackSelector( 85 fun VideoItemTrackSelector(
85 room: Room, 86 room: Room,
86 participant: Participant, 87 participant: Participant,
87 - videoTracks: Map<String, TrackPublication>,  
88 modifier: Modifier = Modifier 88 modifier: Modifier = Modifier
89 ) { 89 ) {
90 90
91 - val videoTrack = participant.getTrackPublication(Track.Source.SCREEN_SHARE)?.track as? VideoTrack  
92 - ?: participant.getTrackPublication(Track.Source.CAMERA)?.track as? VideoTrack  
93 - ?: videoTracks.values.firstOrNull()?.track as? VideoTrack 91 + val subscribedVideoTracksFlow by remember(participant) {
  92 + mutableStateOf(
  93 + participant::videoTracks.flow
  94 + .map { tracks -> tracks.values.filter { pub -> pub.subscribed } }
  95 + )
  96 + }
  97 + val videoTracks by subscribedVideoTracksFlow.collectAsState(initial = emptyList())
  98 + val videoTrack = videoTracks.firstOrNull { pub -> pub.source == Track.Source.SCREEN_SHARE }?.track as? VideoTrack
  99 + ?: videoTracks.firstOrNull { pub -> pub.source == Track.Source.CAMERA }?.track as? VideoTrack
  100 + ?: videoTracks.firstOrNull()?.track as? VideoTrack
94 101
95 if (videoTrack != null) { 102 if (videoTrack != null) {
96 VideoItem( 103 VideoItem(