mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
83 lines
3.0 KiB
Swift
83 lines
3.0 KiB
Swift
import Foundation
|
|
import SwiftSignalKit
|
|
import TelegramCore
|
|
import DeviceAccess
|
|
import AccountContext
|
|
|
|
public enum PermissionKind: Int32 {
|
|
case contacts
|
|
case notifications
|
|
case siri
|
|
case cellularData
|
|
case nearbyLocation
|
|
}
|
|
|
|
public enum PermissionRequestStatus {
|
|
case requestable
|
|
case denied
|
|
case unreachable
|
|
case allowed
|
|
|
|
public init(accessType: AccessType) {
|
|
switch accessType {
|
|
case .notDetermined:
|
|
self = .requestable
|
|
case .denied, .restricted:
|
|
self = .denied
|
|
case .unreachable:
|
|
self = .unreachable
|
|
case .allowed:
|
|
self = .allowed
|
|
}
|
|
}
|
|
}
|
|
|
|
public enum PermissionState: Equatable {
|
|
case contacts(status: PermissionRequestStatus)
|
|
case notifications(status: PermissionRequestStatus)
|
|
case siri(status: PermissionRequestStatus)
|
|
case cellularData(status: PermissionRequestStatus)
|
|
case nearbyLocation(status: PermissionRequestStatus)
|
|
|
|
public var kind: PermissionKind {
|
|
switch self {
|
|
case .contacts:
|
|
return .contacts
|
|
case .notifications:
|
|
return .notifications
|
|
case .siri:
|
|
return .siri
|
|
case .cellularData:
|
|
return .cellularData
|
|
case .nearbyLocation:
|
|
return .nearbyLocation
|
|
}
|
|
}
|
|
|
|
public var status: PermissionRequestStatus {
|
|
switch self {
|
|
case let .contacts(status):
|
|
return status
|
|
case let .notifications(status):
|
|
return status
|
|
case let .siri(status):
|
|
return status
|
|
case let .cellularData(status):
|
|
return status
|
|
case let .nearbyLocation(status):
|
|
return status
|
|
}
|
|
}
|
|
}
|
|
|
|
public func requiredPermissions(context: AccountContext) -> Signal<(contacts: PermissionState, notifications: PermissionState, cellularData: PermissionState, siri: PermissionState), NoError> {
|
|
return combineLatest(DeviceAccess.authorizationStatus(subject: .contacts), DeviceAccess.authorizationStatus(applicationInForeground: context.sharedContext.applicationBindings.applicationInForeground, subject: .notifications), DeviceAccess.authorizationStatus(siriAuthorization: {
|
|
return context.sharedContext.applicationBindings.siriAuthorization()
|
|
}, subject: .cellularData), DeviceAccess.authorizationStatus(siriAuthorization: {
|
|
return context.sharedContext.applicationBindings.siriAuthorization()
|
|
}, subject: .siri))
|
|
|> map { contactsStatus, notificationsStatus, cellularDataStatus, siriStatus in
|
|
return (.contacts(status: PermissionRequestStatus(accessType: contactsStatus)), .notifications(status: PermissionRequestStatus(accessType: notificationsStatus)), .cellularData(status: PermissionRequestStatus(accessType: cellularDataStatus)), .siri(status: PermissionRequestStatus(accessType: siriStatus)))
|
|
}
|
|
}
|