davidliu
Committed by GitHub

Add Room.isRecording to surface if the room is being recorded (#200)

* Add Room.isRecording to surface if the room is being recorded

* Add livekit-lint/bin to git ignore
... ... @@ -15,3 +15,4 @@
/captures
.externalNativeBuild
.cxx
/livekit-lint/bin
\ No newline at end of file
... ...
... ... @@ -169,6 +169,11 @@ sealed class RoomEvent(val room: Room) : Event() {
val newPermissions: ParticipantPermission?,
val oldPermissions: ParticipantPermission?,
) : RoomEvent(room)
/**
* The recording of a room has started/stopped.
*/
class RecordingStatusChanged(room: Room, isRecording: Boolean) : RoomEvent(room)
}
enum class DisconnectReason {
... ...
... ... @@ -108,6 +108,11 @@ constructor(
var metadata: String? by flowDelegate(null)
private set
@FlowObservable
@get:FlowObservable
var isRecording: Boolean by flowDelegate(false)
private set
/**
* Automatically manage quality of subscribed video tracks, subscribe to the
* an appropriate resolution based on the size of the video elements that tracks
... ... @@ -271,6 +276,11 @@ constructor(
name = response.room.name
metadata = response.room.metadata
if (response.room.activeRecording != isRecording) {
isRecording = response.room.activeRecording
eventBus.postEvent(RoomEvent.RecordingStatusChanged(this, isRecording), coroutineScope)
}
if (!response.hasParticipant()) {
listener?.onFailedToConnect(this, RoomException.ConnectException("server didn't return any participants"))
return
... ... @@ -462,6 +472,7 @@ constructor(
sid = null
metadata = null
name = null
isRecording = false
}
private fun handleDisconnect(reason: DisconnectReason) {
... ... @@ -673,7 +684,16 @@ constructor(
val oldMetadata = metadata
metadata = update.metadata
eventBus.postEvent(RoomEvent.RoomMetadataChanged(this, metadata, oldMetadata), coroutineScope)
val oldIsRecording = isRecording
isRecording = update.activeRecording
if (oldMetadata != metadata) {
eventBus.postEvent(RoomEvent.RoomMetadataChanged(this, metadata, oldMetadata), coroutineScope)
}
if (oldIsRecording != isRecording) {
eventBus.postEvent(RoomEvent.RecordingStatusChanged(this, isRecording), coroutineScope)
}
}
/**
... ...
... ... @@ -5,6 +5,7 @@ import android.net.ConnectivityManager
import android.net.Network
import androidx.test.platform.app.InstrumentationRegistry
import io.livekit.android.MockE2ETest
import io.livekit.android.assert.assertIsClassList
import io.livekit.android.events.*
import io.livekit.android.mock.MockAudioStreamTrack
import io.livekit.android.mock.MockMediaStream
... ... @@ -92,15 +93,25 @@ class RoomMockE2ETest : MockE2ETest() {
fun roomUpdateTest() = runTest {
connect()
val eventCollector = EventCollector(room.events, coroutineRule.scope)
val roomUpdate = SignalClientTest.ROOM_UPDATE
wsFactory.listener.onMessage(wsFactory.ws, SignalClientTest.ROOM_UPDATE.toOkioByteString())
val events = eventCollector.stopCollecting()
Assert.assertEquals(
SignalClientTest.ROOM_UPDATE.roomUpdate.room.metadata,
assertEquals(
roomUpdate.roomUpdate.room.metadata,
room.metadata
)
Assert.assertEquals(1, events.size)
Assert.assertEquals(true, events[0] is RoomEvent.RoomMetadataChanged)
assertEquals(
roomUpdate.roomUpdate.room.activeRecording,
room.isRecording
)
assertIsClassList(
listOf(
RoomEvent.RoomMetadataChanged::class.java,
RoomEvent.RecordingStatusChanged::class.java,
),
events
)
}
@Test
... ...
... ... @@ -5,6 +5,7 @@ import android.net.ConnectivityManager
import android.net.Network
import androidx.test.core.app.ApplicationProvider
import androidx.test.platform.app.InstrumentationRegistry
import io.livekit.android.assert.assertIsClassList
import io.livekit.android.audio.NoAudioHandler
import io.livekit.android.coroutines.TestCoroutineRule
import io.livekit.android.events.*
... ... @@ -104,6 +105,28 @@ class RoomTest {
assertEquals(roomInfo.name, room.name)
assertEquals(Room.Sid(roomInfo.sid), room.sid)
assertEquals(roomInfo.metadata, room.metadata)
assertEquals(roomInfo.activeRecording, room.isRecording)
}
@Test
fun roomUpdate() = runTest {
connect()
val update = SignalClientTest.ROOM_UPDATE.roomUpdate.room
val eventCollector = EventCollector(room.events, coroutineRule.scope)
room.onRoomUpdate(update)
val events = eventCollector.stopCollecting()
assertEquals(update.metadata, room.metadata)
assertEquals(update.activeRecording, room.isRecording)
assertIsClassList(
listOf(
RoomEvent.RoomMetadataChanged::class.java,
RoomEvent.RecordingStatusChanged::class.java,
),
events
)
}
@Test
... ... @@ -144,6 +167,7 @@ class RoomTest {
assertNull(room.sid)
assertNull(room.metadata)
assertNull(room.name)
assertFalse(room.isRecording)
}
@Test
... ... @@ -163,7 +187,7 @@ class RoomTest {
assertNull(room.sid)
assertNull(room.metadata)
assertNull(room.name)
assertFalse(room.isRecording)
}
@Test
... ...
... ... @@ -310,6 +310,7 @@ class SignalClientTest : BaseTest() {
roomUpdate = with(LivekitRtc.RoomUpdate.newBuilder()) {
room = with(LivekitModels.Room.newBuilder()) {
metadata = "metadata"
activeRecording = true
build()
}
build()
... ...