diff --git a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderCoordinator.swift b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderCoordinator.swift index e5e0afe3c..2a9fe90b8 100644 --- a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderCoordinator.swift +++ b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderCoordinator.swift @@ -50,6 +50,10 @@ final class VoiceBroadcastRecorderCoordinator: Coordinator, Presentable { recorderService: voiceBroadcastRecorderService) voiceBroadcastRecorderViewModel = viewModel } + + deinit { + voiceBroadcastRecorderService.cancelRecordingVoiceBroadcast() + } // MARK: - Public diff --git a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift index 3db5cad54..e7f998716 100644 --- a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift +++ b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift @@ -33,7 +33,19 @@ import Foundation } } } - var coordinatorsForEventIdentifiers = [String: VoiceBroadcastRecorderCoordinator]() + private var coordinatorsForEventIdentifiers = [String: VoiceBroadcastRecorderCoordinator]() { + didSet { + if !self.coordinatorsForEventIdentifiers.isEmpty && self.redactionsListener == nil { + redactionsListener = session?.listenToEvents([MXEventType(identifier: kMXEventTypeStringRoomRedaction)], self.handleRedactedEvent) + } + + if self.coordinatorsForEventIdentifiers.isEmpty && self.redactionsListener != nil { + session?.removeListener(self.redactionsListener) + self.redactionsListener = nil + } + } + } + private var redactionsListener: Any? // MARK: Private private var currentEventIdentifier: String? @@ -83,4 +95,17 @@ import Foundation return coordinatorsForEventIdentifiers[currentEventIdentifier] } + + private func handleRedactedEvent(event: MXEvent, direction: MXTimelineDirection, customObject: Any?) { + if direction == .backwards { + // ignore backwards events + return + } + + var coordinator = coordinatorsForEventIdentifiers.removeValue(forKey: event.redacts) + + coordinator?.toPresentable().dismiss(animated: false) { + coordinator = nil + } + } } diff --git a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Service/MatrixSDK/VoiceBroadcastRecorderService.swift b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Service/MatrixSDK/VoiceBroadcastRecorderService.swift index 5c4eae74a..437abbe3c 100644 --- a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Service/MatrixSDK/VoiceBroadcastRecorderService.swift +++ b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Service/MatrixSDK/VoiceBroadcastRecorderService.swift @@ -151,6 +151,21 @@ class VoiceBroadcastRecorderService: VoiceBroadcastRecorderServiceProtocol { }) } + func cancelRecordingVoiceBroadcast() { + MXLog.debug("[VoiceBroadcastRecorderService] Cancel recording voice broadcast") + audioEngine.stop() + audioEngine.inputNode.removeTap(onBus: audioNodeBus) + UIApplication.shared.isIdleTimerDisabled = false + + // Remove current chunk + if self.chunkFile != nil { + self.deleteRecording(at: self.chunkFile.url) + self.chunkFile = nil + } + + self.tearDownVoiceBroadcastService() + } + // MARK: - Private /// Reset chunk values. private func resetValues() { diff --git a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Service/VoiceBroadcastRecorderServiceProtocol.swift b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Service/VoiceBroadcastRecorderServiceProtocol.swift index e457eb843..9e48e2e9a 100644 --- a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Service/VoiceBroadcastRecorderServiceProtocol.swift +++ b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Service/VoiceBroadcastRecorderServiceProtocol.swift @@ -36,4 +36,7 @@ protocol VoiceBroadcastRecorderServiceProtocol { /// Resume voice broadcast recording after paused it. func resumeRecordingVoiceBroadcast() + + /// Cancel voice broadcast recording after redacted it. + func cancelRecordingVoiceBroadcast() }