Remove fuzzy searching entirely because of performance issues

This commit is contained in:
Stefan Ceriu 2023-08-18 15:36:32 +03:00 committed by Stefan Ceriu
parent f683861ade
commit e86f65ad2d
9 changed files with 11 additions and 54 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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()

View File

@ -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 { }

View File

@ -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")

View File

@ -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

View File

@ -45,8 +45,6 @@ class MockRoomSummaryProvider: RoomSummaryProviderProtocol {
func setRoomList(_ roomList: RoomList) { }
func updateVisibleRange(_ range: Range<Int>) { }
func updateFilterPattern(_ pattern: String?) { }
}
extension Array where Element == RoomSummary {

View File

@ -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<AnyCancellable>()
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]) {

View File

@ -99,6 +99,4 @@ protocol RoomSummaryProviderProtocol {
func setRoomList(_ roomList: RoomList)
func updateVisibleRange(_ range: Range<Int>)
func updateFilterPattern(_ pattern: String?)
}