From e86f65ad2d0200d247cb457448bbc8adf6b6e533 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Fri, 18 Aug 2023 15:36:32 +0300 Subject: [PATCH] Remove fuzzy searching entirely because of performance issues --- .../Sources/Application/AppSettings.swift | 4 --- .../Screens/HomeScreen/HomeScreenModels.swift | 4 +-- .../HomeScreen/HomeScreenViewModel.swift | 15 +--------- .../DeveloperOptionsScreenModels.swift | 1 - .../View/DeveloperOptionsScreen.swift | 7 ----- .../Sources/Services/Client/ClientProxy.swift | 2 -- .../RoomSummary/MockRoomSummaryProvider.swift | 2 -- .../RoomSummary/RoomSummaryProvider.swift | 28 ++++++------------- .../RoomSummaryProviderProtocol.swift | 2 -- 9 files changed, 11 insertions(+), 54 deletions(-) diff --git a/ElementX/Sources/Application/AppSettings.swift b/ElementX/Sources/Application/AppSettings.swift index a9a645149..9b464e275 100644 --- a/ElementX/Sources/Application/AppSettings.swift +++ b/ElementX/Sources/Application/AppSettings.swift @@ -38,7 +38,6 @@ final class AppSettings { case notificationSettingsEnabled case swiftUITimelineEnabled case pollsInTimeline - case fuzzySearchEnabled } private static var suiteName: String = InfoPlistReader.main.appGroupIdentifier @@ -224,7 +223,4 @@ final class AppSettings { @UserPreference(key: UserDefaultsKeys.pollsInTimeline, defaultValue: false, storageType: .userDefaults(store)) var pollsInTimelineEnabled - - @UserPreference(key: UserDefaultsKeys.fuzzySearchEnabled, defaultValue: true, storageType: .userDefaults(store)) - var fuzzySearchEnabled } diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift index 19aee6ffb..b6361c47b 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift @@ -79,14 +79,12 @@ struct HomeScreenViewState: BindableState { var selectedRoomID: String? - var fuzzySearchEnabled: Bool - var visibleRooms: [HomeScreenRoom] { if roomListMode == .skeletons { return placeholderRooms } - if fuzzySearchEnabled || bindings.searchQuery.isEmpty { + if bindings.searchQuery.isEmpty { return rooms } diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift index 1f776aa66..54b9058cd 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift @@ -49,7 +49,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol roomSummaryProvider = userSession.clientProxy.roomSummaryProvider inviteSummaryProvider = userSession.clientProxy.inviteSummaryProvider - super.init(initialViewState: HomeScreenViewState(userID: userSession.userID, fuzzySearchEnabled: appSettings.fuzzySearchEnabled), + super.init(initialViewState: HomeScreenViewState(userID: userSession.userID), imageProvider: userSession.mediaProvider) userSession.callbacks @@ -74,19 +74,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol .weakAssign(to: \.state.selectedRoomID, on: self) .store(in: &cancellables) - appSettings.$fuzzySearchEnabled - .weakAssign(to: \.state.fuzzySearchEnabled, on: self) - .store(in: &cancellables) - - context.$viewState - .filter { _ in appSettings.fuzzySearchEnabled } - .map(\.bindings.searchQuery) - .debounceAndRemoveDuplicates() - .sink { [weak self] searchQuery in - self?.roomSummaryProvider?.updateFilterPattern(searchQuery) - } - .store(in: &cancellables) - setupRoomSummaryProviderSubscriptions() updateRooms() diff --git a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift index 928113a49..a3255f19d 100644 --- a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift +++ b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift @@ -49,7 +49,6 @@ protocol DeveloperOptionsProtocol: AnyObject { var notificationSettingsEnabled: Bool { get set } var swiftUITimelineEnabled: Bool { get set } var pollsInTimelineEnabled: Bool { get set } - var fuzzySearchEnabled: Bool { get set } } extension AppSettings: DeveloperOptionsProtocol { } diff --git a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift index aa5172029..7ec796678 100644 --- a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift +++ b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift @@ -38,13 +38,6 @@ struct DeveloperOptionsScreen: View { } } - Section("Room list") { - Toggle(isOn: $context.fuzzySearchEnabled) { - Text("Fuzzy search") - Text("Requires app reboot") - } - } - Section("Notifications") { Toggle(isOn: $context.notificationSettingsEnabled) { Text("Show notification settings") diff --git a/ElementX/Sources/Services/Client/ClientProxy.swift b/ElementX/Sources/Services/Client/ClientProxy.swift index 933e4dd3d..45e0ef49c 100644 --- a/ElementX/Sources/Services/Client/ClientProxy.swift +++ b/ElementX/Sources/Services/Client/ClientProxy.swift @@ -399,13 +399,11 @@ class ClientProxy: ClientProxyProtocol { roomSummaryProvider = RoomSummaryProvider(roomListService: roomListService, eventStringBuilder: eventStringBuilder, name: "AllRooms", - appSettings: appSettings, backgroundTaskService: backgroundTaskService) try await roomSummaryProvider?.setRoomList(roomListService.allRooms()) inviteSummaryProvider = RoomSummaryProvider(roomListService: roomListService, eventStringBuilder: eventStringBuilder, name: "Invites", - appSettings: appSettings, backgroundTaskService: backgroundTaskService) self.syncService = syncService diff --git a/ElementX/Sources/Services/Room/RoomSummary/MockRoomSummaryProvider.swift b/ElementX/Sources/Services/Room/RoomSummary/MockRoomSummaryProvider.swift index ba974ec69..b516fceec 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/MockRoomSummaryProvider.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/MockRoomSummaryProvider.swift @@ -45,8 +45,6 @@ class MockRoomSummaryProvider: RoomSummaryProviderProtocol { func setRoomList(_ roomList: RoomList) { } func updateVisibleRange(_ range: Range) { } - - func updateFilterPattern(_ pattern: String?) { } } extension Array where Element == RoomSummary { diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift index 0f490097e..bd35d883f 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift @@ -22,7 +22,6 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { private let roomListService: RoomListServiceProtocol private let eventStringBuilder: RoomEventStringBuilder private let name: String - private var appSettings: AppSettings private let backgroundTaskService: BackgroundTaskServiceProtocol private let serialDispatchQueue: DispatchQueue @@ -30,7 +29,6 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { private var roomList: RoomListProtocol? private var cancellables = Set() - private var listUpdatesSubscriptionResult: RoomListEntriesWithDynamicFilterResult? private var listUpdatesTaskHandle: TaskHandle? private var stateUpdatesTaskHandle: TaskHandle? @@ -57,13 +55,11 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { init(roomListService: RoomListServiceProtocol, eventStringBuilder: RoomEventStringBuilder, name: String, - appSettings: AppSettings, backgroundTaskService: BackgroundTaskServiceProtocol) { self.roomListService = roomListService serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomsummaryprovider", qos: .utility) self.eventStringBuilder = eventStringBuilder self.name = name - self.appSettings = appSettings self.backgroundTaskService = backgroundTaskService diffsPublisher @@ -80,16 +76,20 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { self.roomList = roomList do { - listUpdatesSubscriptionResult = roomList.entriesWithDynamicFilter(listener: RoomListEntriesListenerProxy { [weak self] updates in + let listUpdatesSubscriptionResult = roomList.entries(listener: RoomListEntriesListenerProxy { [weak self] updates in guard let self else { return } MXLog.info("\(name): Received list update") diffsPublisher.send(updates) }) - listUpdatesTaskHandle = listUpdatesSubscriptionResult?.entriesStream + listUpdatesTaskHandle = listUpdatesSubscriptionResult.entriesStream + + rooms = listUpdatesSubscriptionResult.entries.map { roomListEntry in + buildSummaryForRoomListEntry(roomListEntry) + } - // Forces the listener above to be called with the current state - updateFilterPattern(nil) + // Manually call it here as the didSet doesn't work from constructors + roomListSubject.send(rooms) let stateUpdatesSubscriptionResult = try roomList.loadingState(listener: RoomListStateObserver { [weak self] state in guard let self else { return } @@ -100,6 +100,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { stateUpdatesTaskHandle = stateUpdatesSubscriptionResult.stateStream stateSubject.send(RoomSummaryProviderState(roomListState: stateUpdatesSubscriptionResult.state)) + } catch { MXLog.error("Failed setting up room list entry listener with error: \(error)") } @@ -115,18 +116,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { } } } - - func updateFilterPattern(_ pattern: String?) { - guard let pattern, !pattern.isEmpty else { - _ = listUpdatesSubscriptionResult?.dynamicFilter.set(kind: .all) - return - } - guard appSettings.fuzzySearchEnabled else { return } - - _ = listUpdatesSubscriptionResult?.dynamicFilter.set(kind: .fuzzyMatchRoomName(pattern: pattern.lowercased())) - } - // MARK: - Private fileprivate func updateRoomsWithDiffs(_ diffs: [RoomListEntriesUpdate]) { diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift index 545bd2fdd..a804163fd 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift @@ -99,6 +99,4 @@ protocol RoomSummaryProviderProtocol { func setRoomList(_ roomList: RoomList) func updateVisibleRange(_ range: Range) - - func updateFilterPattern(_ pattern: String?) }