David Zhao

Docs pass

... ... @@ -65,7 +65,7 @@ dokkaHtml {
skipEmptyPackages.set(true)
includeNonPublic.set(false)
includes.from("module.md")
displayName.set("SDK")
sourceLink {
localDirectory.set(file("src/main/java"))
... ... @@ -75,6 +75,16 @@ dokkaHtml {
// Suffix which is used to append the line number to the URL. Use #L for GitHub
remoteLineSuffix.set("#L")
}
perPackageOption {
matchingRegex.set(".*\\.dagger.*")
suppress.set(true)
}
perPackageOption {
matchingRegex.set(".*\\.util.*")
suppress.set(true)
}
}
}
}
... ...
... ... @@ -2,7 +2,6 @@ package io.livekit.android
data class ConnectOptions(
val isSecure: Boolean = true,
val sendAudio: Boolean = true,
val sendVideo: Boolean = true,
)
\ No newline at end of file
... ...
... ... @@ -11,6 +11,11 @@ import org.webrtc.PeerConnectionFactory
class LiveKit {
companion object {
/**
* Connect to a LiveKit room
* @param url URL to LiveKit server (i.e. ws://mylivekitdeploy.io)
* @param listener Listener to Room events. LiveKit interactions take place with these callbacks
*/
suspend fun connect(
appContext: Context,
url: String,
... ... @@ -26,7 +31,7 @@ class LiveKit {
val room = component.roomFactory()
.create(options)
room.listener = listener
room.connect(url, token, options.isSecure)
room.connect(url, token)
val localParticipant = room.localParticipant
if (localParticipant != null) {
... ... @@ -54,7 +59,7 @@ class LiveKit {
context: Context,
rootEglBase: EglBase,
): LocalVideoTrack {
return LocalVideoTrack.track(
return LocalVideoTrack.createTrack(
peerConnectionFactory,
context,
true,
... ...
... ... @@ -2,5 +2,8 @@ package io.livekit.android.room
import kotlinx.serialization.Serializable
/**
* @suppress
*/
@Serializable
data class IceCandidateJSON(val candidate: String, val sdpMLineIndex: Int, val sdpMid: String?)
\ No newline at end of file
... ...
... ... @@ -5,6 +5,9 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import org.webrtc.*
/**
* @suppress
*/
class PeerConnectionTransport
@AssistedInject
constructor(
... ...
... ... @@ -4,6 +4,9 @@ import com.github.ajalt.timberkt.Timber
import livekit.LivekitRtc
import org.webrtc.*
/**
* @suppress
*/
class PublisherTransportObserver(
private val engine: RTCEngine
) : PeerConnection.Observer {
... ...
... ... @@ -21,6 +21,9 @@ import org.webrtc.SessionDescription
import javax.inject.Inject
import javax.inject.Named
/**
* @suppress
*/
class RTCClient
@Inject
constructor(
... ... @@ -38,13 +41,10 @@ constructor(
var listener: Listener? = null
fun join(
host: String,
url: String,
token: String,
isSecure: Boolean,
) {
val protocol = if (isSecure) "wss" else "ws"
val wsUrlString = "$protocol://$host/rtc?access_token=$token"
val wsUrlString = "$url/rtc?access_token=$token"
Timber.i { "connecting to $wsUrlString" }
val request = Request.Builder()
... ...
... ... @@ -20,7 +20,9 @@ import kotlin.coroutines.Continuation
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
/**
* @suppress
*/
class RTCEngine
@Inject
constructor(
... ... @@ -70,8 +72,8 @@ constructor(
)
}
fun join(url: String, token: String, isSecure: Boolean) {
client.join(url, token, isSecure)
fun join(url: String, token: String) {
client.join(url, token)
}
suspend fun addTrack(cid: Track.Cid, name: String, kind: LivekitModels.TrackType): LivekitModels.TrackInfo {
... ...
... ... @@ -57,12 +57,12 @@ constructor(
get() = mutableActiveSpeakers
private var connectContinuation: Continuation<Unit>? = null
suspend fun connect(url: String, token: String, isSecure: Boolean) {
suspend fun connect(url: String, token: String) {
if (localParticipant != null) {
Timber.d { "Attempting to connect to room when already connected." }
return
}
engine.join(url, token, isSecure)
engine.join(url, token)
return suspendCoroutine { connectContinuation = it }
}
... ... @@ -132,11 +132,18 @@ constructor(
listener?.onActiveSpeakersChanged(speakers, this)
}
/**
* @suppress
*/
@AssistedFactory
interface Factory {
fun create(connectOptions: ConnectOptions): Room
}
/**
* Room Listener, this class provides callbacks that clients should override.
*
*/
interface Listener {
fun onConnect(room: Room) {}
fun onDisconnect(room: Room, error: Exception?) {}
... ... @@ -150,6 +157,9 @@ constructor(
fun onActiveSpeakersChanged(speakers: List<Participant>, room: Room) {}
}
/**
* @suppress
*/
override fun onJoin(response: LivekitRtc.JoinResponse) {
Timber.v { "engine did join, version: ${response.serverVersion}" }
... ... @@ -181,6 +191,9 @@ constructor(
listener?.onConnect(this)
}
/**
* @suppress
*/
override fun onAddTrack(track: MediaStreamTrack, streams: Array<out MediaStream>) {
if (streams.count() < 0) {
Timber.i { "add track with empty streams?" }
... ... @@ -193,6 +206,9 @@ constructor(
participant.addSubscribedMediaTrack(track, trackSid)
}
/**
* @suppress
*/
override fun onAddDataChannel(channel: DataChannel) {
val unpackedTrackLabel = channel.unpackedTrackLabel()
val (participantSid, trackSid, name) = unpackedTrackLabel
... ... @@ -200,10 +216,15 @@ constructor(
participant.addSubscribedDataTrack(channel, trackSid, name)
}
/**
* @suppress
*/
override fun onPublishLocalTrack(cid: Track.Cid, track: LivekitModels.TrackInfo) {
}
/**
* @suppress
*/
override fun onUpdateParticipants(updates: List<LivekitModels.ParticipantInfo>) {
for (info in updates) {
val participantSid = Participant.Sid(info.sid)
... ... @@ -225,19 +246,32 @@ constructor(
}
}
/**
* @suppress
*/
override fun onUpdateSpeakers(speakers: List<LivekitRtc.SpeakerInfo>) {
handleSpeakerUpdate(speakers)
}
/**
* @suppress
*/
override fun onDisconnect(reason: String) {
Timber.v { "engine did disconnect: $reason" }
listener?.onDisconnect(this, null)
}
/**
* @suppress
*/
override fun onFailToConnect(error: Exception) {
listener?.onFailedToConnect(this, error)
}
/**
* @suppress
* // TODO(@dl): can this be moved out of Room/SDK?
*/
fun initVideoRenderer(viewRenderer: SurfaceViewRenderer) {
viewRenderer.init(eglBase.eglBaseContext, null)
viewRenderer.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT)
... ...
... ... @@ -4,6 +4,9 @@ import com.github.ajalt.timberkt.Timber
import livekit.LivekitRtc
import org.webrtc.*
/**
* @suppress
*/
class SubscriberTransportObserver(
private val engine: RTCEngine
) : PeerConnection.Observer {
... ...
... ... @@ -10,6 +10,10 @@ import java.util.*
class LocalParticipant(sid: Sid, name: String? = null) :
Participant(sid, name) {
/**
* @suppress
*/
constructor(info: LivekitModels.ParticipantInfo, engine: RTCEngine) : this(
Sid(info.sid),
info.identity
... ... @@ -18,8 +22,6 @@ class LocalParticipant(sid: Sid, name: String? = null) :
this.engine = engine
}
private val streamId = UUID.randomUUID().toString()
val localAudioTrackPublications
get() = audioTracks.values.toList()
val localVideoTrackPublications
... ... @@ -30,6 +32,9 @@ class LocalParticipant(sid: Sid, name: String? = null) :
var engine: RTCEngine? = null
val listener: Listener? = null
/**
* @suppress
*/
fun updateFromInfo(info: LivekitModels.ParticipantInfo) {
sid = Sid(info.sid)
name = info.identity
... ... @@ -55,7 +60,7 @@ class LocalParticipant(sid: Sid, name: String? = null) :
engine.addTrack(cid = Track.Cid(cid), name = track.name, kind = LivekitModels.TrackType.AUDIO)
val transInit = RtpTransceiver.RtpTransceiverInit(
RtpTransceiver.RtpTransceiverDirection.SEND_ONLY,
listOf(streamId)
listOf(this.sid.sid)
)
val transceiver =
engine.publisher.peerConnection.addTransceiver(track.rtcTrack, transInit)
... ... @@ -92,7 +97,7 @@ class LocalParticipant(sid: Sid, name: String? = null) :
engine.addTrack(cid = Track.Cid(cid), name = track.name, kind = LivekitModels.TrackType.VIDEO)
val transInit = RtpTransceiver.RtpTransceiverInit(
RtpTransceiver.RtpTransceiverDirection.SEND_ONLY,
listOf(streamId)
listOf(this.sid.sid)
)
val transceiver =
engine.publisher.peerConnection.addTransceiver(track.rtcTrack, transInit)
... ... @@ -166,7 +171,6 @@ class LocalParticipant(sid: Sid, name: String? = null) :
}
fun unpublishDataTrack(track: LocalDataTrack) {
val sid = track.sid ?: run {
Timber.d { "this track was never published." }
return
... ... @@ -202,7 +206,6 @@ class LocalParticipant(sid: Sid, name: String? = null) :
}
interface Listener {
fun onPublishAudioTrack(track: LocalAudioTrack)
fun onFailToPublishAudioTrack(exception: Exception)
fun onPublishVideoTrack(track: LocalVideoTrack)
... ... @@ -211,5 +214,4 @@ class LocalParticipant(sid: Sid, name: String? = null) :
fun onFailToPublishDataTrack(exception: Exception)
//fun onNetworkQualityLevelChange
}
}
... ...
... ... @@ -19,6 +19,9 @@ open class Participant(var sid: Sid, name: String? = null) {
var dataTracks = mutableMapOf<Track.Sid, TrackPublication>()
private set
/**
* @suppress
*/
fun addTrack(publication: TrackPublication) {
tracks[publication.trackSid] = publication
when (publication) {
... ...
... ... @@ -16,7 +16,9 @@ import java.nio.ByteBuffer
class RemoteParticipant(
sid: Sid, name: String? = null
) : Participant(sid, name), RemoteDataTrack.Listener {
/**
* @suppress
*/
constructor(info: LivekitModels.ParticipantInfo) : this(Sid(info.sid), info.identity) {
updateFromInfo(info)
}
... ... @@ -40,6 +42,9 @@ class RemoteParticipant(
fun getTrackPublication(sid: Track.Sid): RemoteTrackPublication? =
tracks[sid] as? RemoteTrackPublication
/**
* @suppress
*/
fun updateFromInfo(info: LivekitModels.ParticipantInfo) {
val hadInfo = hasInfo
sid = Sid(info.sid)
... ... @@ -85,6 +90,9 @@ class RemoteParticipant(
}
}
/**
* @suppress
*/
fun addSubscribedMediaTrack(rtcTrack: MediaStreamTrack, sid: Track.Sid, triesLeft: Int = 20) {
val publication = getTrackPublication(sid)
val track: Track = when (val kind = rtcTrack.kind()) {
... ... @@ -136,6 +144,9 @@ class RemoteParticipant(
}
}
/**
* @suppress
*/
fun addSubscribedDataTrack(rtcTrack: DataChannel, sid: Track.Sid, name: String) {
val track = RemoteDataTrack(sid, name, rtcTrack)
var publication = getTrackPublication(sid) as? RemoteDataTrackPublication
... ...
... ... @@ -19,7 +19,7 @@ class LocalVideoTrack(
var sid: Sid? = null
companion object {
internal fun track(
internal fun createTrack(
peerConnectionFactory: PeerConnectionFactory,
context: Context,
enabled: Boolean,
... ... @@ -83,6 +83,5 @@ class LocalVideoTrack(
}
return null
}
}
}
\ No newline at end of file
... ...
... ... @@ -71,8 +71,8 @@ class MainActivity : AppCompatActivity() {
}
companion object {
val URL = SpannableStringBuilder("192.168.11.2:7880")
val URL = SpannableStringBuilder("ws://192.168.91.198:7880")
val TOKEN =
SpannableStringBuilder("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTg2MjY0NDAsImlzcyI6IkFQSXdMZWFoN2c0ZnVMWURZQUplYUtzU0UiLCJqdGkiOiJwaG9uZSIsIm5iZiI6MTYxNjAzNDQ0MCwidmlkZW8iOnsicm9vbSI6Im15cm9vbSIsInJvb21Kb2luIjp0cnVlfX0.QWN0B_DO8eSP2sJivnr_QzBud_sdIgJeWDQGQz67DvY")
SpannableStringBuilder("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTgyMDg0NTAsImlzcyI6IkFQSU1teGlMOHJxdUt6dFpFb1pKVjlGYiIsImp0aSI6ImZvcnRoIiwibmJmIjoxNjE1NjE2NDUwLCJ2aWRlbyI6eyJyb29tIjoibXlyb29tIiwicm9vbUpvaW4iOnRydWV9fQ.nu-fOZA-TPFvzleyXk2Zz9b5lFApCXV1npUAexttXQA")
}
}
\ No newline at end of file
... ...