David Liu

fixing up sample app

@@ -247,7 +247,8 @@ constructor( @@ -247,7 +247,8 @@ constructor(
247 } 247 }
248 248
249 fun close() { 249 fun close() {
250 - TODO("Not yet implemented") 250 + isConnected = false
  251 + currentWs?.close(1000, "Normal Closure")
251 } 252 }
252 253
253 interface Listener { 254 interface Listener {
@@ -10,11 +10,13 @@ class SubscriberTransportObserver( @@ -10,11 +10,13 @@ class SubscriberTransportObserver(
10 10
11 11
12 override fun onIceCandidate(candidate: IceCandidate) { 12 override fun onIceCandidate(candidate: IceCandidate) {
  13 + Timber.v { "onIceCandidate: $candidate" }
13 engine.client.sendCandidate(candidate, Rtc.SignalTarget.SUBSCRIBER) 14 engine.client.sendCandidate(candidate, Rtc.SignalTarget.SUBSCRIBER)
14 } 15 }
15 16
16 override fun onAddTrack(receiver: RtpReceiver, streams: Array<out MediaStream>) { 17 override fun onAddTrack(receiver: RtpReceiver, streams: Array<out MediaStream>) {
17 val track = receiver.track() ?: return 18 val track = receiver.track() ?: return
  19 + Timber.v { "onAddTrack: $track, ${streams.fold("") { sum, it -> "$sum, $it" }}" }
18 engine.listener?.onAddTrack(track, streams) 20 engine.listener?.onAddTrack(track, streams)
19 } 21 }
20 22
@@ -27,6 +29,7 @@ class SubscriberTransportObserver( @@ -27,6 +29,7 @@ class SubscriberTransportObserver(
27 } 29 }
28 30
29 override fun onDataChannel(channel: DataChannel) { 31 override fun onDataChannel(channel: DataChannel) {
  32 + Timber.v { "onDataChannel" }
30 engine.listener?.onAddDataChannel(channel) 33 engine.listener?.onAddDataChannel(channel)
31 } 34 }
32 35
@@ -78,10 +78,17 @@ class CallViewModel( @@ -78,10 +78,17 @@ class CallViewModel(
78 } 78 }
79 79
80 fun updateParticipants(room: Room) { 80 fun updateParticipants(room: Room) {
81 - mutableRemoteParticipants.value = room.remoteParticipants  
82 - .keys  
83 - .sortedBy { it.sid }  
84 - .mapNotNull { room.remoteParticipants[it] } 81 + mutableRemoteParticipants.postValue(
  82 + room.remoteParticipants
  83 + .keys
  84 + .sortedBy { it.sid }
  85 + .mapNotNull { room.remoteParticipants[it] }
  86 + )
85 } 87 }
86 88
  89 + override fun onCleared() {
  90 + super.onCleared()
  91 + mutableRoom.value?.disconnect()
  92 + mutableRoom.value = null
  93 + }
87 } 94 }
1 package io.livekit.android.sample 1 package io.livekit.android.sample
2 2
3 import android.view.View 3 import android.view.View
  4 +import com.github.ajalt.timberkt.Timber
4 import com.xwray.groupie.viewbinding.BindableItem 5 import com.xwray.groupie.viewbinding.BindableItem
5 import com.xwray.groupie.viewbinding.GroupieViewHolder 6 import com.xwray.groupie.viewbinding.GroupieViewHolder
6 import io.livekit.android.room.Room 7 import io.livekit.android.room.Room
@@ -19,12 +20,13 @@ class ParticipantItem( @@ -19,12 +20,13 @@ class ParticipantItem(
19 private var videoBound = false 20 private var videoBound = false
20 21
21 override fun initializeViewBinding(view: View): ParticipantItemBinding { 22 override fun initializeViewBinding(view: View): ParticipantItemBinding {
22 - return ParticipantItemBinding.bind(view) 23 + val binding = ParticipantItemBinding.bind(view)
  24 + room.initVideoRenderer(binding.renderer)
  25 + return binding
23 } 26 }
24 27
25 override fun bind(viewBinding: ParticipantItemBinding, position: Int) { 28 override fun bind(viewBinding: ParticipantItemBinding, position: Int) {
26 viewBinding.run { 29 viewBinding.run {
27 - room.initVideoRenderer(renderer)  
28 30
29 val existingTrack = getVideoTrack() 31 val existingTrack = getVideoTrack()
30 if (existingTrack != null) { 32 if (existingTrack != null) {
@@ -58,6 +60,7 @@ class ParticipantItem( @@ -58,6 +60,7 @@ class ParticipantItem(
58 return 60 return
59 } 61 }
60 62
  63 + Timber.v { "adding renderer to $videoTrack" }
61 videoTrack.addRenderer(viewBinding.renderer) 64 videoTrack.addRenderer(viewBinding.renderer)
62 } 65 }
63 66