forked from LoopKit/LoopKit
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathIssueAlertTableViewController.swift
155 lines (130 loc) · 5.43 KB
/
IssueAlertTableViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//
// IssueAlertTableViewController.swift
// MockKitUI
//
// Created by Rick Pasetto on 4/24/20.
// Copyright © 2020 LoopKit Authors. All rights reserved.
//
import UIKit
import LoopKit
import LoopKitUI
import MockKit
final class IssueAlertTableViewController: UITableViewController {
let cgmManager: MockCGMManager
static let delay = TimeInterval(60)
private enum AlertRow: Int, CaseIterable, CustomStringConvertible {
case immediate = 0
case delayed
case repeating
case issueLater
case buzz
case buzzCritical
case critical
case criticalDelayed
case retract // should be kept at the bottom of the list
var description: String {
switch self {
case .immediate: return "Issue an immediate alert"
case .delayed: return "Issue a \"delayed \(delay) seconds\" alert"
case .repeating: return "Issue a \"repeating every \(delay) seconds\" alert"
case .issueLater: return "Issue an immediate alert \(delay) seconds from now"
case .retract: return "Retract any alert above"
case .buzz: return "Issue an immediate vibrate alert"
case .buzzCritical: return "Issue an immediate critical vibrate alert"
case .critical: return "Issue a critical immediate alert"
case .criticalDelayed: return "Issue a \"delayed \(delay) seconds\" critical alert"
}
}
var trigger: Alert.Trigger {
switch self {
case .immediate: return .immediate
case .retract: return .immediate
case .critical: return .immediate
case .delayed: return .delayed(interval: delay)
case .criticalDelayed: return .delayed(interval: delay)
case .repeating: return .repeating(repeatInterval: delay)
case .issueLater: return .immediate
case .buzz: return .immediate
case .buzzCritical: return .immediate
}
}
var delayBeforeIssue: TimeInterval? {
switch self {
case .issueLater: return delay
default: return nil
}
}
var identifier: Alert.AlertIdentifier {
switch self {
case .buzz: return MockCGMManager.buzz.identifier
case .buzzCritical: return MockCGMManager.buzzCritical.identifier
case .critical, .criticalDelayed: return MockCGMManager.critical.identifier
default: return MockCGMManager.submarine.identifier
}
}
var metadata: Alert.Metadata? {
switch self {
case .buzz:
return Alert.Metadata(dict: [
"string": Alert.MetadataValue("Buzz"),
"int": Alert.MetadataValue(1),
"double": Alert.MetadataValue(2.34),
"bool": Alert.MetadataValue(true),
])
default:
return nil
}
}
}
init(cgmManager: MockCGMManager) {
self.cgmManager = cgmManager
super.init(style: .plain)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
title = "Issue Alerts"
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 44
tableView.register(TextButtonTableViewCell.self, forCellReuseIdentifier: TextButtonTableViewCell.className)
let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneTapped(_:)))
button.accessibilityIdentifier = "button_done"
navigationItem.setRightBarButton(button, animated: false)
}
@objc func doneTapped(_ sender: Any) {
done()
}
private func done() {
if let nav = navigationController as? SettingsNavigationViewController {
nav.notifyComplete()
}
}
// MARK: - UITableViewDataSource
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return AlertRow.allCases.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: TextButtonTableViewCell.className, for: indexPath) as! TextButtonTableViewCell
cell.textLabel?.text = String(describing: AlertRow(rawValue: indexPath.row)!)
cell.textLabel?.textAlignment = .center
cell.isEnabled = AlertRow(rawValue: indexPath.row)! == .retract && !cgmManager.hasRetractableAlert ? false : true
return cell
}
// MARK: - UITableViewDelegate
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let row = AlertRow(rawValue: indexPath.row)!
switch row {
case .retract:
cgmManager.retractCurrentAlert()
default:
cgmManager.issueAlert(identifier: row.identifier, trigger: row.trigger, delay: row.delayBeforeIssue, metadata: row.metadata)
}
tableView.deselectRow(at: indexPath, animated: true)
tableView.reloadRows(at: [IndexPath(row: AlertRow.retract.rawValue, section: indexPath.section)], with: .automatic)
}
}