@@ -390,15 +390,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
390390 state: publication.subscriptionState,
391391 ));
392392 })
393- ..on < SignalRoomUpdateEvent > ((event) async {
394- _metadata = event.room.metadata;
395- _roomInfo = event.room;
396- emitWhenConnected (RoomMetadataChangedEvent (metadata: event.room.metadata));
397- if (_isRecording != event.room.activeRecording) {
398- _isRecording = event.room.activeRecording;
399- emitWhenConnected (RoomRecordingStatusChanged (activeRecording: _isRecording));
400- }
401- })
393+ ..on < SignalRoomUpdateEvent > ((event) async => _applyRoomUpdate (event.room))
402394 ..on < SignalRemoteMuteTrackEvent > ((event) async {
403395 final publication = localParticipant? .trackPublications[event.sid];
404396
@@ -421,17 +413,10 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
421413
422414 void _setUpEngineListeners () => _engineListener
423415 ..on < EngineJoinResponseEvent > ((event) async {
424- _roomInfo = event.response.room;
425- _name = event.response.room.name;
426- _metadata = event.response.room.metadata;
416+ _applyRoomUpdate (event.response.room);
427417 _serverVersion = event.response.serverVersion;
428418 _serverRegion = event.response.serverRegion;
429419
430- if (_isRecording != event.response.room.activeRecording) {
431- _isRecording = event.response.room.activeRecording;
432- emitWhenConnected (RoomRecordingStatusChanged (activeRecording: _isRecording));
433- }
434-
435420 logger.fine ('[Engine] Received JoinResponse, '
436421 'serverVersion: ${event .response .serverVersion }' );
437422
@@ -579,6 +564,39 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
579564 ..on < EngineActiveSpeakersUpdateEvent > ((event) => _onEngineActiveSpeakersUpdateEvent (event.speakers))
580565 ..on < EngineDataPacketReceivedEvent > (_onDataMessageEvent)
581566 ..on < EngineTranscriptionReceivedEvent > (_onTranscriptionEvent)
567+ ..on < EngineRequestResponseEvent > ((event) {
568+ localParticipant? .handleSignalRequestResponse (event.response);
569+ })
570+ ..on < EngineRoomMovedEvent > ((event) async {
571+ final response = event.response;
572+ logger.fine ('Room moved to: ${response .room .name }' );
573+
574+ // Apply room info from move response
575+ if (response.hasRoom ()) {
576+ _applyRoomUpdate (response.room);
577+ }
578+
579+ // Disconnect all remote participants
580+ final identities = _remoteParticipants.byIdentity.keys.toList ();
581+ for (final identity in identities) {
582+ await _handleParticipantDisconnect (identity);
583+ }
584+
585+ // Emit public event
586+ events.emit (RoomMovedEvent (roomName: response.room.name));
587+
588+ // Update local participant info
589+ if (response.hasParticipant ()) {
590+ await localParticipant? .updateFromInfo (response.participant);
591+ }
592+
593+ // Add new participants
594+ if (response.otherParticipants.isNotEmpty) {
595+ await _onParticipantUpdateEvent (response.otherParticipants);
596+ }
597+
598+ notifyListeners ();
599+ })
582600 ..on < AudioPlaybackStarted > ((event) {
583601 _handleAudioPlaybackStarted ();
584602 })
@@ -993,12 +1011,30 @@ extension RoomPrivateMethods on Room {
9931011 await NativeAudioManagement .stop ();
9941012
9951013 // reset params
1014+ _roomInfo = null ;
9961015 _name = null ;
9971016 _metadata = null ;
1017+ _isRecording = false ;
9981018 _serverVersion = null ;
9991019 _serverRegion = null ;
10001020 }
10011021
1022+ /// Applies room info from server. Skips metadata event on first join
1023+ /// since there is no previous state to compare against.
1024+ void _applyRoomUpdate (lk_models.Room room) {
1025+ final oldRoom = _roomInfo;
1026+ _roomInfo = room;
1027+ _name = room.name;
1028+ _metadata = room.metadata;
1029+ if (oldRoom != null && oldRoom.metadata != room.metadata) {
1030+ emitWhenConnected (RoomMetadataChangedEvent (metadata: room.metadata));
1031+ }
1032+ if (oldRoom? .activeRecording != room.activeRecording) {
1033+ _isRecording = room.activeRecording;
1034+ emitWhenConnected (RoomRecordingStatusChanged (activeRecording: _isRecording));
1035+ }
1036+ }
1037+
10021038 @internal
10031039 void emitWhenConnected (RoomEvent event) {
10041040 if (connectionState == ConnectionState .connected) {
0 commit comments