Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
8ca862e
bump version for dev branch
ps2 Sep 25, 2017
57f19f8
Merge pull request #589 from LoopKit/bump-version
ps2 Sep 25, 2017
fec50e9
Set deployment target for WatchOS to 3.2
ps2 Sep 25, 2017
da39b9e
fix intermittent crash on deleting carbs
ps2 Sep 25, 2017
f5dc15d
Update Info.plist (#585)
paulforgione Sep 25, 2017
8b3ffb7
Merge pull request #590 from LoopKit/watchos3-build-fix
ps2 Sep 25, 2017
fa5124b
Merge pull request #591 from LoopKit/carb-crash
ps2 Sep 25, 2017
3a4fac4
Simplifying Rewind-Prime reconciliation
ps2 Oct 6, 2017
f50e1e1
Additional test coverage around suspend threshold behavior
ps2 Oct 6, 2017
6db6e6c
Faster status update
ps2 Oct 7, 2017
0e0816a
Autolayout warnings
ps2 Oct 7, 2017
f293561
Adjust time borders
ps2 Oct 7, 2017
c58dd8a
Merge pull request #602 from LoopKit/rewind-handling
ps2 Oct 7, 2017
d939229
Merge pull request #603 from LoopKit/test-suspend-threshold
ps2 Oct 7, 2017
448070b
Merge pull request #604 from LoopKit/faster-status-update
ps2 Oct 8, 2017
1affe64
Merge pull request #605 from LoopKit/autolayout-warnings
ps2 Oct 8, 2017
7b32162
Merge pull request #606 from LoopKit/green-loop-until-6-minutes
ps2 Oct 8, 2017
006a8cc
Remove Swift 3 support
ps2 Oct 8, 2017
27b9dbe
Merge pull request #607 from LoopKit/remove-swift3-support
ps2 Oct 8, 2017
0fdf10f
Merge pull request #2 from LoopKit/master
Kdisimone Oct 10, 2017
1ee1f7c
Merge pull request #3 from LoopKit/dev
Kdisimone Oct 11, 2017
bbc9a43
Update to LoopKit 1.5.1 (#617)
ps2 Nov 3, 2017
6a667eb
Revert inadvertant bundle id change, and add missing nib files
ps2 Nov 4, 2017
650a550
Merge pull request #619 from LoopKit/fix-missing-nibs
ps2 Nov 4, 2017
bb83268
Make carb entry time configurable when entered via Watch (#608) (#609)
mpangburn Nov 4, 2017
22980ac
Tweaks for 38mm watch
ps2 Nov 5, 2017
aa89841
Set pending bolus end date
ps2 Nov 13, 2017
5016266
Merge pull request #621 from LoopKit/master
ps2 Dec 5, 2017
337e4d5
Merge pull request #628 from LoopKit/set-pending-bolus-end-date
ps2 Dec 5, 2017
9f6de1e
Merge pull request #620 from LoopKit/38mm-tweaks
ps2 Dec 5, 2017
8b4f061
A few fixes to avoid compile-time warnings (#631)
elnjensen Dec 9, 2017
089360a
Fix logging and set background color
ps2 Dec 9, 2017
302bb40
Fix bolus end date charting
ps2 Dec 9, 2017
bea4d68
spanish translation for Loop
Kdisimone Dec 12, 2017
ef3be83
Merge pull request #4 from LoopKit/dev
Kdisimone Dec 13, 2017
a40da20
Merge pull request #638 from LoopKit/fix-bolus-end-date-charting
ps2 Dec 13, 2017
e10eff6
Merge pull request #637 from LoopKit/fix-logging
ps2 Dec 13, 2017
6453d5c
Add active insulin (IOB) value in Today widget (#635)
elnjensen Dec 13, 2017
9146f84
Update to LoopKit 1.5.2 and Swiftcharts 0.6.1
ps2 Dec 13, 2017
b935907
Merge pull request #640 from Kdisimone/spanish
ps2 Dec 13, 2017
56fd9e7
Merge pull request #639 from LoopKit/update-loopkit
ps2 Dec 13, 2017
32c9648
Merge pull request #6 from LoopKit/dev
Kdisimone Dec 14, 2017
6f5b030
testing russian redo
Kdisimone Dec 14, 2017
d305148
Merge pull request #643 from Kdisimone/test-russian
ps2 Dec 19, 2017
6f3a0e0
Update LoopKit to v1.5.3
ps2 Dec 19, 2017
ca1377d
Fetch pump data if needed, even after .noData CGM updates.
ps2 Dec 19, 2017
1cbf199
Merge pull request #646 from LoopKit/update-loopkit
ps2 Dec 19, 2017
07d7281
Merge pull request #647 from LoopKit/pump-data-fetch-fix
ps2 Dec 19, 2017
0792391
Bump version in prep for release
ps2 Dec 20, 2017
86f85bc
Merge pull request #649 from LoopKit/bump-version
ps2 Dec 20, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix intermittent crash on deleting carbs
  • Loading branch information
ps2 committed Sep 25, 2017
commit da39b9e8b7b9cce6d27859f77d4af08b0026717a
62 changes: 32 additions & 30 deletions Loop/View Controllers/CarbAbsorptionViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,18 +80,7 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl

private var refreshContext = RefreshContext.all

private var chartStartDate: Date {
get {
return charts.startDate
}
set {
if newValue != chartStartDate {
refreshContext = RefreshContext.all
}

charts.startDate = newValue
}
}
private var reloading = false

private var carbStatuses: [CarbStatus] = []

Expand All @@ -101,29 +90,36 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl

// MARK: - Data loading

override func reloadData(animated: Bool) {
guard active && !self.refreshContext.isEmpty else { return }
override func reloadData(animated: Bool = false) {
guard active && !reloading && !self.refreshContext.isEmpty else { return }
var currentContext = self.refreshContext
var retryContext: Set<RefreshContext> = []
self.refreshContext = []
reloading = true

// How far back should we show data? Use the screen size as a guide.
let minimumSegmentWidth: CGFloat = 75

let size = self.refreshContext.removeNewSize() ?? self.tableView.bounds.size
let size = currentContext.newSize ?? self.tableView.bounds.size
let availableWidth = size.width - self.charts.fixedHorizontalMargin
let totalHours = floor(Double(availableWidth / minimumSegmentWidth))

var components = DateComponents()
components.minute = 0
let date = Date(timeIntervalSinceNow: -TimeInterval(hours: max(1, totalHours)))
chartStartDate = Calendar.current.nextDate(after: date, matching: components, matchingPolicy: .strict, direction: .backward) ?? date
let chartStartDate = Calendar.current.nextDate(after: date, matching: components, matchingPolicy: .strict, direction: .backward) ?? date
if charts.startDate != chartStartDate {
currentContext.formUnion(RefreshContext.all)
}
charts.startDate = chartStartDate

let midnight = Calendar.current.startOfDay(for: Date())
let listStart = min(midnight, chartStartDate)

let reloadGroup = DispatchGroup()
let shouldUpdateGlucose = self.refreshContext.remove(.glucose) != nil
let shouldUpdateCarbs = self.refreshContext.remove(.carbs) != nil
let shouldUpdateGlucose = currentContext.contains(.glucose)
let shouldUpdateCarbs = currentContext.contains(.carbs)

var refreshContext = self.refreshContext
var carbEffects: [GlucoseEffect]?
var carbStatuses: [CarbStatus]?
var carbsOnBoard: CarbValue?
Expand All @@ -135,12 +131,12 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl
self.charts.glucoseUnit = unit
}

_ = refreshContext.remove(.status)
// TODO: Don't always assume currentContext.contains(.status)
reloadGroup.enter()
self.deviceManager.loopManager.getLoopState { (manager, state) in
if shouldUpdateGlucose || shouldUpdateCarbs {
let insulinCounteractionEffects = state.insulinCounteractionEffects
self.charts.setInsulinCounteractionEffects(state.insulinCounteractionEffects.filterDateRange(self.chartStartDate, nil))
self.charts.setInsulinCounteractionEffects(state.insulinCounteractionEffects.filterDateRange(chartStartDate, nil))

reloadGroup.enter()
manager.carbStore.getCarbStatus(start: listStart, effectVelocities: manager.settings.dynamicCarbAbsorptionEnabled ? insulinCounteractionEffects : nil) { (result) in
Expand All @@ -150,27 +146,27 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl
carbsOnBoard = status.clampedCarbsOnBoard
case .failure(let error):
self.deviceManager.logger.addError(error, fromSource: "CarbStore")
refreshContext.update(with: .carbs)
retryContext.update(with: .carbs)
}

reloadGroup.leave()
}

reloadGroup.enter()
manager.carbStore.getGlucoseEffects(start: self.chartStartDate, effectVelocities: manager.settings.dynamicCarbAbsorptionEnabled ? insulinCounteractionEffects : nil) { (result) in
manager.carbStore.getGlucoseEffects(start: chartStartDate, effectVelocities: manager.settings.dynamicCarbAbsorptionEnabled ? insulinCounteractionEffects : nil) { (result) in
switch result {
case .success(let effects):
carbEffects = effects
case .failure(let error):
carbEffects = []
self.deviceManager.logger.addError(error, fromSource: "CarbStore")
refreshContext.update(with: .carbs)
retryContext.update(with: .carbs)
}
reloadGroup.leave()
}
}

if refreshContext.remove(.targets) != nil {
if currentContext.contains(.targets) {
if let schedule = manager.settings.glucoseTargetRangeSchedule {
self.charts.targetPointsCalculator = GlucoseRangeScheduleCalculator(schedule)
} else {
Expand All @@ -189,7 +185,7 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl
carbTotal = total
case .failure(let error):
self.deviceManager.logger.addError(error, fromSource: "CarbStore")
refreshContext.update(with: .carbs)
retryContext.update(with: .carbs)
}

reloadGroup.leave()
Expand All @@ -200,7 +196,6 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl
}

reloadGroup.notify(queue: .main) {
self.refreshContext = refreshContext
if let carbEffects = carbEffects {
self.charts.setCarbEffects(carbEffects)
}
Expand All @@ -227,6 +222,15 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl
if let cell = self.tableView.cellForRow(at: IndexPath(row: 0, section: Section.totals.rawValue)) as? HeaderValuesTableViewCell {
self.updateCell(cell)
}

self.reloading = false
let reloadNow = !self.refreshContext.isEmpty
self.refreshContext.formUnion(retryContext)

// Trigger a reload if new context exists.
if reloadNow {
self.reloadData()
}
}
}

Expand Down Expand Up @@ -431,9 +435,7 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl

public override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let status = carbStatuses.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)

let status = carbStatuses[indexPath.row]
deviceManager.loopManager.carbStore.deleteCarbEntry(status.entry) { (success, error) -> Void in
DispatchQueue.main.async {
if success {
Expand Down
24 changes: 15 additions & 9 deletions Loop/View Controllers/StatusTableViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -427,13 +427,12 @@ final class StatusTableViewController: ChartsTableViewController {
self.tableView.endUpdates()

self.reloading = false
let reloadNow = !self.refreshContext.isEmpty
self.refreshContext.formUnion(retryContext)

// Trigger a reload if new context exists.
if !self.refreshContext.isEmpty {
self.refreshContext.formUnion(retryContext)
if reloadNow {
self.reloadData()
} else {
// If our only context is retry, wait for the next trigger
self.refreshContext.formUnion(retryContext)
}
}
}
Expand Down Expand Up @@ -739,10 +738,17 @@ final class StatusTableViewController: ChartsTableViewController {
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
switch Section(rawValue: indexPath.section)! {
case .charts:
// 20: Status bar
// 70: HUD
// 44: Toolbar
let availableSize = max(tableView.bounds.width, tableView.bounds.height) - 20 - 70 - 44
// Compute the height of the HUD, defaulting to 70
let hudHeight = ceil(hudView?.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height ?? 70)
var availableSize = max(tableView.bounds.width, tableView.bounds.height)

if #available(iOS 11.0, *) {
availableSize -= (tableView.safeAreaInsets.top + tableView.safeAreaInsets.bottom + hudHeight)
} else {
// 20: Status bar
// 44: Toolbar
availableSize -= hudHeight + 20 + 44
}

switch ChartRow(rawValue: indexPath.row)! {
case .glucose:
Expand Down