diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index db213eac6..8b14e0bb5 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -7449,7 +7449,7 @@ repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift"; requirement = { kind = exactVersion; - version = 1.0.25; + version = 1.0.26; }; }; 701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = { diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 56c0d2321..dd2a4c519 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -149,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/element-hq/matrix-rust-components-swift", "state" : { - "revision" : "dd9e0d89d65be16c3db1a14a121543e0af326536", - "version" : "1.0.25" + "revision" : "29a19a07df68a5fe97431d08c944ced27e791ae3", + "version" : "1.0.26" } }, { diff --git a/ElementX/Sources/Application/AppCoordinator.swift b/ElementX/Sources/Application/AppCoordinator.swift index abec4b130..c79930a31 100644 --- a/ElementX/Sources/Application/AppCoordinator.swift +++ b/ElementX/Sources/Application/AppCoordinator.swift @@ -102,7 +102,7 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg let keychainController = KeychainController(service: .sessions, accessGroup: InfoPlistReader.main.keychainAccessGroupIdentifier) - userSessionStore = UserSessionStore(keychainController: keychainController, appHooks: appHooks) + userSessionStore = UserSessionStore(keychainController: keychainController, appSettings: appSettings, appHooks: appHooks) let appLockService = AppLockService(keychainController: keychainController, appSettings: appSettings) let appLockNavigationCoordinator = NavigationRootCoordinator() diff --git a/ElementX/Sources/Application/AppSettings.swift b/ElementX/Sources/Application/AppSettings.swift index 725bb3eff..63103f4bb 100644 --- a/ElementX/Sources/Application/AppSettings.swift +++ b/ElementX/Sources/Application/AppSettings.swift @@ -43,6 +43,7 @@ final class AppSettings { case elementCallEncryptionEnabled // Feature flags + case simplifiedSlidingSyncEnabled case publicSearchEnabled case fuzzyRoomListSearchEnabled } @@ -62,6 +63,7 @@ final class AppSettings { static func resetSessionSpecificSettings() { MXLog.warning("Resetting the user session specific AppSettings.") store.removeObject(forKey: UserDefaultsKeys.hasRunIdentityConfirmationOnboarding.rawValue) + store.removeObject(forKey: UserDefaultsKeys.simplifiedSlidingSyncEnabled.rawValue) } static func configureWithSuiteName(_ name: String) { @@ -286,4 +288,9 @@ final class AppSettings { @UserPreference(key: UserDefaultsKeys.logLevel, defaultValue: TracingConfiguration.LogLevel.info, storageType: .userDefaults(store)) var logLevel + + // MARK: Shared Feature Flags + + @UserPreference(key: UserDefaultsKeys.simplifiedSlidingSyncEnabled, defaultValue: false, storageType: .userDefaults(store)) + var simplifiedSlidingSyncEnabled } diff --git a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift index 1800eb743..192bf60a2 100644 --- a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift @@ -4041,6 +4041,71 @@ open class ClientBuilderSDKMock: MatrixRustSDK.ClientBuilder { } } + //MARK: - disableBuiltInRootCertificates + + var disableBuiltInRootCertificatesUnderlyingCallsCount = 0 + open var disableBuiltInRootCertificatesCallsCount: Int { + get { + if Thread.isMainThread { + return disableBuiltInRootCertificatesUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = disableBuiltInRootCertificatesUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + disableBuiltInRootCertificatesUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + disableBuiltInRootCertificatesUnderlyingCallsCount = newValue + } + } + } + } + open var disableBuiltInRootCertificatesCalled: Bool { + return disableBuiltInRootCertificatesCallsCount > 0 + } + + var disableBuiltInRootCertificatesUnderlyingReturnValue: ClientBuilder! + open var disableBuiltInRootCertificatesReturnValue: ClientBuilder! { + get { + if Thread.isMainThread { + return disableBuiltInRootCertificatesUnderlyingReturnValue + } else { + var returnValue: ClientBuilder? = nil + DispatchQueue.main.sync { + returnValue = disableBuiltInRootCertificatesUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + disableBuiltInRootCertificatesUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + disableBuiltInRootCertificatesUnderlyingReturnValue = newValue + } + } + } + } + open var disableBuiltInRootCertificatesClosure: (() -> ClientBuilder)? + + open override func disableBuiltInRootCertificates() -> ClientBuilder { + disableBuiltInRootCertificatesCallsCount += 1 + if let disableBuiltInRootCertificatesClosure = disableBuiltInRootCertificatesClosure { + return disableBuiltInRootCertificatesClosure() + } else { + return disableBuiltInRootCertificatesReturnValue + } + } + //MARK: - disableSslVerification var disableSslVerificationUnderlyingCallsCount = 0 @@ -4739,6 +4804,77 @@ open class ClientBuilderSDKMock: MatrixRustSDK.ClientBuilder { } } + //MARK: - simplifiedSlidingSync + + var simplifiedSlidingSyncEnableUnderlyingCallsCount = 0 + open var simplifiedSlidingSyncEnableCallsCount: Int { + get { + if Thread.isMainThread { + return simplifiedSlidingSyncEnableUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = simplifiedSlidingSyncEnableUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + simplifiedSlidingSyncEnableUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + simplifiedSlidingSyncEnableUnderlyingCallsCount = newValue + } + } + } + } + open var simplifiedSlidingSyncEnableCalled: Bool { + return simplifiedSlidingSyncEnableCallsCount > 0 + } + open var simplifiedSlidingSyncEnableReceivedEnable: Bool? + open var simplifiedSlidingSyncEnableReceivedInvocations: [Bool] = [] + + var simplifiedSlidingSyncEnableUnderlyingReturnValue: ClientBuilder! + open var simplifiedSlidingSyncEnableReturnValue: ClientBuilder! { + get { + if Thread.isMainThread { + return simplifiedSlidingSyncEnableUnderlyingReturnValue + } else { + var returnValue: ClientBuilder? = nil + DispatchQueue.main.sync { + returnValue = simplifiedSlidingSyncEnableUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + simplifiedSlidingSyncEnableUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + simplifiedSlidingSyncEnableUnderlyingReturnValue = newValue + } + } + } + } + open var simplifiedSlidingSyncEnableClosure: ((Bool) -> ClientBuilder)? + + open override func simplifiedSlidingSync(enable: Bool) -> ClientBuilder { + simplifiedSlidingSyncEnableCallsCount += 1 + simplifiedSlidingSyncEnableReceivedEnable = enable + DispatchQueue.main.async { + self.simplifiedSlidingSyncEnableReceivedInvocations.append(enable) + } + if let simplifiedSlidingSyncEnableClosure = simplifiedSlidingSyncEnableClosure { + return simplifiedSlidingSyncEnableClosure(enable) + } else { + return simplifiedSlidingSyncEnableReturnValue + } + } + //MARK: - slidingSyncProxy var slidingSyncProxySlidingSyncProxyUnderlyingCallsCount = 0 @@ -15494,42 +15630,6 @@ open class RoomListItemSDKMock: MatrixRustSDK.RoomListItem { } subscribeSettingsClosure?(settings) } - - //MARK: - unsubscribe - - var unsubscribeUnderlyingCallsCount = 0 - open var unsubscribeCallsCount: Int { - get { - if Thread.isMainThread { - return unsubscribeUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = unsubscribeUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - unsubscribeUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - unsubscribeUnderlyingCallsCount = newValue - } - } - } - } - open var unsubscribeCalled: Bool { - return unsubscribeCallsCount > 0 - } - open var unsubscribeClosure: (() -> Void)? - - open override func unsubscribe() { - unsubscribeCallsCount += 1 - unsubscribeClosure?() - } } open class RoomListServiceSDKMock: MatrixRustSDK.RoomListService { init() { diff --git a/ElementX/Sources/Other/Extensions/ClientBuilder.swift b/ElementX/Sources/Other/Extensions/ClientBuilder.swift index d3b76e9c6..41639549d 100644 --- a/ElementX/Sources/Other/Extensions/ClientBuilder.swift +++ b/ElementX/Sources/Other/Extensions/ClientBuilder.swift @@ -23,11 +23,13 @@ extension ClientBuilder { httpProxy: String? = nil, slidingSyncProxy: URL? = nil, sessionDelegate: ClientSessionDelegate, + simplifiedSlidingSyncEnabled: Bool, appHooks: AppHooks) -> ClientBuilder { var builder = ClientBuilder() .slidingSyncProxy(slidingSyncProxy: slidingSyncProxy?.absoluteString) .enableCrossProcessRefreshLock(processId: InfoPlistReader.main.bundleIdentifier, sessionDelegate: sessionDelegate) .userAgent(userAgent: UserAgentBuilder.makeASCIIUserAgent()) + .simplifiedSlidingSync(enable: simplifiedSlidingSyncEnabled) if setupEncryption { builder = builder diff --git a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift index ff80493fa..d16e97cbc 100644 --- a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift +++ b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift @@ -46,6 +46,7 @@ enum DeveloperOptionsScreenViewAction { protocol DeveloperOptionsProtocol: AnyObject { var logLevel: TracingConfiguration.LogLevel { get set } + var simplifiedSlidingSyncEnabled: Bool { get set } var hideUnreadMessagesBadge: Bool { get set } var elementCallBaseURLOverride: URL? { get set } var fuzzyRoomListSearchEnabled: Bool { get set } diff --git a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift index e79e114b5..285d0c2c8 100644 --- a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift +++ b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift @@ -27,6 +27,13 @@ struct DeveloperOptionsScreen: View { LogLevelConfigurationView(logLevel: $context.logLevel) } + Section("Sliding Sync") { + Toggle(isOn: $context.simplifiedSlidingSyncEnabled) { + Text("Simplified Sliding Sync") + Text("Requires app reboot") + } + } + Section("Room List") { Toggle(isOn: $context.hideUnreadMessagesBadge) { Text("Hide grey dots") diff --git a/ElementX/Sources/Services/Authentication/AuthenticationService.swift b/ElementX/Sources/Services/Authentication/AuthenticationService.swift index 0a9f61881..2f08ac2fb 100644 --- a/ElementX/Sources/Services/Authentication/AuthenticationService.swift +++ b/ElementX/Sources/Services/Authentication/AuthenticationService.swift @@ -143,6 +143,7 @@ class AuthenticationService: AuthenticationServiceProtocol { .baseBuilder(httpProxy: appSettings.websiteURL.globalProxy, slidingSyncProxy: appSettings.slidingSyncProxyURL, sessionDelegate: userSessionStore.clientSessionDelegate, + simplifiedSlidingSyncEnabled: appSettings.simplifiedSlidingSyncEnabled, appHooks: appHooks) .sessionPath(path: sessionDirectory.path(percentEncoded: false)) .passphrase(passphrase: passphrase) diff --git a/ElementX/Sources/Services/QRCode/QRCodeLoginService.swift b/ElementX/Sources/Services/QRCode/QRCodeLoginService.swift index 68a6deccf..1c8fa629f 100644 --- a/ElementX/Sources/Services/QRCode/QRCodeLoginService.swift +++ b/ElementX/Sources/Services/QRCode/QRCodeLoginService.swift @@ -61,6 +61,7 @@ final class QRCodeLoginService: QRCodeLoginServiceProtocol { .baseBuilder(httpProxy: appSettings.websiteURL.globalProxy, slidingSyncProxy: appSettings.slidingSyncProxyURL, sessionDelegate: userSessionStore.clientSessionDelegate, + simplifiedSlidingSyncEnabled: appSettings.simplifiedSlidingSyncEnabled, appHooks: appHooks) .sessionPath(path: sessionDirectory.path(percentEncoded: false)) .passphrase(passphrase: passphrase) diff --git a/ElementX/Sources/Services/UserSession/UserSessionStore.swift b/ElementX/Sources/Services/UserSession/UserSessionStore.swift index a1e590dd1..11cecf73d 100644 --- a/ElementX/Sources/Services/UserSession/UserSessionStore.swift +++ b/ElementX/Sources/Services/UserSession/UserSessionStore.swift @@ -20,6 +20,7 @@ import MatrixRustSDK class UserSessionStore: UserSessionStoreProtocol { private let keychainController: KeychainControllerProtocol + private let appSettings: AppSettings private let appHooks: AppHooks private let matrixSDKStateKey = "matrix-sdk-state" @@ -30,8 +31,9 @@ class UserSessionStore: UserSessionStoreProtocol { var clientSessionDelegate: ClientSessionDelegate { keychainController } - init(keychainController: KeychainControllerProtocol, appHooks: AppHooks) { + init(keychainController: KeychainControllerProtocol, appSettings: AppSettings, appHooks: AppHooks) { self.keychainController = keychainController + self.appSettings = appSettings self.appHooks = appHooks } @@ -123,6 +125,7 @@ class UserSessionStore: UserSessionStoreProtocol { let builder = ClientBuilder .baseBuilder(httpProxy: URL(string: homeserverURL)?.globalProxy, sessionDelegate: keychainController, + simplifiedSlidingSyncEnabled: appSettings.simplifiedSlidingSyncEnabled, appHooks: appHooks) .sessionPath(path: credentials.restorationToken.sessionDirectory.path(percentEncoded: false)) .username(username: credentials.userID) diff --git a/NSE/Sources/NotificationServiceExtension.swift b/NSE/Sources/NotificationServiceExtension.swift index 7041b629f..172c464e7 100644 --- a/NSE/Sources/NotificationServiceExtension.swift +++ b/NSE/Sources/NotificationServiceExtension.swift @@ -86,7 +86,10 @@ class NotificationServiceExtension: UNNotificationServiceExtension { // It's imperative that we create **at most** one UserSession/Client per process Task.synchronous { [appHooks] in do { - Self.userSession = try await NSEUserSession(credentials: credentials, clientSessionDelegate: keychainController, appHooks: appHooks) + Self.userSession = try await NSEUserSession(credentials: credentials, + clientSessionDelegate: keychainController, + simplifiedSlidingSyncEnabled: settings.simplifiedSlidingSyncEnabled, + appHooks: appHooks) } catch { MXLog.error("Failed creating user session with error: \(error)") } diff --git a/NSE/Sources/Other/NSESettingsProtocol.swift b/NSE/Sources/Other/NSESettingsProtocol.swift index 943b1fe5a..c693acc3b 100644 --- a/NSE/Sources/Other/NSESettingsProtocol.swift +++ b/NSE/Sources/Other/NSESettingsProtocol.swift @@ -18,6 +18,7 @@ import Foundation protocol NSESettingsProtocol { var logLevel: TracingConfiguration.LogLevel { get } + var simplifiedSlidingSyncEnabled: Bool { get } } extension AppSettings: NSESettingsProtocol { } diff --git a/NSE/Sources/Other/NSEUserSession.swift b/NSE/Sources/Other/NSEUserSession.swift index d5b915209..6f4ffdd2b 100644 --- a/NSE/Sources/Other/NSEUserSession.swift +++ b/NSE/Sources/Other/NSEUserSession.swift @@ -25,7 +25,7 @@ final class NSEUserSession { imageCache: .onlyOnDisk) private let delegateHandle: TaskHandle? - init(credentials: KeychainCredentials, clientSessionDelegate: ClientSessionDelegate, appHooks: AppHooks) async throws { + init(credentials: KeychainCredentials, clientSessionDelegate: ClientSessionDelegate, simplifiedSlidingSyncEnabled: Bool, appHooks: AppHooks) async throws { userID = credentials.userID if credentials.restorationToken.passphrase != nil { MXLog.info("Restoring client with encrypted store.") @@ -36,6 +36,7 @@ final class NSEUserSession { .baseBuilder(setupEncryption: false, httpProxy: URL(string: homeserverURL)?.globalProxy, sessionDelegate: clientSessionDelegate, + simplifiedSlidingSyncEnabled: simplifiedSlidingSyncEnabled, appHooks: appHooks) .sessionPath(path: credentials.restorationToken.sessionDirectory.path(percentEncoded: false)) .username(username: credentials.userID) diff --git a/project.yml b/project.yml index 52a083d5a..3f6d142b2 100644 --- a/project.yml +++ b/project.yml @@ -60,7 +60,7 @@ packages: # Element/Matrix dependencies MatrixRustSDK: url: https://github.com/element-hq/matrix-rust-components-swift - exactVersion: 1.0.25 + exactVersion: 1.0.26 # path: ../matrix-rust-sdk Compound: url: https://github.com/element-hq/compound-ios