Add a feature flag for fuzzy room list searching

This commit is contained in:
Stefan Ceriu 2024-06-17 12:57:27 +03:00 committed by Stefan Ceriu
parent 5f9310e943
commit b614f43d00
6 changed files with 28 additions and 6 deletions

View File

@ -45,6 +45,7 @@ final class AppSettings {
// Feature flags // Feature flags
case publicSearchEnabled case publicSearchEnabled
case draftRestoringEnabled case draftRestoringEnabled
case fuzzyRoomListSearchEnabled
} }
private static var suiteName: String = InfoPlistReader.main.appGroupIdentifier private static var suiteName: String = InfoPlistReader.main.appGroupIdentifier
@ -272,6 +273,9 @@ final class AppSettings {
@UserPreference(key: UserDefaultsKeys.draftRestoringEnabled, defaultValue: false, storageType: .userDefaults(store)) @UserPreference(key: UserDefaultsKeys.draftRestoringEnabled, defaultValue: false, storageType: .userDefaults(store))
var draftRestoringEnabled var draftRestoringEnabled
@UserPreference(key: UserDefaultsKeys.fuzzyRoomListSearchEnabled, defaultValue: false, storageType: .userDefaults(store))
var fuzzyRoomListSearchEnabled
#endif #endif

View File

@ -48,6 +48,7 @@ protocol DeveloperOptionsProtocol: AnyObject {
var hideUnreadMessagesBadge: Bool { get set } var hideUnreadMessagesBadge: Bool { get set }
var draftRestoringEnabled: Bool { get set } var draftRestoringEnabled: Bool { get set }
var elementCallBaseURL: URL { get set } var elementCallBaseURL: URL { get set }
var fuzzyRoomListSearchEnabled: Bool { get set }
} }
extension AppSettings: DeveloperOptionsProtocol { } extension AppSettings: DeveloperOptionsProtocol { }

View File

