Skip to content

Commit

Permalink
fix: refactor location auth publisher to new file
Browse files Browse the repository at this point in the history
  • Loading branch information
gtokman committed May 5, 2021
1 parent cfbfcf2 commit bec8289
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 1 deletion.
96 changes: 96 additions & 0 deletions Sources/ExtensionKit/CoreLocation/AuthorizationPublisher.swift
@@ -0,0 +1,96 @@
import Foundation
import Combine
import CoreLocation


protocol PublisherAuthorizationDelegate: class {
func send(status: CLAuthorizationStatus)
}

protocol SubscriptionAuthorizationDelegate: class {
func requestAuthorization(type: CLLocationManager.AuthorizationType)
}

final class AuthorizationSubscription <S: Subscriber>: NSObject,
PublisherAuthorizationDelegate,
Subscription where S.Input == CLAuthorizationStatus,
S.Failure == Never {

typealias Output = CLAuthorizationStatus
typealias Failure = Never

var subscriber: S?
private weak var delegate: SubscriptionAuthorizationDelegate?
private let authorizationType: CLLocationManager.AuthorizationType

init(
subscriber: S,
authorizationType: CLLocationManager.AuthorizationType,
delegate: SubscriptionAuthorizationDelegate
) {
self.subscriber = subscriber
self.delegate = delegate
self.authorizationType = authorizationType
}

func request(_ demand: Subscribers.Demand) {
delegate?.requestAuthorization(type: authorizationType)
}

func cancel() {
subscriber = nil
delegate = nil
}

func send(status: CLAuthorizationStatus) {
_ = subscriber?.receive(status)
}
}

final class AuthorizationPublisher: NSObject,
Publisher,
CLLocationManagerDelegate,
SubscriptionAuthorizationDelegate {

typealias Output = CLAuthorizationStatus
typealias Failure = Never

private let manager: CLLocationManager
private let authorizationType: CLLocationManager.AuthorizationType
private weak var publisherAuthorizationDelegate: PublisherAuthorizationDelegate?

init(manager: CLLocationManager, authorizationType: CLLocationManager.AuthorizationType) {
self.manager = manager
self.authorizationType = authorizationType
super.init()
self.manager.delegate = self
}

func receive<S>(subscriber: S) where S: Subscriber, AuthorizationPublisher.Failure == S.Failure, AuthorizationPublisher.Output == S.Input {
let subscription = AuthorizationSubscription(
subscriber: subscriber,
authorizationType: authorizationType,
delegate: self
)
subscriber.receive(subscription: subscription)
publisherAuthorizationDelegate = subscription
}

// MARK: - CLLocationManagerDelegate

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
publisherAuthorizationDelegate?.send(status: status)
}

// MARK: - AuthorizationSubscriptionDelegate

func requestAuthorization(type: CLLocationManager.AuthorizationType) {
switch type {
case .whenInUse:
manager.requestWhenInUseAuthorization()
case .always:
manager.requestAlwaysAuthorization()
}
}
}

15 changes: 14 additions & 1 deletion Sources/ExtensionKit/CoreLocation/CLLocationManager.swift
Expand Up @@ -2,7 +2,20 @@ import Combine
import CoreLocation

public extension CLLocationManager {


/*
/// Upgrade the user authoriztion status
requestLocationAuthorization()
.flatMap { status -> AnyPublisher<CLAuthorizationStatus, Never> in
if status == CLAuthorizationStatus.authorizedAlways {
return AuthorizationPublisher(manager: manager, authorizationType: type)
.eraseToAnyPublisher()
} else {
return Just(status)
.eraseToAnyPublisher()
}
}
**/
/// Request locaton authorization and subscribe to `CLAuthorizationStatus` updates
/// - Parameters:
/// - manager: `CLLocationManager`
Expand Down

0 comments on commit bec8289

Please sign in to comment.