diff --git a/lib/matrix_api/model/sync_update.dart b/lib/matrix_api/model/sync_update.dart index f82ab04..c21ff06 100644 --- a/lib/matrix_api/model/sync_update.dart +++ b/lib/matrix_api/model/sync_update.dart @@ -33,6 +33,8 @@ class SyncUpdate { DeviceListsUpdate deviceLists; Map deviceOneTimeKeysCount; + SyncUpdate(); + SyncUpdate.fromJson(Map json) { nextBatch = json['next_batch']; rooms = json['rooms'] != null ? RoomsUpdate.fromJson(json['rooms']) : null; @@ -97,6 +99,8 @@ class RoomsUpdate { Map invite; Map leave; + RoomsUpdate(); + RoomsUpdate.fromJson(Map json) { join = json['join'] != null ? (json['join'] as Map) @@ -136,6 +140,8 @@ class JoinedRoomUpdate extends SyncRoomUpdate { List accountData; UnreadNotificationCounts unreadNotifications; + JoinedRoomUpdate(); + JoinedRoomUpdate.fromJson(Map json) { summary = json['summary'] != null ? RoomSummary.fromJson(json['summary']) : null; @@ -260,6 +266,9 @@ class TimelineUpdate { List events; bool limited; String prevBatch; + + TimelineUpdate(); + TimelineUpdate.fromJson(Map json) { events = json['events'] != null ? (json['events'] as List).map((i) => MatrixEvent.fromJson(i)).toList() @@ -267,6 +276,7 @@ class TimelineUpdate { limited = json['limited']; prevBatch = json['prev_batch']; } + Map toJson() { final data = {}; if (events != null) { diff --git a/lib/src/client.dart b/lib/src/client.dart index bdd2ada..5ae9947 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -737,19 +737,22 @@ class Client { } /// Use this method only for testing utilities! - Future handleSync(SyncUpdate sync) async { + Future handleSync(SyncUpdate sync, {bool sortAtTheEnd = false}) async { if (sync.toDevice != null) { await _handleToDeviceEvents(sync.toDevice); } if (sync.rooms != null) { if (sync.rooms.join != null) { - await _handleRooms(sync.rooms.join, Membership.join); + await _handleRooms(sync.rooms.join, Membership.join, + sortAtTheEnd: sortAtTheEnd); } if (sync.rooms.invite != null) { - await _handleRooms(sync.rooms.invite, Membership.invite); + await _handleRooms(sync.rooms.invite, Membership.invite, + sortAtTheEnd: sortAtTheEnd); } if (sync.rooms.leave != null) { - await _handleRooms(sync.rooms.leave, Membership.leave); + await _handleRooms(sync.rooms.leave, Membership.leave, + sortAtTheEnd: sortAtTheEnd); } } if (sync.presence != null) { @@ -827,7 +830,8 @@ class Client { } Future _handleRooms( - Map rooms, Membership membership) async { + Map rooms, Membership membership, + {bool sortAtTheEnd = false}) async { for (final entry in rooms.entries) { final id = entry.key; final room = entry.value; @@ -853,8 +857,11 @@ class Client { handledEvents = true; } if (room.timeline?.events?.isNotEmpty ?? false) { - await _handleRoomEvents(id, - room.timeline.events.map((i) => i.toJson()).toList(), 'timeline'); + await _handleRoomEvents( + id, + room.timeline.events.map((i) => i.toJson()).toList(), + sortAtTheEnd ? 'history' : 'timeline', + sortAtTheEnd: sortAtTheEnd); handledEvents = true; } if (room.ephemeral?.isNotEmpty ?? false) { @@ -938,14 +945,16 @@ class Client { } Future _handleRoomEvents( - String chat_id, List events, String type) async { + String chat_id, List events, String type, + {bool sortAtTheEnd = false}) async { for (num i = 0; i < events.length; i++) { - await _handleEvent(events[i], chat_id, type); + await _handleEvent(events[i], chat_id, type, sortAtTheEnd: sortAtTheEnd); } } Future _handleEvent( - Map event, String roomID, String type) async { + Map event, String roomID, String type, + {bool sortAtTheEnd = false}) async { if (event['type'] is String && event['content'] is Map) { // The client must ignore any new m.room.encryption event to prevent // man-in-the-middle attacks! @@ -960,7 +969,9 @@ class Client { // ephemeral events aren't persisted and don't need a sort order - they are // expected to be processed as soon as they come in - final sortOrder = type != 'ephemeral' ? room.newSortOrder : 0.0; + final sortOrder = type != 'ephemeral' + ? (sortAtTheEnd ? room.oldSortOrder : room.newSortOrder) + : 0.0; var update = EventUpdate( eventType: event['type'], roomID: roomID, diff --git a/lib/src/room.dart b/lib/src/room.dart index 40aa431..93b6398 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -791,28 +791,17 @@ class Room { final loadFn = () async { if (!((resp.chunk?.isNotEmpty ?? false) && resp.end != null)) return; - if (resp.state != null) { - for (final state in resp.state) { - await EventUpdate( - type: 'state', - roomID: id, - eventType: state.type, - content: state.toJson(), - sortOrder: oldSortOrder, - ).decrypt(this, store: true); - } - } - - for (final hist in resp.chunk) { - final eventUpdate = await EventUpdate( - type: 'history', - roomID: id, - eventType: hist.type, - content: hist.toJson(), - sortOrder: oldSortOrder, - ).decrypt(this, store: true); - client.onEvent.add(eventUpdate); - } + await client.handleSync( + SyncUpdate() + ..rooms = (RoomsUpdate() + ..join = { + '$id': (JoinedRoomUpdate() + ..state = resp.state + ..timeline = (TimelineUpdate() + ..events = resp.chunk + ..prevBatch = resp.end)), + }), + sortAtTheEnd: true); }; if (client.database != null) { @@ -824,15 +813,6 @@ class Room { } else { await loadFn(); } - client.onRoomUpdate.add( - RoomUpdate( - id: id, - membership: membership, - prev_batch: resp.end, - notification_count: notificationCount, - highlight_count: highlightCount, - ), - ); } /// Sets this room as a direct chat for this user if not already. diff --git a/test/timeline_test.dart b/test/timeline_test.dart index 9044a67..005e8b0 100644 --- a/test/timeline_test.dart +++ b/test/timeline_test.dart @@ -49,19 +49,6 @@ void main() { test('Create', () async { await client.checkServer('https://fakeServer.notExisting'); - client.onEvent.add(EventUpdate( - type: 'timeline', - roomID: roomID, - eventType: 'm.room.message', - content: { - 'type': 'm.room.message', - 'content': {'msgtype': 'm.text', 'body': 'Testcase'}, - 'sender': '@alice:example.com', - 'status': 2, - 'event_id': '1', - 'origin_server_ts': testTimeStamp - }, - sortOrder: room.newSortOrder)); client.onEvent.add(EventUpdate( type: 'timeline', @@ -75,7 +62,20 @@ void main() { 'event_id': '2', 'origin_server_ts': testTimeStamp - 1000 }, - sortOrder: room.oldSortOrder)); + sortOrder: room.newSortOrder)); + client.onEvent.add(EventUpdate( + type: 'timeline', + roomID: roomID, + eventType: 'm.room.message', + content: { + 'type': 'm.room.message', + 'content': {'msgtype': 'm.text', 'body': 'Testcase'}, + 'sender': '@alice:example.com', + 'status': 2, + 'event_id': '1', + 'origin_server_ts': testTimeStamp + }, + sortOrder: room.newSortOrder)); expect(timeline.sub != null, true);