diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index 8c84e8bb0..c356d0b86 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -100,14 +100,8 @@ final class AppCoordinator: NSObject, AppCoordinatorType { if AppDelegate.theDelegate().isOffline { self.splitViewCoordinator?.showAppStateIndicator(with: VectorL10n.networkOfflineTitle, icon: UIImage(systemName: "wifi.slash")) - - // Pause voice broadcast recording without sending pending events. - VoiceBroadcastRecorderProvider.shared.pauseRecordingOnError() } else { - self.splitViewCoordinator?.hideAppStateIndicator() - - // Send pause voice broadcast event. - VoiceBroadcastRecorderProvider.shared.pauseRecording() + self.splitViewCoordinator?.hideAppStateIndicator() } } diff --git a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift index 9ef2d5c98..b69476593 100644 --- a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift +++ b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift @@ -32,6 +32,9 @@ import Foundation coordinatorsForEventIdentifiers.removeAll() } } + didSet { + sessionState = session?.state + } } private var coordinatorsForEventIdentifiers = [String: VoiceBroadcastRecorderCoordinator]() { didSet { @@ -49,9 +52,19 @@ import Foundation // MARK: Private private var currentEventIdentifier: String? + private var sessionState: MXSessionState? + + private var sessionStateDidChangeObserver: Any? // MARK: - Setup - private override init() { } + private override init() { + super.init() + self.registerNotificationObservers() + } + + deinit { + unregisterNotificationObservers() + } // MARK: - Public @@ -121,4 +134,36 @@ import Foundation coordinator = nil } } + + // MARK: - Notification handling + + private func registerNotificationObservers() { + self.sessionStateDidChangeObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.mxSessionStateDidChange, object: session, queue: nil) { [weak self] notification in + guard let self else { return } + guard let concernedSession = notification.object as? MXSession, self.session === concernedSession else { return } + + self.update(sessionState: concernedSession.state) + } + } + + private func unregisterNotificationObservers() { + if let observer = self.sessionStateDidChangeObserver { + NotificationCenter.default.removeObserver(observer) + } + } + + // MARK: - Session state + private func update(sessionState: MXSessionState) { + let oldState = self.sessionState + self.sessionState = sessionState + + switch (oldState, sessionState) { + case (_, .homeserverNotReachable): + pauseRecordingOnError() + case (_, .running): + pauseRecording() + default: + break + } + } }