diff --git a/lib/src/client.dart b/lib/src/client.dart index 227edaae..5677b7ff 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -2559,7 +2559,7 @@ class Client extends MatrixApi { final room = getRoomById(roomId); if (room != null) { - final List events = []; + final events = []; for (final event in _eventsPendingDecryption) { if (event.event.room.id != roomId) continue; if (!sessionIds.contains( @@ -2571,7 +2571,7 @@ class Client extends MatrixApi { final decryptedEvent = await encryption!.decryptRoomEvent(event.event); if (decryptedEvent.type != EventTypes.Encrypted) { - events.add(BasicEvent.fromJson(decryptedEvent.content)); + events.add(decryptedEvent); } } @@ -2651,11 +2651,10 @@ class Client extends MatrixApi { final accountData = syncRoomUpdate.accountData; if (accountData != null && accountData.isNotEmpty) { - await _handleRoomEvents( - room, - accountData, - EventUpdateType.accountData, - ); + for (final event in accountData) { + await database?.storeRoomAccountData(event); + room.roomAccountData[event.type] = event; + } } } @@ -2671,12 +2670,9 @@ class Client extends MatrixApi { } final accountData = syncRoomUpdate.accountData; if (accountData != null && accountData.isNotEmpty) { - await _handleRoomEvents( - room, - accountData, - EventUpdateType.accountData, - store: false, - ); + for (final event in accountData) { + room.roomAccountData[event.type] = event; + } } final state = syncRoomUpdate.state; if (state != null && state.isNotEmpty) { @@ -2720,17 +2716,13 @@ class Client extends MatrixApi { await receiptStateContent.update(e, room); } - await _handleRoomEvents( - room, - [ - BasicRoomEvent( - type: LatestReceiptState.eventType, - roomId: room.id, - content: receiptStateContent.toJson(), - ), - ], - EventUpdateType.accountData, + final event = BasicRoomEvent( + type: LatestReceiptState.eventType, + roomId: room.id, + content: receiptStateContent.toJson(), ); + await database?.storeRoomAccountData(event); + room.roomAccountData[event.type] = event; } } @@ -2739,7 +2731,7 @@ class Client extends MatrixApi { Future _handleRoomEvents( Room room, - List events, + List events, EventUpdateType type, { bool store = true, }) async { @@ -2785,7 +2777,7 @@ class Client extends MatrixApi { ); // Any kind of member change? We should invalidate the profile then: - if (event is StrippedStateEvent && event.type == EventTypes.RoomMember) { + if (event.type == EventTypes.RoomMember) { final userId = event.stateKey; if (userId != null) { // We do not re-request the profile here as this would lead to @@ -2978,10 +2970,6 @@ class Client extends MatrixApi { room.lastEvent = event; break; - case EventUpdateType.accountData: - room.roomAccountData[eventUpdate.content['type']] = - BasicRoomEvent.fromJson(eventUpdate.content); - break; case EventUpdateType.history: case EventUpdateType.decryptedTimelineQueue: break; diff --git a/lib/src/database/database_api.dart b/lib/src/database/database_api.dart index dc37a437..17cde032 100644 --- a/lib/src/database/database_api.dart +++ b/lib/src/database/database_api.dart @@ -129,6 +129,8 @@ abstract class DatabaseApi { Future storeAccountData(String type, Map content); + Future storeRoomAccountData(BasicRoomEvent event); + Future> getUserDeviceKeys(Client client); Future getSSSSCache(String type); diff --git a/lib/src/database/hive_collections_database.dart b/lib/src/database/hive_collections_database.dart index 3c2ee5e2..359a0b58 100644 --- a/lib/src/database/hive_collections_database.dart +++ b/lib/src/database/hive_collections_database.dart @@ -1095,6 +1095,15 @@ class HiveCollectionsDatabase extends DatabaseApi { return; } + @override + Future storeRoomAccountData(BasicRoomEvent event) async { + await _roomAccountDataBox.put( + TupleKey(event.roomId ?? '', event.type).toString(), + copyMap(event.toJson()), + ); + return; + } + @override Future storeEventUpdate(EventUpdate eventUpdate, Client client) async { final tmpRoom = client.getRoomById(eventUpdate.roomID) ?? @@ -1244,17 +1253,6 @@ class HiveCollectionsDatabase extends DatabaseApi { await _roomStateBox.put(key, stateMap); } } - - // Store a room account data event - if (eventUpdate.type == EventUpdateType.accountData) { - await _roomAccountDataBox.put( - TupleKey( - eventUpdate.roomID, - eventUpdate.content['type'], - ).toString(), - eventUpdate.content, - ); - } } @override diff --git a/lib/src/database/matrix_sdk_database.dart b/lib/src/database/matrix_sdk_database.dart index bd1e6cfb..95c6f7ce 100644 --- a/lib/src/database/matrix_sdk_database.dart +++ b/lib/src/database/matrix_sdk_database.dart @@ -1058,6 +1058,15 @@ class MatrixSdkDatabase extends DatabaseApi with DatabaseFileStorage { return; } + @override + Future storeRoomAccountData(BasicRoomEvent event) async { + await _roomAccountDataBox.put( + TupleKey(event.roomId ?? '', event.type).toString(), + event.toJson(), + ); + return; + } + @override Future storeEventUpdate(EventUpdate eventUpdate, Client client) async { final tmpRoom = client.getRoomById(eventUpdate.roomID) ?? @@ -1214,17 +1223,6 @@ class MatrixSdkDatabase extends DatabaseApi with DatabaseFileStorage { await roomStateBox.put(key, eventUpdate.content); } } - - // Store a room account data event - if (eventUpdate.type == EventUpdateType.accountData) { - await _roomAccountDataBox.put( - TupleKey( - eventUpdate.roomID, - eventUpdate.content['type'], - ).toString(), - eventUpdate.content, - ); - } } @override diff --git a/lib/src/utils/event_update.dart b/lib/src/utils/event_update.dart index d71ca206..af0926c7 100644 --- a/lib/src/utils/event_update.dart +++ b/lib/src/utils/event_update.dart @@ -26,9 +26,6 @@ enum EventUpdateType { /// Messages that have been fetched when requesting past history history, - /// Updates to account data - accountData, - /// The state of an invite inviteState, diff --git a/test/client_test.dart b/test/client_test.dart index 5d219afa..0f8a84df 100644 --- a/test/client_test.dart +++ b/test/client_test.dart @@ -282,7 +282,7 @@ void main() { final eventUpdateList = await eventUpdateListFuture; - expect(eventUpdateList.length, 18); + expect(eventUpdateList.length, 13); expect(eventUpdateList[0].content['type'], 'm.room.member'); expect(eventUpdateList[0].roomID, '!726s6s6q:example.com'); @@ -308,28 +308,35 @@ void main() { expect(eventUpdateList[5].roomID, '!726s6s6q:example.com'); expect(eventUpdateList[5].type, EventUpdateType.timeline); - expect(eventUpdateList[6].content['type'], LatestReceiptState.eventType); - expect(eventUpdateList[6].roomID, '!726s6s6q:example.com'); - expect(eventUpdateList[6].type, EventUpdateType.accountData); + expect(eventUpdateList[6].content['type'], 'm.room.member'); + expect(eventUpdateList[6].roomID, '!calls:example.com'); + expect(eventUpdateList[6].type, EventUpdateType.state); - expect(eventUpdateList[7].content['type'], 'm.tag'); - expect(eventUpdateList[7].roomID, '!726s6s6q:example.com'); - expect(eventUpdateList[7].type, EventUpdateType.accountData); + expect(eventUpdateList[7].content['type'], 'm.room.member'); + expect(eventUpdateList[7].roomID, '!calls:example.com'); + expect(eventUpdateList[7].type, EventUpdateType.state); expect( - eventUpdateList[8].content['type'], + matrix + .getRoomById('!726s6s6q:example.com') + ?.roomAccountData['org.example.custom.room.config'] + ?.type, 'org.example.custom.room.config', ); - expect(eventUpdateList[8].roomID, '!726s6s6q:example.com'); - expect(eventUpdateList[8].type, EventUpdateType.accountData); - - expect(eventUpdateList[9].content['type'], 'm.room.member'); - expect(eventUpdateList[9].roomID, '!calls:example.com'); - expect(eventUpdateList[9].type, EventUpdateType.state); - - expect(eventUpdateList[10].content['type'], 'm.room.member'); - expect(eventUpdateList[10].roomID, '!calls:example.com'); - expect(eventUpdateList[10].type, EventUpdateType.state); + expect( + matrix + .getRoomById('!726s6s6q:example.com') + ?.roomAccountData[LatestReceiptState.eventType] + ?.type, + LatestReceiptState.eventType, + ); + expect( + matrix + .getRoomById('!726s6s6q:example.com') + ?.roomAccountData['m.tag'] + ?.type, + 'm.tag', + ); expect( matrix diff --git a/test/database_api_test.dart b/test/database_api_test.dart index 2846a2fb..eda46236 100644 --- a/test/database_api_test.dart +++ b/test/database_api_test.dart @@ -254,6 +254,14 @@ void main() { client, ); + await database.storeRoomAccountData( + BasicRoomEvent( + content: {'foo': 'bar'}, + type: 'm.test', + roomId: roomid, + ), + ); + await database.storeEventUpdate( EventUpdate( roomID: roomid, @@ -277,6 +285,8 @@ void main() { expect(room?.name, 'start'); + expect(room?.roomAccountData['m.test']?.content, {'foo': 'bar'}); + await database.storeEventUpdate( EventUpdate( roomID: roomid,