From 2d21e4af6c19b795667a22617e63a759ab594056 Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 3 Dec 2025 11:16:13 -0800 Subject: [PATCH 1/3] Add secure recording and authentication features Introduces secure recording capabilities with complete file protection, on-device transcription, and consent management. Adds LocalAuthenticationManager for Face ID/Touch ID authentication, SecureRecordingManager for private recordings, and updates AudioRecordingManager, CacheManager, and Info.plist to support secure workflows and background audio. Includes new UI and test files for secure recordings. --- SpeechDictation.xcodeproj/project.pbxproj | 24 + .../UserInterfaceState.xcuserstate | Bin 187660 -> 192810 bytes SpeechDictation/.DS_Store | Bin 10244 -> 10244 bytes SpeechDictation/Info.plist | 8 +- .../Services/AudioRecordingManager.swift | 126 +++-- .../Services/AudioSessionManager.swift | 192 ++++---- SpeechDictation/Services/CacheManager.swift | 211 ++++++++ .../Services/LocalAuthenticationManager.swift | 383 +++++++++++++++ .../Services/SecureRecordingManager.swift | 354 ++++++++++++++ .../Speech/SpeechRecognizer+Timing.swift | 3 + .../Speech/SpeechRecognizer+config.swift | 44 +- SpeechDictation/Speech/SpeechRecognizer.swift | 3 + SpeechDictation/UI/ContentView.swift | 62 ++- SpeechDictation/UI/MicSensitivityView.swift | 10 +- SpeechDictation/UI/SecureRecordingsView.swift | 416 ++++++++++++++++ SpeechDictation/UI/SettingsView.swift | 294 ++++++++++- .../SecureRecordingBusinessLogicTests.swift | 363 ++++++++++++++ .../SecureRecordingTests.swift | 462 ++++++++++++++++++ memlog/changelog.md | 12 + utility/build_and_test.sh | 48 +- 20 files changed, 2826 insertions(+), 189 deletions(-) create mode 100644 SpeechDictation/Services/LocalAuthenticationManager.swift create mode 100644 SpeechDictation/Services/SecureRecordingManager.swift create mode 100644 SpeechDictation/UI/SecureRecordingsView.swift create mode 100644 SpeechDictationTests/SecureRecordingBusinessLogicTests.swift create mode 100644 SpeechDictationTests/SecureRecordingTests.swift diff --git a/SpeechDictation.xcodeproj/project.pbxproj b/SpeechDictation.xcodeproj/project.pbxproj index 666e33a..fce0dd6 100644 --- a/SpeechDictation.xcodeproj/project.pbxproj +++ b/SpeechDictation.xcodeproj/project.pbxproj @@ -53,6 +53,12 @@ 450001002C60008000AAA131 /* CameraSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000FF2C60008000AAA130 /* CameraSettingsManager.swift */; }; 450000442C60009000AAA121 /* AudioPlaybackManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000432C60009000AAA120 /* AudioPlaybackManager.swift */; }; 450000452C60010000AAA122 /* SpeechRecognizer+Timing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000442C60010000AAA121 /* SpeechRecognizer+Timing.swift */; }; + F12F961D9ACF4AB98793429D /* LocalAuthenticationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12F961D9ACF4AB98793429E /* LocalAuthenticationManager.swift */; }; + F12F961D9ACF4AB987934300 /* AudioSessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12F961D9ACF4AB987934301 /* AudioSessionManager.swift */; }; + FA295D6C5DAA414DB909AF65 /* SecureRecordingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA295D6C5DAA414DB909AF66 /* SecureRecordingManager.swift */; }; + 83AFD655C028498D8E6ADE1F /* SecureRecordingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AFD655C028498D8E6ADE20 /* SecureRecordingsView.swift */; }; + 181C4C6BED7E47AAA4642AA3 /* SecureRecordingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181C4C6BED7E47AAA4642AA4 /* SecureRecordingTests.swift */; }; + CE446A7C990C4714AC59E6C1 /* SecureRecordingBusinessLogicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE446A7C990C4714AC59E6C2 /* SecureRecordingBusinessLogicTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -123,6 +129,12 @@ 450000FF2C60008000AAA130 /* CameraSettingsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraSettingsManager.swift; sourceTree = ""; }; 450000432C60009000AAA120 /* AudioPlaybackManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlaybackManager.swift; sourceTree = ""; }; 450000442C60010000AAA121 /* SpeechRecognizer+Timing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechRecognizer+Timing.swift"; sourceTree = ""; }; + F12F961D9ACF4AB98793429E /* LocalAuthenticationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthenticationManager.swift; sourceTree = ""; }; + F12F961D9ACF4AB987934301 /* AudioSessionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioSessionManager.swift; sourceTree = ""; }; + FA295D6C5DAA414DB909AF66 /* SecureRecordingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingManager.swift; sourceTree = ""; }; + 83AFD655C028498D8E6ADE20 /* SecureRecordingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingsView.swift; sourceTree = ""; }; + 181C4C6BED7E47AAA4642AA4 /* SecureRecordingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingTests.swift; sourceTree = ""; }; + CE446A7C990C4714AC59E6C2 /* SecureRecordingBusinessLogicTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingBusinessLogicTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -207,6 +219,7 @@ 44E6EBD92C2B99D600BBF2F6 /* CameraExperienceView.swift */, 44F6EBCB2C31BB2200BBF2F3 /* NativeStyleShareView.swift */, 44EA2BFE2C4884B500F76CFC /* SettingsView.swift */, + 83AFD655C028498D8E6ADE20 /* SecureRecordingsView.swift */, 4420D05E2C2E4E2500263CF6 /* WaveformView.swift */, 4500001A2C60000000AAA111 /* VUMeterView.swift */, 4500003A2C60005000AAA113 /* TextSizeSettingView.swift */, @@ -227,6 +240,9 @@ 450000422C60008000AAA119 /* AudioRecordingManager.swift */, 450000432C60009000AAA120 /* AudioPlaybackManager.swift */, 450000FF2C60008000AAA130 /* CameraSettingsManager.swift */, + F12F961D9ACF4AB98793429E /* LocalAuthenticationManager.swift */, + F12F961D9ACF4AB987934301 /* AudioSessionManager.swift */, + FA295D6C5DAA414DB909AF66 /* SecureRecordingManager.swift */, ); path = Services; sourceTree = ""; @@ -281,6 +297,8 @@ isa = PBXGroup; children = ( 44E6EBE52C2B99D500BBF2F3 /* SpeechDictationTests.swift */, + 181C4C6BED7E47AAA4642AA4 /* SecureRecordingTests.swift */, + CE446A7C990C4714AC59E6C2 /* SecureRecordingBusinessLogicTests.swift */, ); path = SpeechDictationTests; sourceTree = ""; @@ -465,6 +483,10 @@ 443B0CA82E2366BD00D292B9 /* ObjectDetectionOverlayView.swift in Sources */, 450000442C60009000AAA121 /* AudioPlaybackManager.swift in Sources */, 450000452C60010000AAA122 /* SpeechRecognizer+Timing.swift in Sources */, + F12F961D9ACF4AB98793429D /* LocalAuthenticationManager.swift in Sources */, + F12F961D9ACF4AB987934300 /* AudioSessionManager.swift in Sources */, + FA295D6C5DAA414DB909AF65 /* SecureRecordingManager.swift in Sources */, + 83AFD655C028498D8E6ADE1F /* SecureRecordingsView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -473,6 +495,8 @@ buildActionMask = 2147483647; files = ( 44E6EBE62C2B99D500BBF2F3 /* SpeechDictationTests.swift in Sources */, + 181C4C6BED7E47AAA4642AA3 /* SecureRecordingTests.swift in Sources */, + CE446A7C990C4714AC59E6C1 /* SecureRecordingBusinessLogicTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SpeechDictation.xcodeproj/project.xcworkspace/xcuserdata/josephmccraw.xcuserdatad/UserInterfaceState.xcuserstate b/SpeechDictation.xcodeproj/project.xcworkspace/xcuserdata/josephmccraw.xcuserdatad/UserInterfaceState.xcuserstate index d4712086bbb5c026c7b80c96b8f44780884c14e4..432c3132554831e29103c6be842ec332fb3d5b49 100644 GIT binary patch literal 192810 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

R;=<=@&!*K9<0pG0-4c3*q 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 literal 187660 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 G!G8fdEGcLJ diff --git a/SpeechDictation/.DS_Store b/SpeechDictation/.DS_Store index 1e574e38b0cf336a559762047558ae64a2743c81..3fe82f553f38750ec01ae088860448a26edc18d5 100644 GIT binary patch delta 224 zcmZn(XbIRLD#px|t}@v{Ol-2A7#CZv%;#xs(v$7Pln_j@$u(kpj1MMvi+MBU-I{zu zOonaqrlbQc(wl#YF);<^vM?|(FfoKOc;@E2xFqG|Cjt2!a~4LgTqb?o5h0g?Q?4Mx dFgQ6sw*aUXXwrv`g}c}`vn%kiQRFf%MgY#2MD73p delta 217 zcmZn(XbIRLD#pxs>-=N~F|o;dVq9z`&pyo+5t?i#ri5UMO|B8+V|19@E#}Qs>@fL; zn9O7eaf!`5;vX0TxpEm87?>DB89a0IU0jlK@{@pkj%`OQZ0-pjcSOjg;FK%KFbq!4 c&n*C|1)5Z_v2YjLW_ATWHZq+xnMeEw0K4KqrT_o{ diff --git a/SpeechDictation/Info.plist b/SpeechDictation/Info.plist index df93eda..49bc1ae 100644 --- a/SpeechDictation/Info.plist +++ b/SpeechDictation/Info.plist @@ -10,6 +10,12 @@ NSCameraUsageDescription Speech Dictation uses the camera to provide live object detection and scene description for accessibility and content creation features. NSMicrophoneUsageDescription - Speech Dictation uses the microphone to convert your speech to text with real-time transcription. + Speech Dictation uses the microphone to convert your speech to text with real-time transcription and secure private recording. + NSFaceIDUsageDescription + Speech Dictation uses Face ID to securely protect your private recordings and ensure only you can access sensitive transcribed content. + UIBackgroundModes + + audio + diff --git a/SpeechDictation/Services/AudioRecordingManager.swift b/SpeechDictation/Services/AudioRecordingManager.swift index 0b1df84..38d4517 100644 --- a/SpeechDictation/Services/AudioRecordingManager.swift +++ b/SpeechDictation/Services/AudioRecordingManager.swift @@ -4,6 +4,9 @@ // // Created by AI Assistant on 12/19/24. // +// Enhanced audio recording manager with secure storage capabilities for private recordings. +// Supports both standard recording and secure recording with complete file protection. +// import Foundation import AVFoundation @@ -38,8 +41,15 @@ struct AudioQualitySettings: Codable { ) } +/// Recording mode for different security requirements +enum RecordingMode { + case standard // Standard documents directory storage + case secure // Secure storage with complete file protection +} + /// Service responsible for high-quality audio recording and storage /// Handles audio capture, compression, and file management with configurable quality settings +/// Supports both standard and secure recording modes for different privacy requirements /// Uses AudioQualitySettings from TimingData.swift for quality configuration class AudioRecordingManager: ObservableObject { static let shared = AudioRecordingManager() @@ -47,6 +57,7 @@ class AudioRecordingManager: ObservableObject { @Published private(set) var isRecording = false @Published private(set) var recordingDuration: TimeInterval = 0 @Published private(set) var currentAudioFileURL: URL? + @Published private(set) var currentRecordingMode: RecordingMode = .standard private var audioEngine: AVAudioEngine? private var audioFile: AVAudioFile? @@ -69,15 +80,35 @@ class AudioRecordingManager: ObservableObject { /// - Parameter quality: Audio quality settings (defaults to standard quality) /// - Returns: URL to the audio file being recorded, or nil if failed func startRecording(quality: AudioQualitySettings = .standardQuality) -> URL? { + return startRecording(mode: .standard, quality: quality, sessionId: nil) + } + + /// Starts secure audio recording with complete file protection + /// - Parameters: + /// - quality: Audio quality settings (defaults to standard quality) + /// - sessionId: Optional session identifier for grouping recordings + /// - Returns: URL to the securely stored audio file being recorded, or nil if failed + func startSecureRecording(quality: AudioQualitySettings = .standardQuality, sessionId: String? = nil) -> URL? { + return startRecording(mode: .secure, quality: quality, sessionId: sessionId) + } + + /// Starts audio recording with specified mode and quality + /// - Parameters: + /// - mode: Recording mode (standard or secure) + /// - quality: Audio quality settings + /// - sessionId: Optional session identifier for secure recordings + /// - Returns: URL to the audio file being recorded, or nil if failed + private func startRecording(mode: RecordingMode, quality: AudioQualitySettings, sessionId: String?) -> URL? { guard !isRecording else { print("Already recording") return nil } qualitySettings = quality + currentRecordingMode = mode do { - try setupAudioEngine() + try setupAudioEngine(mode: mode, sessionId: sessionId) try startAudioCapture() isRecording = true @@ -86,14 +117,15 @@ class AudioRecordingManager: ObservableObject { startRecordingTimer() - print("Started audio recording with quality: \(quality.sampleRate)Hz, \(quality.bitDepth)bit") + let modeDescription = mode == .secure ? "secure" : "standard" + print("Started \(modeDescription) audio recording with quality: \(quality.sampleRate)Hz, \(quality.bitDepth)bit") return currentAudioFileURL } catch { print("Failed to start recording: \(error)") return nil } } - + /// Stops the current audio recording /// - Returns: URL to the recorded audio file, or nil if no recording was active func stopRecording() -> URL? { @@ -106,11 +138,18 @@ class AudioRecordingManager: ObservableObject { do { try stopAudioCapture() + + // For secure recordings, ensure file protection is properly applied + if currentRecordingMode == .secure, let fileURL = currentAudioFileURL { + validateSecureFileProtection(at: fileURL) + } + isRecording = false let audioFileURL = currentAudioFileURL currentAudioFileURL = nil recordingStartTime = nil + currentRecordingMode = .standard print("Stopped audio recording") return audioFileURL @@ -148,44 +187,11 @@ class AudioRecordingManager: ObservableObject { /// Configures the audio session for recording with iPad-specific optimizations /// Handles device-specific audio configuration and provides robust fallbacks private func setupAudioSession() { - do { - let session = AVAudioSession.sharedInstance() - - // Check if session is already active before trying to deactivate - if session.isOtherAudioPlaying { - print("Other audio is playing, will configure without deactivation") - } else { - // Only deactivate if not already inactive - if session.category != .playAndRecord { - try session.setActive(false, options: .notifyOthersOnDeactivation) - } - } - - #if targetEnvironment(simulator) - // Use simpler configuration for simulator - try session.setCategory(.playAndRecord, mode: .default, options: []) - #else - // Device-specific configuration with iPad optimizations - let options: AVAudioSession.CategoryOptions = [.defaultToSpeaker, .allowBluetooth] - - // Try measurement mode first for better speech recognition - do { - try session.setCategory(.playAndRecord, mode: .measurement, options: options) - print("Audio session configured with measurement mode") - } catch { - print("Measurement mode failed, trying default mode: \(error)") - // Fallback to default mode if measurement fails - try session.setCategory(.playAndRecord, mode: .default, options: options) - print("Audio session configured with default mode") - } - #endif - - // Activate session with proper options - try session.setActive(true, options: .notifyOthersOnDeactivation) - print("Audio session configured for recording") - - } catch { - print("Error setting up audio session: \(error)") + // Concurrency: Called from a synchronous initializer, so we must block until configuration completes + // to avoid a race where recording begins before the audio session is ready. + let success = AudioSessionManager.shared.configureForRecordingSync() + guard success else { + print("Warning: Failed to configure audio session for recording via manager") // Try a simpler configuration as fallback do { let session = AVAudioSession.sharedInstance() @@ -196,6 +202,7 @@ class AudioRecordingManager: ObservableObject { } catch { print("Failed to configure audio session even with fallback: \(error)") } + return } } #else @@ -205,7 +212,7 @@ class AudioRecordingManager: ObservableObject { } #endif - private func setupAudioEngine() throws { + private func setupAudioEngine(mode: RecordingMode, sessionId: String?) throws { audioEngine = AVAudioEngine() guard let inputNode = audioEngine?.inputNode else { @@ -231,7 +238,13 @@ class AudioRecordingManager: ObservableObject { // Create audio file for recording let fileName = "recording_\(formattedTimestamp()).m4a" - let audioFileURL = documentsDirectory.appendingPathComponent(fileName) + let audioFileURL: URL + + if mode == .secure { + audioFileURL = CacheManager.shared.getSecureFileURL(fileName: fileName, sessionId: sessionId) + } else { + audioFileURL = documentsDirectory.appendingPathComponent(fileName) + } do { audioFile = try AVAudioFile( @@ -252,6 +265,20 @@ class AudioRecordingManager: ObservableObject { ) } + // For secure recordings, apply complete file protection immediately + if mode == .secure { + do { + try FileManager.default.setAttributes( + [.protectionKey: FileProtectionType.complete], + ofItemAtPath: audioFileURL.path + ) + print("Applied complete file protection to: \(audioFileURL.lastPathComponent)") + } catch { + print("Warning: Failed to apply file protection to audio file: \(error)") + // Continue recording even if protection fails, but log the issue + } + } + currentAudioFileURL = audioFileURL // Install a tap on the input node so we can capture audio buffers @@ -412,6 +439,19 @@ class AudioRecordingManager: ObservableObject { return String(format: "%02d:%02d", minutes, seconds) } } + + // MARK: - Secure File Protection + + private func validateSecureFileProtection(at url: URL) { + do { + try CacheManager.shared.validateFileProtection(at: url) + print("Secure file protection validated: \(url.lastPathComponent)") + } catch { + print("Error validating secure file protection: \(error)") + // Optionally, you might want to delete the file if protection fails + // try? FileManager.default.removeItem(at: url) + } + } } // MARK: - Error Types diff --git a/SpeechDictation/Services/AudioSessionManager.swift b/SpeechDictation/Services/AudioSessionManager.swift index 2a58dbf..b6a13ec 100644 --- a/SpeechDictation/Services/AudioSessionManager.swift +++ b/SpeechDictation/Services/AudioSessionManager.swift @@ -16,14 +16,17 @@ final class AudioSessionManager: ObservableObject { static let shared = AudioSessionManager() private let sessionQueue = DispatchQueue(label: "AudioSessionManager.queue", qos: .userInitiated) + private let sessionQueueKey = DispatchSpecificKey() private var isConfiguring = false private var currentConfiguration: AudioConfiguration = .none - private init() {} + private init() { + sessionQueue.setSpecific(key: sessionQueueKey, value: ()) + } // MARK: - Audio Configuration Types - enum AudioConfiguration { + enum AudioConfiguration: Equatable { // Added Equatable for comparison case none case speechRecognition case recording @@ -38,12 +41,24 @@ final class AudioSessionManager: ObservableObject { func configureForSpeechRecognition() async -> Bool { return await configureSession(for: .speechRecognition) } + + /// Synchronous variant for speech recognition setup when async/await is not available (e.g., initializers) + /// - Returns: True if the configuration succeeded before returning + func configureForSpeechRecognitionSync() -> Bool { + return configureSessionSync(for: .speechRecognition) + } /// Configures audio session for recording with priority handling /// - Returns: True if configuration was successful func configureForRecording() async -> Bool { return await configureSession(for: .recording) } + + /// Synchronous variant for recording setup when async/await is not available (e.g., singletons inits) + /// - Returns: True if the configuration succeeded before returning + func configureForRecordingSync() -> Bool { + return configureSessionSync(for: .recording) + } /// Configures audio session for level monitoring with priority handling /// - Returns: True if configuration was successful @@ -51,98 +66,110 @@ final class AudioSessionManager: ObservableObject { return await configureSession(for: .levelMonitoring) } + /// Synchronous variant for level monitoring setup in contexts where async cannot be used + /// - Returns: True if configuration succeeded + func configureForLevelMonitoringSync() -> Bool { + return configureSessionSync(for: .levelMonitoring) + } + /// Resets audio session to default state - func resetSession() async { - await sessionQueue.async { - #if os(iOS) - do { - let session = AVAudioSession.sharedInstance() - try session.setActive(false, options: .notifyOthersOnDeactivation) - self.currentConfiguration = .none - print("Audio session reset") - } catch { - print("Error resetting audio session: \(error)") + func resetAudioSession() async { + await withCheckedContinuation { continuation in + sessionQueue.async { + #if os(iOS) + do { + let session = AVAudioSession.sharedInstance() + if session.category != .ambient { // Only deactivate if not already ambient + try session.setActive(false, options: .notifyOthersOnDeactivation) + } + self.currentConfiguration = .none + print("Audio session reset to default state") + } catch { + print("Error resetting audio session: \(error)") + } + #endif + continuation.resume() } - #else - print("Audio session reset (macOS - no-op)") - #endif } } - // MARK: - Private Configuration Logic - - /// Centralized audio session configuration with conflict resolution - /// - Parameter configuration: The desired audio configuration - /// - Returns: True if configuration was successful + /// Internal method to handle actual audio session configuration on a dedicated queue + /// Ensures only one configuration attempt is active at a time private func configureSession(for configuration: AudioConfiguration) async -> Bool { - return await sessionQueue.async { - #if os(iOS) - // Prevent concurrent configuration attempts - guard !self.isConfiguring else { - print("Audio session configuration already in progress, skipping") - return false + return await withCheckedContinuation { continuation in + sessionQueue.async { + continuation.resume(returning: self.performConfiguration(for: configuration)) } + } + } + + private func configureSessionSync(for configuration: AudioConfiguration) -> Bool { + if DispatchQueue.getSpecific(key: sessionQueueKey) != nil { + return performConfiguration(for: configuration) + } else { + return sessionQueue.sync { + performConfiguration(for: configuration) + } + } + } + + private func performConfiguration(for configuration: AudioConfiguration) -> Bool { + #if os(iOS) + // Prevent concurrent configuration attempts + guard !isConfiguring else { + print("Audio session configuration already in progress, skipping") + return false + } + + isConfiguring = true + defer { isConfiguring = false } + + do { + let session = AVAudioSession.sharedInstance() - self.isConfiguring = true - defer { self.isConfiguring = false } - - do { - let session = AVAudioSession.sharedInstance() - - // Only reconfigure if the configuration has changed - guard self.currentConfiguration != configuration else { - print("Audio session already configured for \(configuration)") - return true - } - - // Deactivate current session if needed - if session.category != .playAndRecord { - try session.setActive(false, options: .notifyOthersOnDeactivation) - } - - // Configure based on the requested configuration - switch configuration { - case .speechRecognition: - try self.configureForSpeechRecognition(session) - case .recording: - try self.configureForRecording(session) - case .levelMonitoring: - try self.configureForLevelMonitoring(session) - case .playback: - try self.configureForPlayback(session) - case .none: - break - } - - // Activate the session - try session.setActive(true, options: .notifyOthersOnDeactivation) - - self.currentConfiguration = configuration - print("Audio session configured for \(configuration)") + // Only reconfigure if the configuration has changed + guard currentConfiguration != configuration else { + print("Audio session already configured for \(configuration)") return true - - } catch { - print("Audio session configuration failed for \(configuration): \(error)") - - // Try fallback configuration - do { - let session = AVAudioSession.sharedInstance() - try session.setCategory(.playAndRecord, mode: .default, options: []) - try session.setActive(true, options: .notifyOthersOnDeactivation) - self.currentConfiguration = configuration - print("Audio session configured with fallback settings") - return true - } catch { - print("Audio session fallback configuration also failed: \(error)") - return false - } } - #else - // macOS fallback - print("Audio session configuration not available on macOS") + + // Deactivate current session if needed, unless it's already playAndRecord + if session.category != .playAndRecord { + try session.setActive(false, options: .notifyOthersOnDeactivation) + print("Deactivated current audio session for new configuration.") + } else { + print("Current audio session is already playAndRecord, skipping deactivation.") + } + + // Configure based on the requested configuration + switch configuration { + case .speechRecognition: + try configureForSpeechRecognition(session) + case .recording: + try configureForRecording(session) + case .levelMonitoring: + try configureForLevelMonitoring(session) + case .playback: + try configureForPlayback(session) + case .none: + break // No specific configuration for .none + } + + // Activate the session + try session.setActive(true, options: .notifyOthersOnDeactivation) + + currentConfiguration = configuration + print("Audio session configured for \(configuration)") return true - #endif + } catch { + print("Error configuring audio session for \(configuration): \(error)") + currentConfiguration = .none // Reset on error + return false } + #else + print("Audio session configuration skipped – not available on this platform.") + return true + #endif } #if os(iOS) @@ -159,6 +186,7 @@ final class AudioSessionManager: ObservableObject { print("Audio session configured for speech recognition with measurement mode") } catch { print("Measurement mode failed, trying default mode: \(error)") + // Fallback to default mode if measurement fails try session.setCategory(.playAndRecord, mode: .default, options: options) print("Audio session configured for speech recognition with default mode") } diff --git a/SpeechDictation/Services/CacheManager.swift b/SpeechDictation/Services/CacheManager.swift index c157157..6fee5d2 100644 --- a/SpeechDictation/Services/CacheManager.swift +++ b/SpeechDictation/Services/CacheManager.swift @@ -4,17 +4,45 @@ // // Created by Joseph McCraw on 6/28/24. // +// Enhanced cache manager with secure storage capabilities for private recordings. +// Provides both standard caching and secure storage with complete file protection. +// import Foundation +/// Enhanced cache manager providing both standard caching and secure storage capabilities +/// Supports secure storage with complete file protection for sensitive private recordings +/// Uses iOS file protection levels to ensure data security at rest class CacheManager { static let shared = CacheManager() private init() {} + // MARK: - Storage Directories + + /// Standard cache directory for temporary files and downloads private var cacheDirectory: URL { return FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0] } + + /// Secure documents directory for protected private recordings + private var secureDocumentsDirectory: URL { + return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] + } + + /// Dedicated directory for secure private recordings with complete file protection + private var secureRecordingsDirectory: URL { + let recordingsDir = secureDocumentsDirectory.appendingPathComponent("SecureRecordings") + ensureDirectoryExists(at: recordingsDir, withProtection: .complete) + return recordingsDir + } + // MARK: - Standard Cache Operations (Existing API) + + /// Saves data to standard cache directory + /// - Parameters: + /// - data: Data to save + /// - key: Cache key identifier + /// - Returns: URL of saved file, or nil if failed func save(data: Data, forKey key: String) -> URL? { let fileURL = cacheDirectory.appendingPathComponent(key) do { @@ -27,6 +55,9 @@ class CacheManager { } } + /// Retrieves data from standard cache directory + /// - Parameter key: Cache key identifier + /// - Returns: Retrieved data, or nil if not found func retrieveData(forKey key: String) -> Data? { let fileURL = cacheDirectory.appendingPathComponent(key) do { @@ -39,6 +70,8 @@ class CacheManager { } } + /// Deletes data from standard cache directory + /// - Parameter key: Cache key identifier func deleteData(forKey key: String) { let fileURL = cacheDirectory.appendingPathComponent(key) do { @@ -48,4 +81,182 @@ class CacheManager { print("Error deleting file: \(error)") } } + + // MARK: - Secure Storage Operations + + /// Saves data securely with complete file protection + /// - Parameters: + /// - data: Data to save securely + /// - key: Unique identifier for the secure file + /// - subdirectory: Optional subdirectory within secure recordings + /// - Returns: URL of securely saved file, or nil if failed + func saveSecurely(data: Data, forKey key: String, subdirectory: String? = nil) -> URL? { + var targetDirectory = secureRecordingsDirectory + + if let subdirectory = subdirectory { + targetDirectory = targetDirectory.appendingPathComponent(subdirectory) + ensureDirectoryExists(at: targetDirectory, withProtection: .complete) + } + + let fileURL = targetDirectory.appendingPathComponent(key) + + do { + // Write data to file + try data.write(to: fileURL) + + // Apply complete file protection + try FileManager.default.setAttributes( + [.protectionKey: FileProtectionType.complete], + ofItemAtPath: fileURL.path + ) + + print("Securely saved file to: \(fileURL) with complete file protection") + return fileURL + } catch { + print("Error saving secure file: \(error)") + return nil + } + } + + /// Retrieves data from secure storage + /// - Parameters: + /// - key: Unique identifier for the secure file + /// - subdirectory: Optional subdirectory within secure recordings + /// - Returns: Retrieved data, or nil if not found or inaccessible + func retrieveSecureData(forKey key: String, subdirectory: String? = nil) -> Data? { + var targetDirectory = secureRecordingsDirectory + + if let subdirectory = subdirectory { + targetDirectory = targetDirectory.appendingPathComponent(subdirectory) + } + + let fileURL = targetDirectory.appendingPathComponent(key) + + do { + let data = try Data(contentsOf: fileURL) + print("Retrieved secure file from: \(fileURL)") + return data + } catch { + print("Error retrieving secure file: \(error)") + return nil + } + } + + /// Deletes data from secure storage + /// - Parameters: + /// - key: Unique identifier for the secure file + /// - subdirectory: Optional subdirectory within secure recordings + /// - Returns: True if deletion was successful + @discardableResult + func deleteSecureData(forKey key: String, subdirectory: String? = nil) -> Bool { + var targetDirectory = secureRecordingsDirectory + + if let subdirectory = subdirectory { + targetDirectory = targetDirectory.appendingPathComponent(subdirectory) + } + + let fileURL = targetDirectory.appendingPathComponent(key) + + do { + try FileManager.default.removeItem(at: fileURL) + print("Deleted secure file at: \(fileURL)") + return true + } catch { + print("Error deleting secure file: \(error)") + return false + } + } + + /// Lists all files in secure storage + /// - Parameter subdirectory: Optional subdirectory to list + /// - Returns: Array of file URLs in secure storage + func listSecureFiles(inSubdirectory subdirectory: String? = nil) -> [URL] { + var targetDirectory = secureRecordingsDirectory + + if let subdirectory = subdirectory { + targetDirectory = targetDirectory.appendingPathComponent(subdirectory) + } + + do { + let fileURLs = try FileManager.default.contentsOfDirectory( + at: targetDirectory, + includingPropertiesForKeys: [.creationDateKey, .fileSizeKey], + options: .skipsHiddenFiles + ) + return fileURLs.sorted { $0.lastPathComponent > $1.lastPathComponent } + } catch { + print("Error listing secure files: \(error)") + return [] + } + } + + // MARK: - Directory Management + + /// Ensures a directory exists with specified file protection + /// - Parameters: + /// - url: Directory URL to create + /// - protection: File protection level to apply + private func ensureDirectoryExists(at url: URL, withProtection protection: FileProtectionType) { + let fileManager = FileManager.default + + if !fileManager.fileExists(atPath: url.path) { + do { + try fileManager.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil) + try fileManager.setAttributes( + [.protectionKey: protection], + ofItemAtPath: url.path + ) + print("Created secure directory: \(url.path)") + } catch { + print("Error creating secure directory: \(error)") + } + } + } + + // MARK: - Utility Methods + + /// Gets a secure file URL for a given filename and optional session + /// - Parameters: + /// - fileName: Name of the file + /// - sessionId: Optional session identifier for grouping + /// - Returns: URL in secure storage directory + func getSecureFileURL(fileName: String, sessionId: String? = nil) -> URL { + var targetDirectory = secureRecordingsDirectory + + if let sessionId = sessionId { + targetDirectory = targetDirectory.appendingPathComponent(sessionId) + ensureDirectoryExists(at: targetDirectory, withProtection: .complete) + } + + return targetDirectory.appendingPathComponent(fileName) + } + + /// Gets available storage space for security validation + /// - Returns: Available bytes, or nil if unable to determine + func getAvailableStorageSpace() -> Int64? { + do { + let attributes = try FileManager.default.attributesOfFileSystem(forPath: secureDocumentsDirectory.path) + return attributes[.systemFreeSize] as? Int64 + } catch { + print("Error getting storage space: \(error)") + return nil + } + } + + /// Validates file protection level + /// - Parameter url: File URL to check + /// - Returns: True if file has complete protection + /// - Throws: Error if validation fails + func validateFileProtection(at url: URL) throws { + let attributes = try FileManager.default.attributesOfItem(atPath: url.path) + let protection = attributes[.protectionKey] as? FileProtectionType + + guard protection == .complete else { + throw NSError( + domain: "CacheManagerError", + code: 1001, + userInfo: [NSLocalizedDescriptionKey: "File does not have complete protection: \(url.lastPathComponent)"] + ) + } + } } diff --git a/SpeechDictation/Services/LocalAuthenticationManager.swift b/SpeechDictation/Services/LocalAuthenticationManager.swift new file mode 100644 index 0000000..654e92d --- /dev/null +++ b/SpeechDictation/Services/LocalAuthenticationManager.swift @@ -0,0 +1,383 @@ +// +// LocalAuthenticationManager.swift +// SpeechDictation +// +// Created by AI Assistant on 1/27/25. +// +// Local authentication manager for securing access to private recordings. +// Provides Face ID/Touch ID authentication with proper fallback to device passcode. +// Handles authentication states and provides clear user feedback. +// + +import Foundation +import LocalAuthentication + +/// Authentication states for biometric access +enum AuthenticationState { + case notEvaluated + case authenticated + case denied + case biometricUnavailable + case biometricNotEnrolled + case devicePasscodeNotSet + case error(String) +} + +/// Biometric authentication types available on the device +enum BiometricType { + case none + case touchID + case faceID + case opticID + + var description: String { + switch self { + case .none: return "None" + case .touchID: return "Touch ID" + case .faceID: return "Face ID" + case .opticID: return "Optic ID" + } + } +} + +/// Service for managing biometric authentication and device security +/// Provides secure access control for private recordings and sensitive features +/// Uses LocalAuthentication framework with proper error handling and fallbacks +@MainActor +final class LocalAuthenticationManager: ObservableObject { + static let shared = LocalAuthenticationManager() + + // MARK: - Published Properties + + @Published private(set) var authenticationState: AuthenticationState = .notEvaluated + @Published private(set) var isAuthenticationRequired = false + @Published private(set) var biometricType: BiometricType = .none + @Published private(set) var isAuthenticating = false + + // MARK: - Private Properties + + private let context = LAContext() + private let userDefaults = UserDefaults.standard + + // UserDefaults keys + private let authenticationRequiredKey = "secureRecordingsAuthenticationRequired" + private let lastAuthenticationTimeKey = "lastAuthenticationTime" + + // MARK: - Initialization + + private init() { + loadSettings() + updateBiometricType() + } + + // MARK: - Public Interface + + /// Checks if biometric authentication is available on the device + /// - Returns: True if biometrics are available and enrolled + func isBiometricAuthenticationAvailable() -> Bool { + var error: NSError? + let result = context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) + + if let error = error { + print("Biometric authentication availability check failed: \(error.localizedDescription)") + return false + } + + return result + } + + /// Enables or disables authentication requirement for secure recordings + /// - Parameter enabled: Whether authentication should be required + func setAuthenticationRequired(_ enabled: Bool) { + isAuthenticationRequired = enabled + userDefaults.set(enabled, forKey: authenticationRequiredKey) + + if !enabled { + authenticationState = .notEvaluated + } + + print("Authentication requirement set to: \(enabled)") + } + + /// Authenticates the user using biometrics or device passcode + /// - Parameter reason: Human-readable reason for authentication request + /// - Returns: True if authentication was successful + func authenticate(reason: String = "Access secure recordings") async -> Bool { + guard isAuthenticationRequired else { + authenticationState = .authenticated + return true + } + + // Check if recently authenticated (within last 5 minutes) + if isRecentlyAuthenticated() { + authenticationState = .authenticated + return true + } + + isAuthenticating = true + authenticationState = .notEvaluated + + let context = LAContext() + context.localizedFallbackTitle = "Use Passcode" + context.localizedCancelTitle = "Cancel" + + var error: NSError? + + // Check if authentication is available + guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { + if let error = error { + await handleAuthenticationError(error) + } else { + authenticationState = .biometricUnavailable + } + isAuthenticating = false + return false + } + + do { + let success = try await context.evaluatePolicy( + .deviceOwnerAuthenticationWithBiometrics, + localizedReason: reason + ) + + if success { + authenticationState = .authenticated + recordSuccessfulAuthentication() + print("Biometric authentication successful") + } else { + authenticationState = .denied + print("Biometric authentication denied") + } + + isAuthenticating = false + return success + + } catch { + await handleAuthenticationError(error) + isAuthenticating = false + return false + } + } + + /// Authenticates using device passcode as fallback + /// - Parameter reason: Human-readable reason for authentication request + /// - Returns: True if authentication was successful + func authenticateWithPasscode(reason: String = "Access secure recordings") async -> Bool { + guard isAuthenticationRequired else { + authenticationState = .authenticated + return true + } + + isAuthenticating = true + authenticationState = .notEvaluated + + let context = LAContext() + context.localizedFallbackTitle = "Cancel" + + var error: NSError? + + // Check if device passcode is available + guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) else { + if let error = error { + await handleAuthenticationError(error) + } else { + authenticationState = .devicePasscodeNotSet + } + isAuthenticating = false + return false + } + + do { + let success = try await context.evaluatePolicy( + .deviceOwnerAuthentication, + localizedReason: reason + ) + + if success { + authenticationState = .authenticated + recordSuccessfulAuthentication() + print("Passcode authentication successful") + } else { + authenticationState = .denied + print("Passcode authentication denied") + } + + isAuthenticating = false + return success + + } catch { + await handleAuthenticationError(error) + isAuthenticating = false + return false + } + } + + /// Resets authentication state (requires re-authentication) + func resetAuthenticationState() { + authenticationState = .notEvaluated + userDefaults.removeObject(forKey: lastAuthenticationTimeKey) + print("Authentication state reset") + } + + /// Forces a fresh biometric capability check. + /// Call when application state changes (e.g., foreground) to ensure cached data is current. + func refreshBiometricCapabilities() { + updateBiometricType() + } + + /// Gets the cached biometric type determined during initialization or the most recent refresh. + /// - Returns: The current `BiometricType` without mutating internal state. + func getCurrentBiometricType() -> BiometricType { + return biometricType + } + + /// Checks if the device has any form of authentication set up + /// - Returns: True if device has passcode or biometrics configured + func isDeviceSecure() -> Bool { + let context = LAContext() + var error: NSError? + return context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) + } + + // MARK: - Private Methods + + private func loadSettings() { + isAuthenticationRequired = userDefaults.bool(forKey: authenticationRequiredKey) + } + + private func updateBiometricType() { + let context = LAContext() + var error: NSError? + + guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { + biometricType = .none + return + } + + switch context.biometryType { + case .none: + biometricType = .none + case .touchID: + biometricType = .touchID + case .faceID: + biometricType = .faceID + case .opticID: + if #available(iOS 17.0, *) { + biometricType = .opticID + } else { + biometricType = .none + } + @unknown default: + biometricType = .none + } + } + + private func isRecentlyAuthenticated() -> Bool { + guard let lastAuthTime = userDefaults.object(forKey: lastAuthenticationTimeKey) as? Date else { + return false + } + + let timeInterval = Date().timeIntervalSince(lastAuthTime) + let fiveMinutes: TimeInterval = 5 * 60 + + return timeInterval < fiveMinutes + } + + private func recordSuccessfulAuthentication() { + userDefaults.set(Date(), forKey: lastAuthenticationTimeKey) + } + + private func handleAuthenticationError(_ error: Error) async { + if let laError = error as? LAError { + switch laError.code { + case .biometryNotAvailable: + authenticationState = .biometricUnavailable + print("Biometric authentication not available") + + case .biometryNotEnrolled: + authenticationState = .biometricNotEnrolled + print("Biometric authentication not enrolled") + + case .passcodeNotSet: + authenticationState = .devicePasscodeNotSet + print("Device passcode not set") + + case .userCancel: + authenticationState = .denied + print("User cancelled authentication") + + case .userFallback: + // User chose to use passcode instead of biometrics + let success = await authenticateWithPasscode() + if !success { + authenticationState = .denied + } + + case .systemCancel: + authenticationState = .denied + print("System cancelled authentication") + + case .authenticationFailed: + authenticationState = .denied + print("Authentication failed") + + default: + authenticationState = .error(laError.localizedDescription) + print("Authentication error: \(laError.localizedDescription)") + } + } else { + authenticationState = .error(error.localizedDescription) + print("Authentication error: \(error.localizedDescription)") + } + } +} + +// MARK: - Extensions + +extension AuthenticationState: Equatable { + static func == (lhs: AuthenticationState, rhs: AuthenticationState) -> Bool { + switch (lhs, rhs) { + case (.notEvaluated, .notEvaluated), + (.authenticated, .authenticated), + (.denied, .denied), + (.biometricUnavailable, .biometricUnavailable), + (.biometricNotEnrolled, .biometricNotEnrolled), + (.devicePasscodeNotSet, .devicePasscodeNotSet): + return true + case (.error(let lhsMessage), .error(let rhsMessage)): + return lhsMessage == rhsMessage + default: + return false + } + } +} + +extension AuthenticationState { + /// User-friendly description of the authentication state + var description: String { + switch self { + case .notEvaluated: + return "Authentication not evaluated" + case .authenticated: + return "Authenticated" + case .denied: + return "Authentication denied" + case .biometricUnavailable: + return "Biometric authentication unavailable" + case .biometricNotEnrolled: + return "Biometric authentication not set up" + case .devicePasscodeNotSet: + return "Device passcode not set" + case .error(let message): + return "Error: \(message)" + } + } + + /// Whether the current state represents successful authentication + var isAuthenticated: Bool { + if case .authenticated = self { + return true + } + return false + } +} \ No newline at end of file diff --git a/SpeechDictation/Services/SecureRecordingManager.swift b/SpeechDictation/Services/SecureRecordingManager.swift new file mode 100644 index 0000000..7a9b0d4 --- /dev/null +++ b/SpeechDictation/Services/SecureRecordingManager.swift @@ -0,0 +1,354 @@ +// +// SecureRecordingManager.swift +// SpeechDictation +// +// Created by AI Assistant on 1/27/25. +// +// Secure recording manager for private conversations and meetings. +// Provides complete file protection, on-device transcription, and secure storage. +// Coordinates AudioRecordingManager, SpeechRecognizer, and TimingDataManager for secure workflows. +// + +import Foundation +import AVFoundation +import Combine + +/// Metadata for a secure recording session +struct SecureRecordingSession: Codable, Identifiable { + let id: String + let title: String + let startTime: Date + let endTime: Date? + let duration: TimeInterval + let audioFileName: String + let transcriptFileName: String + let isCompleted: Bool + let hasConsent: Bool + + /// Human-readable description of the session + var displayTitle: String { + return title.isEmpty ? "Recording \(startTime.formatted(.dateTime.hour().minute()))" : title + } + + /// Size of audio file in bytes + var audioFileSize: Int64 { + let url = CacheManager.shared.getSecureFileURL(fileName: audioFileName, sessionId: id) + do { + let attributes = try FileManager.default.attributesOfItem(atPath: url.path) + return attributes[FileAttributeKey.size] as? Int64 ?? 0 + } catch { + return 0 + } + } +} + +/// Service for managing secure private recordings with complete file protection +/// Integrates audio recording, on-device transcription, and secure storage +/// Uses proper concurrency patterns and provides authentication controls +@MainActor +final class SecureRecordingManager: ObservableObject { + static let shared = SecureRecordingManager() + + // MARK: - Published Properties + + @Published private(set) var isRecording = false + @Published private(set) var currentSession: SecureRecordingSession? + @Published private(set) var allSessions: [SecureRecordingSession] = [] + @Published private(set) var recordingDuration: TimeInterval = 0 + @Published private(set) var hasValidConsent = false + + // MARK: - Private Properties + + private let audioRecordingManager = AudioRecordingManager.shared + private let speechRecognizer = SpeechRecognizer() + private let cacheManager = CacheManager.shared + private let timingDataManager = TimingDataManager.shared + + private var recordingTimer: Timer? + private var cancellables = Set() + private var currentAudioURL: URL? + + // MARK: - Initialization + + private init() { + setupBindings() + loadExistingSessions() + } + + // MARK: - Public Interface + + /// Starts a new secure recording session with user consent + /// - Parameters: + /// - title: Optional title for the recording + /// - hasConsent: Whether user has provided explicit consent + /// - Returns: Session ID if started successfully, nil otherwise + func startSecureRecording(title: String = "", hasConsent: Bool = true) async -> String? { + guard !isRecording else { + print("Secure recording already in progress") + return nil + } + + guard hasConsent else { + print("Cannot start secure recording without user consent") + return nil + } + + // Validate storage space + guard validateStorageSpace() else { + print("Insufficient storage space for secure recording") + return nil + } + + let sessionId = UUID().uuidString + let startTime = Date() + + // Create session metadata + currentSession = SecureRecordingSession( + id: sessionId, + title: title, + startTime: startTime, + endTime: nil, + duration: 0, + audioFileName: "audio_\(sessionId).m4a", + transcriptFileName: "transcript_\(sessionId).json", + isCompleted: false, + hasConsent: hasConsent + ) + + // Start secure audio recording + currentAudioURL = audioRecordingManager.startSecureRecording( + quality: AudioQualitySettings.standardQuality, + sessionId: sessionId + ) + + guard currentAudioURL != nil else { + print("Failed to start secure audio recording") + currentSession = nil + return nil + } + + // Start on-device transcription with timing + speechRecognizer.startTranscribingWithTiming(sessionId: sessionId) + + // Update state + isRecording = true + hasValidConsent = hasConsent + recordingDuration = 0 + + // Start duration timer + startRecordingTimer() + + print("Started secure recording session: \(sessionId)") + return sessionId + } + + /// Stops the current secure recording session + /// - Returns: The completed session metadata, or nil if no active session + func stopSecureRecording() async -> SecureRecordingSession? { + guard isRecording, var session = currentSession else { + print("No active secure recording to stop") + return nil + } + + // Stop recording timer + stopRecordingTimer() + + // Stop audio recording + let finalAudioURL = audioRecordingManager.stopRecording() + + // Stop transcription + speechRecognizer.stopTranscribing() + + // Save transcript data securely + await saveTranscriptSecurely(sessionId: session.id) + + // Update session metadata + session = SecureRecordingSession( + id: session.id, + title: session.title, + startTime: session.startTime, + endTime: Date(), + duration: recordingDuration, + audioFileName: session.audioFileName, + transcriptFileName: session.transcriptFileName, + isCompleted: true, + hasConsent: session.hasConsent + ) + + // Save session metadata securely + await saveSessionMetadata(session) + + // Update state + isRecording = false + currentSession = nil + currentAudioURL = nil + recordingDuration = 0 + + // Reload sessions list + loadExistingSessions() + + print("Completed secure recording session: \(session.id)") + return session + } + + /// Gets all secure recording sessions + /// - Returns: Array of all recorded sessions + func getAllSessions() -> [SecureRecordingSession] { + return allSessions.sorted { $0.startTime > $1.startTime } + } + + /// Deletes a secure recording session and all associated files + /// - Parameter sessionId: ID of the session to delete + /// - Returns: True if deletion was successful + func deleteSession(_ sessionId: String) async -> Bool { + guard let session = allSessions.first(where: { $0.id == sessionId }) else { + print("Session not found: \(sessionId)") + return false + } + + // Delete audio file + let audioDeleted = cacheManager.deleteSecureData( + forKey: session.audioFileName, + subdirectory: sessionId + ) + + // Delete transcript file + let transcriptDeleted = cacheManager.deleteSecureData( + forKey: session.transcriptFileName, + subdirectory: sessionId + ) + + // Delete session metadata + let metadataDeleted = cacheManager.deleteSecureData( + forKey: "metadata.json", + subdirectory: sessionId + ) + + // Delete session directory + let sessionDirectoryURL = cacheManager.getSecureFileURL(fileName: "", sessionId: sessionId) + do { + try FileManager.default.removeItem(at: sessionDirectoryURL) + } catch { + print("Error deleting session directory: \(error)") + } + + // Update sessions list + allSessions.removeAll { $0.id == sessionId } + + let success = audioDeleted && transcriptDeleted && metadataDeleted + print("Deleted secure recording session: \(sessionId) - success: \(success)") + return success + } + + // MARK: - Private Methods + + private func setupBindings() { + audioRecordingManager.$recordingDuration + .receive(on: DispatchQueue.main) + .assign(to: &$recordingDuration) + } + + private func startRecordingTimer() { + recordingTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] _ in + Task { @MainActor in + self?.updateRecordingDuration() + } + } + } + + private func stopRecordingTimer() { + recordingTimer?.invalidate() + recordingTimer = nil + } + + private func updateRecordingDuration() { + guard let session = currentSession else { return } + recordingDuration = Date().timeIntervalSince(session.startTime) + } + + private func validateStorageSpace() -> Bool { + guard let availableSpace = cacheManager.getAvailableStorageSpace() else { + return false + } + + // Require at least 100MB free space for secure recordings + let minimumSpace: Int64 = 100 * 1024 * 1024 + return availableSpace > minimumSpace + } + + private func saveTranscriptSecurely(sessionId: String) async { + let transcript = speechRecognizer.transcribedText + let currentSession = timingDataManager.currentSession + + let transcriptData = [ + "transcript": transcript, + "timingData": currentSession?.segments ?? [], + "savedAt": Date().ISO8601String + ] as [String: Any] + + do { + let jsonData = try JSONSerialization.data(withJSONObject: transcriptData, options: .prettyPrinted) + let fileName = "transcript_\(sessionId).json" + + let savedURL = cacheManager.saveSecurely( + data: jsonData, + forKey: fileName, + subdirectory: sessionId + ) + + if savedURL != nil { + print("Saved secure transcript for session: \(sessionId)") + } else { + print("Failed to save secure transcript for session: \(sessionId)") + } + } catch { + print("Error serializing transcript data: \(error)") + } + } + + private func saveSessionMetadata(_ session: SecureRecordingSession) async { + do { + let jsonData = try JSONEncoder().encode(session) + + let savedURL = cacheManager.saveSecurely( + data: jsonData, + forKey: "metadata.json", + subdirectory: session.id + ) + + if savedURL != nil { + print("Saved secure metadata for session: \(session.id)") + } else { + print("Failed to save secure metadata for session: \(session.id)") + } + } catch { + print("Error encoding session metadata: \(error)") + } + } + + private func loadExistingSessions() { + let sessionFiles = cacheManager.listSecureFiles() + var sessions: [SecureRecordingSession] = [] + + for sessionFile in sessionFiles { + let sessionId = sessionFile.lastPathComponent + let metadataURL = cacheManager.getSecureFileURL(fileName: "metadata.json", sessionId: sessionId) + + if let metadataData = cacheManager.retrieveSecureData(forKey: "metadata.json", subdirectory: sessionId), + let session = try? JSONDecoder().decode(SecureRecordingSession.self, from: metadataData) { + sessions.append(session) + } + } + + allSessions = sessions.sorted { $0.startTime > $1.startTime } + print("Loaded \(allSessions.count) secure recording sessions") + } +} + +// MARK: - Extensions + +extension Date { + var ISO8601String: String { + return ISO8601DateFormatter().string(from: self) + } +} \ No newline at end of file diff --git a/SpeechDictation/Speech/SpeechRecognizer+Timing.swift b/SpeechDictation/Speech/SpeechRecognizer+Timing.swift index 8ff28d6..2db157c 100644 --- a/SpeechDictation/Speech/SpeechRecognizer+Timing.swift +++ b/SpeechDictation/Speech/SpeechRecognizer+Timing.swift @@ -46,6 +46,9 @@ extension SpeechRecognizer { } request.shouldReportPartialResults = true + // SECURITY: Enforce on-device recognition for privacy and security + // This ensures all speech processing happens locally on the device + request.requiresOnDeviceRecognition = true // Store session start time for timing calculations let sessionStartTime = Date() diff --git a/SpeechDictation/Speech/SpeechRecognizer+config.swift b/SpeechDictation/Speech/SpeechRecognizer+config.swift index 745ba3b..077771d 100644 --- a/SpeechDictation/Speech/SpeechRecognizer+config.swift +++ b/SpeechDictation/Speech/SpeechRecognizer+config.swift @@ -12,45 +12,14 @@ extension SpeechRecognizer { /// Configures the audio session for speech recognition with iPad-specific optimizations /// Coordinates with other audio components to prevent session conflicts func configureAudioSession() { - let audioSession = AVAudioSession.sharedInstance() - do { - // Check if session is already active before trying to deactivate - if audioSession.isOtherAudioPlaying { - print("Other audio is playing, will configure without deactivation") - } else { - // Only deactivate if not already inactive - if audioSession.category != .playAndRecord { - try audioSession.setActive(false, options: .notifyOthersOnDeactivation) - } - } - - #if targetEnvironment(simulator) - // Use simpler configuration for simulator - try audioSession.setCategory(.playAndRecord, mode: .default, options: []) - #else - // Device-specific configuration with iPad optimizations - let options: AVAudioSession.CategoryOptions = [.allowBluetooth, .defaultToSpeaker] - - // Try measurement mode first for better speech recognition - do { - try audioSession.setCategory(.playAndRecord, mode: .measurement, options: options) - print("Audio session configured for speech recognition with measurement mode") - } catch { - print("Measurement mode failed, trying default mode: \(error)") - // Fallback to default mode if measurement fails - try audioSession.setCategory(.playAndRecord, mode: .default, options: options) - print("Audio session configured for speech recognition with default mode") - } - #endif - - // Activate session with proper options - try audioSession.setActive(true, options: .notifyOthersOnDeactivation) - print("Audio session configured for speech recognition") - - } catch { - print("Error setting up audio session for speech recognition: \(error)") + // Concurrency: SpeechRecognizer.init is synchronous, so we must block until the session + // finishes configuring to avoid race conditions before transcription starts. + let success = AudioSessionManager.shared.configureForSpeechRecognitionSync() + guard success else { + print("Warning: Failed to configure audio session for speech recognition") // Final fallback with minimal configuration do { + let audioSession = AVAudioSession.sharedInstance() // Don't try to deactivate again if it failed before try audioSession.setCategory(.playAndRecord, mode: .default, options: []) try audioSession.setActive(true, options: .notifyOthersOnDeactivation) @@ -58,6 +27,7 @@ extension SpeechRecognizer { } catch { print("Critical error: Unable to configure audio session for speech recognition: \(error)") } + return } } diff --git a/SpeechDictation/Speech/SpeechRecognizer.swift b/SpeechDictation/Speech/SpeechRecognizer.swift index 0e39e98..548d2fe 100644 --- a/SpeechDictation/Speech/SpeechRecognizer.swift +++ b/SpeechDictation/Speech/SpeechRecognizer.swift @@ -55,6 +55,9 @@ class SpeechRecognizer: ObservableObject { } request.shouldReportPartialResults = true + // SECURITY: Enforce on-device recognition for privacy and security + // This ensures all speech processing happens locally on the device + request.requiresOnDeviceRecognition = true recognitionTask = speechRecognizer?.recognitionTask(with: request) { result, error in if let result = result { diff --git a/SpeechDictation/UI/ContentView.swift b/SpeechDictation/UI/ContentView.swift index 9443a07..ca0e113 100644 --- a/SpeechDictation/UI/ContentView.swift +++ b/SpeechDictation/UI/ContentView.swift @@ -4,7 +4,8 @@ // // Created by Joseph McCraw on 6/25/24. // -// Main content view with proper dark/light mode support. +// Main content view with proper dark/light mode support and secure recordings integration. +// Provides both standard transcription and secure private recording workflows. // import SwiftUI @@ -12,6 +13,7 @@ import SwiftUI struct ContentView: View { @ObservedObject var viewModel = SpeechRecognizerViewModel() @State private var showingCustomShare = false + @State private var showingSecureRecordings = false @State private var isUserScrolling = false @State private var showJumpToLiveButton = false @State private var lastTranscriptLength = 0 @@ -27,7 +29,7 @@ struct ContentView: View { VStack { Text(viewModel.transcribedText) .font(.system(size: viewModel.fontSize)) - .foregroundColor(.primary) + .foregroundColor(transcriptTextColor) .padding() .frame(maxWidth: .infinity, alignment: .leading) .id("transcriptText") @@ -116,6 +118,21 @@ struct ContentView: View { Spacer() + // Secure Recordings button + Button(action: { + showingSecureRecordings = true + }) { + Image(systemName: "lock.shield") + .font(.title2) + .padding() + .background(secureRecordingsButtonBackgroundColor) + .foregroundColor(secureRecordingsButtonForegroundColor) + .clipShape(Circle()) + .shadow(color: shadowColor, radius: 2, x: 0, y: 0) + } + .accessibilityLabel("Secure Recordings") + .accessibilityHint("Access private recordings with authentication") + Button(action: { showingCustomShare = true }) { @@ -160,12 +177,8 @@ struct ContentView: View { } } .onAppear { - applyTheme() lastTranscriptLength = viewModel.transcribedText.count } - .onChange(of: viewModel.theme) { _ in - applyTheme() - } .sheet(isPresented: $showingCustomShare) { NativeStyleShareView( text: viewModel.transcribedText, @@ -173,6 +186,9 @@ struct ContentView: View { isPresented: $showingCustomShare ) } + .sheet(isPresented: $showingSecureRecordings) { + SecureRecordingsView(isPresented: $showingSecureRecordings) + } } // MARK: - Color Helpers @@ -188,6 +204,16 @@ struct ContentView: View { } } + /// Color used for transcript text to ensure readability regardless of system-wide color scheme. + private var transcriptTextColor: Color { + switch viewModel.theme { + case .light, .highContrast: + return Color.black + case .dark: + return Color.white + } + } + private var primaryActionButtonColor: Color { Color.accentColor } @@ -200,6 +226,16 @@ struct ContentView: View { Color.orange } + /// Secure recordings button styling following existing patterns + private var secureRecordingsButtonBackgroundColor: Color { + Color.blue.opacity(colorScheme == .dark ? 0.3 : 0.2) + } + + /// Secure recordings button styling following existing patterns + private var secureRecordingsButtonForegroundColor: Color { + Color.blue + } + private var shareButtonBackgroundColor: Color { Color.green.opacity(colorScheme == .dark ? 0.3 : 0.2) } @@ -224,16 +260,12 @@ struct ContentView: View { Color.black.opacity(colorScheme == .dark ? 0.3 : 0.1) } + /// Applies the current theme to the user interface + /// Note: Modern iOS apps should use the system appearance settings + /// rather than programmatically overriding the interface style private func applyTheme() { - switch viewModel.theme { - case .light: - UIApplication.shared.windows.first?.overrideUserInterfaceStyle = .light - case .dark: - UIApplication.shared.windows.first?.overrideUserInterfaceStyle = .dark - case .highContrast: - // For high contrast, you might want to set a specific override, if necessary. - break - } + // Theme changes are now handled through the system appearance settings + // and the view's color scheme environment } // MARK: - Export Functionality diff --git a/SpeechDictation/UI/MicSensitivityView.swift b/SpeechDictation/UI/MicSensitivityView.swift index 651eb31..1ff74f3 100644 --- a/SpeechDictation/UI/MicSensitivityView.swift +++ b/SpeechDictation/UI/MicSensitivityView.swift @@ -10,6 +10,9 @@ import SwiftUI import Foundation +#if canImport(UIKit) +import UIKit +#endif struct MicSensitivityView: View { @ObservedObject var viewModel: SpeechRecognizerViewModel @@ -22,9 +25,10 @@ struct MicSensitivityView: View { .foregroundColor(.primary) HStack { - Slider(value: $viewModel.volume, in: 0...100, step: 1, onEditingChanged: { _ in - viewModel.adjustVolume() - }) + Slider(value: $viewModel.volume, in: 0...100, step: 1) + .onChange(of: viewModel.volume) { _ in + viewModel.adjustVolume() + } .accentColor(.accentColor) VUMeterView(level: viewModel.currentLevel) diff --git a/SpeechDictation/UI/SecureRecordingsView.swift b/SpeechDictation/UI/SecureRecordingsView.swift new file mode 100644 index 0000000..40fd4c9 --- /dev/null +++ b/SpeechDictation/UI/SecureRecordingsView.swift @@ -0,0 +1,416 @@ +// +// SecureRecordingsView.swift +// SpeechDictation +// +// Created by AI Assistant on 1/27/25. +// +// Secure recordings management interface with authentication gating. +// Provides comprehensive management of private recordings with complete file protection. +// Follows existing NavigationView and List patterns for consistency. +// + +import SwiftUI + +/// Main view for managing secure private recordings +/// Integrates authentication, recording controls, and session management +/// Uses structured concurrency for all async operations +struct SecureRecordingsView: View { + @Binding var isPresented: Bool + + @StateObject private var secureRecordingManager = SecureRecordingManager.shared + @StateObject private var authManager = LocalAuthenticationManager.shared + @State private var showingNewRecordingDialog = false + @State private var newRecordingTitle = "" + @State private var showingDeleteConfirmation = false + @State private var sessionToDelete: SecureRecordingSession? + @State private var isAuthenticating = false + @Environment(\.colorScheme) private var colorScheme + + var body: some View { + NavigationView { + Group { + if authManager.isAuthenticationRequired && !authManager.authenticationState.isAuthenticated { + authenticationView + } else { + recordingsListView + } + } + .navigationTitle("Secure Recordings") + .navigationBarTitleDisplayMode(.large) + .toolbar { + ToolbarItemGroup(placement: .navigationBarLeading) { + Button("Close") { + isPresented = false + } + } + + ToolbarItemGroup(placement: .navigationBarTrailing) { + if authManager.authenticationState.isAuthenticated { + if secureRecordingManager.isRecording { + Button("Stop Recording") { + Task { + await secureRecordingManager.stopSecureRecording() + } + } + .foregroundColor(.red) + } else { + Button(action: { + showingNewRecordingDialog = true + }) { + Image(systemName: "plus.circle.fill") + .foregroundColor(.accentColor) + } + } + } + } + } + } + .navigationViewStyle(StackNavigationViewStyle()) + .onAppear { + authManager.refreshBiometricCapabilities() + Task { + await authenticateIfRequired() + } + } + .alert("New Secure Recording", isPresented: $showingNewRecordingDialog) { + TextField("Recording title (optional)", text: $newRecordingTitle) + Button("Start Recording") { + Task { + await startNewRecording() + } + } + Button("Cancel", role: .cancel) { } + } message: { + Text("This will create a private recording with complete file protection and on-device transcription.") + } + .alert("Delete Recording", isPresented: $showingDeleteConfirmation) { + Button("Delete", role: .destructive) { + Task { + if let session = sessionToDelete { + await deleteRecording(session) + } + } + } + Button("Cancel", role: .cancel) { } + } message: { + if let session = sessionToDelete { + Text("Are you sure you want to permanently delete \"\(session.displayTitle)\"? This action cannot be undone.") + } + } + } + + // MARK: - Authentication View + + /// Authentication interface with biometric and passcode options + private var authenticationView: some View { + VStack(spacing: 24) { + Spacer() + + // Security icon + Image(systemName: "lock.shield.fill") + .font(.system(size: 64)) + .foregroundColor(.accentColor) + .padding(.bottom, 16) + + VStack(spacing: 16) { + Text("Secure Recordings") + .font(.title) + .fontWeight(.semibold) + + Text("Private recordings are protected with complete file protection and require authentication to access.") + .font(.body) + .multilineTextAlignment(.center) + .foregroundColor(.secondary) + .padding(.horizontal) + } + + VStack(spacing: 12) { + // Primary authentication button + Button(action: { + Task { + await authenticate() + } + }) { + HStack { + Image(systemName: biometricIcon) + .font(.title2) + Text(authenticationButtonText) + .font(.headline) + } + .frame(maxWidth: .infinity) + .padding() + .background(Color.accentColor) + .foregroundColor(.white) + .cornerRadius(10) + } + .disabled(isAuthenticating) + + // Passcode fallback (if biometrics available) + if authManager.isBiometricAuthenticationAvailable() { + Button(action: { + Task { + await authenticateWithPasscode() + } + }) { + Text("Use Passcode") + .font(.subheadline) + .foregroundColor(.accentColor) + } + .disabled(isAuthenticating) + } + } + .padding(.horizontal) + + Spacer() + + // Authentication state message + if case .error(let message) = authManager.authenticationState { + Text(message) + .font(.caption) + .foregroundColor(.red) + .multilineTextAlignment(.center) + .padding(.horizontal) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + + // MARK: - Recordings List View + + /// Main recordings management interface with list and controls + private var recordingsListView: some View { + VStack { + // Current recording status + if secureRecordingManager.isRecording, let currentSession = secureRecordingManager.currentSession { + currentRecordingHeader(session: currentSession) + } + + // Recordings list + List { + ForEach(secureRecordingManager.getAllSessions()) { session in + SecureRecordingRow( + session: session, + onDelete: { sessionToDelete = session; showingDeleteConfirmation = true } + ) + } + } + .listStyle(PlainListStyle()) + .overlay( + Group { + if secureRecordingManager.allSessions.isEmpty && !secureRecordingManager.isRecording { + emptyStateView + } + } + ) + } + } + + /// Current recording status header + private func currentRecordingHeader(session: SecureRecordingSession) -> some View { + VStack(spacing: 8) { + HStack { + Image(systemName: "record.circle.fill") + .foregroundColor(.red) + .font(.title2) + Text("Recording: \(session.displayTitle)") + .font(.headline) + .foregroundColor(.primary) + Spacer() + } + + HStack { + Text("Duration: \(formatDuration(secureRecordingManager.recordingDuration))") + .font(.subheadline) + .foregroundColor(.secondary) + Spacer() + } + } + .padding() + .background(Color.red.opacity(0.1)) + .cornerRadius(8) + .padding(.horizontal) + } + + /// Empty state when no recordings exist + private var emptyStateView: some View { + VStack(spacing: 16) { + Image(systemName: "waveform.circle.fill") + .font(.system(size: 48)) + .foregroundColor(.secondary) + + Text("No Secure Recordings") + .font(.title2) + .foregroundColor(.secondary) + + Text("Tap the + button to create your first private recording with complete file protection.") + .font(.body) + .multilineTextAlignment(.center) + .foregroundColor(.secondary) + .padding(.horizontal) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + + // MARK: - Authentication Logic + + /// Performs initial authentication check on view appearance + private func authenticateIfRequired() async { + guard authManager.isAuthenticationRequired else { return } + + if !authManager.authenticationState.isAuthenticated { + await authenticate() + } + } + + /// Authenticates using primary method (biometrics or passcode) + private func authenticate() async { + isAuthenticating = true + defer { isAuthenticating = false } + + _ = await authManager.authenticate(reason: "Access secure recordings") + } + + /// Authenticates using device passcode as fallback + private func authenticateWithPasscode() async { + isAuthenticating = true + defer { isAuthenticating = false } + + _ = await authManager.authenticateWithPasscode(reason: "Access secure recordings") + } + + // MARK: - Recording Management + + /// Starts a new secure recording with user consent + private func startNewRecording() async { + let title = newRecordingTitle.trimmingCharacters(in: .whitespacesAndNewlines) + newRecordingTitle = "" + + _ = await secureRecordingManager.startSecureRecording(title: title, hasConsent: true) + } + + /// Deletes a secure recording after confirmation + private func deleteRecording(_ session: SecureRecordingSession) async { + _ = await secureRecordingManager.deleteSession(session.id) + sessionToDelete = nil + } + + // MARK: - Helper Properties + + /// Dynamic biometric icon based on device capabilities + private var biometricIcon: String { + switch authManager.biometricType { + case .faceID: return "faceid" + case .touchID: return "touchid" + case .opticID: return "opticid" + case .none: return "key.fill" + } + } + + /// Dynamic authentication button text based on device capabilities + private var authenticationButtonText: String { + switch authManager.biometricType { + case .faceID: return "Authenticate with Face ID" + case .touchID: return "Authenticate with Touch ID" + case .opticID: return "Authenticate with Optic ID" + case .none: return "Authenticate with Passcode" + } + } + + /// Formats duration for display + private func formatDuration(_ duration: TimeInterval) -> String { + let minutes = Int(duration) / 60 + let seconds = Int(duration) % 60 + return String(format: "%d:%02d", minutes, seconds) + } +} + +// MARK: - Recording Row View + +/// Individual row for displaying secure recording session information +struct SecureRecordingRow: View { + let session: SecureRecordingSession + let onDelete: () -> Void + @Environment(\.colorScheme) private var colorScheme + + var body: some View { + VStack(alignment: .leading, spacing: 8) { + HStack { + VStack(alignment: .leading, spacing: 4) { + Text(session.displayTitle) + .font(.headline) + .foregroundColor(.primary) + + Text(session.startTime.formatted(.dateTime.day().month().hour().minute())) + .font(.caption) + .foregroundColor(.secondary) + } + + Spacer() + + VStack(alignment: .trailing, spacing: 4) { + if session.isCompleted { + Text(formatDuration(session.duration)) + .font(.subheadline) + .foregroundColor(.secondary) + } else { + Text("Recording...") + .font(.subheadline) + .foregroundColor(.red) + } + + Text(formatFileSize(session.audioFileSize)) + .font(.caption2) + .foregroundColor(.secondary) + } + } + + // Status indicators + HStack(spacing: 12) { + Label("Encrypted", systemImage: "lock.shield.fill") + .font(.caption2) + .foregroundColor(.green) + + Label("On-Device", systemImage: "iphone") + .font(.caption2) + .foregroundColor(.blue) + + if session.hasConsent { + Label("Consent", systemImage: "checkmark.circle.fill") + .font(.caption2) + .foregroundColor(.green) + } + + Spacer() + } + } + .padding(.vertical, 4) + .swipeActions(edge: .trailing, allowsFullSwipe: false) { + Button("Delete", role: .destructive) { + onDelete() + } + } + } + + /// Formats file size for display + private func formatFileSize(_ bytes: Int64) -> String { + let formatter = ByteCountFormatter() + formatter.allowedUnits = [.useMB, .useKB] + formatter.countStyle = .file + return formatter.string(fromByteCount: bytes) + } + + /// Formats duration for display + private func formatDuration(_ duration: TimeInterval) -> String { + let minutes = Int(duration) / 60 + let seconds = Int(duration) % 60 + return String(format: "%d:%02d", minutes, seconds) + } +} + +// MARK: - Preview Provider + +struct SecureRecordingsView_Previews: PreviewProvider { + static var previews: some View { + SecureRecordingsView(isPresented: .constant(true)) + } +} \ No newline at end of file diff --git a/SpeechDictation/UI/SettingsView.swift b/SpeechDictation/UI/SettingsView.swift index bb70b62..2007447 100644 --- a/SpeechDictation/UI/SettingsView.swift +++ b/SpeechDictation/UI/SettingsView.swift @@ -4,8 +4,8 @@ // // Created by Joseph McCraw on 7/17/24. // -// Main settings view that combines all setting components. -// Now supports proper dark/light mode adaptation. +// Main settings view that combines all setting components including security preferences. +// Now supports proper dark/light mode adaptation and secure recordings configuration. // import SwiftUI @@ -14,7 +14,9 @@ import AVFoundation import CoreML import Vision import Combine +#if canImport(ARKit) import ARKit +#endif #if canImport(UIKit) import UIKit #endif @@ -37,6 +39,7 @@ struct SettingsView: View { ThemeSettingView(viewModel: viewModel) MicSensitivityView(viewModel: viewModel) DepthBasedDistanceView() + SecureRecordingsSettingsView() } .padding() .background(mainBackgroundColor) @@ -49,7 +52,11 @@ struct SettingsView: View { // MARK: - Color Helpers private var headerBackgroundColor: Color { - Color(UIColor.tertiarySystemBackground) + #if canImport(UIKit) + return Color(UIColor.tertiarySystemBackground) + #else + return Color(NSColor.windowBackgroundColor) + #endif } private var mainBackgroundColor: Color { @@ -65,6 +72,241 @@ struct SettingsView: View { } } +/// SwiftUI view for configuring secure recordings preferences +/// Provides authentication settings, biometric status, and iCloud sync options +struct SecureRecordingsSettingsView: View { + @StateObject private var authManager = LocalAuthenticationManager.shared + @Environment(\.colorScheme) private var colorScheme + @State private var showingAuthenticationInfo = false + @State private var iCloudSyncEnabled = false + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + // Header + HStack { + Image(systemName: "lock.shield.fill") + .foregroundColor(.blue) + .font(.title2) + + Text("Secure Recordings") + .font(.headline) + .fontWeight(.medium) + + Spacer() + + Button(action: { + showingAuthenticationInfo = true + }) { + Image(systemName: "info.circle") + .foregroundColor(.secondary) + .font(.subheadline) + } + } + .padding(.horizontal, 16) + .padding(.vertical, 8) + + // Authentication requirement toggle + VStack(alignment: .leading, spacing: 8) { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text("Require Authentication") + .font(.subheadline) + .fontWeight(.medium) + + Text("Use \(authManager.biometricType.description) or passcode to access private recordings") + .font(.caption) + .foregroundColor(.secondary) + } + + Spacer() + + Toggle("", isOn: Binding( + get: { authManager.isAuthenticationRequired }, + set: { authManager.setAuthenticationRequired($0) } + )) + .labelsHidden() + .scaleEffect(0.8) + } + .padding(.horizontal, 16) + + // Authentication status indicator + if authManager.isAuthenticationRequired { + HStack(spacing: 8) { + Image(systemName: authenticationStatusIcon) + .foregroundColor(authenticationStatusColor) + .font(.caption) + + Text(authenticationStatusText) + .font(.caption) + .foregroundColor(authenticationStatusColor) + + Spacer() + } + .padding(.horizontal, 16) + } + } + + Divider() + .padding(.horizontal, 16) + + // iCloud sync preference (placeholder for future implementation) + VStack(alignment: .leading, spacing: 8) { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text("iCloud Backup") + .font(.subheadline) + .fontWeight(.medium) + + Text("Optionally sync secure recordings to iCloud (requires encryption)") + .font(.caption) + .foregroundColor(.secondary) + } + + Spacer() + + Toggle("", isOn: $iCloudSyncEnabled) + .labelsHidden() + .scaleEffect(0.8) + .disabled(true) // Disabled for future implementation + } + .padding(.horizontal, 16) + + if iCloudSyncEnabled { + HStack(spacing: 8) { + Image(systemName: "icloud.fill") + .foregroundColor(.blue) + .font(.caption) + + Text("Coming soon - End-to-end encrypted iCloud sync") + .font(.caption) + .foregroundColor(.secondary) + + Spacer() + } + .padding(.horizontal, 16) + } + } + + // Device security status + VStack(alignment: .leading, spacing: 8) { + Text("Device Security Status") + .font(.subheadline) + .fontWeight(.medium) + .padding(.horizontal, 16) + + VStack(spacing: 6) { + SecurityStatusRow( + title: "Device Passcode", + isEnabled: authManager.isDeviceSecure(), + icon: "key.fill" + ) + + SecurityStatusRow( + title: authManager.biometricType.description, + isEnabled: authManager.isBiometricAuthenticationAvailable(), + icon: biometricIcon + ) + + SecurityStatusRow( + title: "File Protection", + isEnabled: true, + icon: "shield.checkered" + ) + } + .padding(.horizontal, 16) + } + } + .padding(.vertical, 12) + .background(settingsCardBackgroundColor) + .cornerRadius(12) + .onAppear { + authManager.refreshBiometricCapabilities() + loadiCloudSyncPreference() + } + .alert("Secure Recordings Authentication", isPresented: $showingAuthenticationInfo) { + Button("OK") { } + } message: { + Text("Secure recordings use complete file protection and require authentication to access. All speech processing happens on-device for maximum privacy. Authentication is cached for 5 minutes after successful verification.") + } + } + + // MARK: - Helper Properties + + private var settingsCardBackgroundColor: Color { + #if canImport(UIKit) + Color(UIColor.secondarySystemBackground) + #else + Color(NSColor.controlBackgroundColor) + #endif + } + + private var authenticationStatusIcon: String { + if authManager.authenticationState.isAuthenticated { + return "checkmark.circle.fill" + } else { + return "lock.circle.fill" + } + } + + private var authenticationStatusColor: Color { + if authManager.authenticationState.isAuthenticated { + return .green + } else { + return .orange + } + } + + private var authenticationStatusText: String { + if authManager.authenticationState.isAuthenticated { + return "Authenticated - Access granted" + } else { + return "Authentication required for access" + } + } + + private var biometricIcon: String { + switch authManager.biometricType { + case .faceID: return "faceid" + case .touchID: return "touchid" + case .opticID: return "opticid" + case .none: return "questionmark.circle" + } + } + + // MARK: - Helper Methods + + private func loadiCloudSyncPreference() { + iCloudSyncEnabled = UserDefaults.standard.bool(forKey: "secureRecordingsiCloudSync") + } +} + +/// Individual security status row component +struct SecurityStatusRow: View { + let title: String + let isEnabled: Bool + let icon: String + + var body: some View { + HStack(spacing: 12) { + Image(systemName: icon) + .foregroundColor(isEnabled ? .green : .secondary) + .font(.subheadline) + .frame(width: 16) + + Text(title) + .font(.caption) + .foregroundColor(.primary) + + Spacer() + + Image(systemName: isEnabled ? "checkmark.circle.fill" : "xmark.circle.fill") + .foregroundColor(isEnabled ? .green : .red) + .font(.caption) + } + } +} + +#if canImport(ARKit) /// SwiftUI view for configuring depth-based distance estimation settings /// Provides toggle control and information about device capabilities struct DepthBasedDistanceView: View { @@ -138,7 +380,7 @@ struct DepthBasedDistanceView: View { } .background( RoundedRectangle(cornerRadius: 10) - .fill(Color(UIColor.secondarySystemBackground)) + .fill(semanticSecondaryBackgroundColor()) ) .onAppear { loadDepthCapabilities() @@ -181,6 +423,50 @@ struct DepthBasedDistanceView: View { print("Detected \(sources.count) depth estimation sources: \(sources.joined(separator: ", "))") } } +#else +/// Fallback view when ARKit is unavailable (e.g., macOS Catalyst previews) +struct DepthBasedDistanceView: View { + var body: some View { + VStack(spacing: 12) { + HStack { + Image(systemName: "camera.metering.matrix") + .foregroundColor(.accentColor) + .font(.title2) + Text("Depth-Based Distance") + .font(.headline) + .fontWeight(.medium) + Spacer() + } + .padding(.horizontal, 16) + .padding(.vertical, 8) + + Text("Depth sensors are unavailable on this platform.") + .font(.caption) + .foregroundColor(.secondary) + .padding(.horizontal, 16) + } + .padding(.vertical, 12) + .frame(maxWidth: .infinity) + .background( + RoundedRectangle(cornerRadius: 10) + .fill(semanticSecondaryBackgroundColor()) + ) + } +} + +#endif + +// MARK: - Cross-platform Color Helpers + +private func semanticSecondaryBackgroundColor() -> Color { + #if canImport(UIKit) + return Color(UIColor.secondarySystemBackground) + #elseif canImport(AppKit) + return Color(NSColor.controlBackgroundColor) + #else + return Color.gray.opacity(0.2) + #endif +} /// Badge view for displaying depth source capabilities struct DepthSourceBadge: View { diff --git a/SpeechDictationTests/SecureRecordingBusinessLogicTests.swift b/SpeechDictationTests/SecureRecordingBusinessLogicTests.swift new file mode 100644 index 0000000..69070fd --- /dev/null +++ b/SpeechDictationTests/SecureRecordingBusinessLogicTests.swift @@ -0,0 +1,363 @@ +// +// SecureRecordingBusinessLogicTests.swift +// SpeechDictationTests +// +// Created by AI Assistant on 1/27/25. +// +// Focused unit tests for secure recording business logic. +// Tests only meaningful behaviors where bugs could cause security vulnerabilities or data corruption. +// Skips trivial operations like basic getters/setters or simple math. +// + +import XCTest +@testable import SpeechDictation + +/// Tests critical business logic for secure recording workflows +/// Focuses on security-sensitive behaviors and complex state management +final class SecureRecordingBusinessLogicTests: XCTestCase { + + var mockAuthManager: MockLocalAuthenticationManager! + var mockCacheManager: MockCacheManager! + var testDirectory: URL! + + override func setUpWithError() throws { + try super.setUpWithError() + + testDirectory = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString) + try FileManager.default.createDirectory(at: testDirectory, withIntermediateDirectories: true, attributes: nil) + + mockAuthManager = MockLocalAuthenticationManager() + mockCacheManager = MockCacheManager(testDirectory: testDirectory) + } + + override func tearDownWithError() throws { + try? FileManager.default.removeItem(at: testDirectory) + mockAuthManager = nil + mockCacheManager = nil + testDirectory = nil + try super.tearDownWithError() + } + + // MARK: - Authentication State Management Business Logic + + /// Tests that authentication requirement properly gates access to sensitive operations + /// BUSINESS VALUE: Prevents unauthorized access to private recordings + func testAuthenticationRequirementEnforcement() async throws { + // Given: Authentication is required but user hasn't authenticated + mockAuthManager.isAuthenticationRequired = true + mockAuthManager.authenticationState = .notEvaluated + + // When: Checking if sensitive operations should be allowed + let shouldAllowAccess = mockAuthManager.authenticationState.isAuthenticated + + // Then: Access must be denied to protect private data + XCTAssertFalse(shouldAllowAccess, + "Critical Security Bug: Unauthenticated users can access private recordings") + + // When: User successfully authenticates + let authSuccess = await mockAuthManager.authenticate(reason: "Test") + + // Then: Access should be granted after successful authentication + XCTAssertTrue(authSuccess, "Authentication should succeed in test environment") + XCTAssertTrue(mockAuthManager.authenticationState.isAuthenticated, + "Authentication state must update after successful auth") + } + + /// Tests authentication state transitions handle edge cases correctly + /// BUSINESS VALUE: Ensures authentication states are consistent and can't be bypassed + func testAuthenticationStateTransitionIntegrity() async throws { + // Given: Multiple authentication attempts with different outcomes + mockAuthManager.authenticationState = .notEvaluated + + // When: First authentication fails + mockAuthManager.setAuthenticationResult(false) + let firstAttempt = await mockAuthManager.authenticate(reason: "Test") + + // Then: State should reflect failure, not success + XCTAssertFalse(firstAttempt, "Failed authentication should return false") + XCTAssertFalse(mockAuthManager.authenticationState.isAuthenticated, + "Failed authentication must not grant access") + + // When: Subsequent authentication succeeds + mockAuthManager.setAuthenticationResult(true) + let secondAttempt = await mockAuthManager.authenticate(reason: "Test") + + // Then: State should transition to authenticated + XCTAssertTrue(secondAttempt, "Successful authentication should return true") + XCTAssertTrue(mockAuthManager.authenticationState.isAuthenticated, + "Successful authentication must grant access") + + // When: Authentication is explicitly reset + mockAuthManager.resetAuthenticationState() + + // Then: Access should be revoked + XCTAssertFalse(mockAuthManager.authenticationState.isAuthenticated, + "Reset must revoke authentication state") + } + + /// Tests biometric fallback logic handles device capability changes + /// BUSINESS VALUE: Ensures authentication works across different device configurations + func testBiometricFallbackLogic() throws { + // Test critical authentication paths based on device capabilities + let testScenarios: [(BiometricType, Bool, String)] = [ + (.faceID, true, "Face ID should be available when device supports it"), + (.touchID, true, "Touch ID should be available when device supports it"), + (.opticID, true, "Optic ID should be available when device supports it"), + (.none, false, "No biometrics should force passcode-only authentication") + ] + + for (biometricType, expectedAvailability, failureMessage) in testScenarios { + // When: Device has specific biometric capability + mockAuthManager.biometricType = biometricType + + // Then: Availability must match device capability exactly + let isAvailable = mockAuthManager.isBiometricAuthenticationAvailable() + XCTAssertEqual(isAvailable, expectedAvailability, failureMessage) + } + } + + // MARK: - Session Lifecycle Business Logic + + /// Tests that session completion properly validates all required data + /// BUSINESS VALUE: Ensures recordings are never lost due to incomplete metadata + func testSessionCompletionDataIntegrity() throws { + // Given: A recording session with various completion states + let sessionId = "integrity-test-\(UUID().uuidString)" + let startTime = Date().addingTimeInterval(-300) // 5 minutes ago + + // Test incomplete session (missing end time) + let incompleteSession = SecureRecordingSession( + id: sessionId, + title: "Test Recording", + startTime: startTime, + endTime: nil, // Missing end time + duration: 0, // Missing duration + audioFileName: "audio_\(sessionId).m4a", + transcriptFileName: "transcript_\(sessionId).json", + isCompleted: false, + hasConsent: true + ) + + // Verify incomplete session is properly marked + XCTAssertFalse(incompleteSession.isCompleted, + "Incomplete sessions must be flagged to prevent data loss") + XCTAssertNil(incompleteSession.endTime, + "Incomplete sessions should not have end time") + + // When: Session is properly completed + let endTime = Date() + let duration = endTime.timeIntervalSince(startTime) + + let completedSession = SecureRecordingSession( + id: sessionId, + title: incompleteSession.title, + startTime: incompleteSession.startTime, + endTime: endTime, + duration: duration, + audioFileName: incompleteSession.audioFileName, + transcriptFileName: incompleteSession.transcriptFileName, + isCompleted: true, + hasConsent: incompleteSession.hasConsent + ) + + // Then: All completion data must be present and valid + XCTAssertTrue(completedSession.isCompleted, + "Completed sessions must be properly flagged") + XCTAssertNotNil(completedSession.endTime, + "Completed sessions must have end time") + XCTAssertGreaterThan(completedSession.duration, 0, + "Completed sessions must have positive duration") + XCTAssertEqual(completedSession.duration, duration, accuracy: 0.1, + "Duration calculation must be accurate for timing data") + } + + /// Tests session ID uniqueness to prevent data collisions + /// BUSINESS VALUE: Prevents recordings from overwriting each other + func testSessionIdUniquenessLogic() throws { + // Given: Multiple session creation attempts + var generatedIds: Set = [] + let sessionCount = 100 + + // When: Creating many sessions rapidly + for _ in 0.. minimumRequired + + // Then: Storage validation must make correct decisions + XCTAssertEqual(hasSpace, shouldAllow, message) + } + } + + /// Tests secure file deletion actually removes sensitive data + /// BUSINESS VALUE: Ensures deleted recordings cannot be recovered + func testSecureFileDeletion() throws { + // Given: Sensitive data that user wants to delete + let sensitiveData = "Private conversation to be deleted".data(using: .utf8)! + let fileName = "sensitive_to_delete.json" + + // When: Creating then deleting sensitive file + let savedURL = mockCacheManager.saveSecurely(data: sensitiveData, forKey: fileName) + XCTAssertNotNil(savedURL, "File creation must succeed for deletion test") + + let deleteSuccess = mockCacheManager.deleteSecureData(forKey: fileName) + + // Then: Deletion must be complete and irreversible + XCTAssertTrue(deleteSuccess, "Secure deletion must succeed") + + let retrievedAfterDeletion = mockCacheManager.retrieveSecureData(forKey: fileName) + XCTAssertNil(retrievedAfterDeletion, + "Critical Security Bug: Deleted sensitive data is still accessible") + } + + // MARK: - Data Integrity and Serialization Logic + + /// Tests that session metadata survives serialization without corruption + /// BUSINESS VALUE: Ensures recording metadata is never lost or corrupted + func testSessionMetadataSerializationIntegrity() throws { + // Given: Session with complex metadata including edge cases + let originalSession = SecureRecordingSession( + id: "serialization-test-\(UUID().uuidString)", + title: "Test Recording with Special Characters: åäö 🎤 \"quotes\" & symbols", + startTime: Date(timeIntervalSince1970: 1640995200), // Fixed date for consistency + endTime: Date(timeIntervalSince1970: 1640995320), // 2 minutes later + duration: 120.5, + audioFileName: "audio_test_\(UUID().uuidString).m4a", + transcriptFileName: "transcript_test_\(UUID().uuidString).json", + isCompleted: true, + hasConsent: true + ) + + // When: Serializing and deserializing session metadata + let encodedData = try JSONEncoder().encode(originalSession) + let decodedSession = try JSONDecoder().decode(SecureRecordingSession.self, from: encodedData) + + // Then: All critical metadata must be preserved exactly + XCTAssertEqual(decodedSession.id, originalSession.id, + "Session ID corruption would cause data loss") + XCTAssertEqual(decodedSession.title, originalSession.title, + "Title corruption affects user experience") + XCTAssertEqual(decodedSession.duration, originalSession.duration, accuracy: 0.01, + "Duration corruption affects timing data accuracy") + XCTAssertEqual(decodedSession.isCompleted, originalSession.isCompleted, + "Completion status corruption affects data integrity") + XCTAssertEqual(decodedSession.hasConsent, originalSession.hasConsent, + "Consent corruption affects legal compliance") + XCTAssertEqual(decodedSession.audioFileName, originalSession.audioFileName, + "File name corruption would cause data loss") + XCTAssertEqual(decodedSession.transcriptFileName, originalSession.transcriptFileName, + "Transcript file name corruption would cause data loss") + } + + /// Tests secure directory structure prevents data leakage between sessions + /// BUSINESS VALUE: Ensures recordings are properly isolated + func testSecureDirectoryIsolation() throws { + // Given: Multiple sensitive recording sessions + let sessionIds = ["patient-123", "meeting-456", "personal-789"] + + for sessionId in sessionIds { + // When: Creating isolated storage for each session + let testData = "Sensitive data for session \(sessionId)".data(using: .utf8)! + let fileName = "metadata.json" + + let savedURL = mockCacheManager.saveSecurely( + data: testData, + forKey: fileName, + subdirectory: sessionId + ) + + // Then: Each session must have isolated storage + XCTAssertNotNil(savedURL, "Secure storage creation must succeed for session: \(sessionId)") + XCTAssertTrue(savedURL!.path.contains(sessionId), + "Critical Security Bug: Session data not properly isolated for \(sessionId)") + } + } +} \ No newline at end of file diff --git a/SpeechDictationTests/SecureRecordingTests.swift b/SpeechDictationTests/SecureRecordingTests.swift new file mode 100644 index 0000000..2cadd4b --- /dev/null +++ b/SpeechDictationTests/SecureRecordingTests.swift @@ -0,0 +1,462 @@ +// +// SecureRecordingTests.swift +// SpeechDictationTests +// +// Created by AI Assistant on 1/27/25. +// +// Unit tests for secure recording business logic and workflows. +// Tests authentication flows, file protection, session management, and security constraints. +// Focuses on business logic validation rather than basic operations. +// + +import XCTest +import LocalAuthentication +@testable import SpeechDictation + +/// Test cases for secure recording business logic +/// Validates security constraints, authentication flows, and data protection +final class SecureRecordingTests: XCTestCase { + + var mockAuthManager: MockLocalAuthenticationManager! + var mockCacheManager: MockCacheManager! + var testFileManager: FileManager! + var testDirectory: URL! + + override func setUpWithError() throws { + try super.setUpWithError() + + // Setup test environment + testFileManager = FileManager.default + testDirectory = testFileManager.temporaryDirectory.appendingPathComponent(UUID().uuidString) + try testFileManager.createDirectory(at: testDirectory, withIntermediateDirectories: true, attributes: nil) + + // Setup mocks + mockAuthManager = MockLocalAuthenticationManager() + mockCacheManager = MockCacheManager(testDirectory: testDirectory) + } + + override func tearDownWithError() throws { + // Cleanup test directory + try? testFileManager.removeItem(at: testDirectory) + + mockAuthManager = nil + mockCacheManager = nil + testFileManager = nil + testDirectory = nil + + try super.tearDownWithError() + } + + // MARK: - Authentication Business Logic Tests + + /// Tests that authentication requirement properly gates access to secure features + func testAuthenticationRequirementGating() async throws { + // Given: Authentication is required but user is not authenticated + mockAuthManager.isAuthenticationRequired = true + mockAuthManager.authenticationState = .notEvaluated + + // When: Attempting to access secure features + let canAccess = mockAuthManager.authenticationState.isAuthenticated + + // Then: Access should be denied + XCTAssertFalse(canAccess, "Access should be denied when authentication is required but not completed") + } + + /// Tests authentication state transitions and validation + func testAuthenticationStateTransitions() async throws { + // Given: Initial unauthenticated state + mockAuthManager.authenticationState = .notEvaluated + + // When: Successful authentication occurs + let success = await mockAuthManager.authenticate(reason: "Test authentication") + + // Then: State should transition to authenticated + XCTAssertTrue(success, "Authentication should succeed in test environment") + XCTAssertTrue(mockAuthManager.authenticationState.isAuthenticated, "State should be authenticated after successful auth") + + // When: Authentication is reset + mockAuthManager.resetAuthenticationState() + + // Then: State should return to not evaluated + XCTAssertFalse(mockAuthManager.authenticationState.isAuthenticated, "State should be reset after explicit reset") + } + + /// Tests biometric capability detection and fallback logic + func testBiometricCapabilityDetection() throws { + // Given: Device with different biometric capabilities + let testCases: [(BiometricType, Bool)] = [ + (.faceID, true), + (.touchID, true), + (.opticID, true), + (.none, false) + ] + + for (biometricType, expectedAvailability) in testCases { + // When: Setting biometric type + mockAuthManager.biometricType = biometricType + + // Then: Availability should match expected + let isAvailable = mockAuthManager.isBiometricAuthenticationAvailable() + XCTAssertEqual(isAvailable, expectedAvailability, "Biometric availability should match type: \(biometricType)") + } + } + + // MARK: - Session Lifecycle Business Logic Tests + + /// Tests secure recording session creation with proper metadata + func testSecureRecordingSessionCreation() throws { + // Given: Valid session parameters + let sessionId = "test-session-123" + let title = "Test Medical Consultation" + let startTime = Date() + + // When: Creating a secure recording session + let session = SecureRecordingSession( + id: sessionId, + title: title, + startTime: startTime, + endTime: nil, + duration: 0, + audioFileName: "audio_\(sessionId).m4a", + transcriptFileName: "transcript_\(sessionId).json", + isCompleted: false, + hasConsent: true + ) + + // Then: Session should have correct metadata + XCTAssertEqual(session.id, sessionId, "Session ID should match") + XCTAssertEqual(session.title, title, "Title should match") + XCTAssertTrue(session.hasConsent, "Consent should be recorded") + XCTAssertFalse(session.isCompleted, "New session should not be completed") + XCTAssertEqual(session.displayTitle, title, "Display title should use provided title") + } + + /// Tests session completion with proper state transitions + func testSecureRecordingSessionCompletion() throws { + // Given: An active recording session + let sessionId = "test-session-456" + let startTime = Date().addingTimeInterval(-120) // 2 minutes ago + let endTime = Date() + let duration = endTime.timeIntervalSince(startTime) + + var session = SecureRecordingSession( + id: sessionId, + title: "Test Session", + startTime: startTime, + endTime: nil, + duration: 0, + audioFileName: "audio_\(sessionId).m4a", + transcriptFileName: "transcript_\(sessionId).json", + isCompleted: false, + hasConsent: true + ) + + // When: Completing the session + session = SecureRecordingSession( + id: session.id, + title: session.title, + startTime: session.startTime, + endTime: endTime, + duration: duration, + audioFileName: session.audioFileName, + transcriptFileName: session.transcriptFileName, + isCompleted: true, + hasConsent: session.hasConsent + ) + + // Then: Session should be properly completed + XCTAssertTrue(session.isCompleted, "Session should be marked as completed") + XCTAssertNotNil(session.endTime, "End time should be set") + XCTAssertGreaterThan(session.duration, 0, "Duration should be positive") + XCTAssertEqual(session.duration, duration, accuracy: 1.0, "Duration should match calculated time") + } + + /// Tests default display title generation for untitled sessions + func testSessionDisplayTitleGeneration() throws { + // Given: A session without a custom title + let startTime = Date() + let session = SecureRecordingSession( + id: "test-session", + title: "", + startTime: startTime, + endTime: nil, + duration: 0, + audioFileName: "audio.m4a", + transcriptFileName: "transcript.json", + isCompleted: false, + hasConsent: true + ) + + // When: Getting display title + let displayTitle = session.displayTitle + + // Then: Should generate default title with time + XCTAssertTrue(displayTitle.contains("Recording"), "Display title should contain 'Recording'") + XCTAssertFalse(displayTitle.isEmpty, "Display title should not be empty") + } + + // MARK: - File Protection Business Logic Tests + + /// Tests that secure storage applies complete file protection + func testSecureFileProtectionApplication() throws { + // Given: Data to store securely + let testData = "Sensitive medical recording data".data(using: .utf8)! + let fileName = "test_secure_file.json" + + // When: Saving data securely + let savedURL = mockCacheManager.saveSecurely(data: testData, forKey: fileName) + + // Then: File should exist and have protection applied + XCTAssertNotNil(savedURL, "Secure save should return valid URL") + XCTAssertTrue(mockCacheManager.secureProtectionApplied, "Complete file protection should be applied") + + // And: File should be retrievable + let retrievedData = mockCacheManager.retrieveSecureData(forKey: fileName) + XCTAssertNotNil(retrievedData, "Secure data should be retrievable") + XCTAssertEqual(retrievedData, testData, "Retrieved data should match original") + } + + /// Tests secure file validation and integrity checking + func testSecureFileValidation() throws { + // Given: A file that should have complete protection + let fileName = "protected_file.json" + let testData = "Protected content".data(using: .utf8)! + + // When: Saving and then validating protection + let savedURL = mockCacheManager.saveSecurely(data: testData, forKey: fileName) + let isValid = mockCacheManager.validateFileProtection(at: savedURL!) + + // Then: File should be valid and protected + XCTAssertTrue(isValid, "Secure file should pass protection validation") + } + + /// Tests secure file deletion and cleanup + func testSecureFileDeletion() throws { + // Given: An existing secure file + let fileName = "file_to_delete.json" + let testData = "Data to be deleted".data(using: .utf8)! + let savedURL = mockCacheManager.saveSecurely(data: testData, forKey: fileName) + XCTAssertNotNil(savedURL, "File should be created") + + // When: Deleting the secure file + let deleteSuccess = mockCacheManager.deleteSecureData(forKey: fileName) + + // Then: File should be deleted and no longer accessible + XCTAssertTrue(deleteSuccess, "Secure file deletion should succeed") + + let retrievedAfterDeletion = mockCacheManager.retrieveSecureData(forKey: fileName) + XCTAssertNil(retrievedAfterDeletion, "File should not be retrievable after deletion") + } + + // MARK: - Storage Space Validation Tests + + /// Tests storage space validation for secure recordings + func testStorageSpaceValidation() throws { + // Given: Mock cache manager with controllable storage space + let minimumRequired: Int64 = 100 * 1024 * 1024 // 100MB + + // When: Checking available space with sufficient storage + mockCacheManager.mockAvailableSpace = minimumRequired + 1000 + let hasSufficientSpace = mockCacheManager.getAvailableStorageSpace()! > minimumRequired + + // Then: Should indicate sufficient space + XCTAssertTrue(hasSufficientSpace, "Should have sufficient space when above minimum") + + // When: Checking with insufficient storage + mockCacheManager.mockAvailableSpace = minimumRequired - 1000 + let hasInsufficientSpace = mockCacheManager.getAvailableStorageSpace()! < minimumRequired + + // Then: Should indicate insufficient space + XCTAssertTrue(hasInsufficientSpace, "Should have insufficient space when below minimum") + } + + // MARK: - Consent and Legal Compliance Tests + + /// Tests that recordings cannot start without proper consent + func testConsentRequirement() throws { + // Given: A session creation attempt without consent + let sessionWithoutConsent = SecureRecordingSession( + id: "no-consent-session", + title: "Test", + startTime: Date(), + endTime: nil, + duration: 0, + audioFileName: "audio.m4a", + transcriptFileName: "transcript.json", + isCompleted: false, + hasConsent: false + ) + + // Then: Session should reflect lack of consent + XCTAssertFalse(sessionWithoutConsent.hasConsent, "Session should properly track consent state") + } + + /// Tests consent validation in recording workflow + func testConsentValidationWorkflow() throws { + // Given: Different consent states + let consentStates = [true, false] + + for hasConsent in consentStates { + // When: Creating session with specific consent state + let session = SecureRecordingSession( + id: "consent-test-\(hasConsent)", + title: "Consent Test", + startTime: Date(), + endTime: nil, + duration: 0, + audioFileName: "audio.m4a", + transcriptFileName: "transcript.json", + isCompleted: false, + hasConsent: hasConsent + ) + + // Then: Consent state should be accurately recorded + XCTAssertEqual(session.hasConsent, hasConsent, "Consent state should match input for: \(hasConsent)") + } + } + + // MARK: - Data Integrity and Security Tests + + /// Tests that session metadata is properly encoded and decoded + func testSessionMetadataSerialization() throws { + // Given: A complete session with all metadata + let originalSession = SecureRecordingSession( + id: "serialization-test", + title: "Test Recording with Special Characters: åäö", + startTime: Date(), + endTime: Date().addingTimeInterval(120), + duration: 120.5, + audioFileName: "audio_test.m4a", + transcriptFileName: "transcript_test.json", + isCompleted: true, + hasConsent: true + ) + + // When: Encoding and decoding the session + let encodedData = try JSONEncoder().encode(originalSession) + let decodedSession = try JSONDecoder().decode(SecureRecordingSession.self, from: encodedData) + + // Then: All properties should be preserved + XCTAssertEqual(decodedSession.id, originalSession.id, "ID should be preserved") + XCTAssertEqual(decodedSession.title, originalSession.title, "Title should be preserved") + XCTAssertEqual(decodedSession.duration, originalSession.duration, accuracy: 0.1, "Duration should be preserved") + XCTAssertEqual(decodedSession.isCompleted, originalSession.isCompleted, "Completion state should be preserved") + XCTAssertEqual(decodedSession.hasConsent, originalSession.hasConsent, "Consent state should be preserved") + } + + /// Tests secure directory structure and organization + func testSecureDirectoryStructure() throws { + // Given: Multiple sessions with different IDs + let sessionIds = ["session-1", "session-2", "session-3"] + + for sessionId in sessionIds { + // When: Creating secure files for each session + let testData = "Session data for \(sessionId)".data(using: .utf8)! + let fileName = "metadata.json" + + let savedURL = mockCacheManager.saveSecurely(data: testData, forKey: fileName, subdirectory: sessionId) + + // Then: Each session should have its own secure directory + XCTAssertNotNil(savedURL, "Should create secure file for session: \(sessionId)") + XCTAssertTrue(savedURL!.path.contains(sessionId), "URL should contain session ID in path") + } + } +} + +// MARK: - Mock Objects for Testing + +/// Mock LocalAuthenticationManager for testing authentication logic +class MockLocalAuthenticationManager: ObservableObject { + @Published var authenticationState: AuthenticationState = .notEvaluated + @Published var isAuthenticationRequired = false + @Published var biometricType: BiometricType = .faceID + @Published var isAuthenticating = false + + private var shouldSucceedAuthentication = true + + func setAuthenticationResult(_ shouldSucceed: Bool) { + shouldSucceedAuthentication = shouldSucceed + } + + func isBiometricAuthenticationAvailable() -> Bool { + return biometricType != .none + } + + func authenticate(reason: String = "Test authentication") async -> Bool { + isAuthenticating = true + + // Simulate authentication delay + try? await Task.sleep(nanoseconds: 100_000_000) // 0.1 seconds + + if shouldSucceedAuthentication { + authenticationState = .authenticated + } else { + authenticationState = .denied + } + + isAuthenticating = false + return shouldSucceedAuthentication + } + + func authenticateWithPasscode(reason: String = "Test passcode authentication") async -> Bool { + return await authenticate(reason: reason) + } + + func resetAuthenticationState() { + authenticationState = .notEvaluated + } + + func getCurrentBiometricType() -> BiometricType { + return biometricType + } +} + +/// Mock CacheManager for testing secure storage logic +class MockCacheManager { + private let testDirectory: URL + private var secureFiles: [String: Data] = [:] + + var secureProtectionApplied = false + var mockAvailableSpace: Int64 = 1_000_000_000 // 1GB default + + init(testDirectory: URL) { + self.testDirectory = testDirectory + } + + func saveSecurely(data: Data, forKey key: String, subdirectory: String? = nil) -> URL? { + var targetDirectory = testDirectory + + if let subdirectory = subdirectory { + targetDirectory = targetDirectory.appendingPathComponent(subdirectory) + try? FileManager.default.createDirectory(at: targetDirectory, withIntermediateDirectories: true, attributes: nil) + } + + let fileURL = targetDirectory.appendingPathComponent(key) + + do { + try data.write(to: fileURL) + secureProtectionApplied = true // Simulate protection application + secureFiles[key] = data + return fileURL + } catch { + return nil + } + } + + func retrieveSecureData(forKey key: String, subdirectory: String? = nil) -> Data? { + return secureFiles[key] + } + + func deleteSecureData(forKey key: String, subdirectory: String? = nil) -> Bool { + secureFiles.removeValue(forKey: key) + return true + } + + func validateFileProtection(at url: URL) -> Bool { + return secureProtectionApplied + } + + func getAvailableStorageSpace() -> Int64? { + return mockAvailableSpace + } +} \ No newline at end of file diff --git a/memlog/changelog.md b/memlog/changelog.md index e26092b..750e9a1 100644 --- a/memlog/changelog.md +++ b/memlog/changelog.md @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- **Settings Button Crash** - Fixed "Publishing changes from within view updates" crash when clicking settings button + - **Root Cause**: `applyTheme()` method in ContentView was calling `UIApplication.shared.windows.first?.overrideUserInterfaceStyle` during view updates + - **Solution**: Removed theme application from view updates and modernized approach to use system appearance settings + - **Changes Made**: + - Removed `applyTheme()` calls from `onAppear` and `onChange` in ContentView + - Updated `applyTheme()` method to use modern system appearance approach + - Fixed `MicSensitivityView` slider to use `onChange` instead of `onEditingChanged` for better SwiftUI compliance + - Added proper UIKit imports to resolve compilation issues + - **Testing**: Build succeeds and all unit tests pass, confirming crash is resolved + - **Impact**: Settings button now works without crashing, maintaining proper SwiftUI view update lifecycle + ### Added - **Speech Synthesis for Object Detection** - Added text-to-speech functionality for camera object detection and scene description - **YOLO Object Detection Speech** - Speaks detected objects with distance information (e.g., "Objects detected: dog in lower left, close") diff --git a/utility/build_and_test.sh b/utility/build_and_test.sh index f906268..69debc3 100755 --- a/utility/build_and_test.sh +++ b/utility/build_and_test.sh @@ -215,6 +215,41 @@ select_simulator() { fi } +create_fresh_simulator() { + log "INFO" "Attempting to create a fresh simulator from installed runtimes..." >&2 + + local device_line runtime_line device_type runtime_id runtime_os + + device_line=$(xcrun simctl list devicetypes 2>/dev/null | grep -E "iPhone" | grep -vi "unavailable" | tail -1 || true) + runtime_line=$(xcrun simctl list runtimes 2>/dev/null | grep -E "iOS [0-9.]+ \(" | grep -vi "unavailable" | tail -1 || true) + + if [[ -z "$device_line" || -z "$runtime_line" ]]; then + log "ERROR" "Unable to locate compatible device types or runtimes. Ensure iOS simulator runtimes are installed via Xcode." >&2 + return 1 + fi + + device_type=$(echo "$device_line" | sed -E 's/.*\((com\.apple\.CoreSimulator\.SimDeviceType\.[^)]+)\).*/\1/') + runtime_id=$(echo "$runtime_line" | sed -E 's/.*(com\.apple\.CoreSimulator\.SimRuntime\.[^)]+)\).*/\1/') + runtime_os=$(echo "$runtime_line" | sed -E 's/.*iOS ([0-9.]+).*/\1/') + + if [[ -z "$device_type" || -z "$runtime_id" ]]; then + log "ERROR" "Parsed simulator identifiers were empty. Device line: $device_line Runtime line: $runtime_line" >&2 + return 1 + fi + + local simulator_name="SpeechDictation Auto iOS $runtime_os" + local new_uuid + if new_uuid=$(xcrun simctl create "$simulator_name" "$device_type" "$runtime_id" 2>/dev/null); then + new_uuid=$(echo "$new_uuid" | tr -d '[:space:]') + log "INFO" "Created simulator: $simulator_name UUID: $new_uuid" >&2 + echo "$simulator_name|$runtime_os|$new_uuid" + return 0 + else + log "ERROR" "Failed to create simulator with type $device_type and runtime $runtime_id" >&2 + return 1 + fi +} + # Fast simulator status check get_simulator_status() { local simulator_uuid="$1" @@ -337,8 +372,13 @@ check_prerequisites() { # Pre-boot cached simulator boot_simulator_fast "$SIMULATOR_UUID" else - local simulator_info=$(select_simulator) - if [[ $? -eq 0 ]]; then + local simulator_info + simulator_info=$(select_simulator) + if [[ $? -ne 0 || -z "$simulator_info" ]]; then + log "WARN" "Automatic simulator selection failed, attempting to create a new simulator..." + simulator_info=$(create_fresh_simulator) + fi + if [[ -n "$simulator_info" ]]; then IFS='|' read -r SIMULATOR_NAME SIMULATOR_OS SIMULATOR_UUID <<< "$simulator_info" export SIMULATOR_NAME export SIMULATOR_OS @@ -351,11 +391,11 @@ check_prerequisites() { # Save newly selected simulator to cache save_simulator_cache else - log "ERROR" "No simulator UUID found after selection." + log "ERROR" "No simulator UUID found after selection or creation." exit 1 fi else - log "ERROR" "Failed to select simulator" + log "ERROR" "Failed to select or create a simulator. Install an iOS simulator runtime via Xcode > Settings > Platforms." exit 1 fi fi From b0378c2e9bd25ef46fa838d0270514c875a5d2c7 Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 3 Dec 2025 15:53:05 -0800 Subject: [PATCH 2/3] Fix secure recording transcript sync and JSON crash SecureRecordingManager now publishes live transcription via a new @Published property, and SpeechRecognizerViewModel mirrors this to keep the UI in sync during secure recording. Stopping secure recording now uses stopTranscribingWithTiming to ensure timing data is finalized, and transcript persistence uses a Codable SecureTranscriptPayload to prevent JSON serialization crashes. ContentView refactored to separate live and secure recording controls, and changelog updated with details. --- SpeechDictation.xcodeproj/project.pbxproj | 32 +-- .../UserInterfaceState.xcuserstate | Bin 192810 -> 197315 bytes .../Services/SecureRecordingManager.swift | 39 ++- .../SpeechRecognitionViewModel.swift | 69 +++++- SpeechDictation/UI/ContentView.swift | 227 ++++++++++-------- memlog/changelog.md | 6 + 6 files changed, 250 insertions(+), 123 deletions(-) diff --git a/SpeechDictation.xcodeproj/project.pbxproj b/SpeechDictation.xcodeproj/project.pbxproj index fce0dd6..d85d77c 100644 --- a/SpeechDictation.xcodeproj/project.pbxproj +++ b/SpeechDictation.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 181C4C6BED7E47AAA4642AA3 /* SecureRecordingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181C4C6BED7E47AAA4642AA4 /* SecureRecordingTests.swift */; }; 4420D05F2C2E4E2500263CF6 /* WaveformView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4420D05E2C2E4E2500263CF6 /* WaveformView.swift */; }; 4420D0612C2F6A8C00263CF6 /* CacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4420D0602C2F6A8C00263CF6 /* CacheManager.swift */; }; 443B0CA32E2366BD00D292B9 /* LiveCameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 443B0C9F2E2366BD00D292B9 /* LiveCameraView.swift */; }; @@ -32,9 +33,9 @@ 44E6EBD52C2B99D300BBF2F3 /* SpeechDictationApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44E6EBD42C2B99D300BBF2F3 /* SpeechDictationApp.swift */; }; 44E6EBD72C2B99D300BBF2F3 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44E6EBD62C2B99D300BBF2F3 /* ContentView.swift */; }; 44E6EBD82C2B99D400BBF2F4 /* EntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44E6EBD72C2B99D400BBF2F4 /* EntryView.swift */; }; + 44E6EBD92C2B99D500BBF2F3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 44E6EBD82C2B99D500BBF2F3 /* Assets.xcassets */; }; 44E6EBD92C2B99D500BBF2F5 /* CameraPermissionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44E6EBD82C2B99D500BBF2F5 /* CameraPermissionsView.swift */; }; 44E6EBDA2C2B99D600BBF2F6 /* CameraExperienceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44E6EBD92C2B99D600BBF2F6 /* CameraExperienceView.swift */; }; - 44E6EBD92C2B99D500BBF2F3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 44E6EBD82C2B99D500BBF2F3 /* Assets.xcassets */; }; 44E6EBDC2C2B99D500BBF2F3 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 44E6EBDB2C2B99D500BBF2F3 /* Preview Assets.xcassets */; }; 44E6EBE62C2B99D500BBF2F3 /* SpeechDictationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44E6EBE52C2B99D500BBF2F3 /* SpeechDictationTests.swift */; }; 44E6EBF02C2B99D500BBF2F3 /* SpeechDictationUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44E6EBEF2C2B99D500BBF2F3 /* SpeechDictationUITests.swift */; }; @@ -50,15 +51,14 @@ 4500003F2C60005000AAA116 /* MicSensitivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4500003E2C60005000AAA115 /* MicSensitivityView.swift */; }; 450000422C60007000AAA119 /* TimingDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000412C60007000AAA118 /* TimingDataManager.swift */; }; 450000432C60008000AAA120 /* AudioRecordingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000422C60008000AAA119 /* AudioRecordingManager.swift */; }; - 450001002C60008000AAA131 /* CameraSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000FF2C60008000AAA130 /* CameraSettingsManager.swift */; }; 450000442C60009000AAA121 /* AudioPlaybackManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000432C60009000AAA120 /* AudioPlaybackManager.swift */; }; 450000452C60010000AAA122 /* SpeechRecognizer+Timing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000442C60010000AAA121 /* SpeechRecognizer+Timing.swift */; }; + 450001002C60008000AAA131 /* CameraSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450000FF2C60008000AAA130 /* CameraSettingsManager.swift */; }; + 83AFD655C028498D8E6ADE1F /* SecureRecordingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AFD655C028498D8E6ADE20 /* SecureRecordingsView.swift */; }; + CE446A7C990C4714AC59E6C1 /* SecureRecordingBusinessLogicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE446A7C990C4714AC59E6C2 /* SecureRecordingBusinessLogicTests.swift */; }; F12F961D9ACF4AB98793429D /* LocalAuthenticationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12F961D9ACF4AB98793429E /* LocalAuthenticationManager.swift */; }; F12F961D9ACF4AB987934300 /* AudioSessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12F961D9ACF4AB987934301 /* AudioSessionManager.swift */; }; FA295D6C5DAA414DB909AF65 /* SecureRecordingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA295D6C5DAA414DB909AF66 /* SecureRecordingManager.swift */; }; - 83AFD655C028498D8E6ADE1F /* SecureRecordingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AFD655C028498D8E6ADE20 /* SecureRecordingsView.swift */; }; - 181C4C6BED7E47AAA4642AA3 /* SecureRecordingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181C4C6BED7E47AAA4642AA4 /* SecureRecordingTests.swift */; }; - CE446A7C990C4714AC59E6C1 /* SecureRecordingBusinessLogicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE446A7C990C4714AC59E6C2 /* SecureRecordingBusinessLogicTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -79,6 +79,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 181C4C6BED7E47AAA4642AA4 /* SecureRecordingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingTests.swift; sourceTree = ""; }; 4420D05E2C2E4E2500263CF6 /* WaveformView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaveformView.swift; sourceTree = ""; }; 4420D0602C2F6A8C00263CF6 /* CacheManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheManager.swift; sourceTree = ""; }; 443B0C9D2E2366BD00D292B9 /* CameraSceneDescriptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraSceneDescriptionView.swift; sourceTree = ""; }; @@ -105,9 +106,9 @@ 44E6EBD42C2B99D300BBF2F3 /* SpeechDictationApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechDictationApp.swift; sourceTree = ""; }; 44E6EBD62C2B99D300BBF2F3 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 44E6EBD72C2B99D400BBF2F4 /* EntryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryView.swift; sourceTree = ""; }; + 44E6EBD82C2B99D500BBF2F3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 44E6EBD82C2B99D500BBF2F5 /* CameraPermissionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraPermissionsView.swift; sourceTree = ""; }; 44E6EBD92C2B99D600BBF2F6 /* CameraExperienceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraExperienceView.swift; sourceTree = ""; }; - 44E6EBD82C2B99D500BBF2F3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 44E6EBDB2C2B99D500BBF2F3 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 44E6EBE12C2B99D500BBF2F3 /* SpeechDictationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SpeechDictationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 44E6EBE52C2B99D500BBF2F3 /* SpeechDictationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeechDictationTests.swift; sourceTree = ""; }; @@ -126,15 +127,14 @@ 4500003E2C60005000AAA115 /* MicSensitivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicSensitivityView.swift; sourceTree = ""; }; 450000412C60007000AAA118 /* TimingDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimingDataManager.swift; sourceTree = ""; }; 450000422C60008000AAA119 /* AudioRecordingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecordingManager.swift; sourceTree = ""; }; - 450000FF2C60008000AAA130 /* CameraSettingsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraSettingsManager.swift; sourceTree = ""; }; 450000432C60009000AAA120 /* AudioPlaybackManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlaybackManager.swift; sourceTree = ""; }; 450000442C60010000AAA121 /* SpeechRecognizer+Timing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SpeechRecognizer+Timing.swift"; sourceTree = ""; }; + 450000FF2C60008000AAA130 /* CameraSettingsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraSettingsManager.swift; sourceTree = ""; }; + 83AFD655C028498D8E6ADE20 /* SecureRecordingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingsView.swift; sourceTree = ""; }; + CE446A7C990C4714AC59E6C2 /* SecureRecordingBusinessLogicTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingBusinessLogicTests.swift; sourceTree = ""; }; F12F961D9ACF4AB98793429E /* LocalAuthenticationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthenticationManager.swift; sourceTree = ""; }; F12F961D9ACF4AB987934301 /* AudioSessionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioSessionManager.swift; sourceTree = ""; }; FA295D6C5DAA414DB909AF66 /* SecureRecordingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingManager.swift; sourceTree = ""; }; - 83AFD655C028498D8E6ADE20 /* SecureRecordingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingsView.swift; sourceTree = ""; }; - 181C4C6BED7E47AAA4642AA4 /* SecureRecordingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingTests.swift; sourceTree = ""; }; - CE446A7C990C4714AC59E6C2 /* SecureRecordingBusinessLogicTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureRecordingBusinessLogicTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -663,7 +663,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -696,7 +696,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -718,7 +718,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = RWZ25NGH8K; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.ShowBlender.SpeechDictationTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -737,7 +737,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = RWZ25NGH8K; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.ShowBlender.SpeechDictationTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -755,7 +755,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = RWZ25NGH8K; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.ShowBlender.SpeechDictationUITests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -773,7 +773,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = RWZ25NGH8K; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.ShowBlender.SpeechDictationUITests; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/SpeechDictation.xcodeproj/project.xcworkspace/xcuserdata/josephmccraw.xcuserdatad/UserInterfaceState.xcuserstate b/SpeechDictation.xcodeproj/project.xcworkspace/xcuserdata/josephmccraw.xcuserdatad/UserInterfaceState.xcuserstate index 432c3132554831e29103c6be842ec332fb3d5b49..13206d3874f6f9972f165298b2ec06952508cc20 100644 GIT binary patch literal 197315 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

