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
4 years ago
|
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
|
||
|
}
|
||
|
}
|