Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
folium-app
GitHub Repository: folium-app/Folium
Path: blob/a-new-beginning/Folium-iOS/Actors/MicrophoneAccess.swift
2 views
//
//  MicrophoneAccess.swift
//  Folium-iOS
//
//  Created by Jarrod Norwell on 12/7/2025.
//

/*
 MARK: 29/11/2025
 - Cleaned up LatestMicrophoneAccess, MicrophoneAccess actors
 - Made `checkAuthorisationStatus` async
 */

import AVFAudio

protocol MicrophoneAccessProtocol {
    init()
    
    func checkAuthorisationStatus() async
    func authorise() async -> Bool
}

// MARK: iOS 17+
@available(iOS 17, *)
actor LatestMicrophoneAccess : MicrophoneAccessProtocol {
    var authorised: Bool = false
    var status: AVAudioApplication.recordPermission = .undetermined
    
    init() {}
    
    func checkAuthorisationStatus() async {
        await withCheckedContinuation { continuation in
            status = AVAudioApplication.shared.recordPermission
            authorised = status == .granted
            continuation.resume()
        }
    }
    
    func authorise() async -> Bool {
        authorised = await AVAudioApplication.requestRecordPermission()
        return authorised
    }
}

// MARK: iOS 16
@available(iOS 16, *)
actor MicrophoneAccess : MicrophoneAccessProtocol  {
    var authorised: Bool = false
    var status: AVAudioSession.RecordPermission = .undetermined
    
    init() {}
    
    func checkAuthorisationStatus() async {
        await withCheckedContinuation { continuation in
            status = AVAudioSession.sharedInstance().recordPermission
            authorised = status == .granted
            continuation.resume()
        }
    }
    
    func authorise() async -> Bool {
        await withCheckedContinuation { continuation in
            AVAudioSession.sharedInstance().requestRecordPermission { result in
                continuation.resume(returning: result)
            }
        }
    }
}