David Liu

fill in leftover high level api stuff and update sample app usage

... ... @@ -108,6 +108,18 @@ internal constructor(
return super.getTrackPublicationByName(name) as? LocalTrackPublication
}
suspend fun setCameraEnabled(enabled: Boolean){
setTrackEnabled(Track.Source.CAMERA, enabled)
}
suspend fun setMicrophoneEnabled(enabled: Boolean){
setTrackEnabled(Track.Source.MICROPHONE, enabled)
}
suspend fun setScreenShareEnabled(enabled: Boolean) {
setTrackEnabled(Track.Source.SCREEN_SHARE, enabled)
}
private suspend fun setTrackEnabled(
source: Track.Source,
enabled: Boolean,
... ... @@ -122,6 +134,7 @@ internal constructor(
when (source) {
Track.Source.CAMERA -> {
val track = createVideoTrack()
track.startCapture()
publishVideoTrack(track)
}
Track.Source.MICROPHONE -> {
... ...
... ... @@ -109,6 +109,25 @@ open class Participant(var sid: String, identity: String? = null) {
return null
}
fun isCameraEnabled(): Boolean {
val pub = getTrackPublication(Track.Source.CAMERA)
return isTrackPublicationEnabled(pub)
}
fun isMicrophoneEnabled(): Boolean {
val pub = getTrackPublication(Track.Source.MICROPHONE)
return isTrackPublicationEnabled(pub)
}
fun isScreenShareEnabled(): Boolean {
val pub = getTrackPublication(Track.Source.SCREEN_SHARE)
return isTrackPublicationEnabled(pub)
}
private fun isTrackPublicationEnabled(pub: TrackPublication?): Boolean {
return !(pub?.muted ?: true)
}
/**
* @suppress
*/
... ...
... ... @@ -87,7 +87,7 @@ class CallActivity : AppCompatActivity() {
val room by viewModel.room.observeAsState()
val participants by viewModel.remoteParticipants.observeAsState(emptyList())
val micEnabled by viewModel.micEnabled.observeAsState(true)
val videoEnabled by viewModel.videoEnabled.observeAsState(true)
val videoEnabled by viewModel.cameraEnabled.observeAsState(true)
val flipButtonEnabled by viewModel.flipButtonVideoEnabled.observeAsState(true)
val screencastEnabled by viewModel.screencastEnabled.observeAsState(false)
Content(
... ... @@ -228,7 +228,7 @@ class CallActivity : AppCompatActivity() {
)
}
FloatingActionButton(
onClick = { viewModel.setVideoEnabled(!videoEnabled) },
onClick = { viewModel.setCameraEnabled(!videoEnabled) },
backgroundColor = Color.DarkGray,
) {
val resource =
... ...
... ... @@ -11,10 +11,8 @@ import io.livekit.android.ConnectOptions
import io.livekit.android.LiveKit
import io.livekit.android.room.Room
import io.livekit.android.room.RoomListener
import io.livekit.android.room.participant.AudioTrackPublishOptions
import io.livekit.android.room.participant.Participant
import io.livekit.android.room.participant.RemoteParticipant
import io.livekit.android.room.participant.VideoTrackPublishOptions
import io.livekit.android.room.track.*
import kotlinx.coroutines.launch
... ... @@ -28,15 +26,13 @@ class CallViewModel(
private val mutableRemoteParticipants = MutableLiveData<List<RemoteParticipant>>()
val remoteParticipants: LiveData<List<RemoteParticipant>> = mutableRemoteParticipants
private var localAudioTrack: LocalAudioTrack? = null
private var localVideoTrack: LocalVideoTrack? = null
private var localScreencastTrack: LocalScreencastVideoTrack? = null
private val mutableMicEnabled = MutableLiveData(true)
val micEnabled = mutableMicEnabled.hide()
private val mutableVideoEnabled = MutableLiveData(true)
val videoEnabled = mutableVideoEnabled.hide()
private val mutableCameraEnabled = MutableLiveData(true)
val cameraEnabled = mutableCameraEnabled.hide()
private val mutableFlipVideoButtonEnabled = MutableLiveData(true)
val flipButtonVideoEnabled = mutableFlipVideoButtonEnabled.hide()
... ... @@ -56,19 +52,11 @@ class CallViewModel(
// Create and publish audio/video tracks
val localParticipant = room.localParticipant
val audioTrack = localParticipant.createAudioTrack()
localParticipant.publishAudioTrack(audioTrack, AudioTrackPublishOptions(dtx = true))
this@CallViewModel.localAudioTrack = audioTrack
mutableMicEnabled.postValue(audioTrack.enabled)
localParticipant.setMicrophoneEnabled(true)
mutableMicEnabled.postValue(localParticipant.isMicrophoneEnabled())
val videoTrack = localParticipant.createVideoTrack()
localParticipant.publishVideoTrack(
videoTrack,
VideoTrackPublishOptions(simulcast = false)
)
videoTrack.startCapture()
this@CallViewModel.localVideoTrack = videoTrack
mutableVideoEnabled.postValue(videoTrack.enabled)
localParticipant.setCameraEnabled(true)
mutableCameraEnabled.postValue(localParticipant.isCameraEnabled())
updateParticipants(room)
mutableRoom.value = room
... ... @@ -146,25 +134,31 @@ class CallViewModel(
}
fun setMicEnabled(enabled: Boolean) {
localAudioTrack?.enabled = enabled
viewModelScope.launch {
val localParticipant = room.value?.localParticipant ?: return@launch
localParticipant.setMicrophoneEnabled(enabled)
mutableMicEnabled.postValue(enabled)
}
}
fun setVideoEnabled(enabled: Boolean) {
localVideoTrack?.enabled = enabled
mutableVideoEnabled.postValue(enabled)
fun setCameraEnabled(enabled: Boolean) {
viewModelScope.launch {
val localParticipant = room.value?.localParticipant ?: return@launch
localParticipant.setMicrophoneEnabled(enabled)
mutableCameraEnabled.postValue(enabled)
}
}
fun flipVideo() {
room.value?.localParticipant?.let { participant ->
val videoTrack = participant.videoTracks.values
.firstOrNull()
val videoTrack = participant.getTrackPublication(Track.Source.CAMERA)
?.track as? LocalVideoTrack
?: return@let
val newOptions = when (videoTrack.options.position) {
CameraPosition.FRONT -> LocalVideoTrackOptions(position = CameraPosition.BACK)
CameraPosition.BACK -> LocalVideoTrackOptions(position = CameraPosition.FRONT)
else -> LocalVideoTrackOptions()
}
videoTrack.restartTrack(newOptions)
... ...