NotificationSettings.swift 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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 let authorizationStatus: AuthorizationStatus
  90. public let soundSetting: NotificationSetting
  91. public let badgeSetting: NotificationSetting
  92. public let alertSetting: NotificationSetting
  93. public let notificationCenterSetting: NotificationSetting
  94. public let lockScreenSetting: NotificationSetting
  95. public let carPlaySetting: NotificationSetting
  96. public let alertStyle: AlertStyle
  97. public let showPreviewsSetting: ShowPreviewsSetting
  98. public let criticalAlertSetting: NotificationSetting
  99. public let providesAppNotificationSettings: Bool
  100. public let announcementSetting: NotificationSetting
  101. public let timeSensitiveSetting: NotificationSetting
  102. public let scheduledDeliverySetting: NotificationSetting
  103. public init(authorizationStatus: AuthorizationStatus,
  104. soundSetting: NotificationSetting,
  105. badgeSetting: NotificationSetting,
  106. alertSetting: NotificationSetting,
  107. notificationCenterSetting: NotificationSetting,
  108. lockScreenSetting: NotificationSetting,
  109. carPlaySetting: NotificationSetting,
  110. alertStyle: AlertStyle,
  111. showPreviewsSetting: ShowPreviewsSetting,
  112. criticalAlertSetting: NotificationSetting,
  113. providesAppNotificationSettings: Bool,
  114. announcementSetting: NotificationSetting,
  115. timeSensitiveSetting: NotificationSetting,
  116. scheduledDeliverySetting: NotificationSetting)
  117. {
  118. self.authorizationStatus = authorizationStatus
  119. self.soundSetting = soundSetting
  120. self.badgeSetting = badgeSetting
  121. self.alertSetting = alertSetting
  122. self.notificationCenterSetting = notificationCenterSetting
  123. self.lockScreenSetting = lockScreenSetting
  124. self.carPlaySetting = carPlaySetting
  125. self.alertStyle = alertStyle
  126. self.showPreviewsSetting = showPreviewsSetting
  127. self.criticalAlertSetting = criticalAlertSetting
  128. self.providesAppNotificationSettings = providesAppNotificationSettings
  129. self.announcementSetting = announcementSetting
  130. self.timeSensitiveSetting = timeSensitiveSetting
  131. self.scheduledDeliverySetting = scheduledDeliverySetting
  132. }
  133. }
  134. extension NotificationSettings: Codable {
  135. public init(from decoder: Decoder) throws {
  136. let container = try decoder.container(keyedBy: CodingKeys.self)
  137. self.init(
  138. authorizationStatus: try container.decode(AuthorizationStatus.self, forKey: .authorizationStatus),
  139. soundSetting: try container.decode(NotificationSetting.self, forKey: .soundSetting),
  140. badgeSetting: try container.decode(NotificationSetting.self, forKey: .badgeSetting),
  141. alertSetting: try container.decode(NotificationSetting.self, forKey: .alertSetting),
  142. notificationCenterSetting: try container.decode(NotificationSetting.self, forKey: .notificationCenterSetting),
  143. lockScreenSetting: try container.decode(NotificationSetting.self, forKey: .lockScreenSetting),
  144. carPlaySetting: try container.decode(NotificationSetting.self, forKey: .carPlaySetting),
  145. alertStyle: try container.decode(AlertStyle.self, forKey: .alertStyle),
  146. showPreviewsSetting: try container.decode(ShowPreviewsSetting.self, forKey: .showPreviewsSetting),
  147. criticalAlertSetting: try container.decode(NotificationSetting.self, forKey: .criticalAlertSetting),
  148. providesAppNotificationSettings: try container.decode(Bool.self, forKey: .providesAppNotificationSettings),
  149. announcementSetting: try container.decode(NotificationSetting.self, forKey: .announcementSetting),
  150. timeSensitiveSetting: try container.decodeIfPresent(NotificationSetting.self, forKey: .timeSensitiveSetting) ?? .unknown,
  151. scheduledDeliverySetting: try container.decodeIfPresent(NotificationSetting.self, forKey: .scheduledDeliverySetting) ?? .unknown)
  152. }
  153. // public func encode(to encoder: Encoder) throws {
  154. // let bloodGlucoseUnit = self.bloodGlucoseUnit ?? StoredSettings.codingGlucoseUnit
  155. // var container = encoder.container(keyedBy: CodingKeys.self)
  156. // try container.encode(date, forKey: .date)
  157. // try container.encode(controllerTimeZone, forKey: .controllerTimeZone)
  158. // try container.encode(dosingEnabled, forKey: .dosingEnabled)
  159. // try container.encodeIfPresent(glucoseTargetRangeSchedule, forKey: .glucoseTargetRangeSchedule)
  160. // try container.encodeIfPresent(preMealTargetRange?.doubleRange(for: bloodGlucoseUnit), forKey: .preMealTargetRange)
  161. // try container.encodeIfPresent(workoutTargetRange?.doubleRange(for: bloodGlucoseUnit), forKey: .workoutTargetRange)
  162. // try container.encodeIfPresent(overridePresets, forKey: .overridePresets)
  163. // try container.encodeIfPresent(scheduleOverride, forKey: .scheduleOverride)
  164. // try container.encodeIfPresent(preMealOverride, forKey: .preMealOverride)
  165. // try container.encodeIfPresent(maximumBasalRatePerHour, forKey: .maximumBasalRatePerHour)
  166. // try container.encodeIfPresent(maximumBolus, forKey: .maximumBolus)
  167. // try container.encodeIfPresent(suspendThreshold, forKey: .suspendThreshold)
  168. // try container.encodeIfPresent(insulinType, forKey: .insulinType)
  169. // try container.encodeIfPresent(deviceToken, forKey: .deviceToken)
  170. // try container.encodeIfPresent(defaultRapidActingModel, forKey: .defaultRapidActingModel)
  171. // try container.encodeIfPresent(basalRateSchedule, forKey: .basalRateSchedule)
  172. // try container.encodeIfPresent(insulinSensitivitySchedule, forKey: .insulinSensitivitySchedule)
  173. // try container.encodeIfPresent(carbRatioSchedule, forKey: .carbRatioSchedule)
  174. // try container.encodeIfPresent(notificationSettings, forKey: .notificationSettings)
  175. // try container.encodeIfPresent(controllerDevice, forKey: .controllerDevice)
  176. // try container.encodeIfPresent(cgmDevice.map { CodableDevice($0) }, forKey: .cgmDevice)
  177. // try container.encodeIfPresent(pumpDevice.map { CodableDevice($0) }, forKey: .pumpDevice)
  178. // try container.encode(bloodGlucoseUnit.unitString, forKey: .bloodGlucoseUnit)
  179. // try container.encode(automaticDosingStrategy, forKey: .automaticDosingStrategy)
  180. // try container.encode(syncIdentifier, forKey: .syncIdentifier)
  181. // }
  182. private enum CodingKeys: String, CodingKey {
  183. case authorizationStatus
  184. case soundSetting
  185. case badgeSetting
  186. case alertSetting
  187. case notificationCenterSetting
  188. case lockScreenSetting
  189. case carPlaySetting
  190. case alertStyle
  191. case showPreviewsSetting
  192. case criticalAlertSetting
  193. case providesAppNotificationSettings
  194. case announcementSetting
  195. case timeSensitiveSetting
  196. case scheduledDeliverySetting
  197. }
  198. }