Skip to content

Commit cb15f90

Browse files
mpangburnps2
authored andcommitted
Temporary overrides πŸƒβ€β™€οΈπŸ€’ (#18)
* Revamped temporary override mode * Watch integration, remove remnants of old workout mode * Update Cartfile * Update Watch preset selection interface * removing signing team * Clear charts override after finishing * Account for optional target range * Optional target range updates * Fix missing comma from merge * Override history tracking * Renaming * Fix StatusTableViewController for overrides * Backport previous workout mode * Enable overrides * Update Watch button label per feature flags * Feature flags via plist * Correct workout button enable state in legacy * Remove recovered references * Allow overriding of feature flags and build settings. * Updates from review * Fix status row presence post-resume
1 parent 8c1dfdb commit cb15f90

35 files changed

+914
-224
lines changed

β€ŽCommon/Extensions/GlucoseRangeSchedule.swiftβ€Ž

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,8 @@ import HealthKit
1010

1111

1212
extension GlucoseRangeSchedule {
13-
func overrideEnabledForContext(_ context: Override.Context) -> Bool? {
14-
guard let override = override, override.context == context else {
15-
guard let value = overrideRanges[context], !value.isZero else {
16-
// Unavailable to set
17-
return nil
18-
}
19-
20-
return false
21-
}
22-
23-
return override.isActive()
24-
}
25-
26-
var activeOverride: GlucoseRangeSchedule.Override? {
27-
guard let override = override, override.isActive() else {
28-
return nil
29-
}
30-
31-
return override
32-
}
33-
34-
var activeOverrideContext: GlucoseRangeSchedule.Override.Context? {
35-
return activeOverride?.context
36-
}
37-
38-
var configuredOverrideContexts: [GlucoseRangeSchedule.Override.Context] {
39-
var contexts: [GlucoseRangeSchedule.Override.Context] = []
40-
for (context, range) in overrideRanges where !range.isZero {
41-
contexts.append(context)
42-
}
43-
44-
return contexts
13+
func minQuantity(at date: Date) -> HKQuantity {
14+
return HKQuantity(unit: unit, doubleValue: value(at: date).minValue)
4515
}
4616
}
4717

β€ŽCommon/FeatureFlags.swiftβ€Ž

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//
2+
// FeatureFlags.swift
3+
// Loop
4+
//
5+
// Created by Michael Pangburn on 5/19/19.
6+
// Copyright Β© 2019 LoopKit Authors. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
12+
let FeatureFlags: FeatureFlagConfiguration = {
13+
guard
14+
let path = Bundle.main.path(forResource: "FeatureFlags", ofType: "plist"),
15+
let data = FileManager.default.contents(atPath: path),
16+
let configuration = try? PropertyListDecoder().decode(FeatureFlagConfiguration.self, from: data)
17+
else {
18+
return FeatureFlagConfiguration()
19+
}
20+
21+
return configuration
22+
}()
23+
24+
struct FeatureFlagConfiguration: Decodable {
25+
let sensitivityOverridesEnabled: Bool
26+
27+
fileprivate init() {
28+
self.sensitivityOverridesEnabled = false
29+
}
30+
}

β€ŽDoseMathTests/DoseMathTests.swiftβ€Ž

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class RecommendTempBasalTests: XCTestCase {
8484
}
8585

8686
var glucoseTargetRange: GlucoseRangeSchedule {
87-
return GlucoseRangeSchedule(unit: HKUnit.milligramsPerDeciliter, dailyItems: [RepeatingScheduleValue(startTime: TimeInterval(0), value: DoubleRange(minValue: 90, maxValue: 120))], overrideRanges: [:])!
87+
return GlucoseRangeSchedule(unit: HKUnit.milligramsPerDeciliter, dailyItems: [RepeatingScheduleValue(startTime: TimeInterval(0), value: DoubleRange(minValue: 90, maxValue: 120))])!
8888
}
8989

9090
var insulinSensitivitySchedule: InsulinSensitivitySchedule {
@@ -120,6 +120,25 @@ class RecommendTempBasalTests: XCTestCase {
120120
XCTAssertNil(dose)
121121
}
122122

123+
func testNoChangeOverrideActive() {
124+
let glucose = loadGlucoseValueFixture("recommend_temp_basal_no_change_glucose")
125+
126+
let dose = glucose.recommendedTempBasal(
127+
to: glucoseTargetRange,
128+
at: glucose.first!.startDate,
129+
suspendThreshold: suspendThreshold.quantity,
130+
sensitivity: insulinSensitivitySchedule,
131+
model: insulinModel,
132+
basalRates: basalRateSchedule,
133+
maxBasalRate: maxBasalRate,
134+
lastTempBasal: nil,
135+
isBasalRateScheduleOverrideActive: true
136+
)
137+
138+
XCTAssertEqual(0.8, dose!.unitsPerHour, accuracy: 1.0 / 40.0)
139+
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)
140+
}
141+
123142
func testStartHighEndInRange() {
124143
let glucose = loadGlucoseValueFixture("recommend_temp_basal_start_high_end_in_range")
125144

@@ -472,7 +491,7 @@ class RecommendBolusTests: XCTestCase {
472491
}
473492

474493
var glucoseTargetRange: GlucoseRangeSchedule {
475-
return GlucoseRangeSchedule(unit: HKUnit.milligramsPerDeciliter, dailyItems: [RepeatingScheduleValue(startTime: TimeInterval(0), value: DoubleRange(minValue: 90, maxValue: 120))], overrideRanges: [:])!
494+
return GlucoseRangeSchedule(unit: HKUnit.milligramsPerDeciliter, dailyItems: [RepeatingScheduleValue(startTime: TimeInterval(0), value: DoubleRange(minValue: 90, maxValue: 120))])!
476495
}
477496

478497
var insulinSensitivitySchedule: InsulinSensitivitySchedule {

β€ŽLoop.xcconfigβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@
99
// This is automatically disambiguated by development team, but you may choose to change this to
1010
// support running multiple apps simultaneously.
1111
MAIN_APP_BUNDLE_IDENTIFIER = com.${DEVELOPMENT_TEAM}.loopkit
12+
MAIN_APP_DISPLAY_NAME = Loop
13+
14+
// Optional workspace configuration overrides
15+
#include? "../LoopConfigOverride.xcconfig"

0 commit comments

Comments
Β (0)