David Zhao

explicit leave when disconnect requested, stop all tracks, including remote

@@ -205,8 +205,15 @@ constructor( @@ -205,8 +205,15 @@ constructor(
205 205
206 sendRequest(request) 206 sendRequest(request)
207 } 207 }
  208 +
  209 + fun sendLeave() {
  210 + val request = LivekitRtc.SignalRequest.newBuilder()
  211 + .setLeave(LivekitRtc.LeaveRequest.newBuilder().build())
  212 + .build()
  213 + sendRequest(request)
  214 + }
208 215
209 - fun sendRequest(request: LivekitRtc.SignalRequest) { 216 + private fun sendRequest(request: LivekitRtc.SignalRequest) {
210 Timber.v { "sending request: $request" } 217 Timber.v { "sending request: $request" }
211 if (!isConnected || currentWs == null) { 218 if (!isConnected || currentWs == null) {
212 throw IllegalStateException("not connected!") 219 throw IllegalStateException("not connected!")
@@ -66,6 +66,7 @@ constructor( @@ -66,6 +66,7 @@ constructor(
66 } 66 }
67 67
68 fun disconnect() { 68 fun disconnect() {
  69 + engine.client.sendLeave()
69 handleDisconnect() 70 handleDisconnect()
70 } 71 }
71 72
@@ -137,8 +138,14 @@ constructor( @@ -137,8 +138,14 @@ constructor(
137 } 138 }
138 139
139 private fun handleDisconnect() { 140 private fun handleDisconnect() {
140 - for (track in localParticipant?.tracks.values) {  
141 - track.track?.stop() 141 + for (pub in localParticipant.tracks.values) {
  142 + pub.track?.stop()
  143 + }
  144 + // stop remote tracks too
  145 + for (p in remoteParticipants.values) {
  146 + for (pub in p.tracks.values) {
  147 + pub.track?.stop()
  148 + }
142 } 149 }
143 engine.close() 150 engine.close()
144 state = State.DISCONNECTED 151 state = State.DISCONNECTED