Merge pull request #7335 from vector-im/alfogrillo/automatic_poll_rules_sync

Automatic poll rules sync (PSG-1135)
This commit is contained in:
Alfonso Grillo
2023-02-03 11:57:53 +01:00
committed by GitHub
11 changed files with 249 additions and 17 deletions
+48 -3
View File
@@ -14,6 +14,7 @@
limitations under the License.
*/
import Combine
import Foundation
import Intents
import MatrixSDK
@@ -60,6 +61,8 @@ final class AppCoordinator: NSObject, AppCoordinatorType {
}
private var currentSpaceId: String?
private var cancellables: Set<AnyCancellable> = .init()
private var pushRulesUpdater: PushRulesUpdater?
// MARK: Public
@@ -81,9 +84,10 @@ final class AppCoordinator: NSObject, AppCoordinatorType {
// MARK: - Public methods
func start() {
self.setupLogger()
self.setupTheme()
self.excludeAllItemsFromBackup()
setupLogger()
setupTheme()
excludeAllItemsFromBackup()
setupPushRulesSessionEvents()
// Setup navigation router store
_ = NavigationRouterStore.shared
@@ -259,6 +263,47 @@ final class AppCoordinator: NSObject, AppCoordinatorType {
// Reload split view with selected space id
self.splitViewCoordinator?.start(with: spaceId)
}
private func setupPushRulesSessionEvents() {
let sessionReady = NotificationCenter.default.publisher(for: .mxSessionStateDidChange)
.compactMap { $0.object as? MXSession }
.filter { $0.state == .running }
.removeDuplicates { session1, session2 in
session1 == session2
}
sessionReady
.sink { [weak self] session in
self?.setupPushRulesUpdater(session: session)
}
.store(in: &cancellables)
let sessionClosed = NotificationCenter.default.publisher(for: .mxSessionStateDidChange)
.compactMap { $0.object as? MXSession }
.filter { $0.state == .closed }
sessionClosed
.sink { [weak self] _ in
self?.pushRulesUpdater = nil
}
.store(in: &cancellables)
}
private func setupPushRulesUpdater(session: MXSession) {
pushRulesUpdater = .init(notificationSettingsService: MXNotificationSettingsService(session: session))
let applicationDidBecomeActive = NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification).eraseOutput()
let needsCheckPublisher = applicationDidBecomeActive.merge(with: Just(())).eraseToAnyPublisher()
needsCheckPublisher
.sink { _ in
Task { @MainActor [weak self] in
await self?.pushRulesUpdater?.syncRulesIfNeeded()
}
}
.store(in: &cancellables)
}
}
// MARK: - LegacyAppDelegateDelegate