IssueAlertTableViewController.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 criticalDelayed
  23. case retract // should be kept at the bottom of the list
  24. var description: String {
  25. switch self {
  26. case .immediate: return "Issue an immediate alert"
  27. case .delayed: return "Issue a \"delayed \(delay) seconds\" alert"
  28. case .repeating: return "Issue a \"repeating every \(delay) seconds\" alert"
  29. case .issueLater: return "Issue an immediate alert \(delay) seconds from now"
  30. case .retract: return "Retract any alert above"
  31. case .buzz: return "Issue an immediate vibrate alert"
  32. case .critical: return "Issue a critical immediate alert"
  33. case .criticalDelayed: return "Issue a \"delayed \(delay) seconds\" critical alert"
  34. }
  35. }
  36. var trigger: Alert.Trigger {
  37. switch self {
  38. case .immediate: return .immediate
  39. case .retract: return .immediate
  40. case .critical: return .immediate
  41. case .delayed: return .delayed(interval: delay)
  42. case .criticalDelayed: return .delayed(interval: delay)
  43. case .repeating: return .repeating(repeatInterval: delay)
  44. case .issueLater: return .immediate
  45. case .buzz: return .immediate
  46. }
  47. }
  48. var delayBeforeIssue: TimeInterval? {
  49. switch self {
  50. case .issueLater: return delay
  51. default: return nil
  52. }
  53. }
  54. var identifier: Alert.AlertIdentifier {
  55. switch self {
  56. case .buzz: return MockCGMManager.buzz.identifier
  57. case .critical, .criticalDelayed: return MockCGMManager.critical.identifier
  58. default: return MockCGMManager.submarine.identifier
  59. }
  60. }
  61. var metadata: Alert.Metadata? {
  62. switch self {
  63. case .buzz:
  64. return Alert.Metadata(dict: [
  65. "string": Alert.MetadataValue("Buzz"),
  66. "int": Alert.MetadataValue(1),
  67. "double": Alert.MetadataValue(2.34),
  68. "bool": Alert.MetadataValue(true),
  69. ])
  70. default:
  71. return nil
  72. }
  73. }
  74. }
  75. init(cgmManager: MockCGMManager) {
  76. self.cgmManager = cgmManager
  77. super.init(style: .plain)
  78. }
  79. required init?(coder: NSCoder) {
  80. fatalError("init(coder:) has not been implemented")
  81. }
  82. override func viewDidLoad() {
  83. super.viewDidLoad()
  84. title = "Issue Alerts"
  85. tableView.rowHeight = UITableView.automaticDimension
  86. tableView.estimatedRowHeight = 44
  87. tableView.register(TextButtonTableViewCell.self, forCellReuseIdentifier: TextButtonTableViewCell.className)
  88. let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneTapped(_:)))
  89. navigationItem.setRightBarButton(button, animated: false)
  90. }
  91. @objc func doneTapped(_ sender: Any) {
  92. done()
  93. }
  94. private func done() {
  95. if let nav = navigationController as? SettingsNavigationViewController {
  96. nav.notifyComplete()
  97. }
  98. }
  99. // MARK: - UITableViewDataSource
  100. override func numberOfSections(in tableView: UITableView) -> Int {
  101. return 1
  102. }
  103. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  104. return AlertRow.allCases.count
  105. }
  106. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  107. let cell = tableView.dequeueReusableCell(withIdentifier: TextButtonTableViewCell.className, for: indexPath) as! TextButtonTableViewCell
  108. cell.textLabel?.text = String(describing: AlertRow(rawValue: indexPath.row)!)
  109. cell.textLabel?.textAlignment = .center
  110. cell.isEnabled = AlertRow(rawValue: indexPath.row)! == .retract && !cgmManager.hasRetractableAlert ? false : true
  111. return cell
  112. }
  113. // MARK: - UITableViewDelegate
  114. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  115. let row = AlertRow(rawValue: indexPath.row)!
  116. switch row {
  117. case .retract:
  118. cgmManager.retractCurrentAlert()
  119. default:
  120. cgmManager.issueAlert(identifier: row.identifier, trigger: row.trigger, delay: row.delayBeforeIssue, metadata: row.metadata)
  121. }
  122. tableView.deselectRow(at: indexPath, animated: true)
  123. tableView.reloadRows(at: [IndexPath(row: AlertRow.retract.rawValue, section: indexPath.section)], with: .automatic)
  124. }
  125. }