@ -31,6 +31,10 @@ struct DeveloperOptionsScreen: View {
Toggle(isOn: $context.hideUnreadMessagesBadge) { Toggle(isOn: $context.hideUnreadMessagesBadge) {
Text("Hide grey dots") Text("Hide grey dots")
} }
Toggle(isOn: $context.fuzzyRoomListSearchEnabled) {
Text("Fuzzy searching")
}
} }
Section("Room") { Section("Room") {

View File

@ -24,6 +24,7 @@ import MatrixRustSDK
class ClientProxy: ClientProxyProtocol { class ClientProxy: ClientProxyProtocol {
private let client: ClientProtocol private let client: ClientProtocol
private let networkMonitor: NetworkMonitorProtocol private let networkMonitor: NetworkMonitorProtocol
private let appSettings: AppSettings
private let mediaLoader: MediaLoaderProtocol private let mediaLoader: MediaLoaderProtocol
private let clientQueue: DispatchQueue private let clientQueue: DispatchQueue
@ -123,9 +124,11 @@ class ClientProxy: ClientProxyProtocol {
private let sendQueueStatusSubject = CurrentValueSubject<Bool, Never>(false) private let sendQueueStatusSubject = CurrentValueSubject<Bool, Never>(false)
init(client: ClientProtocol, init(client: ClientProtocol,
networkMonitor: NetworkMonitorProtocol) async { networkMonitor: NetworkMonitorProtocol,
appSettings: AppSettings) async {
self.client = client self.client = client
self.networkMonitor = networkMonitor self.networkMonitor = networkMonitor
self.appSettings = appSettings
clientQueue = .init(label: "ClientProxyQueue", attributes: .concurrent) clientQueue = .init(label: "ClientProxyQueue", attributes: .concurrent)
@ -726,13 +729,15 @@ class ClientProxy: ClientProxyProtocol {
eventStringBuilder: eventStringBuilder, eventStringBuilder: eventStringBuilder,
name: "AllRooms", name: "AllRooms",
shouldUpdateVisibleRange: true, shouldUpdateVisibleRange: true,
notificationSettings: notificationSettings) notificationSettings: notificationSettings,
appSettings: appSettings)
try await roomSummaryProvider?.setRoomList(roomListService.allRooms()) try await roomSummaryProvider?.setRoomList(roomListService.allRooms())
alternateRoomSummaryProvider = RoomSummaryProvider(roomListService: roomListService, alternateRoomSummaryProvider = RoomSummaryProvider(roomListService: roomListService,
eventStringBuilder: eventStringBuilder, eventStringBuilder: eventStringBuilder,
name: "MessageForwarding", name: "MessageForwarding",
notificationSettings: notificationSettings) notificationSettings: notificationSettings,
appSettings: appSettings)
try await alternateRoomSummaryProvider?.setRoomList(roomListService.allRooms()) try await alternateRoomSummaryProvider?.setRoomList(roomListService.allRooms())
self.syncService = syncService self.syncService = syncService

View File

@ -24,6 +24,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
private let name: String private let name: String
private let shouldUpdateVisibleRange: Bool private let shouldUpdateVisibleRange: Bool
private let notificationSettings: NotificationSettingsProxyProtocol private let notificationSettings: NotificationSettingsProxyProtocol
private let appSettings: AppSettings
private let roomListPageSize = 200 private let roomListPageSize = 200
@ -65,13 +66,15 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
eventStringBuilder: RoomEventStringBuilder, eventStringBuilder: RoomEventStringBuilder,
name: String, name: String,
shouldUpdateVisibleRange: Bool = false, shouldUpdateVisibleRange: Bool = false,
notificationSettings: NotificationSettingsProxyProtocol) { notificationSettings: NotificationSettingsProxyProtocol,
appSettings: AppSettings) {
self.roomListService = roomListService self.roomListService = roomListService
serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomsummaryprovider", qos: .default) serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomsummaryprovider", qos: .default)
self.eventStringBuilder = eventStringBuilder self.eventStringBuilder = eventStringBuilder
self.name = name self.name = name
self.shouldUpdateVisibleRange = shouldUpdateVisibleRange self.shouldUpdateVisibleRange = shouldUpdateVisibleRange
self.notificationSettings = notificationSettings self.notificationSettings = notificationSettings
self.appSettings = appSettings
diffsPublisher diffsPublisher
.receive(on: serialDispatchQueue) .receive(on: serialDispatchQueue)
@ -148,7 +151,11 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
case .excludeAll: case .excludeAll:
_ = listUpdatesSubscriptionResult?.controller.setFilter(kind: .none) _ = listUpdatesSubscriptionResult?.controller.setFilter(kind: .none)
case let .search(query): case let .search(query):
let filters: [RoomListEntriesDynamicFilterKind] = [.normalizedMatchRoomName(pattern: query), .nonLeft] let filters: [RoomListEntriesDynamicFilterKind] = if appSettings.fuzzyRoomListSearchEnabled {
[.fuzzyMatchRoomName(pattern: query), .nonLeft]
} else {
[.normalizedMatchRoomName(pattern: query), .nonLeft]
}
_ = listUpdatesSubscriptionResult?.controller.setFilter(kind: .all(filters: filters)) _ = listUpdatesSubscriptionResult?.controller.setFilter(kind: .all(filters: filters))
case let .all(filters): case let .all(filters):
var filters = filters.map(\.rustFilter) var filters = filters.map(\.rustFilter)

View File

@ -148,7 +148,8 @@ class UserSessionStore: UserSessionStoreProtocol {
private func setupProxyForClient(_ client: Client) async -> ClientProxyProtocol { private func setupProxyForClient(_ client: Client) async -> ClientProxyProtocol {
await ClientProxy(client: client, await ClientProxy(client: client,
networkMonitor: ServiceLocator.shared.networkMonitor) networkMonitor: ServiceLocator.shared.networkMonitor,
appSettings: ServiceLocator.shared.settings)
} }
private func deleteSessionDirectory(for credentials: KeychainCredentials) { private func deleteSessionDirectory(for credentials: KeychainCredentials) {