IssueAlertTableViewController.swift 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. //
  2. // IssueAlertTableViewController.swift
  3. // MockKitUI
  4. //
  5. // Created by Rick Pasetto on 4/24/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import UIKit
  9. import LoopKit
  10. import LoopKitUI
  11. import MockKit
  12. final class IssueAlertTableViewController: UITableViewController {
  13. let cgmManager: MockCGMManager
  14. static let delay = TimeInterval(60)
  15. private enum AlertRow: Int, CaseIterable, CustomStringConvertible {
  16. case immediate = 0
  17. case delayed
  18. case repeating
  19. case issueLater
  20. case buzz
  21. case critical
  22. case retract // should be kept at the bottom of the list
  23. var description: String {
  24. switch self {
  25. case .immediate: return "Issue an immediate alert"
  26. case .delayed: return "Issue a \"delayed \(delay) seconds\" alert"
  27. case .repeating: return "Issue a \"repeating every \(delay) seconds\" alert"
  28. case .issueLater: return "Issue an immediate alert \(delay) seconds from now"
  29. case .retract: return "Retract any alert above"
  30. case .buzz: return "Issue an immediate vibrate alert"
  31. case .critical: return "Issue a critical immediate alert"
  32. }
  33. }
  34. var trigger: Alert.Trigger {
  35. switch self {
  36. case .immediate: return .immediate
  37. case .retract: return .immediate
  38. case .critical: return .immediate
  39. case .delayed: return .delayed(interval: delay)
  40. case .repeating: return .repeating(repeatInterval: delay)
  41. case .issueLater: return .immediate
  42. case .buzz: return .immediate
  43. }
  44. }
  45. var delayBeforeIssue: TimeInterval? {
  46. switch self {
  47. case .issueLater: return delay
  48. default: return nil
  49. }
  50. }
  51. var identifier: Alert.AlertIdentifier {
  52. switch self {
  53. case .buzz: return MockCGMManager.buzz.identifier
  54. case .critical: return MockCGMManager.critical.identifier
  55. default: return MockCGMManager.submarine.identifier
  56. }
  57. }
  58. }
  59. init(cgmManager: MockCGMManager) {
  60. self.cgmManager = cgmManager
  61. super.init(style: .plain)
  62. }
  63. required init?(coder: NSCoder) {
  64. fatalError("init(coder:) has not been implemented")
  65. }
  66. override func viewDidLoad() {
  67. super.viewDidLoad()
  68. title = "Issue Alerts"
  69. tableView.rowHeight = UITableView.automaticDimension
  70. tableView.estimatedRowHeight = 44
  71. tableView.register(TextButtonTableViewCell.self, forCellReuseIdentifier: TextButtonTableViewCell.className)
  72. let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneTapped(_:)))
  73. navigationItem.setRightBarButton(button, animated: false)
  74. }
  75. @objc func doneTapped(_ sender: Any) {
  76. done()
  77. }
  78. private func done() {
  79. if let nav = navigationController as? SettingsNavigationViewController {
  80. nav.notifyComplete()
  81. }
  82. if let nav = navigationController as? MockPumpManagerSetupViewController {
  83. nav.finishedSettingsDisplay()
  84. }
  85. }
  86. // MARK: - UITableViewDataSource
  87. override func numberOfSections(in tableView: UITableView) -> Int {
  88. return 1
  89. }
  90. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  91. return AlertRow.allCases.count
  92. }
  93. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  94. let cell = tableView.dequeueReusableCell(withIdentifier: TextButtonTableViewCell.className, for: indexPath) as! TextButtonTableViewCell
  95. cell.textLabel?.text = String(describing: AlertRow(rawValue: indexPath.row)!)
  96. cell.textLabel?.textAlignment = .center
  97. cell.isEnabled = AlertRow(rawValue: indexPath.row)! == .retract && !cgmManager.hasRetractableAlert ? false : true
  98. return cell
  99. }
  100. // MARK: - UITableViewDelegate
  101. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  102. let row = AlertRow(rawValue: indexPath.row)!
  103. switch row {
  104. case .retract:
  105. cgmManager.retractCurrentAlert()
  106. default:
  107. cgmManager.issueAlert(identifier: row.identifier, trigger: row.trigger, delay: row.delayBeforeIssue)
  108. }
  109. tableView.deselectRow(at: indexPath, animated: true)
  110. tableView.reloadRows(at: [IndexPath(row: AlertRow.retract.rawValue, section: indexPath.section)], with: .automatic)
  111. }
  112. }