David Zhao

onMetadataChanged callback on Room

... ... @@ -24,7 +24,7 @@ constructor(
@Assisted private val connectOptions: ConnectOptions,
private val engine: RTCEngine,
private val eglBase: EglBase,
) : RTCEngine.Listener {
) : RTCEngine.Listener, RemoteParticipant.Listener, LocalParticipant.Listener {
init {
engine.listener = this
}
... ... @@ -96,6 +96,7 @@ constructor(
} else {
RemoteParticipant(sid, null)
}
participant.listener = this
mutableRemoteParticipants[sid] = participant
return participant
}
... ... @@ -152,11 +153,11 @@ constructor(
fun onFailedToConnect(room: Room, error: Exception) {}
fun onReconnecting(room: Room, error: Exception) {}
fun onReconnect(room: Room) {}
fun onStartRecording(room: Room) {}
fun onStopRecording(room: Room) {}
fun onMetadataChanged(room: Room, Participant: Participant, prevMetadata: String?) {}
fun onActiveSpeakersChanged(speakers: List<Participant>, room: Room) {}
}
//----------------------------------- RTCEngine.Listener ------------------------------------//
/**
* @suppress
*/
... ... @@ -178,7 +179,9 @@ constructor(
name = response.room.name
if (response.hasParticipant()) {
localParticipant = LocalParticipant(response.participant, engine)
val lp = LocalParticipant(response.participant, engine)
lp.listener = this
localParticipant = lp
}
if (response.otherParticipantsList.isNotEmpty()) {
response.otherParticipantsList.forEach {
... ... @@ -268,6 +271,15 @@ constructor(
listener?.onFailedToConnect(this, error)
}
//------------------------------- RemoteParticipant.Listener --------------------------------//
/**
* @suppress
*/
override fun onMetadataChanged(participant: Participant, prevMetadata: String?) {
listener?.onMetadataChanged(this, participant, prevMetadata)
}
/**
* @suppress
* // TODO(@dl): can this be moved out of Room/SDK?
... ...
... ... @@ -29,17 +29,12 @@ class LocalParticipant(sid: Sid, name: String? = null) :
val localDataTrackPublications
get() = dataTracks.values.toList()
var engine: RTCEngine? = null
val listener: Listener? = null
/**
* @suppress
*/
fun updateFromInfo(info: LivekitModels.ParticipantInfo) {
sid = Sid(info.sid)
name = info.identity
metadata = info.metadata
}
private var engine: RTCEngine? = null
var listener: Listener? = null
set(v) {
field = v
participantListener = v
}
suspend fun publishAudioTrack(
track: LocalAudioTrack,
... ... @@ -205,13 +200,14 @@ class LocalParticipant(sid: Sid, name: String? = null) :
}
}
interface Listener {
fun onPublishAudioTrack(track: LocalAudioTrack)
fun onFailToPublishAudioTrack(exception: Exception)
fun onPublishVideoTrack(track: LocalVideoTrack)
fun onFailToPublishVideoTrack(exception: Exception)
fun onPublishDataTrack(track: LocalDataTrack)
fun onFailToPublishDataTrack(exception: Exception)
interface Listener : Participant.Listener {
// TODO: can we move these to exceptions? instead of callbacks
fun onPublishAudioTrack(track: LocalAudioTrack) {}
fun onFailToPublishAudioTrack(exception: Exception) {}
fun onPublishVideoTrack(track: LocalVideoTrack) {}
fun onFailToPublishVideoTrack(exception: Exception) {}
fun onPublishDataTrack(track: LocalDataTrack) {}
fun onFailToPublishDataTrack(exception: Exception) {}
//fun onNetworkQualityLevelChange
}
}
... ...
package io.livekit.android.room.participant
import io.livekit.android.room.track.*
import livekit.LivekitModels
open class Participant(var sid: Sid, name: String? = null) {
inline class Sid(val sid: String)
var metadata: String? = null
var participantInfo: LivekitModels.ParticipantInfo? = null
private set
var name: String? = name
internal set
var audioLevel: Float = 0f
internal set
var metadata: String? = null
var participantListener: Listener? = null
val hasInfo
get() = participantInfo != null
var tracks = mutableMapOf<Track.Sid, TrackPublication>()
var audioTracks = mutableMapOf<Track.Sid, TrackPublication>()
... ... @@ -31,6 +37,22 @@ open class Participant(var sid: Sid, name: String? = null) {
}
}
/**
* @suppress
*/
open fun updateFromInfo(info: LivekitModels.ParticipantInfo) {
sid = Sid(info.sid)
name = info.identity
participantInfo = info
val prevMetadata = metadata
metadata = info.metadata
if (prevMetadata != metadata) {
participantListener?.onMetadataChanged(this, prevMetadata)
}
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
... ... @@ -46,4 +68,7 @@ open class Participant(var sid: Sid, name: String? = null) {
return sid.hashCode()
}
interface Listener {
fun onMetadataChanged(participant: Participant, prevMetadata: String?) {}
}
}
\ No newline at end of file
... ...
... ... @@ -31,11 +31,10 @@ class RemoteParticipant(
get() = dataTracks.values.toList()
var listener: Listener? = null
var participantInfo: LivekitModels.ParticipantInfo? = null
val hasInfo
get() = participantInfo != null
set(v) {
field = v
participantListener = v
}
private val coroutineScope = CloseableCoroutineScope(SupervisorJob())
... ... @@ -45,12 +44,9 @@ class RemoteParticipant(
/**
* @suppress
*/
fun updateFromInfo(info: LivekitModels.ParticipantInfo) {
override fun updateFromInfo(info: LivekitModels.ParticipantInfo) {
val hadInfo = hasInfo
sid = Sid(info.sid)
name = info.identity
participantInfo = info
metadata = info.metadata
super.updateFromInfo(info)
val validTrackPublication = mutableMapOf<Track.Sid, RemoteTrackPublication>()
val newTrackPublications = mutableMapOf<Track.Sid, RemoteTrackPublication>()
... ... @@ -247,7 +243,7 @@ class RemoteParticipant(
private const val KIND_VIDEO = "video"
}
interface Listener {
interface Listener: Participant.Listener {
fun onPublish(audioTrack: RemoteAudioTrackPublication, participant: RemoteParticipant) {}
fun onUnpublish(audioTrack: RemoteAudioTrackPublication, participant: RemoteParticipant) {}
fun onPublish(videoTrack: RemoteVideoTrackPublication, participant: RemoteParticipant) {}
... ...
... ... @@ -44,6 +44,7 @@ class LocalVideoTrack(
)
}
private fun createVideoCapturer(context: Context): VideoCapturer? {
val videoCapturer: VideoCapturer? = if (Camera2Enumerator.isSupported(context)) {
createCameraCapturer(Camera2Enumerator(context))
... ...
... ... @@ -65,15 +65,16 @@ class CallViewModel(
updateParticipants(room)
}
override fun onStartRecording(room: Room) {
override fun onActiveSpeakersChanged(speakers: List<Participant>, room: Room) {
}
override fun onStopRecording(room: Room) {
}
override fun onMetadataChanged(
room: Room,
Participant: Participant,
prevMetadata: String?
) {
override fun onActiveSpeakersChanged(speakers: List<Participant>, room: Room) {
}
}
)
}
... ...