NotificationSettings.swift 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. //
  2. // NotificationSettings.swift
  3. // LoopKit
  4. //
  5. // Created by Darin Krauss on 9/17/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import Foundation
  9. import UserNotifications
  10. public struct NotificationSettings: Equatable {
  11. public enum AuthorizationStatus: String, Codable {
  12. case notDetermined
  13. case denied
  14. case authorized
  15. case provisional
  16. case ephemeral
  17. case unknown
  18. public init(_ authorizationStatus: UNAuthorizationStatus) {
  19. switch authorizationStatus {
  20. case .notDetermined:
  21. self = .notDetermined
  22. case .denied:
  23. self = .denied
  24. case .authorized:
  25. self = .authorized
  26. case .provisional:
  27. self = .provisional
  28. case .ephemeral:
  29. self = .ephemeral
  30. @unknown default:
  31. self = .unknown
  32. }
  33. }
  34. }
  35. public enum NotificationSetting: String, Codable {
  36. case notSupported
  37. case disabled
  38. case enabled
  39. case unknown
  40. public init(_ notificationSetting: UNNotificationSetting) {
  41. switch notificationSetting {
  42. case .notSupported:
  43. self = .notSupported
  44. case .disabled:
  45. self = .disabled
  46. case .enabled:
  47. self = .enabled
  48. @unknown default:
  49. self = .unknown
  50. }
  51. }
  52. }
  53. public enum AlertStyle: String, Codable {
  54. case none
  55. case banner
  56. case alert
  57. case unknown
  58. public init(_ alertStyle: UNAlertStyle) {
  59. switch alertStyle {
  60. case .none:
  61. self = .none
  62. case .banner:
  63. self = .banner
  64. case .alert:
  65. self = .alert
  66. @unknown default:
  67. self = .unknown
  68. }
  69. }
  70. }
  71. public enum ShowPreviewsSetting: String, Codable {
  72. case always
  73. case whenAuthenticated
  74. case never
  75. case unknown
  76. public init(_ showPreviewsSetting: UNShowPreviewsSetting) {
  77. switch showPreviewsSetting {
  78. case .always:
  79. self = .always
  80. case .whenAuthenticated:
  81. self = .whenAuthenticated
  82. case .never:
  83. self = .never
  84. @unknown default:
  85. self = .unknown
  86. }
  87. }
  88. }
  89. public enum TemporaryMuteAlertSetting: Codable, Equatable {
  90. case disabled
  91. case enabled(TimeInterval)
  92. public init(enabled: Bool, duration: TimeInterval) {
  93. self = enabled ? .enabled(duration) : .disabled
  94. }
  95. }
  96. public let authorizationStatus: AuthorizationStatus
  97. public let soundSetting: NotificationSetting
  98. public let badgeSetting: NotificationSetting
  99. public let alertSetting: NotificationSetting
  100. public let notificationCenterSetting: NotificationSetting
  101. public let lockScreenSetting: NotificationSetting
  102. public let carPlaySetting: NotificationSetting
  103. public let alertStyle: AlertStyle
  104. public let showPreviewsSetting: ShowPreviewsSetting
  105. public let criticalAlertSetting: NotificationSetting
  106. public let providesAppNotificationSettings: Bool
  107. public let announcementSetting: NotificationSetting
  108. public let timeSensitiveSetting: NotificationSetting
  109. public let scheduledDeliverySetting: NotificationSetting
  110. public var temporaryMuteAlertsSetting: TemporaryMuteAlertSetting
  111. public init(authorizationStatus: AuthorizationStatus,
  112. soundSetting: NotificationSetting,
  113. badgeSetting: NotificationSetting,
  114. alertSetting: NotificationSetting,
  115. notificationCenterSetting: NotificationSetting,
  116. lockScreenSetting: NotificationSetting,
  117. carPlaySetting: NotificationSetting,
  118. alertStyle: AlertStyle,
  119. showPreviewsSetting: ShowPreviewsSetting,
  120. criticalAlertSetting: NotificationSetting,
  121. providesAppNotificationSettings: Bool,
  122. announcementSetting: NotificationSetting,
  123. timeSensitiveSetting: NotificationSetting,
  124. scheduledDeliverySetting: NotificationSetting,
  125. temporaryMuteAlertsSetting: TemporaryMuteAlertSetting)
  126. {
  127. self.authorizationStatus = authorizationStatus
  128. self.soundSetting = soundSetting
  129. self.badgeSetting = badgeSetting
  130. self.alertSetting = alertSetting
  131. self.notificationCenterSetting = notificationCenterSetting
  132. self.lockScreenSetting = lockScreenSetting
  133. self.carPlaySetting = carPlaySetting
  134. self.alertStyle = alertStyle
  135. self.showPreviewsSetting = showPreviewsSetting
  136. self.criticalAlertSetting = criticalAlertSetting
  137. self.providesAppNotificationSettings = providesAppNotificationSettings
  138. self.announcementSetting = announcementSetting
  139. self.timeSensitiveSetting = timeSensitiveSetting
  140. self.scheduledDeliverySetting = scheduledDeliverySetting
  141. self.temporaryMuteAlertsSetting = temporaryMuteAlertsSetting
  142. }
  143. }
  144. extension NotificationSettings: Codable {
  145. public init(from decoder: Decoder) throws {
  146. let container = try decoder.container(keyedBy: CodingKeys.self)
  147. self.init(
  148. authorizationStatus: try container.decode(AuthorizationStatus.self, forKey: .authorizationStatus),
  149. soundSetting: try container.decode(NotificationSetting.self, forKey: .soundSetting),
  150. badgeSetting: try container.decode(NotificationSetting.self, forKey: .badgeSetting),
  151. alertSetting: try container.decode(NotificationSetting.self, forKey: .alertSetting),
  152. notificationCenterSetting: try container.decode(NotificationSetting.self, forKey: .notificationCenterSetting),
  153. lockScreenSetting: try container.decode(NotificationSetting.self, forKey: .lockScreenSetting),
  154. carPlaySetting: try container.decode(NotificationSetting.self, forKey: .carPlaySetting),
  155. alertStyle: try container.decode(AlertStyle.self, forKey: .alertStyle),
  156. showPreviewsSetting: try container.decode(ShowPreviewsSetting.self, forKey: .showPreviewsSetting),
  157. criticalAlertSetting: try container.decode(NotificationSetting.self, forKey: .criticalAlertSetting),
  158. providesAppNotificationSettings: try container.decode(Bool.self, forKey: .providesAppNotificationSettings),
  159. announcementSetting: try container.decode(NotificationSetting.self, forKey: .announcementSetting),
  160. timeSensitiveSetting: try container.decodeIfPresent(NotificationSetting.self, forKey: .timeSensitiveSetting) ?? .unknown,
  161. scheduledDeliverySetting: try container.decodeIfPresent(NotificationSetting.self, forKey: .scheduledDeliverySetting) ?? .unknown,
  162. temporaryMuteAlertsSetting: try container.decodeIfPresent(TemporaryMuteAlertSetting.self, forKey: .temporaryMuteAlertsSetting) ?? .disabled)
  163. }
  164. private enum CodingKeys: String, CodingKey {
  165. case authorizationStatus
  166. case soundSetting
  167. case badgeSetting
  168. case alertSetting
  169. case notificationCenterSetting
  170. case lockScreenSetting
  171. case carPlaySetting
  172. case alertStyle
  173. case showPreviewsSetting
  174. case criticalAlertSetting
  175. case providesAppNotificationSettings
  176. case announcementSetting
  177. case timeSensitiveSetting
  178. case scheduledDeliverySetting
  179. case temporaryMuteAlertsSetting
  180. }
  181. }