@@ -39,16 +39,33 @@ import io.livekit.android.audio.CommunicationWorkaround
3939import io.livekit.android.dagger.InjectionNames
4040import io.livekit.android.e2ee.E2EEManager
4141import io.livekit.android.e2ee.E2EEOptions
42- import io.livekit.android.events.*
42+ import io.livekit.android.events.BroadcastEventBus
43+ import io.livekit.android.events.DisconnectReason
44+ import io.livekit.android.events.ParticipantEvent
45+ import io.livekit.android.events.RoomEvent
46+ import io.livekit.android.events.collect
4347import io.livekit.android.memory.CloseableManager
4448import io.livekit.android.renderer.TextureViewRenderer
4549import io.livekit.android.room.datastream.incoming.IncomingDataStreamManager
4650import io.livekit.android.room.metrics.collectMetrics
4751import io.livekit.android.room.network.NetworkCallbackManagerFactory
48- import io.livekit.android.room.participant.*
52+ import io.livekit.android.room.participant.AudioTrackPublishDefaults
53+ import io.livekit.android.room.participant.ConnectionQuality
54+ import io.livekit.android.room.participant.LocalParticipant
55+ import io.livekit.android.room.participant.Participant
56+ import io.livekit.android.room.participant.ParticipantListener
57+ import io.livekit.android.room.participant.RemoteParticipant
58+ import io.livekit.android.room.participant.RpcHandler
59+ import io.livekit.android.room.participant.VideoTrackPublishDefaults
60+ import io.livekit.android.room.participant.publishTracksInfo
4961import io.livekit.android.room.provisions.LKObjects
5062import io.livekit.android.room.rpc.RpcManager
51- import io.livekit.android.room.track.*
63+ import io.livekit.android.room.track.LocalAudioTrackOptions
64+ import io.livekit.android.room.track.LocalTrackPublication
65+ import io.livekit.android.room.track.LocalVideoTrackOptions
66+ import io.livekit.android.room.track.RemoteTrackPublication
67+ import io.livekit.android.room.track.Track
68+ import io.livekit.android.room.track.TrackPublication
5269import io.livekit.android.room.types.toSDKType
5370import io.livekit.android.room.util.ConnectionWarmer
5471import io.livekit.android.util.FlowObservable
@@ -57,15 +74,31 @@ import io.livekit.android.util.flow
5774import io.livekit.android.util.flowDelegate
5875import io.livekit.android.util.invoke
5976import io.livekit.android.webrtc.getFilteredStats
60- import kotlinx.coroutines.*
77+ import kotlinx.coroutines.CancellationException
78+ import kotlinx.coroutines.CoroutineDispatcher
79+ import kotlinx.coroutines.CoroutineExceptionHandler
80+ import kotlinx.coroutines.CoroutineScope
81+ import kotlinx.coroutines.SupervisorJob
82+ import kotlinx.coroutines.cancel
83+ import kotlinx.coroutines.coroutineScope
84+ import kotlinx.coroutines.ensureActive
6185import kotlinx.coroutines.flow.filterNotNull
6286import kotlinx.coroutines.flow.first
87+ import kotlinx.coroutines.job
88+ import kotlinx.coroutines.launch
89+ import kotlinx.coroutines.runBlocking
6390import kotlinx.coroutines.sync.Mutex
6491import kotlinx.coroutines.sync.withLock
6592import kotlinx.serialization.Serializable
6693import livekit.LivekitModels
6794import livekit.LivekitRtc
68- import livekit.org.webrtc.*
95+ import livekit.org.webrtc.EglBase
96+ import livekit.org.webrtc.MediaStream
97+ import livekit.org.webrtc.MediaStreamTrack
98+ import livekit.org.webrtc.RTCStatsCollectorCallback
99+ import livekit.org.webrtc.RendererCommon
100+ import livekit.org.webrtc.RtpReceiver
101+ import livekit.org.webrtc.SurfaceViewRenderer
69102import livekit.org.webrtc.audio.AudioDeviceModule
70103import java.net.URI
71104import java.util.Date
@@ -110,6 +143,7 @@ constructor(
110143 private val connectionWarmer: ConnectionWarmer ,
111144 private val audioRecordPrewarmer: AudioRecordPrewarmer ,
112145 private val incomingDataStreamManager: IncomingDataStreamManager ,
146+ private val remoteParticipantFactory: RemoteParticipant .Factory ,
113147) : RTCEngine .Listener , ParticipantListener , RpcManager , IncomingDataStreamManager by incomingDataStreamManager {
114148
115149 private lateinit var coroutineScope: CoroutineScope
@@ -528,6 +562,9 @@ constructor(
528562 * Disconnect from the room.
529563 */
530564 fun disconnect () {
565+ if (state == State .DISCONNECTED ) {
566+ return
567+ }
531568 engine.client.sendLeave()
532569 handleDisconnect(DisconnectReason .CLIENT_INITIATED )
533570 }
@@ -571,6 +608,7 @@ constructor(
571608 * must be created.
572609 */
573610 fun release () {
611+ disconnect()
574612 closeableManager.close()
575613 }
576614
@@ -744,7 +782,7 @@ constructor(
744782 return participant
745783 }
746784
747- participant = RemoteParticipant (info, engine.client, ioDispatcher, defaultDispatcher )
785+ participant = remoteParticipantFactory.create (info)
748786 participant.internalListener = this
749787
750788 coroutineScope.launch {
0 commit comments