From 0d61d80fc99167c498beab00465c96d44bcfe62d Mon Sep 17 00:00:00 2001 From: marionbarker Date: Thu, 25 Jul 2024 16:48:25 -0700 Subject: [PATCH 1/2] display week of meals, based on PR 2163 and 2182 --- meal_week/meal_week.patch | 89 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 meal_week/meal_week.patch diff --git a/meal_week/meal_week.patch b/meal_week/meal_week.patch new file mode 100644 index 0000000..1191267 --- /dev/null +++ b/meal_week/meal_week.patch @@ -0,0 +1,89 @@ +Submodule Loop contains modified content +diff --git a/Loop/Loop/Managers/LoopDataManager.swift b/Loop/Loop/Managers/LoopDataManager.swift +index 2319f4ec..920ad2f9 100644 +--- a/Loop/Loop/Managers/LoopDataManager.swift ++++ b/Loop/Loop/Managers/LoopDataManager.swift +@@ -992,7 +992,7 @@ extension LoopDataManager { + + let retrospectiveStart = lastGlucoseDate.addingTimeInterval(-type(of: retrospectiveCorrection).retrospectionInterval) + +- let earliestEffectDate = Date(timeInterval: .hours(-24), since: now()) ++ let earliestEffectDate = Date(timeInterval: .hours(-7*24), since: now()) + let nextCounteractionEffectDate = insulinCounteractionEffects.last?.endDate ?? earliestEffectDate + let insulinEffectStartDate = nextCounteractionEffectDate.addingTimeInterval(.minutes(-5)) + +diff --git a/Loop/Loop/View Controllers/CarbAbsorptionViewController.swift b/Loop/Loop/View Controllers/CarbAbsorptionViewController.swift +index fc770192..0b85b4c2 100644 +--- a/Loop/Loop/View Controllers/CarbAbsorptionViewController.swift ++++ b/Loop/Loop/View Controllers/CarbAbsorptionViewController.swift +@@ -139,7 +139,7 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + charts.updateEndDate(chartStartDate.addingTimeInterval(.hours(totalHours+1))) // When there is no data, this allows presenting current hour + 1 + + let midnight = Calendar.current.startOfDay(for: Date()) +- let listStart = min(midnight, chartStartDate, Date(timeIntervalSinceNow: -deviceManager.carbStore.maximumAbsorptionTimeInterval)) ++ let previousMidnight = midnight - .hours(6*24) + + let reloadGroup = DispatchGroup() + let shouldUpdateGlucose = currentContext.contains(.glucose) +@@ -158,11 +158,19 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + let allInsulinCounteractionEffects = state.insulinCounteractionEffects + insulinCounteractionEffects = allInsulinCounteractionEffects.filterDateRange(chartStartDate, nil) + ++ let earliestCounteractionEffect = allInsulinCounteractionEffects.first?.startDate ?? Date() ++ // Show carb entries as far back as previous midnight, or only as far back as counteraction effects are available ++ let boundOnCarbList = max(previousMidnight, earliestCounteractionEffect) ++ // If counteraction effects are missing, at least show all the entries for today and those on the chart ++ let displayListStart = min(boundOnCarbList, midnight, chartStartDate) ++ // To estimate dynamic carb absorption for the entry at the start of the list, we need to fetch samples that might still be absorbing ++ let fetchEntriesStart = displayListStart.addingTimeInterval(-self.deviceManager.carbStore.maximumAbsorptionTimeInterval) ++ + reloadGroup.enter() +- self.deviceManager.carbStore.getCarbStatus(start: listStart, end: nil, effectVelocities: allInsulinCounteractionEffects) { (result) in ++ self.deviceManager.carbStore.getCarbStatus(start: fetchEntriesStart, end: nil, effectVelocities: allInsulinCounteractionEffects) { (result) in + switch result { + case .success(let status): +- carbStatuses = status ++ carbStatuses = status.filterDateRange(displayListStart, nil) + carbsOnBoard = status.getClampedCarbsOnBoard() + case .failure(let error): + self.log.error("CarbStore failed to get carbStatus: %{public}@", String(describing: error)) +@@ -173,7 +181,7 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + } + + reloadGroup.enter() +- self.deviceManager.carbStore.getGlucoseEffects(start: chartStartDate, end: nil, effectVelocities: insulinCounteractionEffects!) { (result) in ++ self.deviceManager.carbStore.getGlucoseEffects(start: chartStartDate, end: nil, effectVelocities: allInsulinCounteractionEffects) { (result) in + switch result { + case .success((_, let effects)): + carbEffects = effects +@@ -287,6 +295,14 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + return formatter + }() + ++ private lazy var relativeTimeFormatter: DateFormatter = { ++ let formatter = DateFormatter() ++ formatter.dateStyle = .medium ++ formatter.doesRelativeDateFormatting = true ++ formatter.timeStyle = .short ++ return formatter ++ }() ++ + override func numberOfSections(in tableView: UITableView) -> Int { + return Section.count + } +@@ -343,7 +359,14 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + } + + // Entry time +- let startTime = timeFormatter.string(from: status.entry.startDate) ++ let startTime: String ++ // Indicate if an entry is from the previous day to avoid potential confusion ++ let midnight = Calendar.current.startOfDay(for: Date()) ++ if status.entry.startDate < midnight { ++ startTime = relativeTimeFormatter.string(from: status.entry.startDate) ++ } else { ++ startTime = timeFormatter.string(from: status.entry.startDate) ++ } + if let absorptionTime = status.entry.absorptionTime, + let duration = absorptionFormatter.string(from: absorptionTime) + { From ef34f6c0ffbce3866ca756afb92be5ed27d269f2 Mon Sep 17 00:00:00 2001 From: marionbarker Date: Fri, 26 Jul 2024 05:53:58 -0700 Subject: [PATCH 2/2] modify variable name to earliestMidnight --- .../meal_week_before_variable_rename.patch | 89 +++++++++++++++++++ meal_week/meal_week.patch | 6 +- 2 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 meal_week/archive/meal_week_before_variable_rename.patch diff --git a/meal_week/archive/meal_week_before_variable_rename.patch b/meal_week/archive/meal_week_before_variable_rename.patch new file mode 100644 index 0000000..1191267 --- /dev/null +++ b/meal_week/archive/meal_week_before_variable_rename.patch @@ -0,0 +1,89 @@ +Submodule Loop contains modified content +diff --git a/Loop/Loop/Managers/LoopDataManager.swift b/Loop/Loop/Managers/LoopDataManager.swift +index 2319f4ec..920ad2f9 100644 +--- a/Loop/Loop/Managers/LoopDataManager.swift ++++ b/Loop/Loop/Managers/LoopDataManager.swift +@@ -992,7 +992,7 @@ extension LoopDataManager { + + let retrospectiveStart = lastGlucoseDate.addingTimeInterval(-type(of: retrospectiveCorrection).retrospectionInterval) + +- let earliestEffectDate = Date(timeInterval: .hours(-24), since: now()) ++ let earliestEffectDate = Date(timeInterval: .hours(-7*24), since: now()) + let nextCounteractionEffectDate = insulinCounteractionEffects.last?.endDate ?? earliestEffectDate + let insulinEffectStartDate = nextCounteractionEffectDate.addingTimeInterval(.minutes(-5)) + +diff --git a/Loop/Loop/View Controllers/CarbAbsorptionViewController.swift b/Loop/Loop/View Controllers/CarbAbsorptionViewController.swift +index fc770192..0b85b4c2 100644 +--- a/Loop/Loop/View Controllers/CarbAbsorptionViewController.swift ++++ b/Loop/Loop/View Controllers/CarbAbsorptionViewController.swift +@@ -139,7 +139,7 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + charts.updateEndDate(chartStartDate.addingTimeInterval(.hours(totalHours+1))) // When there is no data, this allows presenting current hour + 1 + + let midnight = Calendar.current.startOfDay(for: Date()) +- let listStart = min(midnight, chartStartDate, Date(timeIntervalSinceNow: -deviceManager.carbStore.maximumAbsorptionTimeInterval)) ++ let previousMidnight = midnight - .hours(6*24) + + let reloadGroup = DispatchGroup() + let shouldUpdateGlucose = currentContext.contains(.glucose) +@@ -158,11 +158,19 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + let allInsulinCounteractionEffects = state.insulinCounteractionEffects + insulinCounteractionEffects = allInsulinCounteractionEffects.filterDateRange(chartStartDate, nil) + ++ let earliestCounteractionEffect = allInsulinCounteractionEffects.first?.startDate ?? Date() ++ // Show carb entries as far back as previous midnight, or only as far back as counteraction effects are available ++ let boundOnCarbList = max(previousMidnight, earliestCounteractionEffect) ++ // If counteraction effects are missing, at least show all the entries for today and those on the chart ++ let displayListStart = min(boundOnCarbList, midnight, chartStartDate) ++ // To estimate dynamic carb absorption for the entry at the start of the list, we need to fetch samples that might still be absorbing ++ let fetchEntriesStart = displayListStart.addingTimeInterval(-self.deviceManager.carbStore.maximumAbsorptionTimeInterval) ++ + reloadGroup.enter() +- self.deviceManager.carbStore.getCarbStatus(start: listStart, end: nil, effectVelocities: allInsulinCounteractionEffects) { (result) in ++ self.deviceManager.carbStore.getCarbStatus(start: fetchEntriesStart, end: nil, effectVelocities: allInsulinCounteractionEffects) { (result) in + switch result { + case .success(let status): +- carbStatuses = status ++ carbStatuses = status.filterDateRange(displayListStart, nil) + carbsOnBoard = status.getClampedCarbsOnBoard() + case .failure(let error): + self.log.error("CarbStore failed to get carbStatus: %{public}@", String(describing: error)) +@@ -173,7 +181,7 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + } + + reloadGroup.enter() +- self.deviceManager.carbStore.getGlucoseEffects(start: chartStartDate, end: nil, effectVelocities: insulinCounteractionEffects!) { (result) in ++ self.deviceManager.carbStore.getGlucoseEffects(start: chartStartDate, end: nil, effectVelocities: allInsulinCounteractionEffects) { (result) in + switch result { + case .success((_, let effects)): + carbEffects = effects +@@ -287,6 +295,14 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + return formatter + }() + ++ private lazy var relativeTimeFormatter: DateFormatter = { ++ let formatter = DateFormatter() ++ formatter.dateStyle = .medium ++ formatter.doesRelativeDateFormatting = true ++ formatter.timeStyle = .short ++ return formatter ++ }() ++ + override func numberOfSections(in tableView: UITableView) -> Int { + return Section.count + } +@@ -343,7 +359,14 @@ final class CarbAbsorptionViewController: LoopChartsTableViewController, Identif + } + + // Entry time +- let startTime = timeFormatter.string(from: status.entry.startDate) ++ let startTime: String ++ // Indicate if an entry is from the previous day to avoid potential confusion ++ let midnight = Calendar.current.startOfDay(for: Date()) ++ if status.entry.startDate < midnight { ++ startTime = relativeTimeFormatter.string(from: status.entry.startDate) ++ } else { ++ startTime = timeFormatter.string(from: status.entry.startDate) ++ } + if let absorptionTime = status.entry.absorptionTime, + let duration = absorptionFormatter.string(from: absorptionTime) + { diff --git a/meal_week/meal_week.patch b/meal_week/meal_week.patch index 1191267..9278274 100644 --- a/meal_week/meal_week.patch +++ b/meal_week/meal_week.patch @@ -21,7 +21,7 @@ index fc770192..0b85b4c2 100644 let midnight = Calendar.current.startOfDay(for: Date()) - let listStart = min(midnight, chartStartDate, Date(timeIntervalSinceNow: -deviceManager.carbStore.maximumAbsorptionTimeInterval)) -+ let previousMidnight = midnight - .hours(6*24) ++ let earliestMidnight = midnight - .hours(6*24) let reloadGroup = DispatchGroup() let shouldUpdateGlucose = currentContext.contains(.glucose) @@ -30,8 +30,8 @@ index fc770192..0b85b4c2 100644 insulinCounteractionEffects = allInsulinCounteractionEffects.filterDateRange(chartStartDate, nil) + let earliestCounteractionEffect = allInsulinCounteractionEffects.first?.startDate ?? Date() -+ // Show carb entries as far back as previous midnight, or only as far back as counteraction effects are available -+ let boundOnCarbList = max(previousMidnight, earliestCounteractionEffect) ++ // Show carb entries back through midnight a week ago, or only as far back as counteraction effects are available ++ let boundOnCarbList = max(earliestMidnight, earliestCounteractionEffect) + // If counteraction effects are missing, at least show all the entries for today and those on the chart + let displayListStart = min(boundOnCarbList, midnight, chartStartDate) + // To estimate dynamic carb absorption for the entry at the start of the list, we need to fetch samples that might still be absorbing