Adopt the new limited lists API

This commit is contained in:
Stefan Ceriu
2023-09-18 11:49:07 +03:00
committed by Stefan Ceriu
parent 472ff53fe1
commit 40735fba39
2 changed files with 99 additions and 79 deletions
@@ -25,12 +25,14 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
private let notificationSettings: NotificationSettingsProxyProtocol private let notificationSettings: NotificationSettingsProxyProtocol
private let backgroundTaskService: BackgroundTaskServiceProtocol private let backgroundTaskService: BackgroundTaskServiceProtocol
private let roomListPageSize = 200
private let serialDispatchQueue: DispatchQueue private let serialDispatchQueue: DispatchQueue
private var roomList: RoomListProtocol? private var roomList: RoomListProtocol?
private var cancellables = Set<AnyCancellable>() private var cancellables = Set<AnyCancellable>()
private var listUpdatesSubscriptionResult: RoomListEntriesWithDynamicFilterResult? private var listUpdatesSubscriptionResult: RoomListEntriesWithDynamicAdaptersResult?
private var listUpdatesTaskHandle: TaskHandle? private var listUpdatesTaskHandle: TaskHandle?
private var stateUpdatesTaskHandle: TaskHandle? private var stateUpdatesTaskHandle: TaskHandle?
@@ -82,7 +84,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
self.roomList = roomList self.roomList = roomList
do { do {
listUpdatesSubscriptionResult = roomList.entriesWithDynamicFilter(listener: RoomListEntriesListenerProxy { [weak self] updates in listUpdatesSubscriptionResult = roomList.entriesWithDynamicAdapters(pageSize: UInt32(roomListPageSize), listener: RoomListEntriesListenerProxy { [weak self] updates in
guard let self else { return } guard let self else { return }
MXLog.verbose("\(name): Received list update") MXLog.verbose("\(name): Received list update")
diffsPublisher.send(updates) diffsPublisher.send(updates)
@@ -124,15 +126,21 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
MXLog.error("Failed updating visible range with error: \(error)") MXLog.error("Failed updating visible range with error: \(error)")
} }
} }
if range.upperBound >= rooms.count {
listUpdatesSubscriptionResult?.controller.addOnePage()
} else if range.lowerBound == 0 {
listUpdatesSubscriptionResult?.controller.resetToOnePage()
}
} }
func updateFilterPattern(_ pattern: String?) { func updateFilterPattern(_ pattern: String?) {
guard let pattern, !pattern.isEmpty else { guard let pattern, !pattern.isEmpty else {
_ = listUpdatesSubscriptionResult?.dynamicFilter.set(kind: .all) _ = listUpdatesSubscriptionResult?.controller.setFilter(kind: .all)
return return
} }
_ = listUpdatesSubscriptionResult?.dynamicFilter.set(kind: .normalizedMatchRoomName(pattern: pattern.lowercased())) _ = listUpdatesSubscriptionResult?.controller.setFilter(kind: .normalizedMatchRoomName(pattern: pattern.lowercased()))
} }
// MARK: - Private // MARK: - Private
@@ -271,30 +279,41 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
var changes = [CollectionDifference<RoomSummary>.Change]() var changes = [CollectionDifference<RoomSummary>.Change]()
switch diff { switch diff {
case .pushFront(let value): case .append(let values):
MXLog.verbose("\(name): Push Front \(value.debugIdentifier)")
let summary = buildSummaryForRoomListEntry(value)
changes.append(.insert(offset: 0, element: summary, associatedWith: nil))
case .pushBack(let value):
MXLog.verbose("\(name): Push Back \(value.debugIdentifier)")
let summary = buildSummaryForRoomListEntry(value)
changes.append(.insert(offset: rooms.count, element: summary, associatedWith: nil))
case .append(values: let values):
let debugIdentifiers = values.map(\.debugIdentifier) let debugIdentifiers = values.map(\.debugIdentifier)
MXLog.verbose("\(name): Append \(debugIdentifiers)") MXLog.verbose("\(name): Append \(debugIdentifiers)")
for (index, value) in values.enumerated() { for (index, value) in values.enumerated() {
let summary = buildSummaryForRoomListEntry(value) let summary = buildSummaryForRoomListEntry(value)
changes.append(.insert(offset: rooms.count + index, element: summary, associatedWith: nil)) changes.append(.insert(offset: rooms.count + index, element: summary, associatedWith: nil))
} }
case .set(let index, let value): case .clear:
MXLog.verbose("\(name): Update \(value.debugIdentifier) at \(index)") MXLog.verbose("\(name): Clear all items")
let summary = buildSummaryForRoomListEntry(value) for (index, value) in rooms.enumerated() {
changes.append(.remove(offset: Int(index), element: summary, associatedWith: nil)) changes.append(.remove(offset: index, element: value, associatedWith: nil))
changes.append(.insert(offset: Int(index), element: summary, associatedWith: nil)) }
case .insert(let index, let value): case .insert(let index, let value):
MXLog.verbose("\(name): Insert at \(value.debugIdentifier) at \(index)") MXLog.verbose("\(name): Insert at \(value.debugIdentifier) at \(index)")
let summary = buildSummaryForRoomListEntry(value) let summary = buildSummaryForRoomListEntry(value)
changes.append(.insert(offset: Int(index), element: summary, associatedWith: nil)) changes.append(.insert(offset: Int(index), element: summary, associatedWith: nil))
case .popBack:
MXLog.verbose("\(name): Pop Back")
guard let value = rooms.last else {
fatalError()
}
changes.append(.remove(offset: rooms.count - 1, element: value, associatedWith: nil))
case .popFront:
MXLog.verbose("\(name): Pop Front")
let summary = rooms[0]
changes.append(.remove(offset: 0, element: summary, associatedWith: nil))
case .pushBack(let value):
MXLog.verbose("\(name): Push Back \(value.debugIdentifier)")
let summary = buildSummaryForRoomListEntry(value)
changes.append(.insert(offset: rooms.count, element: summary, associatedWith: nil))
case .pushFront(let value):
MXLog.verbose("\(name): Push Front \(value.debugIdentifier)")
let summary = buildSummaryForRoomListEntry(value)
changes.append(.insert(offset: 0, element: summary, associatedWith: nil))
case .remove(let index): case .remove(let index):
let summary = rooms[Int(index)] let summary = rooms[Int(index)]
MXLog.verbose("\(name): Remove \(summary.id ?? "") from \(index)") MXLog.verbose("\(name): Remove \(summary.id ?? "") from \(index)")
@@ -309,22 +328,21 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
for (index, value) in values.enumerated() { for (index, value) in values.enumerated() {
changes.append(.insert(offset: index, element: buildSummaryForRoomListEntry(value), associatedWith: nil)) changes.append(.insert(offset: index, element: buildSummaryForRoomListEntry(value), associatedWith: nil))
} }
case .clear: case .set(let index, let value):
MXLog.verbose("\(name): Clear all items") MXLog.verbose("\(name): Update \(value.debugIdentifier) at \(index)")
let summary = buildSummaryForRoomListEntry(value)
changes.append(.remove(offset: Int(index), element: summary, associatedWith: nil))
changes.append(.insert(offset: Int(index), element: summary, associatedWith: nil))
case .truncate(let length):
let entriesToKeep = rooms.prefix(Int(length))
for (index, value) in rooms.enumerated() { for (index, value) in rooms.enumerated() {
if entriesToKeep.contains(value) {
continue
}
changes.append(.remove(offset: index, element: value, associatedWith: nil)) changes.append(.remove(offset: index, element: value, associatedWith: nil))
} }
case .popFront:
MXLog.verbose("\(name): Pop Front")
let summary = rooms[0]
changes.append(.remove(offset: 0, element: summary, associatedWith: nil))
case .popBack:
MXLog.verbose("\(name): Pop Back")
guard let value = rooms.last else {
fatalError()
}
changes.append(.remove(offset: rooms.count - 1, element: value, associatedWith: nil))
} }
return CollectionDifference(changes) return CollectionDifference(changes)
@@ -94,24 +94,6 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
var changes = [CollectionDifference<TimelineItemProxy>.Change]() var changes = [CollectionDifference<TimelineItemProxy>.Change]()
switch diff.change() { switch diff.change() {
case .pushFront:
guard let item = diff.pushFront() else { fatalError() }
MXLog.verbose("Push Front: \(item.debugIdentifier)")
let itemProxy = TimelineItemProxy(item: item)
changes.append(.insert(offset: 0, element: itemProxy, associatedWith: nil))
case .pushBack:
guard let item = diff.pushBack() else { fatalError() }
MXLog.verbose("Push Back \(item.debugIdentifier)")
let itemProxy = TimelineItemProxy(item: item)
changes.append(.insert(offset: Int(itemProxies.count), element: itemProxy, associatedWith: nil))
case .insert:
guard let update = diff.insert() else { fatalError() }
MXLog.verbose("Insert \(update.item.debugIdentifier) at \(update.index)")
let itemProxy = TimelineItemProxy(item: update.item)
changes.append(.insert(offset: Int(update.index), element: itemProxy, associatedWith: nil))
case .append: case .append:
guard let items = diff.append() else { fatalError() } guard let items = diff.append() else { fatalError() }
@@ -119,25 +101,41 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
for (index, item) in items.enumerated() { for (index, item) in items.enumerated() {
changes.append(.insert(offset: Int(itemProxies.count) + index, element: TimelineItemProxy(item: item), associatedWith: nil)) changes.append(.insert(offset: Int(itemProxies.count) + index, element: TimelineItemProxy(item: item), associatedWith: nil))
} }
case .set: case .clear:
guard let update = diff.set() else { fatalError() } MXLog.verbose("Clear all items")
for (index, itemProxy) in itemProxies.enumerated() {
changes.append(.remove(offset: index, element: itemProxy, associatedWith: nil))
}
case .insert:
guard let update = diff.insert() else { fatalError() }
MXLog.verbose("Set \(update.item.debugIdentifier) at index \(update.index)") MXLog.verbose("Insert \(update.item.debugIdentifier) at \(update.index)")
let itemProxy = TimelineItemProxy(item: update.item) let itemProxy = TimelineItemProxy(item: update.item)
changes.append(.remove(offset: Int(update.index), element: itemProxy, associatedWith: nil))
changes.append(.insert(offset: Int(update.index), element: itemProxy, associatedWith: nil)) changes.append(.insert(offset: Int(update.index), element: itemProxy, associatedWith: nil))
case .popFront:
guard let itemProxy = itemProxies.first else { fatalError() }
MXLog.verbose("Pop Front \(itemProxy.debugIdentifier)")
changes.append(.remove(offset: 0, element: itemProxy, associatedWith: nil))
case .popBack: case .popBack:
guard let itemProxy = itemProxies.last else { fatalError() } guard let itemProxy = itemProxies.last else { fatalError() }
MXLog.verbose("Pop Back \(itemProxy.debugIdentifier)") MXLog.verbose("Pop Back \(itemProxy.debugIdentifier)")
changes.append(.remove(offset: itemProxies.count - 1, element: itemProxy, associatedWith: nil)) changes.append(.remove(offset: itemProxies.count - 1, element: itemProxy, associatedWith: nil))
case .popFront:
guard let itemProxy = itemProxies.first else { fatalError() }
MXLog.verbose("Pop Front \(itemProxy.debugIdentifier)")
changes.append(.remove(offset: 0, element: itemProxy, associatedWith: nil))
case .pushBack:
guard let item = diff.pushBack() else { fatalError() }
MXLog.verbose("Push Back \(item.debugIdentifier)")
let itemProxy = TimelineItemProxy(item: item)
changes.append(.insert(offset: Int(itemProxies.count), element: itemProxy, associatedWith: nil))
case .pushFront:
guard let item = diff.pushFront() else { fatalError() }
MXLog.verbose("Push Front: \(item.debugIdentifier)")
let itemProxy = TimelineItemProxy(item: item)
changes.append(.insert(offset: 0, element: itemProxy, associatedWith: nil))
case .remove: case .remove:
guard let index = diff.remove() else { fatalError() } guard let index = diff.remove() else { fatalError() }
@@ -146,11 +144,6 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
MXLog.verbose("Remove \(itemProxy.debugIdentifier) at: \(index)") MXLog.verbose("Remove \(itemProxy.debugIdentifier) at: \(index)")
changes.append(.remove(offset: Int(index), element: itemProxy, associatedWith: nil)) changes.append(.remove(offset: Int(index), element: itemProxy, associatedWith: nil))
case .clear:
MXLog.verbose("Clear all items")
for (index, itemProxy) in itemProxies.enumerated() {
changes.append(.remove(offset: index, element: itemProxy, associatedWith: nil))
}
case .reset: case .reset:
guard let items = diff.reset() else { fatalError() } guard let items = diff.reset() else { fatalError() }
@@ -162,6 +155,15 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
for (index, timelineItem) in items.enumerated() { for (index, timelineItem) in items.enumerated() {
changes.append(.insert(offset: index, element: TimelineItemProxy(item: timelineItem), associatedWith: nil)) changes.append(.insert(offset: index, element: TimelineItemProxy(item: timelineItem), associatedWith: nil))
} }
case .set:
guard let update = diff.set() else { fatalError() }
MXLog.verbose("Set \(update.item.debugIdentifier) at index \(update.index)")
let itemProxy = TimelineItemProxy(item: update.item)
changes.append(.remove(offset: Int(update.index), element: itemProxy, associatedWith: nil))
changes.append(.insert(offset: Int(update.index), element: itemProxy, associatedWith: nil))
case .truncate:
break
} }
return CollectionDifference(changes) return CollectionDifference(changes)