From e696280e698bcf5664a76fb8b3a88ab94e998d09 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 22 Mar 2023 13:34:24 +0200 Subject: [PATCH] Fixes #676 - Fixes regression on updating room list states when using data from the cold cache --- .../Sources/Services/Client/ClientProxy.swift | 26 ++++++++++++++----- .../Client/SlidingSyncViewProxy.swift | 9 ++++--- changelog.d/676.bugfix | 1 + 3 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 changelog.d/676.bugfix diff --git a/ElementX/Sources/Services/Client/ClientProxy.swift b/ElementX/Sources/Services/Client/ClientProxy.swift index f2242ed91..90a2f49e0 100644 --- a/ElementX/Sources/Services/Client/ClientProxy.swift +++ b/ElementX/Sources/Services/Client/ClientProxy.swift @@ -51,9 +51,10 @@ class ClientProxy: ClientProxyProtocol { private let clientQueue: DispatchQueue private var slidingSyncObserverToken: TaskHandle? - private var slidingSync: SlidingSync? + private var slidingSync: SlidingSyncProtocol? var visibleRoomsSlidingSyncView: SlidingSyncList? + var visibleRoomsViewProxy: SlidingSyncViewProxy? var visibleRoomsSummaryProvider: RoomSummaryProviderProtocol? var allRoomsSlidingSyncView: SlidingSyncList? @@ -266,25 +267,30 @@ class ClientProxy: ClientProxyProtocol { .sendUpdatesForItems(enable: true) .build() + // List observers need to be setup before calling build() on the SlidingSyncBuilder otherwise + // cold cache state and count updates will be lost + buildAndConfigureVisibleRoomsSlidingSyncView(visibleRoomsView: visibleRoomsView) + let slidingSync = try slidingSyncBuilder .addList(v: visibleRoomsView) .withCommonExtensions() .coldCache(name: "ElementX") .build() + visibleRoomsViewProxy?.setSlidingSync(slidingSync: slidingSync) + slidingSync.setObserver(observer: WeakClientProxyWrapper(clientProxy: self)) self.slidingSync = slidingSync - buildAndConfigureVisibleRoomsSlidingSyncView(slidingSync: slidingSync, visibleRoomsView: visibleRoomsView) - buildAndConfigureAllRoomsSlidingSyncView(slidingSync: slidingSync) + buildAndConfigureAllRoomsSlidingSyncView() } catch { MXLog.error("Failed building sliding sync with error: \(error)") } } - private func buildAndConfigureVisibleRoomsSlidingSyncView(slidingSync: SlidingSyncProtocol, visibleRoomsView: SlidingSyncList) { - let visibleRoomsViewProxy = SlidingSyncViewProxy(slidingSync: slidingSync, slidingSyncView: visibleRoomsView) + private func buildAndConfigureVisibleRoomsSlidingSyncView(visibleRoomsView: SlidingSyncList) { + let visibleRoomsViewProxy = SlidingSyncViewProxy(slidingSyncView: visibleRoomsView) visibleRoomsSummaryProvider = RoomSummaryProvider(slidingSyncViewProxy: visibleRoomsViewProxy, eventStringBuilder: RoomEventStringBuilder(stateEventStringBuilder: RoomStateEventStringBuilder(userID: userID))) @@ -303,9 +309,11 @@ class ClientProxy: ClientProxyProtocol { self?.configureViewsPostInitialSync() self?.visibleRoomsViewProxyStateObservationToken = nil } + + self.visibleRoomsViewProxy = visibleRoomsViewProxy } - private func buildAndConfigureAllRoomsSlidingSyncView(slidingSync: SlidingSyncProtocol) { + private func buildAndConfigureAllRoomsSlidingSyncView() { guard allRoomsSlidingSyncView == nil else { fatalError("This shouldn't be called more than once") } @@ -321,7 +329,11 @@ class ClientProxy: ClientProxyProtocol { .sendUpdatesForItems(enable: true) .build() - let allRoomsViewProxy = SlidingSyncViewProxy(slidingSync: slidingSync, slidingSyncView: allRoomsView) + let allRoomsViewProxy = SlidingSyncViewProxy(slidingSyncView: allRoomsView) + + if let slidingSync { + allRoomsViewProxy.setSlidingSync(slidingSync: slidingSync) + } allRoomsSummaryProvider = RoomSummaryProvider(slidingSyncViewProxy: allRoomsViewProxy, eventStringBuilder: RoomEventStringBuilder(stateEventStringBuilder: RoomStateEventStringBuilder(userID: userID))) diff --git a/ElementX/Sources/Services/Client/SlidingSyncViewProxy.swift b/ElementX/Sources/Services/Client/SlidingSyncViewProxy.swift index 8b5d84e7d..114ee6e3c 100644 --- a/ElementX/Sources/Services/Client/SlidingSyncViewProxy.swift +++ b/ElementX/Sources/Services/Client/SlidingSyncViewProxy.swift @@ -51,7 +51,7 @@ private class SlidingSyncViewObserver: SlidingSyncListRoomListObserver, SlidingS } class SlidingSyncViewProxy { - private let slidingSync: SlidingSyncProtocol + private var slidingSync: SlidingSyncProtocol! private let slidingSyncView: SlidingSyncListProtocol private var listUpdateObserverToken: TaskHandle? @@ -71,8 +71,7 @@ class SlidingSyncViewProxy { countUpdateObserverToken?.cancel() } - init(slidingSync: SlidingSyncProtocol, slidingSyncView: SlidingSyncListProtocol) { - self.slidingSync = slidingSync + init(slidingSyncView: SlidingSyncListProtocol) { self.slidingSyncView = slidingSyncView let slidingSyncViewObserver = SlidingSyncViewObserver() @@ -94,6 +93,10 @@ class SlidingSyncViewProxy { countUpdateObserverToken = slidingSyncView.observeRoomsCount(observer: slidingSyncViewObserver) } + func setSlidingSync(slidingSync: SlidingSyncProtocol) { + self.slidingSync = slidingSync + } + func currentRoomsList() -> [RoomListEntry] { slidingSyncView.currentRoomsList() } diff --git a/changelog.d/676.bugfix b/changelog.d/676.bugfix new file mode 100644 index 000000000..a1990358d --- /dev/null +++ b/changelog.d/676.bugfix @@ -0,0 +1 @@ +Fixed room list not loading in offline mode \ No newline at end of file