davidliu
Committed by GitHub

Support setting attributes from local participant (#470)

@@ -718,6 +718,19 @@ internal constructor( @@ -718,6 +718,19 @@ internal constructor(
718 this.engine.client.sendUpdateLocalMetadata(metadata, name) 718 this.engine.client.sendUpdateLocalMetadata(metadata, name)
719 } 719 }
720 720
  721 + /**
  722 + * Set or update participant attributes. It will make updates only to keys that
  723 + * are present in [attributes], and will not override others.
  724 + *
  725 + * To delete a value, set the value to an empty string.
  726 + *
  727 + * Note: this requires `canUpdateOwnMetadata` permission.
  728 + * @param attributes attributes to update
  729 + */
  730 + fun updateAttributes(attributes: Map<String, String>) {
  731 + this.engine.client.sendUpdateLocalMetadata(metadata, name, attributes)
  732 + }
  733 +
721 internal fun onRemoteMuteChanged(trackSid: String, muted: Boolean) { 734 internal fun onRemoteMuteChanged(trackSid: String, muted: Boolean) {
722 val pub = trackPublications[trackSid] 735 val pub = trackPublications[trackSid]
723 pub?.muted = muted 736 pub?.muted = muted
@@ -62,6 +62,7 @@ object TestData { @@ -62,6 +62,7 @@ object TestData {
62 .setHidden(true) 62 .setHidden(true)
63 .setRecorder(false) 63 .setRecorder(false)
64 .build() 64 .build()
  65 + putAttributes("attribute", "value")
65 build() 66 build()
66 } 67 }
67 68
@@ -79,6 +80,7 @@ object TestData { @@ -79,6 +80,7 @@ object TestData {
79 } 80 }
80 addTracks(REMOTE_AUDIO_TRACK) 81 addTracks(REMOTE_AUDIO_TRACK)
81 addTracks(REMOTE_VIDEO_TRACK) 82 addTracks(REMOTE_VIDEO_TRACK)
  83 + putAttributes("attribute", "value")
82 build() 84 build()
83 } 85 }
84 86
@@ -225,6 +227,7 @@ object TestData { @@ -225,6 +227,7 @@ object TestData {
225 val participantMetadataChanged = LOCAL_PARTICIPANT.toBuilder() 227 val participantMetadataChanged = LOCAL_PARTICIPANT.toBuilder()
226 .setMetadata("changed_metadata") 228 .setMetadata("changed_metadata")
227 .setName("changed_name") 229 .setName("changed_name")
  230 + .putAttributes("attribute", "changed_value")
228 .build() 231 .build()
229 232
230 addParticipants(participantMetadataChanged) 233 addParticipants(participantMetadataChanged)
@@ -152,6 +152,23 @@ class LocalParticipantMockE2ETest : MockE2ETest() { @@ -152,6 +152,23 @@ class LocalParticipantMockE2ETest : MockE2ETest() {
152 } 152 }
153 153
154 @Test 154 @Test
  155 + fun updateAttributes() = runTest {
  156 + connect()
  157 + wsFactory.ws.clearRequests()
  158 +
  159 + val newAttributes = mapOf("attribute" to "changedValue")
  160 + room.localParticipant.updateAttributes(newAttributes)
  161 +
  162 + val requestString = wsFactory.ws.sentRequests.first().toPBByteString()
  163 + val sentRequest = LivekitRtc.SignalRequest.newBuilder()
  164 + .mergeFrom(requestString)
  165 + .build()
  166 +
  167 + assertTrue(sentRequest.hasUpdateMetadata())
  168 + assertEquals(newAttributes, sentRequest.updateMetadata.attributesMap)
  169 + }
  170 +
  171 + @Test
155 fun participantMetadataChanged() = runTest { 172 fun participantMetadataChanged() = runTest {
156 connect() 173 connect()
157 174
@@ -183,6 +200,7 @@ class LocalParticipantMockE2ETest : MockE2ETest() { @@ -183,6 +200,7 @@ class LocalParticipantMockE2ETest : MockE2ETest() {
183 listOf( 200 listOf(
184 ParticipantEvent.MetadataChanged::class.java, 201 ParticipantEvent.MetadataChanged::class.java,
185 ParticipantEvent.NameChanged::class.java, 202 ParticipantEvent.NameChanged::class.java,
  203 + ParticipantEvent.AttributesChanged::class.java,
186 ), 204 ),
187 participantEvents, 205 participantEvents,
188 ) 206 )