Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,18 @@ internal class LocationManagerDelegate : NSObject(), CLLocationManagerDelegatePr
locationManager.delegate = this
}

fun requestLocationAccess(callback: (CLAuthorizationStatus) -> Unit) {
fun requestWhenInUseAuthorization(callback: (CLAuthorizationStatus) -> Unit) {
this.callback = callback

locationManager.requestWhenInUseAuthorization()
}

fun requestAlwaysAuthorization(callback: (CLAuthorizationStatus) -> Unit) {
this.callback = callback

locationManager.requestAlwaysAuthorization()
}

override fun locationManager(
manager: CLLocationManager,
didChangeAuthorizationStatus: CLAuthorizationStatus
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ package dev.icerock.moko.permissions.location

import dev.icerock.moko.permissions.DeniedAlwaysException
import dev.icerock.moko.permissions.Permission
import dev.icerock.moko.permissions.PermissionState
import dev.icerock.moko.permissions.PermissionDelegate
import dev.icerock.moko.permissions.PermissionState
import platform.CoreLocation.CLAuthorizationStatus
import platform.CoreLocation.CLLocationManager
import platform.CoreLocation.kCLAuthorizationStatusAuthorizedAlways
Expand All @@ -30,8 +30,13 @@ private class LocationPermissionDelegate(
override suspend fun getPermissionState(): PermissionState {
val status: CLAuthorizationStatus = CLLocationManager.authorizationStatus()
return when (status) {
kCLAuthorizationStatusAuthorizedAlways,
kCLAuthorizationStatusAuthorizedWhenInUse -> PermissionState.Granted
kCLAuthorizationStatusAuthorizedAlways -> PermissionState.Granted
kCLAuthorizationStatusAuthorizedWhenInUse -> {
when (permission) {
BackgroundLocationPermission -> PermissionState.NotGranted
else -> PermissionState.Granted
}
}

kCLAuthorizationStatusNotDetermined -> PermissionState.NotDetermined
kCLAuthorizationStatusDenied,
Expand All @@ -44,21 +49,34 @@ private class LocationPermissionDelegate(
status: CLAuthorizationStatus
) {
when (status) {
kCLAuthorizationStatusAuthorizedAlways,
kCLAuthorizationStatusAuthorizedWhenInUse -> return

kCLAuthorizationStatusNotDetermined -> {
val newStatus = suspendCoroutine<CLAuthorizationStatus> { continuation ->
locationManagerDelegate.requestLocationAccess { continuation.resume(it) }
kCLAuthorizationStatusAuthorizedAlways -> Unit
kCLAuthorizationStatusAuthorizedWhenInUse -> {
if (permission == BackgroundLocationPermission) {
requestAlwaysAuthorization()
}
provideLocationPermission(newStatus)
}

kCLAuthorizationStatusNotDetermined -> requestWhenInUseAuthorization()

kCLAuthorizationStatusDenied,
kCLAuthorizationStatusRestricted -> throw DeniedAlwaysException(permission)
else -> error("unknown location authorization status $status")
}
}

private suspend fun requestWhenInUseAuthorization() {
val newStatus = suspendCoroutine { continuation ->
locationManagerDelegate.requestWhenInUseAuthorization { continuation.resume(it) }
}
provideLocationPermission(newStatus)
}

private suspend fun requestAlwaysAuthorization() {
val newStatus = suspendCoroutine { continuation ->
locationManagerDelegate.requestAlwaysAuthorization { continuation.resume(it) }
}
provideLocationPermission(newStatus)
}
}

actual val locationDelegate: PermissionDelegate =
Expand Down