SnoozeViewController.swift 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. //
  2. // SecondViewController.swift
  3. // LoopFollow
  4. //
  5. // Created by Jon Fawcett on 6/1/20.
  6. // Copyright © 2020 Jon Fawcett. All rights reserved.
  7. //
  8. import UIKit
  9. import UserNotifications
  10. class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate {
  11. var appStateController: AppStateController?
  12. var snoozeTabItem: UITabBarItem = UITabBarItem()
  13. var mainTabItem: UITabBarItem = UITabBarItem()
  14. var clockTimer: Timer = Timer()
  15. @IBOutlet weak var SnoozeButton: UIButton!
  16. @IBOutlet weak var BGLabel: UILabel!
  17. @IBOutlet weak var DirectionLabel: UILabel!
  18. @IBOutlet weak var DeltaLabel: UILabel!
  19. @IBOutlet weak var MinAgoLabel: UILabel!
  20. @IBOutlet weak var AlertLabel: UILabel!
  21. @IBOutlet weak var clockLabel: UILabel!
  22. @IBOutlet weak var snoozeForMinuteLabel: UILabel!
  23. @IBOutlet weak var snoozeForMinuteStepper: UIStepper!
  24. @IBOutlet weak var debugTextView: UITextView!
  25. @IBAction func SnoozeButton(_ sender: Any) {
  26. AlarmSound.stop()
  27. guard let mainVC = self.tabBarController!.viewControllers?[0] as? MainViewController else { return }
  28. mainVC.startCheckAlarmTimer(time: mainVC.checkAlarmInterval)
  29. let tabBarControllerItems = self.tabBarController?.tabBar.items
  30. if let arrayOfTabBarItems = tabBarControllerItems as! AnyObject as? NSArray{
  31. snoozeTabItem = arrayOfTabBarItems[2] as! UITabBarItem
  32. }
  33. setSnoozeTime()
  34. AlertLabel.isHidden = true
  35. SnoozeButton.isHidden = true
  36. clockLabel.isHidden = false
  37. snoozeForMinuteStepper.isHidden = true
  38. snoozeForMinuteLabel.isHidden = true
  39. if UserDefaultsRepository.debugLog.value {
  40. debugTextView.isHidden = false
  41. }
  42. }
  43. @IBAction func snoozeForMinuteValChanged(_ sender: UIStepper) {
  44. snoozeForMinuteLabel.text = Int(sender.value).description
  45. }
  46. // Update Time
  47. func startClockTimer(time: TimeInterval) {
  48. clockTimer = Timer.scheduledTimer(timeInterval: time,
  49. target: self,
  50. selector: #selector(clockTimerDidEnd(_:)),
  51. userInfo: nil,
  52. repeats: true)
  53. }
  54. // Update Time Ended
  55. @objc func clockTimerDidEnd(_ timer:Timer) {
  56. let formatter = DateFormatter()
  57. if dateTimeUtils.is24Hour() {
  58. formatter.setLocalizedDateFormatFromTemplate("HH:mm")
  59. } else {
  60. formatter.setLocalizedDateFormatFromTemplate("hh:mm a")
  61. }
  62. clockLabel.text = formatter.string(from: Date())
  63. }
  64. func updateDisplayWhenTriggered(bgVal: String, directionVal: String, deltaVal: String, minAgoVal: String, alertLabelVal: String){
  65. loadViewIfNeeded()
  66. BGLabel.text = bgVal
  67. DirectionLabel.text = directionVal
  68. DeltaLabel.text = deltaVal
  69. MinAgoLabel.text = minAgoVal
  70. AlertLabel.text = alertLabelVal
  71. if alertLabelVal == "none" { return }
  72. sendNotification(self, bgVal: bgVal, directionVal: directionVal, deltaVal: deltaVal, minAgoVal: minAgoVal, alertLabelVal: alertLabelVal)
  73. }
  74. func sendNotification(_ sender: Any, bgVal: String, directionVal: String, deltaVal: String, minAgoVal: String, alertLabelVal: String) {
  75. UNUserNotificationCenter.current().delegate = self
  76. let content = UNMutableNotificationContent()
  77. content.title = alertLabelVal
  78. content.subtitle += bgVal + " "
  79. content.subtitle += directionVal + " "
  80. content.subtitle += deltaVal
  81. content.categoryIdentifier = "category"
  82. // This is needed to trigger vibrate on watch and phone
  83. // TODO:
  84. // See if we can use .Critcal
  85. // See if we should use this method instead of direct sound player
  86. content.sound = .default
  87. let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
  88. let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
  89. UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
  90. let action = UNNotificationAction(identifier: "snooze", title: "Snooze", options: [])
  91. let category = UNNotificationCategory(identifier: "category", actions: [action], intentIdentifiers: [], options: [])
  92. UNUserNotificationCenter.current().setNotificationCategories([category])
  93. }
  94. func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
  95. if response.actionIdentifier == "snooze" {
  96. SnoozeButton(self)
  97. }
  98. }
  99. func setSnoozeTime()
  100. {
  101. if AlarmSound.whichAlarm == "Temporary Alert" {
  102. UserDefaultsRepository.alertTemporaryActive.value = false
  103. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  104. alarms.reloadIsSnoozed(key: "alertTemporaryActive", value: false)
  105. } else if AlarmSound.whichAlarm == "Urgent Low Alert" {
  106. UserDefaultsRepository.alertUrgentLowIsSnoozed.value = true
  107. UserDefaultsRepository.alertUrgentLowSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  108. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  109. alarms.reloadIsSnoozed(key: "alertUrgentLowIsSnoozed", value: true)
  110. alarms.reloadSnoozeTime(key: "alertUrgentLowSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  111. } else if AlarmSound.whichAlarm == "Low Alert" {
  112. UserDefaultsRepository.alertLowIsSnoozed.value = true
  113. UserDefaultsRepository.alertLowSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  114. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  115. alarms.reloadIsSnoozed(key: "alertLowIsSnoozed", value: true)
  116. alarms.reloadSnoozeTime(key: "alertLowSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  117. } else if AlarmSound.whichAlarm == "High Alert" {
  118. UserDefaultsRepository.alertHighIsSnoozed.value = true
  119. UserDefaultsRepository.alertHighSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  120. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  121. alarms.reloadIsSnoozed(key: "alertHighIsSnoozed", value: true)
  122. alarms.reloadSnoozeTime(key: "alertHighSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  123. } else if AlarmSound.whichAlarm == "Urgent High Alert" {
  124. UserDefaultsRepository.alertUrgentHighIsSnoozed.value = true
  125. UserDefaultsRepository.alertUrgentHighSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  126. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  127. alarms.reloadIsSnoozed(key: "alertUrgentHighIsSnoozed", value: true)
  128. alarms.reloadSnoozeTime(key: "alertUrgentHighSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  129. } else if AlarmSound.whichAlarm == "Fast Drop Alert" {
  130. UserDefaultsRepository.alertFastDropIsSnoozed.value = true
  131. UserDefaultsRepository.alertFastDropSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  132. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  133. alarms.reloadIsSnoozed(key: "alertFastDropIsSnoozed", value: true)
  134. alarms.reloadSnoozeTime(key: "alertFastDropSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  135. } else if AlarmSound.whichAlarm == "Fast Rise Alert" {
  136. UserDefaultsRepository.alertFastRiseIsSnoozed.value = true
  137. UserDefaultsRepository.alertFastRiseSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  138. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  139. alarms.reloadIsSnoozed(key: "alertFastRiseIsSnoozed", value: true)
  140. alarms.reloadSnoozeTime(key: "alertFastRiseSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  141. } else if AlarmSound.whichAlarm == "Missed Reading Alert" {
  142. UserDefaultsRepository.alertMissedReadingIsSnoozed.value = true
  143. UserDefaultsRepository.alertMissedReadingSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  144. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  145. alarms.reloadIsSnoozed(key: "alertMissedReadingIsSnoozed", value: true)
  146. alarms.reloadSnoozeTime(key: "alertMissedReadingSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  147. } else if AlarmSound.whichAlarm == "Sensor Change Alert" {
  148. UserDefaultsRepository.alertSAGEIsSnoozed.value = true
  149. UserDefaultsRepository.alertSAGESnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60))
  150. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  151. alarms.reloadIsSnoozed(key: "alertSAGEIsSnoozed", value: true)
  152. alarms.reloadSnoozeTime(key: "alertSAGESnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60)))
  153. } else if AlarmSound.whichAlarm == "Pump Change Alert" {
  154. UserDefaultsRepository.alertCAGEIsSnoozed.value = true
  155. UserDefaultsRepository.alertCAGESnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60))
  156. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  157. alarms.reloadIsSnoozed(key: "alertCAGEIsSnoozed", value: true)
  158. alarms.reloadSnoozeTime(key: "alertCAGESnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60)))
  159. } else if AlarmSound.whichAlarm == "Not Looping Alert" {
  160. UserDefaultsRepository.alertNotLoopingIsSnoozed.value = true
  161. UserDefaultsRepository.alertNotLoopingSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  162. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  163. alarms.reloadIsSnoozed(key: "alertNotLoopingIsSnoozed", value: true)
  164. alarms.reloadSnoozeTime(key: "alertNotLoopingSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  165. } else if AlarmSound.whichAlarm == "Missed Bolus Alert" {
  166. UserDefaultsRepository.alertMissedBolusIsSnoozed.value = true
  167. UserDefaultsRepository.alertMissedBolusSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
  168. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  169. alarms.reloadIsSnoozed(key: "alertMissedBolusIsSnoozed", value: true)
  170. alarms.reloadSnoozeTime(key: "alertMissedBolusSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
  171. } else if AlarmSound.whichAlarm == "Low Insulin Alert" {
  172. UserDefaultsRepository.alertPumpIsSnoozed.value = true
  173. UserDefaultsRepository.alertPumpSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60))
  174. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  175. alarms.reloadIsSnoozed(key: "alertPumpIsSnoozed", value: true)
  176. alarms.reloadSnoozeTime(key: "alertPumpSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60)))
  177. }
  178. }
  179. func setQuietHours(snoozeTime: Date)
  180. {
  181. if UserDefaultsRepository.alertMissedBolusQuiet.value {
  182. UserDefaultsRepository.alertMissedBolusIsSnoozed.value = true
  183. UserDefaultsRepository.alertMissedBolusSnoozedTime.value = snoozeTime
  184. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  185. alarms.reloadIsSnoozed(key: "alertMissedBolusIsSnoozed", value: true)
  186. alarms.reloadSnoozeTime(key: "alertMissedBolusSnoozedTime", setNil: false, value: snoozeTime)
  187. }
  188. if UserDefaultsRepository.alertOverrideStartQuiet.value {
  189. UserDefaultsRepository.alertOverrideStartIsSnoozed.value = true
  190. UserDefaultsRepository.alertOverrideStartSnoozedTime.value = snoozeTime
  191. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  192. alarms.reloadIsSnoozed(key: "alertOverrideStartIsSnoozed", value: true)
  193. alarms.reloadSnoozeTime(key: "alertOverrideStartSnoozedTime", setNil: false, value: snoozeTime)
  194. }
  195. if UserDefaultsRepository.alertOverrideEndQuiet.value {
  196. UserDefaultsRepository.alertOverrideEndIsSnoozed.value = true
  197. UserDefaultsRepository.alertOverrideEndSnoozedTime.value = snoozeTime
  198. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  199. alarms.reloadIsSnoozed(key: "alertOverrideEndIsSnoozed", value: true)
  200. alarms.reloadSnoozeTime(key: "alertOverrideEndSnoozedTime", setNil: false, value: snoozeTime)
  201. }
  202. if UserDefaultsRepository.alertCAGEQuiet.value {
  203. UserDefaultsRepository.alertCAGEIsSnoozed.value = true
  204. UserDefaultsRepository.alertCAGESnoozedTime.value = snoozeTime
  205. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  206. alarms.reloadIsSnoozed(key: "alertCAGEIsSnoozed", value: true)
  207. alarms.reloadSnoozeTime(key: "alertCAGESnoozedTime", setNil: false, value: snoozeTime)
  208. }
  209. if UserDefaultsRepository.alertSAGEQuiet.value {
  210. UserDefaultsRepository.alertSAGEIsSnoozed.value = true
  211. UserDefaultsRepository.alertSAGESnoozedTime.value = snoozeTime
  212. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  213. alarms.reloadIsSnoozed(key: "alertSAGEIsSnoozed", value: true)
  214. alarms.reloadSnoozeTime(key: "alertSAGESnoozedTime", setNil: false, value: snoozeTime)
  215. }
  216. if UserDefaultsRepository.alertPumpQuiet.value {
  217. UserDefaultsRepository.alertPumpIsSnoozed.value = true
  218. UserDefaultsRepository.alertPumpSnoozedTime.value = snoozeTime
  219. guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
  220. alarms.reloadIsSnoozed(key: "alertPumpIsSnoozed", value: true)
  221. alarms.reloadSnoozeTime(key: "alertPumpSnoozedTime", setNil: false, value: snoozeTime)
  222. }
  223. }
  224. override func viewDidLoad() {
  225. super.viewDidLoad()
  226. if UserDefaultsRepository.forceDarkMode.value {
  227. overrideUserInterfaceStyle = .dark
  228. }
  229. SnoozeButton.layer.cornerRadius = 5
  230. SnoozeButton.contentEdgeInsets = UIEdgeInsets(top: 10,left: 10,bottom: 10,right: 10)
  231. clockLabel.text = ""
  232. startClockTimer(time: 1)
  233. if UserDefaultsRepository.debugLog.value {
  234. debugTextView.isHidden = false
  235. clockLabel.isHidden = true
  236. }
  237. }
  238. }