diff --git a/ElementX/Sources/Application/AppCoordinator.swift b/ElementX/Sources/Application/AppCoordinator.swift index 3016dca58..88085cfff 100644 --- a/ElementX/Sources/Application/AppCoordinator.swift +++ b/ElementX/Sources/Application/AppCoordinator.swift @@ -428,6 +428,10 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg MXLog.info("Migrating user session from \(oldVersion)") + MXLog.info("Performing client store optimizations.") + await userSession.clientProxy.optimizeStores() + MXLog.info("Finished optimizing client stores.") + if oldVersion < Version(25, 6, 0) { MXLog.info("Migrating to version 25.06.0, migrating timeline media settings to account data.") performSettingsToAccountDataMigration(userSession: userSession) diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index 72e46cf08..1012511a7 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -4642,6 +4642,71 @@ class ClientProxyMock: ClientProxyProtocol, @unchecked Sendable { return clearCachesReturnValue } } + //MARK: - optimizeStores + + var optimizeStoresUnderlyingCallsCount = 0 + var optimizeStoresCallsCount: Int { + get { + if Thread.isMainThread { + return optimizeStoresUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = optimizeStoresUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + optimizeStoresUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + optimizeStoresUnderlyingCallsCount = newValue + } + } + } + } + var optimizeStoresCalled: Bool { + return optimizeStoresCallsCount > 0 + } + + var optimizeStoresUnderlyingReturnValue: Result! + var optimizeStoresReturnValue: Result! { + get { + if Thread.isMainThread { + return optimizeStoresUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = optimizeStoresUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + optimizeStoresUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + optimizeStoresUnderlyingReturnValue = newValue + } + } + } + } + var optimizeStoresClosure: (() async -> Result)? + + @discardableResult + func optimizeStores() async -> Result { + optimizeStoresCallsCount += 1 + if let optimizeStoresClosure = optimizeStoresClosure { + return await optimizeStoresClosure() + } else { + return optimizeStoresReturnValue + } + } //MARK: - fetchMediaPreviewConfiguration var fetchMediaPreviewConfigurationUnderlyingCallsCount = 0 diff --git a/ElementX/Sources/Services/Client/ClientProxy.swift b/ElementX/Sources/Services/Client/ClientProxy.swift index fba9ac56b..bcd92eaeb 100644 --- a/ElementX/Sources/Services/Client/ClientProxy.swift +++ b/ElementX/Sources/Services/Client/ClientProxy.swift @@ -807,6 +807,15 @@ class ClientProxy: ClientProxyProtocol { } } + func optimizeStores() async -> Result { + do { + return try await .success(client.optimizeStores()) + } catch { + MXLog.error("Failed optimizing client stores with error: \(error)") + return .failure(.sdkError(error)) + } + } + func fetchMediaPreviewConfiguration() async -> Result { do { let config = try await client.fetchMediaPreviewConfig() diff --git a/ElementX/Sources/Services/Client/ClientProxyProtocol.swift b/ElementX/Sources/Services/Client/ClientProxyProtocol.swift index b9368845e..bf1e1c511 100644 --- a/ElementX/Sources/Services/Client/ClientProxyProtocol.swift +++ b/ElementX/Sources/Services/Client/ClientProxyProtocol.swift @@ -215,6 +215,8 @@ protocol ClientProxyProtocol: AnyObject { @discardableResult func clearCaches() async -> Result + @discardableResult func optimizeStores() async -> Result + func fetchMediaPreviewConfiguration() async -> Result // MARK: - Ignored users