mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			91 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Swift
		
	
| import Photos
 | |
| import PhotosUI
 | |
| 
 | |
| public func requestCameraPermissionIfNeeded() -> Bool {
 | |
|     switch AVCaptureDevice.authorizationStatus(for: .video) {
 | |
|     case .authorized: return true
 | |
|     case .denied, .restricted:
 | |
|         let modal = PermissionMissingModal(permission: "camera") { }
 | |
|         modal.modalPresentationStyle = .overFullScreen
 | |
|         modal.modalTransitionStyle = .crossDissolve
 | |
|         guard let presentingVC = CurrentAppContext().frontmostViewController() else { preconditionFailure() }
 | |
|         presentingVC.present(modal, animated: true, completion: nil)
 | |
|         return false
 | |
|     case .notDetermined:
 | |
|         AVCaptureDevice.requestAccess(for: .video, completionHandler: { _ in })
 | |
|         return false
 | |
|     default: return false
 | |
|     }
 | |
| }
 | |
| 
 | |
| public func requestMicrophonePermissionIfNeeded(onNotGranted: @escaping () -> Void) {
 | |
|     switch AVAudioSession.sharedInstance().recordPermission {
 | |
|     case .granted: break
 | |
|     case .denied:
 | |
|         onNotGranted()
 | |
|         let modal = PermissionMissingModal(permission: "microphone") {
 | |
|             onNotGranted()
 | |
|         }
 | |
|         modal.modalPresentationStyle = .overFullScreen
 | |
|         modal.modalTransitionStyle = .crossDissolve
 | |
|         guard let presentingVC = CurrentAppContext().frontmostViewController() else { preconditionFailure() }
 | |
|         presentingVC.present(modal, animated: true, completion: nil)
 | |
|     case .undetermined:
 | |
|         onNotGranted()
 | |
|         AVAudioSession.sharedInstance().requestRecordPermission { _ in }
 | |
|     default: break
 | |
|     }
 | |
| }
 | |
| 
 | |
| public func requestLibraryPermissionIfNeeded(onAuthorized: @escaping () -> Void) {
 | |
|     let authorizationStatus: PHAuthorizationStatus
 | |
|     if #available(iOS 14, *) {
 | |
|         authorizationStatus = PHPhotoLibrary.authorizationStatus(for: .readWrite)
 | |
|         if authorizationStatus == .notDetermined {
 | |
|             // When the user chooses to select photos (which is the .limit status),
 | |
|             // the PHPhotoUI will present the picker view on the top of the front view.
 | |
|             // Since we have the ScreenLockUI showing when we request premissions,
 | |
|             // the picker view will be presented on the top of the ScreenLockUI.
 | |
|             // However, the ScreenLockUI will dismiss with the permission request alert view, so
 | |
|             // the picker view then will dismiss, too. The selection process cannot be finished
 | |
|             // this way. So we add a flag (isRequestingPermission) to prevent the ScreenLockUI
 | |
|             // from showing when we request the photo library permission.
 | |
|             Environment.shared?.isRequestingPermission = true
 | |
|             let appMode = AppModeManager.shared.currentAppMode
 | |
|             // FIXME: Rather than setting the app mode to light and then to dark again once we're done,
 | |
|             // it'd be better to just customize the appearance of the image picker. There doesn't currently
 | |
|             // appear to be a good way to do so though...
 | |
|             AppModeManager.shared.setCurrentAppMode(to: .light)
 | |
|             PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
 | |
|                 DispatchQueue.main.async {
 | |
|                     AppModeManager.shared.setCurrentAppMode(to: appMode)
 | |
|                 }
 | |
|                 Environment.shared?.isRequestingPermission = false
 | |
|                 if [ PHAuthorizationStatus.authorized, PHAuthorizationStatus.limited ].contains(status) {
 | |
|                     onAuthorized()
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     } else {
 | |
|         authorizationStatus = PHPhotoLibrary.authorizationStatus()
 | |
|         if authorizationStatus == .notDetermined {
 | |
|             PHPhotoLibrary.requestAuthorization { status in
 | |
|                 if status == .authorized {
 | |
|                     onAuthorized()
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     switch authorizationStatus {
 | |
|     case .authorized, .limited:
 | |
|         onAuthorized()
 | |
|     case .denied, .restricted:
 | |
|         let modal = PermissionMissingModal(permission: "library") { }
 | |
|         modal.modalPresentationStyle = .overFullScreen
 | |
|         modal.modalTransitionStyle = .crossDissolve
 | |
|         guard let presentingVC = CurrentAppContext().frontmostViewController() else { preconditionFailure() }
 | |
|         presentingVC.present(modal, animated: true, completion: nil)
 | |
|     default: return
 | |
|     }
 | |
| }
 |