From c5e5a343d3772527b94f8d3c222e7d3e14c99b6f Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Fri, 17 Jul 2020 01:04:50 +0300 Subject: [PATCH] Fixing bugs with audio records. Editing plate numbers in audio records --- AutoCat/Controllers/RecordsController.swift | 40 +++++++++++++++++++++ AutoCat/SceneDelegate.swift | 13 ++++++- AutoCat/Utils/AudioPlayer.swift | 12 ++++--- AutoCat/Utils/Recorder.swift | 16 ++++++--- 4 files changed, 71 insertions(+), 10 deletions(-) diff --git a/AutoCat/Controllers/RecordsController.swift b/AutoCat/Controllers/RecordsController.swift index 3612276..7a7004c 100644 --- a/AutoCat/Controllers/RecordsController.swift +++ b/AutoCat/Controllers/RecordsController.swift @@ -99,6 +99,10 @@ class RecordsController: UIViewController, UITableViewDelegate { activity.becomeCurrent() } + func stopRecording() { + self.recorder?.stopRecording() + } + // MARK: - Bar button handlers @objc func onAddVoiceRecord(_ sender: UIBarButtonItem) { @@ -150,6 +154,7 @@ class RecordsController: UIViewController, UITableViewDelegate { .replacingOccurrences(of: " ", with: "") .uppercased() .replacingOccurrences(of: "Ф", with: "В") + .replacingOccurrences(of: "НОЛЬ", with: "0") var result = "" if let range = trimmed.range(of: #"\S\d\d\d\S\S\d\d\d?"#, options: .regularExpression) { @@ -172,13 +177,20 @@ class RecordsController: UIViewController, UITableViewDelegate { } func valid(number: String) -> Bool { + guard number.count >= 8 else { return false } + let first = String(number.prefix(1)) let second = number.substring(with: 4..<5) let third = number.substring(with: 5..<6) + let digits = Int(number.substring(with: 1..<4)) + let region = Int(number.substring(from: 6)) return self.validLetters.contains(first) && self.validLetters.contains(second) && self.validLetters.contains(third) + && digits != nil + && region != nil + && region! < 1000 } func makeStartSoundIfNeeded(completion: @escaping () throws -> Void) throws { @@ -257,6 +269,11 @@ class RecordsController: UIViewController, UITableViewDelegate { let showText = UIAlertAction(title: "Show recognized text", style: .default) { action in self.showAlert(title: "Recognized text", message: record.rawText) } + let editNumber = UIAlertAction(title: "Edit plate number", style: .default) { action in + self.edit(record: record) + } + + sheet.addAction(editNumber) sheet.addAction(showText) sheet.addAction(share) sheet.addAction(cancel) @@ -270,4 +287,27 @@ class RecordsController: UIViewController, UITableViewDelegate { ad.quickAction = .checkNumber(number) self.tabBarController?.selectedIndex = 0 } + + func edit(record: AudioRecord) { + let alert = UIAlertController(title: "Edit plate number", message: nil, preferredStyle: .alert) + let done = UIAlertAction(title: "Done", style: .default) { action in + guard let tf = alert.textFields?.first else { return } + if let realm = try? Realm() { + try? realm.write { + record.number = tf.text?.uppercased() + } + } + } + alert.addAction(done) + alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in + alert.dismiss(animated: true) + })) + alert.addTextField { tf in + tf.text = record.number ?? record.rawText + NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: tf, queue: OperationQueue.main) { _ in + done.isEnabled = self.valid(number: tf.text?.uppercased() ?? "") + } + } + self.present(alert, animated: true) + } } diff --git a/AutoCat/SceneDelegate.swift b/AutoCat/SceneDelegate.swift index 2f7c5b6..7e4daa6 100644 --- a/AutoCat/SceneDelegate.swift +++ b/AutoCat/SceneDelegate.swift @@ -58,8 +58,19 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // Use this method to save data, release shared resources, and store enough scene-specific state information // to restore the scene back to its current state. + if let split = self.window?.rootViewController as? MainSplitController, let tabvc = split.viewControllers.first as? UITabBarController { + if tabvc.selectedIndex == 1 { + if let nav = tabvc.selectedViewController as? UINavigationController, let child = nav.topViewController { + print(type(of: child)) + if let record = child as? RecordsController { + record.stopRecording() + } + } + } + } + do { - try AVAudioSession.sharedInstance().setActive(false) + try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) } catch { print("sceneDidEnterBackground failed to deactivate audio session: \(error.localizedDescription)") } diff --git a/AutoCat/Utils/AudioPlayer.swift b/AutoCat/Utils/AudioPlayer.swift index 40b54ee..6566757 100644 --- a/AutoCat/Utils/AudioPlayer.swift +++ b/AutoCat/Utils/AudioPlayer.swift @@ -34,7 +34,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { if let player = self.player { if player.isPlaying { player.pause() - try AVAudioSession.sharedInstance().setActive(false) + try self.deactivateSession() self.state.accept(.paused) } else { try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.duckOthers]) @@ -56,7 +56,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { func pause() { if let player = self.player { player.pause() - try? AVAudioSession.sharedInstance().setActive(false) + try? self.deactivateSession() self.state.accept(.paused) } } @@ -64,7 +64,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { func stop() { if let player = self.player { player.stop() - try? AVAudioSession.sharedInstance().setActive(false) + try? self.deactivateSession() self.state.accept(.stopped) self.progressTimer?.invalidate() self.progressTimer = nil @@ -95,10 +95,14 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { return self.progress.asObservable() } + func deactivateSession() throws { + try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) + } + // MARK: - AVAudioPlayerDelegate func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { - try? AVAudioSession.sharedInstance().setActive(false) + try? self.deactivateSession() self.progress.accept(1) self.stop() self.state.accept(.stopped) diff --git a/AutoCat/Utils/Recorder.swift b/AutoCat/Utils/Recorder.swift index 5a83567..7ede563 100644 --- a/AutoCat/Utils/Recorder.swift +++ b/AutoCat/Utils/Recorder.swift @@ -85,14 +85,14 @@ class Recorder { self.result = transcription.formattedString self.endRecognitionTimer?.invalidate() self.endRecognitionTimer = Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { timer in - self.stopRecording() + self.finishRecording() completion(self.result) } } } self.endRecognitionTimer = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { timer in - self.stopRecording() + self.finishRecording() completion(self.result) } @@ -101,20 +101,26 @@ class Recorder { } func cancelRecording() { - self.stopRecording() + self.finishRecording() self.endRecognitionTimer?.invalidate() self.endRecognitionTimer = nil } - func stopRecording() { + func finishRecording() { self.engine.stop() self.engine.inputNode.removeTap(onBus: 0) self.request.endAudio() self.recognitionTask?.cancel() - try? AVAudioSession.sharedInstance().setActive(false) + try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) if let fileRef = self.fileRef { ExtAudioFileDispose(fileRef) } } + + func stopRecording() { + self.finishRecording() + self.endRecognitionTimer?.fire() + self.endRecognitionTimer = nil + } }