2021-09-20 23:07:38 +03:00

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)))
}
}