R;=<=@&!*K9<0pG0-4c3*q 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 diff --git a/SpeechDictation/Services/SecureRecordingManager.swift b/SpeechDictation/Services/SecureRecordingManager.swift index 7a9b0d4..1152a23 100644 --- a/SpeechDictation/Services/SecureRecordingManager.swift +++ b/SpeechDictation/Services/SecureRecordingManager.swift @@ -56,6 +56,9 @@ final class SecureRecordingManager: ObservableObject { @Published private(set) var allSessions: [SecureRecordingSession] = [] @Published private(set) var recordingDuration: TimeInterval = 0 @Published private(set) var hasValidConsent = false + /// Live transcription text surfaced to the UI while secure recording is active. + /// Keeps the secure workflow in sync with the standard transcription experience. + @Published private(set) var liveTranscript: String = "" // MARK: - Private Properties @@ -66,6 +69,7 @@ final class SecureRecordingManager: ObservableObject { private var recordingTimer: Timer? private var cancellables = Set() + private var transcriptCancellable: AnyCancellable? private var currentAudioURL: URL? // MARK: - Initialization @@ -126,6 +130,13 @@ final class SecureRecordingManager: ObservableObject { currentSession = nil return nil } + liveTranscript = "" + transcriptCancellable?.cancel() + transcriptCancellable = speechRecognizer.$transcribedText + .receive(on: RunLoop.main) + .sink { [weak self] latestText in + self?.liveTranscript = latestText + } // Start on-device transcription with timing speechRecognizer.startTranscribingWithTiming(sessionId: sessionId) @@ -157,7 +168,7 @@ final class SecureRecordingManager: ObservableObject { let finalAudioURL = audioRecordingManager.stopRecording() // Stop transcription - speechRecognizer.stopTranscribing() + speechRecognizer.stopTranscribingWithTiming(audioFileURL: finalAudioURL) // Save transcript data securely await saveTranscriptSecurely(sessionId: session.id) @@ -186,6 +197,8 @@ final class SecureRecordingManager: ObservableObject { // Reload sessions list loadExistingSessions() + transcriptCancellable?.cancel() + transcriptCancellable = nil print("Completed secure recording session: \(session.id)") return session @@ -279,15 +292,17 @@ final class SecureRecordingManager: ObservableObject { private func saveTranscriptSecurely(sessionId: String) async { let transcript = speechRecognizer.transcribedText let currentSession = timingDataManager.currentSession - - let transcriptData = [ - "transcript": transcript, - "timingData": currentSession?.segments ?? [], - "savedAt": Date().ISO8601String - ] as [String: Any] + let payload = SecureTranscriptPayload( + transcript: transcript, + segments: currentSession?.segments ?? [], + savedAt: Date() + ) do { - let jsonData = try JSONSerialization.data(withJSONObject: transcriptData, options: .prettyPrinted) + let encoder = JSONEncoder() + encoder.outputFormatting = .prettyPrinted + encoder.dateEncodingStrategy = .iso8601 + let jsonData = try encoder.encode(payload) let fileName = "transcript_\(sessionId).json" let savedURL = cacheManager.saveSecurely( @@ -351,4 +366,10 @@ extension Date { var ISO8601String: String { return ISO8601DateFormatter().string(from: self) } -} \ No newline at end of file +} + +private struct SecureTranscriptPayload: Codable { + let transcript: String + let segments: [TranscriptionSegment] + let savedAt: Date +} \ No newline at end of file diff --git a/SpeechDictation/SpeechRecognitionViewModel.swift b/SpeechDictation/SpeechRecognitionViewModel.swift index 4dfcc0a..7727f63 100644 --- a/SpeechDictation/SpeechRecognitionViewModel.swift +++ b/SpeechDictation/SpeechRecognitionViewModel.swift @@ -16,11 +16,16 @@ private enum SettingsKey { static let audioQuality = "audioQuality" } +/// Root view model for live transcription and secure recording workflows. +/// Annotated with @MainActor because its published properties drive SwiftUI views +/// and it coordinates MainActor services such as `SecureRecordingManager`. +@MainActor class SpeechRecognizerViewModel: ObservableObject { @Published var transcribedText: String = "" @Published var fontSize: CGFloat = 24 @Published var theme: Theme = .light @Published var isRecording: Bool = false + @Published var isSecureRecordingActive: Bool = false @Published var volume: Float = 10.0 @Published var currentLevel: Float = 0.0 @Published var showSettings: Bool = false @@ -43,14 +48,19 @@ class SpeechRecognizerViewModel: ObservableObject { private var audioRecordingManager: AudioRecordingManager private var timingDataManager: TimingDataManager private var audioPlaybackManager: AudioPlaybackManager + private var secureRecordingManager: SecureRecordingManager private var cancellables = Set() private var persistenceCancellables = Set() - init(speechRecognizer: SpeechRecognizer = SpeechRecognizer()) { + init( + speechRecognizer: SpeechRecognizer = SpeechRecognizer(), + secureRecordingManager: SecureRecordingManager = SecureRecordingManager.shared + ) { self.speechRecognizer = speechRecognizer self.audioRecordingManager = AudioRecordingManager.shared self.timingDataManager = TimingDataManager.shared self.audioPlaybackManager = AudioPlaybackManager.shared + self.secureRecordingManager = secureRecordingManager // 1 --- LOAD PERSISTED VALUES --- let defaults = UserDefaults.standard @@ -114,6 +124,23 @@ class SpeechRecognizerViewModel: ObservableObject { self.audioPlaybackManager.$currentSegment .assign(to: \.currentSegment, on: self) .store(in: &cancellables) + + // Mirror secure recording state and transcript output + self.secureRecordingManager.$isRecording + .receive(on: RunLoop.main) + .sink { [weak self] isRecording in + self?.isSecureRecordingActive = isRecording + } + .store(in: &cancellables) + + self.secureRecordingManager.$liveTranscript + .receive(on: RunLoop.main) + .sink { [weak self] secureText in + guard let self = self else { return } + guard self.secureRecordingManager.isRecording else { return } + self.transcribedText = secureText + } + .store(in: &cancellables) // 3 --- PERSIST SETTINGS WHEN THEY CHANGE --- $fontSize @@ -183,6 +210,45 @@ class SpeechRecognizerViewModel: ObservableObject { isRecording = true } + /// Toggles secure recording workflow that captures audio + transcription with protection. + func toggleSecureRecording() { + Task { @MainActor in + if isSecureRecordingActive { + await stopSecureRecordingWorkflow() + } else { + await startSecureRecordingWorkflow() + } + } + } + + private func startSecureRecordingWorkflow() async { + guard !isRecording else { + print("Cannot start secure recording while live transcription is active") + return + } + + let result = await secureRecordingManager.startSecureRecording( + title: "", + hasConsent: true + ) + + guard result != nil else { + print("Secure recording failed to start") + return + } + + transcribedText = "" + segments.removeAll() + currentSession = nil + recordingDuration = 0 + print("Started secure recording workflow") + } + + private func stopSecureRecordingWorkflow() async { + _ = await secureRecordingManager.stopSecureRecording() + print("Stopped secure recording workflow") + } + func adjustVolume() { speechRecognizer.volume = volume } @@ -293,4 +359,5 @@ class SpeechRecognizerViewModel: ObservableObject { func getFormattedPlaybackDuration() -> String { return audioPlaybackManager.getFormattedDuration() } + } diff --git a/SpeechDictation/UI/ContentView.swift b/SpeechDictation/UI/ContentView.swift index ca0e113..c040b05 100644 --- a/SpeechDictation/UI/ContentView.swift +++ b/SpeechDictation/UI/ContentView.swift @@ -9,6 +9,9 @@ // import SwiftUI +#if canImport(UIKit) +import UIKit +#endif struct ContentView: View { @ObservedObject var viewModel = SpeechRecognizerViewModel() @@ -83,84 +86,11 @@ struct ContentView: View { } } - HStack { - Button(action: { - if self.viewModel.isRecording { - self.viewModel.stopTranscribing() - } else { - self.viewModel.startTranscribing() - } - }) { - Text(viewModel.isRecording ? "Stop Listening" : "Start Listening") - .font(.title2) - .fontWeight(.semibold) - .padding() - .background(primaryActionButtonColor) - .foregroundColor(.white) - .cornerRadius(10) - .shadow(color: shadowColor, radius: 2, x: 0, y: 0) - } - - // Reset button - clears text without stopping recording - Button(action: { - self.viewModel.resetTranscribedText() - }) { - Image(systemName: "arrow.clockwise") - .font(.title2) - .padding() - .background(resetButtonBackgroundColor) - .foregroundColor(resetButtonForegroundColor) - .clipShape(Circle()) - .shadow(color: shadowColor, radius: 2, x: 0, y: 0) - } - .disabled(viewModel.transcribedText.isEmpty) - .opacity(viewModel.transcribedText.isEmpty ? 0.5 : 1.0) - - Spacer() - - // Secure Recordings button - Button(action: { - showingSecureRecordings = true - }) { - Image(systemName: "lock.shield") - .font(.title2) - .padding() - .background(secureRecordingsButtonBackgroundColor) - .foregroundColor(secureRecordingsButtonForegroundColor) - .clipShape(Circle()) - .shadow(color: shadowColor, radius: 2, x: 0, y: 0) - } - .accessibilityLabel("Secure Recordings") - .accessibilityHint("Access private recordings with authentication") - - Button(action: { - showingCustomShare = true - }) { - Image(systemName: "square.and.arrow.up") - .font(.title2) - .padding() - .background(shareButtonBackgroundColor) - .foregroundColor(shareButtonForegroundColor) - .clipShape(Circle()) - .shadow(color: shadowColor, radius: 2, x: 0, y: 0) - } - .disabled(!canExport) - .opacity(canExport ? 1.0 : 0.5) - .padding(.trailing, 10) - - Button(action: { - self.viewModel.showSettings.toggle() - }) { - Image(systemName: "gear") - .font(.title2) - .padding() - .background(settingsButtonBackgroundColor) - .foregroundColor(settingsButtonForegroundColor) - .clipShape(Circle()) - .shadow(color: shadowColor, radius: 2, x: 0, y: 0) - } + VStack(spacing: 12) { + startControls + utilityControls } - .padding() + .padding(.horizontal) } .padding() @@ -214,42 +144,145 @@ struct ContentView: View { } } - private var primaryActionButtonColor: Color { - Color.accentColor + private var startControls: some View { + HStack(spacing: 12) { + startListeningButton + startRecordingButton + } } - private var resetButtonBackgroundColor: Color { - Color.orange.opacity(colorScheme == .dark ? 0.3 : 0.2) + private var utilityControls: some View { + ViewThatFits { + HStack(spacing: 12) { + utilityButtons + } + VStack(spacing: 12) { + utilityButtons + } + } } - private var resetButtonForegroundColor: Color { - Color.orange + @ViewBuilder + private var utilityButtons: some View { + utilityButton( + title: "Reset Text", + systemImage: "arrow.clockwise", + action: viewModel.resetTranscribedText, + isDisabled: viewModel.transcribedText.isEmpty + ) + + utilityButton( + title: "Secure Recordings", + systemImage: "lock.shield", + action: { showingSecureRecordings = true } + ) + + utilityButton( + title: "Share", + systemImage: "square.and.arrow.up", + action: { showingCustomShare = true }, + isDisabled: !canExport + ) + + utilityButton( + title: "Settings", + systemImage: "gearshape", + action: { viewModel.showSettings.toggle() } + ) + } + + private var startListeningButton: some View { + actionButton( + title: viewModel.isRecording ? "Stop" : "Transcribe", + systemImage: viewModel.isRecording ? "pause.circle.fill" : "waveform", + background: Color.accentColor, + action: { + if viewModel.isRecording { + viewModel.stopTranscribing() + } else { + viewModel.startTranscribing() + } + } + ) + .disabled(viewModel.isSecureRecordingActive) + .opacity(viewModel.isSecureRecordingActive ? 0.6 : 1.0) } - /// Secure recordings button styling following existing patterns - private var secureRecordingsButtonBackgroundColor: Color { - Color.blue.opacity(colorScheme == .dark ? 0.3 : 0.2) + private var startRecordingButton: some View { + actionButton( + title: viewModel.isSecureRecordingActive ? "Stop" : "Record", + systemImage: viewModel.isSecureRecordingActive ? "stop.circle.fill" : "mic.fill.badge.plus", + background: Color.orange, + action: { + viewModel.toggleSecureRecording() + } + ) + .disabled(viewModel.isRecording) + .opacity(viewModel.isRecording ? 0.6 : 1.0) } - /// Secure recordings button styling following existing patterns - private var secureRecordingsButtonForegroundColor: Color { - Color.blue + private func actionButton( + title: String, + systemImage: String, + background: Color, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + Label(title, systemImage: systemImage) + .font(.system(.title3, design: .default).weight(.semibold)) + .lineLimit(1) + .minimumScaleFactor(0.85) + .frame(maxWidth: .infinity) + .padding(.vertical, 14) + } + .buttonStyle(.plain) + .foregroundColor(.white) + .background( + RoundedRectangle(cornerRadius: 14) + .fill(background) + ) + .shadow(color: shadowColor.opacity(0.5), radius: 4, x: 0, y: 2) } - private var shareButtonBackgroundColor: Color { - Color.green.opacity(colorScheme == .dark ? 0.3 : 0.2) + private func utilityButton( + title: String, + systemImage: String, + action: @escaping () -> Void, + isDisabled: Bool = false + ) -> some View { + Button(action: action) { + Label(title, systemImage: systemImage) + .font(.system(.subheadline, design: .default).weight(.semibold)) + .lineLimit(1) + .minimumScaleFactor(0.9) + .frame(maxWidth: .infinity) + .padding(.vertical, 10) + } + .buttonStyle(.plain) + .foregroundColor(.primary) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(secondaryButtonBackgroundColor) + ) + .shadow(color: shadowColor.opacity(0.25), radius: 2, x: 0, y: 1) + .disabled(isDisabled) + .opacity(isDisabled ? 0.5 : 1.0) } - private var shareButtonForegroundColor: Color { - Color.green + private var secondaryButtonBackgroundColor: Color { + #if canImport(UIKit) + return Color(UIColor.secondarySystemBackground) + #else + return Color.gray.opacity(0.2) + #endif } - private var settingsButtonBackgroundColor: Color { - Color(UIColor.tertiarySystemFill) + private var resetButtonBackgroundColor: Color { + Color.orange.opacity(colorScheme == .dark ? 0.3 : 0.2) } - private var settingsButtonForegroundColor: Color { - Color.primary + private var resetButtonForegroundColor: Color { + Color.orange } private var overlayBackgroundColor: Color { diff --git a/memlog/changelog.md b/memlog/changelog.md index 750e9a1..efa5d2f 100644 --- a/memlog/changelog.md +++ b/memlog/changelog.md @@ -8,6 +8,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Fixed +- **Secure Recording Transcript Stability** - Fixed missing live transcription during secure recordings and resolved JSON serialization crash when stopping + - **Live Transcript Mirroring**: `SecureRecordingManager` now mirrors its `SpeechRecognizer` output through `liveTranscript`, and `SpeechRecognizerViewModel` listens to that publisher so the main transcript view updates while secure recording is active + - **Accurate Timing Finalization**: Secure recordings now stop transcription with `stopTranscribingWithTiming`, ensuring the timing session closes and metadata is committed before persistence + - **Codable Transcript Payload**: Replaced the `[String: Any]` blob passed to `JSONSerialization` with a strongly typed `SecureTranscriptPayload` encoded via `JSONEncoder`, eliminating the `Invalid type in JSON write (__SwiftValue)` crash + - **Session Reset UX**: Secure workflow clears the visible transcript and timing buffers on start, preventing stale text from previous sessions + - **Testing**: `utility/quick_iterate.sh` failed early because CoreSimulatorService was unavailable in this environment; code changes build locally outside the simulator requirement, but a full run should be retried once simulator runtimes are accessible - **Settings Button Crash** - Fixed "Publishing changes from within view updates" crash when clicking settings button - **Root Cause**: `applyTheme()` method in ContentView was calling `UIApplication.shared.windows.first?.overrideUserInterfaceStyle` during view updates - **Solution**: Removed theme application from view updates and modernized approach to use system appearance settings From fb6877142f8bc3e4804311563541767b7f10ffa5 Mon Sep 17 00:00:00 2001 From: Joe Date: Sat, 6 Dec 2025 10:08:53 -0800 Subject: [PATCH 3/3] Fix duplicate context declaration in PR workflow Removed redundant destructuring of 'context' from '@actions/github' in pr-summary.yml to resolve a SyntaxError. This change restores proper execution of the summary-comment and auto-label steps in the GitHub PR summary workflow. --- .github/workflows/pr-summary.yml | 3 --- memlog/changelog.md | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-summary.yml b/.github/workflows/pr-summary.yml index 340f1be..e30fcb1 100644 --- a/.github/workflows/pr-summary.yml +++ b/.github/workflows/pr-summary.yml @@ -22,8 +22,6 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const { context } = require('@actions/github'); - // Get PR details const pr = context.payload.pull_request; const prNumber = pr.number; @@ -85,7 +83,6 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const { context } = require('@actions/github'); const pr = context.payload.pull_request; // Get files changed diff --git a/memlog/changelog.md b/memlog/changelog.md index efa5d2f..ca2ecd6 100644 --- a/memlog/changelog.md +++ b/memlog/changelog.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Fixed +- **GitHub PR Summary Workflow Crash** - Resolved `SyntaxError: Identifier 'context' has already been declared` in `actions/github-script` + - Removed redundant `require('@actions/github')` destructuring inside `.github/workflows/pr-summary.yml` so the script uses the `context` object that GitHub already injects + - Change applies to both the summary-comment and auto-label steps, restoring the automation run - **Secure Recording Transcript Stability** - Fixed missing live transcription during secure recordings and resolved JSON serialization crash when stopping - **Live Transcript Mirroring**: `SecureRecordingManager` now mirrors its `SpeechRecognizer` output through `liveTranscript`, and `SpeechRecognizerViewModel` listens to that publisher so the main transcript view updates while secure recording is active - **Accurate Timing Finalization**: Secure recordings now stop transcription with `stopTranscribingWithTiming`, ensuring the timing session closes and metadata is committed before persistence