Skip to content
Merged
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 @@ -25,10 +25,29 @@ import kotlin.coroutines.suspendCoroutine

internal class RemoteNotificationPermissionDelegate : PermissionDelegate {
override suspend fun providePermission() {
val currentCenter: UNUserNotificationCenter = UNUserNotificationCenter
.currentNotificationCenter()
return provideNotificationPermission(
getPermissionStatus()
)
}

override suspend fun getPermissionState(): PermissionState {
val status: UNAuthorizationStatus = getPermissionStatus()

return when (status) {
UNAuthorizationStatusAuthorized,
UNAuthorizationStatusProvisional,
UNAuthorizationStatusEphemeral,
-> PermissionState.Granted

UNAuthorizationStatusNotDetermined -> PermissionState.NotDetermined
UNAuthorizationStatusDenied -> PermissionState.DeniedAlways
else -> error("unknown push authorization status $status")
}
}

val status: UNAuthorizationStatus = suspendCoroutine { continuation ->
private suspend fun getPermissionStatus(): UNAuthorizationStatus {
val currentCenter = UNUserNotificationCenter.currentNotificationCenter()
return suspendCoroutine { continuation ->
currentCenter.getNotificationSettingsWithCompletionHandler(
mainContinuation { settings: UNNotificationSettings? ->
continuation.resumeWith(
Expand All @@ -39,10 +58,19 @@ internal class RemoteNotificationPermissionDelegate : PermissionDelegate {
}
)
}
}

private suspend fun provideNotificationPermission(
status: UNAuthorizationStatus
) {
when (status) {
UNAuthorizationStatusAuthorized -> return
UNAuthorizationStatusAuthorized,
UNAuthorizationStatusProvisional,
UNAuthorizationStatusEphemeral -> return

UNAuthorizationStatusNotDetermined -> {
val isSuccess = suspendCoroutine<Boolean> { continuation ->
// User has not yet chosen permission, request permission
val newStatus = suspendCoroutine<UNAuthorizationStatus> { continuation ->
UNUserNotificationCenter.currentNotificationCenter()
.requestAuthorizationWithOptions(
UNAuthorizationOptionSound
Expand All @@ -51,48 +79,18 @@ internal class RemoteNotificationPermissionDelegate : PermissionDelegate {
.or(UNAuthorizationOptionCarPlay),
mainContinuation { isOk, error ->
if (isOk && error == null) {
continuation.resumeWith(Result.success(true))
continuation.resumeWith(Result.success(UNAuthorizationStatusAuthorized))
} else {
continuation.resumeWith(Result.success(false))
continuation.resumeWith(Result.success(UNAuthorizationStatusDenied))
}
}
)
}
if (isSuccess) {
providePermission()
} else {
error("notifications permission failed")
}
provideNotificationPermission(newStatus)
}

UNAuthorizationStatusDenied -> throw DeniedAlwaysException(Permission.REMOTE_NOTIFICATION)
else -> error("notifications permission status $status")
}
}

override suspend fun getPermissionState(): PermissionState {
val currentCenter = UNUserNotificationCenter.currentNotificationCenter()

val status = suspendCoroutine<UNAuthorizationStatus> { continuation ->
currentCenter.getNotificationSettingsWithCompletionHandler(
mainContinuation { settings: UNNotificationSettings? ->
continuation.resumeWith(
Result.success(
settings?.authorizationStatus ?: UNAuthorizationStatusNotDetermined
)
)
}
)
}
return when (status) {
UNAuthorizationStatusAuthorized,
UNAuthorizationStatusProvisional,
UNAuthorizationStatusEphemeral,
-> PermissionState.Granted

UNAuthorizationStatusNotDetermined -> PermissionState.NotDetermined
UNAuthorizationStatusDenied -> PermissionState.DeniedAlways
else -> error("unknown push authorization status $status")
else -> error("unknown notifications authorization status $status")
}
}
}
Expand Down