diff --git a/WatchApp Extension/Extensions/Comparable.swift b/Common/Extensions/Comparable.swift
similarity index 95%
rename from WatchApp Extension/Extensions/Comparable.swift
rename to Common/Extensions/Comparable.swift
index aae6846520..84c1642424 100644
--- a/WatchApp Extension/Extensions/Comparable.swift
+++ b/Common/Extensions/Comparable.swift
@@ -1,6 +1,6 @@
//
// Comparable.swift
-// WatchApp Extension
+// Loop
//
// Created by Michael Pangburn on 3/27/20.
// Copyright © 2020 LoopKit Authors. All rights reserved.
diff --git a/Common/Extensions/NSBundle.swift b/Common/Extensions/NSBundle.swift
index 57b7d6ad88..0e6dd493b7 100644
--- a/Common/Extensions/NSBundle.swift
+++ b/Common/Extensions/NSBundle.swift
@@ -60,5 +60,27 @@ extension Bundle {
}
return .days(localCacheDurationDays)
}
+
+ var hostIdentifier: String {
+ var identifier = bundleIdentifier ?? "com.loopkit.Loop"
+ let components = identifier.components(separatedBy: ".")
+ // DIY Loop has bundle identifiers like com.UY653SP37Q.loopkit.Loop
+ if components[2] == "loopkit" && components[3] == "Loop" {
+ identifier = "com.loopkit.Loop"
+ }
+ return identifier
+ }
+
+ var hostVersion: String {
+ var semanticVersion = shortVersionString
+
+ while semanticVersion.split(separator: ".").count < 3 {
+ semanticVersion += ".0"
+ }
+
+ semanticVersion += "+\(Bundle.main.version)"
+
+ return semanticVersion
+ }
}
diff --git a/Common/Extensions/SampleValue.swift b/Common/Extensions/SampleValue.swift
index 39dcb16e9c..dd9c901ecf 100644
--- a/Common/Extensions/SampleValue.swift
+++ b/Common/Extensions/SampleValue.swift
@@ -7,7 +7,7 @@
import HealthKit
import LoopKit
-
+import LoopAlgorithm
extension Collection where Element == SampleValue {
/// O(n)
diff --git a/Common/FeatureFlags.swift b/Common/FeatureFlags.swift
index 0c6440b564..44d8a84e4b 100644
--- a/Common/FeatureFlags.swift
+++ b/Common/FeatureFlags.swift
@@ -39,7 +39,7 @@ struct FeatureFlagConfiguration: Decodable {
let profileExpirationSettingsViewEnabled: Bool
let missedMealNotifications: Bool
let allowAlgorithmExperiments: Bool
-
+ let isInvestigationalDevice: Bool
fileprivate init() {
// Swift compiler config is inverse, since the default state is enabled.
@@ -232,6 +232,12 @@ struct FeatureFlagConfiguration: Decodable {
#else
self.allowAlgorithmExperiments = false
#endif
+
+ #if INVESTIGATIONAL_DEVICE
+ self.isInvestigationalDevice = true
+ #else
+ self.isInvestigationalDevice = false
+ #endif
}
}
@@ -267,7 +273,8 @@ extension FeatureFlagConfiguration : CustomDebugStringConvertible {
"* profileExpirationSettingsViewEnabled: \(profileExpirationSettingsViewEnabled)",
"* missedMealNotifications: \(missedMealNotifications)",
"* allowAlgorithmExperiments: \(allowAlgorithmExperiments)",
- "* allowExperimentalFeatures: \(allowExperimentalFeatures)"
+ "* allowExperimentalFeatures: \(allowExperimentalFeatures)",
+ "* isInvestigationalDevice: \(isInvestigationalDevice)"
].joined(separator: "\n")
}
}
diff --git a/Common/Models/LoopSettingsUserInfo.swift b/Common/Models/LoopSettingsUserInfo.swift
index a6123825d8..bf95b076b4 100644
--- a/Common/Models/LoopSettingsUserInfo.swift
+++ b/Common/Models/LoopSettingsUserInfo.swift
@@ -6,10 +6,67 @@
//
import LoopCore
+import LoopKit
+struct LoopSettingsUserInfo: Equatable {
+ var loopSettings: LoopSettings
+ var scheduleOverride: TemporaryScheduleOverride?
+ var preMealOverride: TemporaryScheduleOverride?
+
+ public mutating func enablePreMealOverride(at date: Date = Date(), for duration: TimeInterval) {
+ preMealOverride = makePreMealOverride(beginningAt: date, for: duration)
+ }
+
+ private func makePreMealOverride(beginningAt date: Date = Date(), for duration: TimeInterval) -> TemporaryScheduleOverride? {
+ guard let preMealTargetRange = loopSettings.preMealTargetRange else {
+ return nil
+ }
+ return TemporaryScheduleOverride(
+ context: .preMeal,
+ settings: TemporaryScheduleOverrideSettings(targetRange: preMealTargetRange),
+ startDate: date,
+ duration: .finite(duration),
+ enactTrigger: .local,
+ syncIdentifier: UUID()
+ )
+ }
+
+ public mutating func clearOverride(matching context: TemporaryScheduleOverride.Context? = nil) {
+ if context == .preMeal {
+ preMealOverride = nil
+ return
+ }
+
+ guard let scheduleOverride = scheduleOverride else { return }
+
+ if let context = context {
+ if scheduleOverride.context == context {
+ self.scheduleOverride = nil
+ }
+ } else {
+ self.scheduleOverride = nil
+ }
+ }
+
+ public func nonPreMealOverrideEnabled(at date: Date = Date()) -> Bool {
+ return scheduleOverride?.isActive(at: date) == true
+ }
+
+ public mutating func legacyWorkoutOverride(beginningAt date: Date = Date(), for duration: TimeInterval) -> TemporaryScheduleOverride? {
+ guard let legacyWorkoutTargetRange = loopSettings.legacyWorkoutTargetRange else {
+ return nil
+ }
+
+ return TemporaryScheduleOverride(
+ context: .legacyWorkout,
+ settings: TemporaryScheduleOverrideSettings(targetRange: legacyWorkoutTargetRange),
+ startDate: date,
+ duration: duration.isInfinite ? .indefinite : .finite(duration),
+ enactTrigger: .local,
+ syncIdentifier: UUID()
+ )
+ }
-struct LoopSettingsUserInfo {
- let settings: LoopSettings
}
@@ -23,19 +80,36 @@ extension LoopSettingsUserInfo: RawRepresentable {
guard rawValue["v"] as? Int == LoopSettingsUserInfo.version,
rawValue["name"] as? String == LoopSettingsUserInfo.name,
let settingsRaw = rawValue["s"] as? LoopSettings.RawValue,
- let settings = LoopSettings(rawValue: settingsRaw)
+ let loopSettings = LoopSettings(rawValue: settingsRaw)
else {
return nil
}
- self.settings = settings
+ self.loopSettings = loopSettings
+
+ if let rawScheduleOverride = rawValue["o"] as? TemporaryScheduleOverride.RawValue {
+ self.scheduleOverride = TemporaryScheduleOverride(rawValue: rawScheduleOverride)
+ } else {
+ self.scheduleOverride = nil
+ }
+
+ if let rawPreMealOverride = rawValue["p"] as? TemporaryScheduleOverride.RawValue {
+ self.preMealOverride = TemporaryScheduleOverride(rawValue: rawPreMealOverride)
+ } else {
+ self.preMealOverride = nil
+ }
}
var rawValue: RawValue {
- return [
+ var raw: RawValue = [
"v": LoopSettingsUserInfo.version,
"name": LoopSettingsUserInfo.name,
- "s": settings.rawValue
+ "s": loopSettings.rawValue
]
+
+ raw["o"] = scheduleOverride?.rawValue
+ raw["p"] = preMealOverride?.rawValue
+
+ return raw
}
}
diff --git a/Common/Models/PumpManager.swift b/Common/Models/PumpManager.swift
index 5ec574366c..d1a82fa2f4 100644
--- a/Common/Models/PumpManager.swift
+++ b/Common/Models/PumpManager.swift
@@ -12,13 +12,13 @@ import MockKit
import MockKitUI
let staticPumpManagersByIdentifier: [String: PumpManagerUI.Type] = [
- MockPumpManager.pluginIdentifier : MockPumpManager.self
+ MockPumpManager.managerIdentifier : MockPumpManager.self
]
var availableStaticPumpManagers: [PumpManagerDescriptor] {
if FeatureFlags.allowSimulators {
return [
- PumpManagerDescriptor(identifier: MockPumpManager.pluginIdentifier, localizedTitle: MockPumpManager.localizedTitle)
+ PumpManagerDescriptor(identifier: MockPumpManager.managerIdentifier, localizedTitle: MockPumpManager.localizedTitle)
]
} else {
return []
diff --git a/Common/Models/StatusExtensionContext.swift b/Common/Models/StatusExtensionContext.swift
index bee1f32894..cf486fd1a8 100644
--- a/Common/Models/StatusExtensionContext.swift
+++ b/Common/Models/StatusExtensionContext.swift
@@ -11,6 +11,7 @@ import Foundation
import HealthKit
import LoopKit
import LoopKitUI
+import LoopAlgorithm
struct NetBasalContext {
@@ -295,6 +296,8 @@ struct StatusExtensionContext: RawRepresentable {
var predictedGlucose: PredictedGlucoseContext?
var lastLoopCompleted: Date?
+ var mostRecentGlucoseDataDate: Date?
+ var mostRecentPumpDataDate: Date?
var createdAt: Date?
var isClosedLoop: Bool?
var preMealPresetAllowed: Bool?
@@ -327,6 +330,8 @@ struct StatusExtensionContext: RawRepresentable {
}
lastLoopCompleted = rawValue["lastLoopCompleted"] as? Date
+ mostRecentGlucoseDataDate = rawValue["mostRecentGlucoseDataDate"] as? Date
+ mostRecentPumpDataDate = rawValue["mostRecentPumpDataDate"] as? Date
createdAt = rawValue["createdAt"] as? Date
isClosedLoop = rawValue["isClosedLoop"] as? Bool
preMealPresetAllowed = rawValue["preMealPresetAllowed"] as? Bool
@@ -368,6 +373,8 @@ struct StatusExtensionContext: RawRepresentable {
raw["predictedGlucose"] = predictedGlucose?.rawValue
raw["lastLoopCompleted"] = lastLoopCompleted
+ raw["mostRecentGlucoseDataDate"] = mostRecentGlucoseDataDate
+ raw["mostRecentPumpDataDate"] = mostRecentPumpDataDate
raw["createdAt"] = createdAt
raw["isClosedLoop"] = isClosedLoop
raw["preMealPresetAllowed"] = preMealPresetAllowed
diff --git a/Common/Models/WatchContext.swift b/Common/Models/WatchContext.swift
index 3ce3adebf1..6d4e7a23a0 100644
--- a/Common/Models/WatchContext.swift
+++ b/Common/Models/WatchContext.swift
@@ -9,6 +9,7 @@
import Foundation
import HealthKit
import LoopKit
+import LoopAlgorithm
final class WatchContext: RawRepresentable {
diff --git a/Common/Models/WatchHistoricalGlucose.swift b/Common/Models/WatchHistoricalGlucose.swift
index 13fda34816..3b166170a9 100644
--- a/Common/Models/WatchHistoricalGlucose.swift
+++ b/Common/Models/WatchHistoricalGlucose.swift
@@ -9,6 +9,7 @@
import Foundation
import HealthKit
import LoopKit
+import LoopAlgorithm
struct WatchHistoricalGlucose {
let samples: [StoredGlucoseSample]
diff --git a/Common/Models/WatchPredictedGlucose.swift b/Common/Models/WatchPredictedGlucose.swift
index 080a824074..d5978eb6ed 100644
--- a/Common/Models/WatchPredictedGlucose.swift
+++ b/Common/Models/WatchPredictedGlucose.swift
@@ -9,6 +9,7 @@
import Foundation
import LoopKit
import HealthKit
+import LoopAlgorithm
struct WatchPredictedGlucose: Equatable {
@@ -29,7 +30,7 @@ extension WatchPredictedGlucose: RawRepresentable {
var rawValue: RawValue {
return [
- "v": values.map { Int16($0.quantity.doubleValue(for: .milligramsPerDeciliter)) },
+ "v": values.map { Int16($0.quantity.doubleValue(for: .milligramsPerDeciliter).clamped(to: Double(Int16.min)...Double(Int16.max))) },
"d": values[0].startDate,
"i": values[1].startDate.timeIntervalSince(values[0].startDate)
]
diff --git a/Learn/Managers/DataManager.swift b/Learn/Managers/DataManager.swift
index 80e958a02f..3929c42bac 100644
--- a/Learn/Managers/DataManager.swift
+++ b/Learn/Managers/DataManager.swift
@@ -47,7 +47,6 @@ final class DataManager {
healthStore: healthStore,
cacheStore: cacheStore,
observationEnabled: false,
- insulinModelProvider: PresetInsulinModelProvider(defaultRapidActingModel: defaultRapidActingModel),
longestEffectDuration: ExponentialInsulinModelPreset.rapidActingAdult.effectDuration,
basalProfile: basalRateSchedule,
insulinSensitivitySchedule: insulinSensitivitySchedule,
diff --git a/Loop Status Extension/Base.lproj/InfoPlist.strings b/Loop Status Extension/Base.lproj/InfoPlist.strings
deleted file mode 100644
index f8e9a2b43f..0000000000
--- a/Loop Status Extension/Base.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* (No Comment) */
-"CFBundleName" = "$(PRODUCT_NAME)";
-
diff --git a/Loop Status Extension/Base.lproj/Localizable.strings b/Loop Status Extension/Base.lproj/Localizable.strings
deleted file mode 100644
index d21551845d..0000000000
--- a/Loop Status Extension/Base.lproj/Localizable.strings
+++ /dev/null
@@ -1,5 +0,0 @@
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Eventually %1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
diff --git a/Loop Status Extension/Base.lproj/MainInterface.storyboard b/Loop Status Extension/Base.lproj/MainInterface.storyboard
deleted file mode 100644
index 78d5e1c465..0000000000
--- a/Loop Status Extension/Base.lproj/MainInterface.storyboard
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Loop Status Extension/Info.plist b/Loop Status Extension/Info.plist
deleted file mode 100644
index 98c5c3e989..0000000000
--- a/Loop Status Extension/Info.plist
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
- AppGroupIdentifier
- $(APP_GROUP_IDENTIFIER)
- CFBundleDevelopmentRegion
- en
- CFBundleDisplayName
- $(MAIN_APP_DISPLAY_NAME)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- XPC!
- CFBundleShortVersionString
- $(LOOP_MARKETING_VERSION)
- CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
- MainAppBundleIdentifier
- $(MAIN_APP_BUNDLE_IDENTIFIER)
- NSExtension
-
- NSExtensionMainStoryboard
- MainInterface
- NSExtensionPointIdentifier
- com.apple.widget-extension
-
-
-
diff --git a/Loop Status Extension/Loop Status Extension.entitlements b/Loop Status Extension/Loop Status Extension.entitlements
deleted file mode 100644
index d9849a816d..0000000000
--- a/Loop Status Extension/Loop Status Extension.entitlements
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- com.apple.security.application-groups
-
- $(APP_GROUP_IDENTIFIER)
-
-
-
diff --git a/Loop Status Extension/StateColorPalette.swift b/Loop Status Extension/StateColorPalette.swift
deleted file mode 100644
index e6f18b436a..0000000000
--- a/Loop Status Extension/StateColorPalette.swift
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// StateColorPalette.swift
-// Loop
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import LoopUI
-import LoopKitUI
-
-extension StateColorPalette {
- static let loopStatus = StateColorPalette(unknown: .unknownColor, normal: .freshColor, warning: .agingColor, error: .staleColor)
-
- static let cgmStatus = loopStatus
-
- static let pumpStatus = StateColorPalette(unknown: .unknownColor, normal: .pumpStatusNormal, warning: .agingColor, error: .staleColor)
-}
diff --git a/Loop Status Extension/StatusChartsManager.swift b/Loop Status Extension/StatusChartsManager.swift
deleted file mode 100644
index c75041e52f..0000000000
--- a/Loop Status Extension/StatusChartsManager.swift
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// StatusChartsManager.swift
-// Loop Status Extension
-//
-// Copyright © 2019 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import LoopUI
-import LoopKitUI
-import SwiftCharts
-import UIKit
-
-class StatusChartsManager: ChartsManager {
- let predictedGlucose = PredictedGlucoseChart(predictedGlucoseBounds: FeatureFlags.predictedGlucoseChartClampEnabled ? .default : nil,
- yAxisStepSizeMGDLOverride: FeatureFlags.predictedGlucoseChartClampEnabled ? 40 : nil)
-
- init(colors: ChartColorPalette, settings: ChartSettings, traitCollection: UITraitCollection) {
- super.init(colors: colors, settings: settings, charts: [predictedGlucose], traitCollection: traitCollection)
- }
-}
diff --git a/Loop Status Extension/StatusViewController.swift b/Loop Status Extension/StatusViewController.swift
deleted file mode 100644
index e3c57a98d9..0000000000
--- a/Loop Status Extension/StatusViewController.swift
+++ /dev/null
@@ -1,330 +0,0 @@
-//
-// StatusViewController.swift
-// Loop Status Extension
-//
-// Created by Bharat Mediratta on 11/25/16.
-// Copyright © 2016 LoopKit Authors. All rights reserved.
-//
-
-import CoreData
-import HealthKit
-import LoopKit
-import LoopKitUI
-import LoopCore
-import LoopUI
-import NotificationCenter
-import UIKit
-import SwiftCharts
-
-class StatusViewController: UIViewController, NCWidgetProviding {
-
- @IBOutlet weak var hudView: StatusBarHUDView! {
- didSet {
- hudView.loopCompletionHUD.stateColors = .loopStatus
- hudView.cgmStatusHUD.stateColors = .cgmStatus
- hudView.cgmStatusHUD.tintColor = .label
- hudView.pumpStatusHUD.tintColor = .insulinTintColor
- hudView.backgroundColor = .clear
-
- // given the reduced width of the widget, allow for tighter spacing
- hudView.containerView.spacing = 6.0
- }
- }
- @IBOutlet weak var activeCarbsTitleLabel: UILabel!
- @IBOutlet weak var activeCarbsAmountLabel: UILabel!
- @IBOutlet weak var activeInsulinTitleLabel: UILabel!
- @IBOutlet weak var activeInsulinAmountLabel: UILabel!
- @IBOutlet weak var glucoseChartContentView: LoopKitUI.ChartContainerView!
-
- private lazy var charts: StatusChartsManager = {
- let charts = StatusChartsManager(
- colors: ChartColorPalette(
- axisLine: .axisLineColor,
- axisLabel: .axisLabelColor,
- grid: .gridColor,
- glucoseTint: .glucoseTintColor,
- insulinTint: .insulinTintColor,
- carbTint: .carbTintColor
- ),
- settings: {
- var settings = ChartSettings()
- settings.top = 8
- settings.bottom = 8
- settings.trailing = 8
- settings.axisTitleLabelsToLabelsSpacing = 0
- settings.labelsToAxisSpacingX = 6
- settings.clipInnerFrame = false
- return settings
- }(),
- traitCollection: traitCollection
- )
-
- if FeatureFlags.predictedGlucoseChartClampEnabled {
- charts.predictedGlucose.glucoseDisplayRange = ChartConstants.glucoseChartDefaultDisplayBoundClamped
- } else {
- charts.predictedGlucose.glucoseDisplayRange = ChartConstants.glucoseChartDefaultDisplayBound
- }
-
- return charts
- }()
-
- var statusExtensionContext: StatusExtensionContext?
-
- lazy var defaults = UserDefaults.appGroup
-
- private var observers: [Any] = []
-
- lazy var healthStore = HKHealthStore()
-
- lazy var cacheStore = PersistenceController.controllerInAppGroupDirectory()
-
- lazy var localCacheDuration = Bundle.main.localCacheDuration
-
- lazy var settingsStore: SettingsStore = SettingsStore(
- store: cacheStore,
- expireAfter: localCacheDuration)
-
- lazy var glucoseStore = GlucoseStore(
- cacheStore: cacheStore,
- provenanceIdentifier: HKSource.default().bundleIdentifier
- )
-
- lazy var doseStore = DoseStore(
- cacheStore: cacheStore,
- insulinModelProvider: PresetInsulinModelProvider(defaultRapidActingModel: settingsStore.latestSettings?.defaultRapidActingModel?.presetForRapidActingInsulin),
- longestEffectDuration: ExponentialInsulinModelPreset.rapidActingAdult.effectDuration,
- basalProfile: settingsStore.latestSettings?.basalRateSchedule,
- insulinSensitivitySchedule: settingsStore.latestSettings?.insulinSensitivitySchedule,
- provenanceIdentifier: HKSource.default().bundleIdentifier
- )
-
- private var pluginManager: PluginManager = {
- let containingAppFrameworksURL = Bundle.main.privateFrameworksURL?.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().appendingPathComponent("Frameworks")
- return PluginManager(pluginsURL: containingAppFrameworksURL)
- }()
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- activeCarbsTitleLabel.text = NSLocalizedString("Active Carbs", comment: "Widget label title describing the active carbs")
- activeInsulinTitleLabel.text = NSLocalizedString("Active Insulin", comment: "Widget label title describing the active insulin")
- activeCarbsTitleLabel.textColor = .secondaryLabel
- activeCarbsAmountLabel.textColor = .label
- activeInsulinTitleLabel.textColor = .secondaryLabel
- activeInsulinAmountLabel.textColor = .label
-
- let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(openLoopApp(_:)))
- view.addGestureRecognizer(tapGestureRecognizer)
-
- self.charts.prerender()
- glucoseChartContentView.chartGenerator = { [weak self] (frame) in
- return self?.charts.chart(atIndex: 0, frame: frame)?.view
- }
-
- extensionContext?.widgetLargestAvailableDisplayMode = .expanded
-
- switch extensionContext?.widgetActiveDisplayMode ?? .compact {
- case .expanded:
- glucoseChartContentView.isHidden = false
- case .compact:
- fallthrough
- @unknown default:
- glucoseChartContentView.isHidden = true
- }
-
- observers = [
- // TODO: Observe cross-process notifications of Loop status updating
- ]
- }
-
- deinit {
- for observer in observers {
- NotificationCenter.default.removeObserver(observer)
- }
- }
-
- func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
- let compactHeight = hudView.systemLayoutSizeFitting(maxSize).height + activeCarbsTitleLabel.systemLayoutSizeFitting(maxSize).height
-
- switch activeDisplayMode {
- case .expanded:
- preferredContentSize = CGSize(width: maxSize.width, height: compactHeight + 135)
- case .compact:
- fallthrough
- @unknown default:
- preferredContentSize = CGSize(width: maxSize.width, height: compactHeight)
- }
- }
-
- override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
- super.viewWillTransition(to: size, with: coordinator)
-
- coordinator.animate(alongsideTransition: {
- (UIViewControllerTransitionCoordinatorContext) -> Void in
- self.glucoseChartContentView.isHidden = self.extensionContext?.widgetActiveDisplayMode != .expanded
- })
- }
-
- override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
- charts.traitCollection = traitCollection
- }
-
- @objc private func openLoopApp(_: Any) {
- if let url = Bundle.main.mainAppUrl {
- self.extensionContext?.open(url)
- }
- }
-
- func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
- let result = update()
- completionHandler(result)
- }
-
- @discardableResult
- func update() -> NCUpdateResult {
- let group = DispatchGroup()
-
- var activeInsulin: Double?
- let carbUnit = HKUnit.gram()
- var glucose: [StoredGlucoseSample] = []
-
- group.enter()
- doseStore.insulinOnBoard(at: Date()) { (result) in
- switch result {
- case .success(let iobValue):
- activeInsulin = iobValue.value
- case .failure:
- activeInsulin = nil
- }
- group.leave()
- }
-
- charts.startDate = Calendar.current.nextDate(after: Date(timeIntervalSinceNow: .minutes(-5)), matching: DateComponents(minute: 0), matchingPolicy: .strict, direction: .backward) ?? Date()
-
- // Showing the whole history plus full prediction in the glucose plot
- // is a little crowded, so limit it to three hours in the future:
- charts.maxEndDate = charts.startDate.addingTimeInterval(TimeInterval(hours: 3))
-
- group.enter()
- glucoseStore.getGlucoseSamples(start: charts.startDate) { (result) in
- switch result {
- case .failure:
- glucose = []
- case .success(let samples):
- glucose = samples
- }
- group.leave()
- }
-
- group.notify(queue: .main) {
- guard let defaults = self.defaults, let context = defaults.statusExtensionContext else {
- return
- }
-
- // Pump Status
- let pumpManagerHUDView: BaseHUDView
- if let hudViewContext = context.pumpManagerHUDViewContext,
- let contextHUDView = PumpManagerHUDViewFromRawValue(hudViewContext.pumpManagerHUDViewRawValue, pluginManager: self.pluginManager)
- {
- pumpManagerHUDView = contextHUDView
- } else {
- pumpManagerHUDView = ReservoirVolumeHUDView.instantiate()
- }
- pumpManagerHUDView.stateColors = .pumpStatus
- self.hudView.removePumpManagerProvidedView()
- self.hudView.addPumpManagerProvidedHUDView(pumpManagerHUDView)
-
- if let netBasal = context.netBasal {
- self.hudView.pumpStatusHUD.basalRateHUD.setNetBasalRate(netBasal.rate, percent: netBasal.percentage, at: netBasal.start)
- }
-
- if let lastCompleted = context.lastLoopCompleted {
- self.hudView.loopCompletionHUD.lastLoopCompleted = lastCompleted
- }
-
- if let isClosedLoop = context.isClosedLoop {
- self.hudView.loopCompletionHUD.loopIconClosed = isClosedLoop
- }
-
- let insulinFormatter: NumberFormatter = {
- let numberFormatter = NumberFormatter()
-
- numberFormatter.numberStyle = .decimal
- numberFormatter.minimumFractionDigits = 2
- numberFormatter.maximumFractionDigits = 2
-
- return numberFormatter
- }()
-
- if let activeInsulin = activeInsulin,
- let valueStr = insulinFormatter.string(from: activeInsulin)
- {
- self.activeInsulinAmountLabel.text = String(format: NSLocalizedString("%1$@ U", comment: "The subtitle format describing units of active insulin. (1: localized insulin value description)"), valueStr)
- } else {
- self.activeInsulinAmountLabel.text = NSLocalizedString("? U", comment: "Displayed in the widget when the amount of active insulin cannot be determined.")
- }
-
- self.hudView.pumpStatusHUD.presentStatusHighlight(context.pumpStatusHighlightContext)
- self.hudView.pumpStatusHUD.lifecycleProgress = context.pumpLifecycleProgressContext
-
- // Active carbs
- let carbsFormatter = QuantityFormatter(for: carbUnit)
-
- if let carbsOnBoard = context.carbsOnBoard,
- let activeCarbsNumberString = carbsFormatter.string(from: HKQuantity(unit: carbUnit, doubleValue: carbsOnBoard))
- {
- self.activeCarbsAmountLabel.text = String(format: NSLocalizedString("%1$@", comment: "The subtitle format describing the grams of active carbs. (1: localized carb value description)"), activeCarbsNumberString)
- } else {
- self.activeCarbsAmountLabel.text = NSLocalizedString("? g", comment: "Displayed in the widget when the amount of active carbs cannot be determined.")
- }
-
- // CGM Status
- self.hudView.cgmStatusHUD.presentStatusHighlight(context.cgmStatusHighlightContext)
- self.hudView.cgmStatusHUD.lifecycleProgress = context.cgmLifecycleProgressContext
-
- guard let unit = context.predictedGlucose?.unit else {
- return
- }
-
- if let lastGlucose = glucose.last {
- self.hudView.cgmStatusHUD.setGlucoseQuantity(
- lastGlucose.quantity.doubleValue(for: unit),
- at: lastGlucose.startDate,
- unit: unit,
- staleGlucoseAge: LoopCoreConstants.inputDataRecencyInterval,
- glucoseDisplay: context.glucoseDisplay,
- wasUserEntered: lastGlucose.wasUserEntered,
- isDisplayOnly: lastGlucose.isDisplayOnly
- )
- }
-
- // Charts
- self.charts.predictedGlucose.glucoseUnit = unit
- self.charts.predictedGlucose.setGlucoseValues(glucose)
-
- if let predictedGlucose = context.predictedGlucose?.samples, context.isClosedLoop == true {
- self.charts.predictedGlucose.setPredictedGlucoseValues(predictedGlucose)
- } else {
- self.charts.predictedGlucose.setPredictedGlucoseValues([])
- }
-
- self.charts.predictedGlucose.targetGlucoseSchedule = self.settingsStore.latestSettings?.glucoseTargetRangeSchedule
- self.charts.invalidateChart(atIndex: 0)
- self.charts.prerender()
- self.glucoseChartContentView.reloadChart()
- }
-
- switch extensionContext?.widgetActiveDisplayMode ?? .compact {
- case .expanded:
- glucoseChartContentView.isHidden = false
- case .compact:
- fallthrough
- @unknown default:
- glucoseChartContentView.isHidden = true
- }
-
- // Right now we always act as if there's new data.
- // TODO: keep track of data changes and return .noData if necessary
- return NCUpdateResult.newData
- }
-}
diff --git a/Loop Status Extension/ar.lproj/InfoPlist.strings b/Loop Status Extension/ar.lproj/InfoPlist.strings
deleted file mode 100644
index 034a1e1f6a..0000000000
--- a/Loop Status Extension/ar.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
diff --git a/Loop Status Extension/ar.lproj/Localizable.strings b/Loop Status Extension/ar.lproj/Localizable.strings
deleted file mode 100644
index 5935bf3282..0000000000
--- a/Loop Status Extension/ar.lproj/Localizable.strings
+++ /dev/null
@@ -1,33 +0,0 @@
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "كارب النشط";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "أنسولين نشط";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "متوقع %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "أنسولين نشط %1$@ وحدة";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "وحدة";
-
diff --git a/Loop Status Extension/ar.lproj/MainInterface.strings b/Loop Status Extension/ar.lproj/MainInterface.strings
deleted file mode 100644
index 23ec628122..0000000000
--- a/Loop Status Extension/ar.lproj/MainInterface.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "كارب النشط";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "أنسولين نشط";
-
diff --git a/Loop Status Extension/da.lproj/InfoPlist.strings b/Loop Status Extension/da.lproj/InfoPlist.strings
deleted file mode 100644
index ffe563a634..0000000000
--- a/Loop Status Extension/da.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop-statusudvidelse";
-
diff --git a/Loop Status Extension/da.lproj/Localizable.strings b/Loop Status Extension/da.lproj/Localizable.strings
deleted file mode 100644
index 4388492489..0000000000
--- a/Loop Status Extension/da.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? E";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ E";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Aktive kulhydrater";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Aktivt insulin";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Med tiden %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ E";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "E";
-
diff --git a/Loop Status Extension/da.lproj/MainInterface.strings b/Loop Status Extension/da.lproj/MainInterface.strings
deleted file mode 100644
index ca088fa3ce..0000000000
--- a/Loop Status Extension/da.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Aktive kulhydrater";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Aktivt insulin";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 E";
-
diff --git a/Loop Status Extension/de.lproj/InfoPlist.strings b/Loop Status Extension/de.lproj/InfoPlist.strings
deleted file mode 100644
index 8a7abf7ee4..0000000000
--- a/Loop Status Extension/de.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Status-Erweiterung";
-
diff --git a/Loop Status Extension/de.lproj/Localizable.strings b/Loop Status Extension/de.lproj/Localizable.strings
deleted file mode 100644
index 196ef74140..0000000000
--- a/Loop Status Extension/de.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? IE";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ IE";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Aktive KH";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Aktives Insulin";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Voraussichtlich %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ IE";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "IE";
-
diff --git a/Loop Status Extension/de.lproj/MainInterface.strings b/Loop Status Extension/de.lproj/MainInterface.strings
deleted file mode 100644
index fb0ae387e6..0000000000
--- a/Loop Status Extension/de.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Aktive KH";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Aktives Insulin";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 IE";
-
diff --git a/Loop Status Extension/en.lproj/Localizable.strings b/Loop Status Extension/en.lproj/Localizable.strings
deleted file mode 100644
index d21551845d..0000000000
--- a/Loop Status Extension/en.lproj/Localizable.strings
+++ /dev/null
@@ -1,5 +0,0 @@
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Eventually %1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
diff --git a/Loop Status Extension/en.lproj/MainInterface.strings b/Loop Status Extension/en.lproj/MainInterface.strings
deleted file mode 100644
index 3a52b2e5e2..0000000000
--- a/Loop Status Extension/en.lproj/MainInterface.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Eventually 92 mg/dL";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "IOB 1.0 U";
-
diff --git a/Loop Status Extension/es.lproj/InfoPlist.strings b/Loop Status Extension/es.lproj/InfoPlist.strings
deleted file mode 100644
index 029eaa2d2a..0000000000
--- a/Loop Status Extension/es.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Extensión de Estado de Loop";
-
diff --git a/Loop Status Extension/es.lproj/Localizable.strings b/Loop Status Extension/es.lproj/Localizable.strings
deleted file mode 100644
index a893db7399..0000000000
--- a/Loop Status Extension/es.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? gr";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? U";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ U";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Carbohidratos Activos";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Insulina activa";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Eventualmente %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/es.lproj/MainInterface.strings b/Loop Status Extension/es.lproj/MainInterface.strings
deleted file mode 100644
index 5354b0e9c3..0000000000
--- a/Loop Status Extension/es.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Carbohidratos Activos";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 gr";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Insulina activa";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 U";
-
diff --git a/Loop Status Extension/fi.lproj/InfoPlist.strings b/Loop Status Extension/fi.lproj/InfoPlist.strings
deleted file mode 100644
index 1565e025fa..0000000000
--- a/Loop Status Extension/fi.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Status Extension";
-
diff --git a/Loop Status Extension/fi.lproj/Localizable.strings b/Loop Status Extension/fi.lproj/Localizable.strings
deleted file mode 100644
index af5d51baf2..0000000000
--- a/Loop Status Extension/fi.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? U";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ U";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Akt. hiilari";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Akt. insuliini";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Ennuste %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/fi.lproj/MainInterface.strings b/Loop Status Extension/fi.lproj/MainInterface.strings
deleted file mode 100644
index a1e847d468..0000000000
--- a/Loop Status Extension/fi.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Akt. hiilari";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Akt. insuliini";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 U";
-
diff --git a/Loop Status Extension/fr.lproj/InfoPlist.strings b/Loop Status Extension/fr.lproj/InfoPlist.strings
deleted file mode 100644
index 1565e025fa..0000000000
--- a/Loop Status Extension/fr.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Status Extension";
-
diff --git a/Loop Status Extension/fr.lproj/Localizable.strings b/Loop Status Extension/fr.lproj/Localizable.strings
deleted file mode 100644
index 1c6e8dfb18..0000000000
--- a/Loop Status Extension/fr.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? U";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ U";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Glucides actifs";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Insuline active";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Finalement %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/fr.lproj/MainInterface.strings b/Loop Status Extension/fr.lproj/MainInterface.strings
deleted file mode 100644
index 4d13ebda2d..0000000000
--- a/Loop Status Extension/fr.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Glucides actifs";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Insuline active";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 U";
-
diff --git a/Loop Status Extension/he.lproj/InfoPlist.strings b/Loop Status Extension/he.lproj/InfoPlist.strings
deleted file mode 100644
index 1565e025fa..0000000000
--- a/Loop Status Extension/he.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Status Extension";
-
diff --git a/Loop Status Extension/he.lproj/Localizable.strings b/Loop Status Extension/he.lproj/Localizable.strings
deleted file mode 100644
index 27db2c87a8..0000000000
--- a/Loop Status Extension/he.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? U";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "U %1$@";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "פחמימות פעילות";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "אינסולין פעיל";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "בדרך ל-%1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/he.lproj/MainInterface.strings b/Loop Status Extension/he.lproj/MainInterface.strings
deleted file mode 100644
index 7bb2ea5747..0000000000
--- a/Loop Status Extension/he.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "פחמימות פעילות";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "אינסולין פעיל";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "U 0";
-
diff --git a/Loop Status Extension/it.lproj/InfoPlist.strings b/Loop Status Extension/it.lproj/InfoPlist.strings
deleted file mode 100644
index da11eb5a77..0000000000
--- a/Loop Status Extension/it.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Estensione dello stato di funzionamento di Loop";
-
diff --git a/Loop Status Extension/it.lproj/Localizable.strings b/Loop Status Extension/it.lproj/Localizable.strings
deleted file mode 100644
index 9404086e35..0000000000
--- a/Loop Status Extension/it.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? U";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ U";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ contro %2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Carboidrati Attivi";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Insulina attiva";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Probabile Glic. %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/it.lproj/MainInterface.strings b/Loop Status Extension/it.lproj/MainInterface.strings
deleted file mode 100644
index ab9c005998..0000000000
--- a/Loop Status Extension/it.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Carb Attivi";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Insulina attiva";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 U";
-
diff --git a/Loop Status Extension/ja.lproj/InfoPlist.strings b/Loop Status Extension/ja.lproj/InfoPlist.strings
deleted file mode 100644
index bb232bb4cc..0000000000
--- a/Loop Status Extension/ja.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "ループ";
-
diff --git a/Loop Status Extension/ja.lproj/Localizable.strings b/Loop Status Extension/ja.lproj/Localizable.strings
deleted file mode 100644
index d328a81f35..0000000000
--- a/Loop Status Extension/ja.lproj/Localizable.strings
+++ /dev/null
@@ -1,33 +0,0 @@
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "残存糖質";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "残存インスリン";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "予想 %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/ja.lproj/MainInterface.strings b/Loop Status Extension/ja.lproj/MainInterface.strings
deleted file mode 100644
index 2407f97e64..0000000000
--- a/Loop Status Extension/ja.lproj/MainInterface.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "残存糖質";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "残存インスリン";
-
diff --git a/Loop Status Extension/nb.lproj/InfoPlist.strings b/Loop Status Extension/nb.lproj/InfoPlist.strings
deleted file mode 100644
index 24d50f5390..0000000000
--- a/Loop Status Extension/nb.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Utvidelse av Loop status";
-
diff --git a/Loop Status Extension/nb.lproj/Localizable.strings b/Loop Status Extension/nb.lproj/Localizable.strings
deleted file mode 100644
index 2e4a88ce5f..0000000000
--- a/Loop Status Extension/nb.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? E";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ E";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v %2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Aktive karbohydrater";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Aktivt insulin";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Omsider %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ E";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "E";
-
diff --git a/Loop Status Extension/nb.lproj/MainInterface.strings b/Loop Status Extension/nb.lproj/MainInterface.strings
deleted file mode 100644
index 7942de07be..0000000000
--- a/Loop Status Extension/nb.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Aktive karbohydrater";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Aktivt insulin";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 E";
-
diff --git a/Loop Status Extension/nl.lproj/InfoPlist.strings b/Loop Status Extension/nl.lproj/InfoPlist.strings
deleted file mode 100644
index 62e5156f17..0000000000
--- a/Loop Status Extension/nl.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Status Extensie";
-
diff --git a/Loop Status Extension/nl.lproj/Localizable.strings b/Loop Status Extension/nl.lproj/Localizable.strings
deleted file mode 100644
index b5f9439380..0000000000
--- a/Loop Status Extension/nl.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? E";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ E";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Actieve Koolhydraten";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Actieve Insuline";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Uiteindelijk %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ E";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "E";
-
diff --git a/Loop Status Extension/nl.lproj/MainInterface.strings b/Loop Status Extension/nl.lproj/MainInterface.strings
deleted file mode 100644
index 3300ee0aec..0000000000
--- a/Loop Status Extension/nl.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Actieve Koolhydraten";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Actieve Insuline";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 E";
-
diff --git a/Loop Status Extension/pl.lproj/InfoPlist.strings b/Loop Status Extension/pl.lproj/InfoPlist.strings
deleted file mode 100644
index 1565e025fa..0000000000
--- a/Loop Status Extension/pl.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Status Extension";
-
diff --git a/Loop Status Extension/pl.lproj/Localizable.strings b/Loop Status Extension/pl.lproj/Localizable.strings
deleted file mode 100644
index 9f9cab187f..0000000000
--- a/Loop Status Extension/pl.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? J";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ J";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Aktywne węglowodany";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Aktywna insulina";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Docelowo %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ J";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dl";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "J";
-
diff --git a/Loop Status Extension/pl.lproj/MainInterface.strings b/Loop Status Extension/pl.lproj/MainInterface.strings
deleted file mode 100644
index 137aac2c3c..0000000000
--- a/Loop Status Extension/pl.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Aktywne węglowodany";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Aktywna insulina";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 J";
-
diff --git a/Loop Status Extension/pt-BR.lproj/InfoPlist.strings b/Loop Status Extension/pt-BR.lproj/InfoPlist.strings
deleted file mode 100644
index 034a1e1f6a..0000000000
--- a/Loop Status Extension/pt-BR.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
diff --git a/Loop Status Extension/pt-BR.lproj/Localizable.strings b/Loop Status Extension/pt-BR.lproj/Localizable.strings
deleted file mode 100644
index ed1ddc8056..0000000000
--- a/Loop Status Extension/pt-BR.lproj/Localizable.strings
+++ /dev/null
@@ -1,33 +0,0 @@
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Carboidratos Ativos";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Insulina Ativa";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Eventualmente %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/pt-BR.lproj/MainInterface.strings b/Loop Status Extension/pt-BR.lproj/MainInterface.strings
deleted file mode 100644
index 09c2331507..0000000000
--- a/Loop Status Extension/pt-BR.lproj/MainInterface.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Carboidratos Ativos";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Insulina Ativa";
-
diff --git a/Loop Status Extension/ro.lproj/InfoPlist.strings b/Loop Status Extension/ro.lproj/InfoPlist.strings
deleted file mode 100644
index 811f60ffd2..0000000000
--- a/Loop Status Extension/ro.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Extensie stare Loop";
-
diff --git a/Loop Status Extension/ro.lproj/Localizable.strings b/Loop Status Extension/ro.lproj/Localizable.strings
deleted file mode 100644
index e749a36e8e..0000000000
--- a/Loop Status Extension/ro.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? U";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ U";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Carbohidrați activi";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Insulină activă";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Eventually %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@%2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/ro.lproj/MainInterface.strings b/Loop Status Extension/ro.lproj/MainInterface.strings
deleted file mode 100644
index 52df0e4c8c..0000000000
--- a/Loop Status Extension/ro.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Carbohidrați activi";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Insulină activă";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 U";
-
diff --git a/Loop Status Extension/ru.lproj/InfoPlist.strings b/Loop Status Extension/ru.lproj/InfoPlist.strings
deleted file mode 100644
index 1565e025fa..0000000000
--- a/Loop Status Extension/ru.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Status Extension";
-
diff --git a/Loop Status Extension/ru.lproj/Localizable.strings b/Loop Status Extension/ru.lproj/Localizable.strings
deleted file mode 100644
index 590b1893da..0000000000
--- a/Loop Status Extension/ru.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? г";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? ед.";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ Ед";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ версии %2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Активные углеводы";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Активный инсулин";
-
-/* The short unit display string for decibles */
-"dB" = "дБ";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "В конечном итоге %1$@";
-
-/* The short unit display string for grams */
-"g" = "г";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ ед";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "мг/дл";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "ммоль/л";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "ед";
-
diff --git a/Loop Status Extension/ru.lproj/MainInterface.strings b/Loop Status Extension/ru.lproj/MainInterface.strings
deleted file mode 100644
index 7a44069cbe..0000000000
--- a/Loop Status Extension/ru.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Активные углеводы";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 г";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Активный инсулин";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 ед.";
-
diff --git a/Loop Status Extension/sk.lproj/InfoPlist.strings b/Loop Status Extension/sk.lproj/InfoPlist.strings
deleted file mode 100644
index 034a1e1f6a..0000000000
--- a/Loop Status Extension/sk.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
diff --git a/Loop Status Extension/sk.lproj/Localizable.strings b/Loop Status Extension/sk.lproj/Localizable.strings
deleted file mode 100644
index f7fe0850f1..0000000000
--- a/Loop Status Extension/sk.lproj/Localizable.strings
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? j";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%@ j";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v %2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Aktívne sacharidy";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Aktívny inzulín";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ j";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "j";
-
diff --git a/Loop Status Extension/sk.lproj/MainInterface.strings b/Loop Status Extension/sk.lproj/MainInterface.strings
deleted file mode 100644
index e249f99412..0000000000
--- a/Loop Status Extension/sk.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Aktívne sacharidy";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Aktívny inzulín";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 j";
-
diff --git a/Loop Status Extension/sv.lproj/InfoPlist.strings b/Loop Status Extension/sv.lproj/InfoPlist.strings
deleted file mode 100644
index 1565e025fa..0000000000
--- a/Loop Status Extension/sv.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Status Extension";
-
diff --git a/Loop Status Extension/sv.lproj/Localizable.strings b/Loop Status Extension/sv.lproj/Localizable.strings
deleted file mode 100644
index fb3f8b00e7..0000000000
--- a/Loop Status Extension/sv.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? g";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? E";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ E";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Aktiva kolhydrater";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Aktivt insulin";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Förväntat %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ E";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dl";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "E";
-
diff --git a/Loop Status Extension/sv.lproj/MainInterface.strings b/Loop Status Extension/sv.lproj/MainInterface.strings
deleted file mode 100644
index afc966ed37..0000000000
--- a/Loop Status Extension/sv.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Aktiva kolhydrater";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 g";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Aktivt insulin";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 E";
-
diff --git a/Loop Status Extension/tr.lproj/InfoPlist.strings b/Loop Status Extension/tr.lproj/InfoPlist.strings
deleted file mode 100644
index a67e46ff7e..0000000000
--- a/Loop Status Extension/tr.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
-/* Bundle name */
-"CFBundleName" = "Loop Durum Uzantısı";
-
diff --git a/Loop Status Extension/tr.lproj/Localizable.strings b/Loop Status Extension/tr.lproj/Localizable.strings
deleted file mode 100644
index 0f5ebe9125..0000000000
--- a/Loop Status Extension/tr.lproj/Localizable.strings
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Displayed in the widget when the amount of active carbs cannot be determined. */
-"? g" = "? gr";
-
-/* Displayed in the widget when the amount of active insulin cannot be determined. */
-"? U" = "? Ü";
-
-/* The subtitle format describing the grams of active carbs. (1: localized carb value description) */
-"%1$@" = "%1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"%1$@ U" = "%1$@ Ü";
-
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Aktif Karb.";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Aktif İnsülin";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Nihai KŞ %1$@";
-
-/* The short unit display string for grams */
-"g" = "gr";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "AİNS %1$@ Ü";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "Ü";
-
diff --git a/Loop Status Extension/tr.lproj/MainInterface.strings b/Loop Status Extension/tr.lproj/MainInterface.strings
deleted file mode 100644
index de7b3fc545..0000000000
--- a/Loop Status Extension/tr.lproj/MainInterface.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Aktif Karb.";
-
-/* Class = "UILabel"; text = "0 g"; ObjectID = "dPp-lJ-5sh"; */
-"dPp-lJ-5sh.text" = "0 gr";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Aktif İnsülin";
-
-/* Class = "UILabel"; text = "0 U"; ObjectID = "Vgf-p1-2QP"; */
-"Vgf-p1-2QP.text" = "0 Ü";
-
diff --git a/Loop Status Extension/vi.lproj/InfoPlist.strings b/Loop Status Extension/vi.lproj/InfoPlist.strings
deleted file mode 100644
index 034a1e1f6a..0000000000
--- a/Loop Status Extension/vi.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Loop";
-
diff --git a/Loop Status Extension/vi.lproj/Localizable.strings b/Loop Status Extension/vi.lproj/Localizable.strings
deleted file mode 100644
index a0b94d6a7f..0000000000
--- a/Loop Status Extension/vi.lproj/Localizable.strings
+++ /dev/null
@@ -1,33 +0,0 @@
-/* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
-"%1$@ v%2$@" = "%1$@ v%2$@";
-
-/* Widget label title describing the active carbs */
-"Active Carbs" = "Lượng Carbs còn hoạt động";
-
-/* Widget label title describing the active insulin */
-"Active Insulin" = "Lượng Insulin còn hoạt động";
-
-/* The short unit display string for decibles */
-"dB" = "dB";
-
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "Kết quả là %1$@";
-
-/* The short unit display string for grams */
-"g" = "g";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ U";
-
-/* The short unit display string for milligrams of glucose per decilter */
-"mg/dL" = "mg/dL";
-
-/* The short unit display string for millimoles of glucose per liter */
-"mmol/L" = "mmol/L";
-
-/* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
-"QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
-
-/* The short unit display string for international units of insulin */
-"U" = "U";
-
diff --git a/Loop Status Extension/vi.lproj/MainInterface.strings b/Loop Status Extension/vi.lproj/MainInterface.strings
deleted file mode 100644
index c766b97e1b..0000000000
--- a/Loop Status Extension/vi.lproj/MainInterface.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "Lượng Carbs còn hoạt động";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "Lượng Insulin còn hoạt động";
-
diff --git a/Loop Status Extension/zh-Hans.lproj/Localizable.strings b/Loop Status Extension/zh-Hans.lproj/Localizable.strings
deleted file mode 100644
index b1d62cfb8c..0000000000
--- a/Loop Status Extension/zh-Hans.lproj/Localizable.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* The subtitle format describing eventual glucose. (1: localized glucose value description) */
-"Eventually %1$@" = "最终 %1$@";
-
-/* The subtitle format describing units of active insulin. (1: localized insulin value description) */
-"IOB %1$@ U" = "IOB %1$@ 单位";
-
diff --git a/Loop Status Extension/zh-Hans.lproj/MainInterface.strings b/Loop Status Extension/zh-Hans.lproj/MainInterface.strings
deleted file mode 100644
index 2a063e6084..0000000000
--- a/Loop Status Extension/zh-Hans.lproj/MainInterface.strings
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Class = "UILabel"; text = "Active Carbs"; ObjectID = "9iF-xY-Bh4"; */
-"9iF-xY-Bh4.text" = "最终血糖为92 毫克/分升";
-
-/* Class = "UILabel"; text = "Active Insulin"; ObjectID = "UPi-dG-yYD"; */
-"UPi-dG-yYD.text" = "IOB 1.0 单位";
-
diff --git a/Loop Widget Extension/Components/BasalView.swift b/Loop Widget Extension/Components/BasalView.swift
index b64bc9f338..224fbc7c27 100644
--- a/Loop Widget Extension/Components/BasalView.swift
+++ b/Loop Widget Extension/Components/BasalView.swift
@@ -10,8 +10,7 @@ import SwiftUI
struct BasalView: View {
let netBasal: NetBasalContext
- let isOld: Bool
-
+ let isStale: Bool
var body: some View {
let percent = netBasal.percentage
@@ -21,20 +20,20 @@ struct BasalView: View {
BasalRateView(percent: percent)
.overlay(
BasalRateView(percent: percent)
- .stroke(isOld ? Color(UIColor.systemGray3) : Color("insulin"), lineWidth: 2)
+ .stroke(isStale ? Color.staleGray : Color.insulin, lineWidth: 2)
)
- .foregroundColor((isOld ? Color(UIColor.systemGray3) : Color("insulin")).opacity(0.5))
+ .foregroundColor((isStale ? Color.staleGray : Color.insulin).opacity(0.5))
.frame(width: 44, height: 22)
if let rateString = decimalFormatter.string(from: NSNumber(value: rate)) {
Text("\(rateString) U")
.font(.footnote)
- .foregroundColor(Color(isOld ? UIColor.systemGray3 : UIColor.secondaryLabel))
+ .foregroundColor(isStale ? .staleGray : .secondary)
}
else {
Text("-U")
.font(.footnote)
- .foregroundColor(Color(isOld ? UIColor.systemGray3 : UIColor.secondaryLabel))
+ .foregroundColor(isStale ? .staleGray : .secondary)
}
}
}
diff --git a/Loop Widget Extension/Components/DeeplinkView.swift b/Loop Widget Extension/Components/DeeplinkView.swift
new file mode 100644
index 0000000000..79fdf05862
--- /dev/null
+++ b/Loop Widget Extension/Components/DeeplinkView.swift
@@ -0,0 +1,55 @@
+//
+// DeeplinkView.swift
+// Loop Widget Extension
+//
+// Created by Noah Brauner on 8/9/24.
+// Copyright © 2024 LoopKit Authors. All rights reserved.
+//
+
+import SwiftUI
+
+fileprivate extension Deeplink {
+ var deeplinkURL: URL {
+ URL(string: "loop://\(rawValue)")!
+ }
+
+ var accentColor: Color {
+ switch self {
+ case .carbEntry:
+ return .carbs
+ case .bolus:
+ return .insulin
+ case .preMeal:
+ return .carbs
+ case .customPresets:
+ return .glucose
+ }
+ }
+
+ var icon: Image {
+ switch self {
+ case .carbEntry:
+ return Image(.carbs)
+ case .bolus:
+ return Image(.bolus)
+ case .preMeal:
+ return Image(.premeal)
+ case .customPresets:
+ return Image(.workout)
+ }
+ }
+}
+
+struct DeeplinkView: View {
+ let destination: Deeplink
+ var isActive: Bool = false
+
+ var body: some View {
+ Link(destination: destination.deeplinkURL) {
+ destination.icon
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
+ .foregroundColor(isActive ? .white : destination.accentColor)
+ .containerRelativeBackground(color: isActive ? destination.accentColor : .widgetSecondaryBackground)
+ }
+ }
+}
diff --git a/Loop Widget Extension/Components/EventualGlucoseView.swift b/Loop Widget Extension/Components/EventualGlucoseView.swift
new file mode 100644
index 0000000000..fcb0d742b0
--- /dev/null
+++ b/Loop Widget Extension/Components/EventualGlucoseView.swift
@@ -0,0 +1,34 @@
+//
+// EventualGlucoseView.swift
+// Loop Widget Extension
+//
+// Created by Noah Brauner on 8/8/24.
+// Copyright © 2024 LoopKit Authors. All rights reserved.
+//
+
+import SwiftUI
+
+struct EventualGlucoseView: View {
+ let entry: StatusWidgetTimelimeEntry
+
+ var body: some View {
+ if let eventualGlucose = entry.eventualGlucose {
+ let glucoseFormatter = NumberFormatter.glucoseFormatter(for: eventualGlucose.unit)
+ if let glucoseString = glucoseFormatter.string(from: eventualGlucose.quantity.doubleValue(for: eventualGlucose.unit)) {
+ VStack {
+ Text("Eventual")
+ .font(.footnote)
+ .foregroundColor(entry.contextIsStale ? .staleGray : .secondary)
+
+ Text("\(glucoseString)")
+ .font(.subheadline)
+ .fontWeight(.heavy)
+
+ Text(eventualGlucose.unit.shortLocalizedUnitString())
+ .font(.footnote)
+ .foregroundColor(entry.contextIsStale ? .staleGray : .secondary)
+ }
+ }
+ }
+ }
+}
diff --git a/Loop Widget Extension/Components/GlucoseView.swift b/Loop Widget Extension/Components/GlucoseView.swift
index a0d5c5c26b..332d4afee4 100644
--- a/Loop Widget Extension/Components/GlucoseView.swift
+++ b/Loop Widget Extension/Components/GlucoseView.swift
@@ -12,78 +12,45 @@ import HealthKit
import LoopCore
struct GlucoseView: View {
-
var entry: StatusWidgetTimelimeEntry
var body: some View {
VStack(alignment: .center, spacing: 0) {
HStack(spacing: 2) {
- if let glucose = entry.currentGlucose,
- !entry.glucoseIsStale,
- let unit = entry.unit
- {
- let quantity = glucose.quantity
- let glucoseFormatter = NumberFormatter.glucoseFormatter(for: unit)
- if let glucoseString = glucoseFormatter.string(from: quantity.doubleValue(for: unit)) {
- Text(glucoseString)
- .font(.system(size: 24, weight: .heavy, design: .default))
- }
- else {
- Text("??")
- .font(.system(size: 24, weight: .heavy, design: .default))
- }
+ if !entry.glucoseIsStale,
+ let glucoseQuantity = entry.currentGlucose?.quantity,
+ let unit = entry.unit,
+ let glucoseString = NumberFormatter.glucoseFormatter(for: unit).string(from: glucoseQuantity.doubleValue(for: unit)) {
+ Text(glucoseString)
+ .font(.system(size: 24, weight: .heavy, design: .default))
}
else {
Text("---")
.font(.system(size: 24, weight: .heavy, design: .default))
}
- if let trendImageName = getArrowImage() {
- Image(systemName: trendImageName)
+ if let trendImage = entry.sensor?.trendType?.image {
+ Image(uiImage: trendImage)
+ .renderingMode(.template)
}
}
- // Prevent truncation of text
- .fixedSize(horizontal: true, vertical: false)
- .foregroundColor(entry.glucoseStatusIsStale ? Color(UIColor.systemGray3) : .primary)
+ .foregroundColor(entry.glucoseStatusIsStale ? .staleGray : .primary)
- let unitString = entry.unit == nil ? "-" : entry.unit!.localizedShortUnitString
+ let unitString = entry.unit?.localizedShortUnitString ?? "-"
if let delta = entry.delta, let unit = entry.unit {
let deltaValue = delta.doubleValue(for: unit)
let numberFormatter = NumberFormatter.glucoseFormatter(for: unit)
let deltaString = (deltaValue < 0 ? "-" : "+") + numberFormatter.string(from: abs(deltaValue))!
Text(deltaString + " " + unitString)
- // Dynamic text causes string to be cut off
- .font(.system(size: 13))
- .foregroundColor(entry.glucoseStatusIsStale ? Color(UIColor.systemGray3) : Color(UIColor.secondaryLabel))
- .fixedSize(horizontal: true, vertical: true)
+ .font(.footnote)
+ .foregroundColor(entry.glucoseStatusIsStale ? .staleGray : .secondary)
}
else {
Text(unitString)
.font(.footnote)
- .foregroundColor(entry.glucoseStatusIsStale ? Color(UIColor.systemGray3) : Color(UIColor.secondaryLabel))
+ .foregroundColor(entry.glucoseStatusIsStale ? .staleGray : .secondary)
}
}
}
-
- private func getArrowImage() -> String? {
- switch entry.sensor?.trendType {
- case .upUpUp:
- return "arrow.double.up.circle"
- case .upUp:
- return "arrow.up.circle"
- case .up:
- return "arrow.up.right.circle"
- case .flat:
- return "arrow.right.circle"
- case .down:
- return "arrow.down.right.circle"
- case .downDown:
- return "arrow.down.circle"
- case .downDownDown:
- return "arrow.double.down.circle"
- case .none:
- return nil
- }
- }
}
diff --git a/Loop Widget Extension/Components/LoopCircleView.swift b/Loop Widget Extension/Components/LoopCircleView.swift
deleted file mode 100644
index b45bd47990..0000000000
--- a/Loop Widget Extension/Components/LoopCircleView.swift
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// LoopCircleView.swift
-// Loop
-//
-// Created by Noah Brauner on 8/15/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import SwiftUI
-import LoopCore
-
-struct LoopCircleView: View {
- var entry: StatusWidgetTimelimeEntry
-
- var body: some View {
- let closeLoop = entry.closeLoop
- let lastLoopCompleted = entry.lastLoopCompleted ?? Date().addingTimeInterval(.minutes(16))
- let age = abs(min(0, lastLoopCompleted.timeIntervalSinceNow))
- let freshness = LoopCompletionFreshness(age: age)
-
- let loopColor = getLoopColor(freshness: freshness)
-
- Circle()
- .trim(from: closeLoop ? 0 : 0.2, to: 1)
- .stroke(entry.contextIsStale ? Color(UIColor.systemGray3) : loopColor, lineWidth: 8)
- .rotationEffect(Angle(degrees: -126))
- .frame(width: 36, height: 36)
- }
-
- func getLoopColor(freshness: LoopCompletionFreshness) -> Color {
- switch freshness {
- case .fresh:
- return Color("fresh")
- case .aging:
- return Color("warning")
- case .stale:
- return Color.red
- }
- }
-}
diff --git a/Loop Widget Extension/Components/PumpView.swift b/Loop Widget Extension/Components/PumpView.swift
index bee09c1217..1dca02276d 100644
--- a/Loop Widget Extension/Components/PumpView.swift
+++ b/Loop Widget Extension/Components/PumpView.swift
@@ -9,42 +9,19 @@
import SwiftUI
struct PumpView: View {
-
- var entry: StatusWidgetTimelineProvider.Entry
+ var entry: StatusWidgetTimelimeEntry
var body: some View {
- HStack(alignment: .center) {
- if let pumpHighlight = entry.pumpHighlight {
- HStack {
- Image(systemName: pumpHighlight.imageName)
- .foregroundColor(pumpHighlight.state == .critical ? .critical : .warning)
- Text(pumpHighlight.localizedMessage)
- .fontWeight(.heavy)
- }
- }
- else if let netBasal = entry.netBasal {
- BasalView(netBasal: netBasal, isOld: entry.contextIsStale)
-
- if let eventualGlucose = entry.eventualGlucose {
- let glucoseFormatter = NumberFormatter.glucoseFormatter(for: eventualGlucose.unit)
- if let glucoseString = glucoseFormatter.string(from: eventualGlucose.quantity.doubleValue(for: eventualGlucose.unit)) {
- VStack {
- Text("Eventual")
- .font(.footnote)
- .foregroundColor(entry.contextIsStale ? Color(UIColor.systemGray3) : Color(UIColor.secondaryLabel))
-
- Text("\(glucoseString)")
- .font(.subheadline)
- .fontWeight(.heavy)
-
- Text(eventualGlucose.unit.shortLocalizedUnitString())
- .font(.footnote)
- .foregroundColor(entry.contextIsStale ? Color(UIColor.systemGray3) : Color(UIColor.secondaryLabel))
- }
- }
- }
+ if let pumpHighlight = entry.pumpHighlight {
+ HStack {
+ Image(systemName: pumpHighlight.imageName)
+ .foregroundColor(pumpHighlight.state == .critical ? .critical : .warning)
+ Text(pumpHighlight.localizedMessage)
+ .fontWeight(.heavy)
}
-
+ }
+ else if let netBasal = entry.netBasal {
+ BasalView(netBasal: netBasal, isStale: entry.contextIsStale)
}
}
}
diff --git a/Loop Widget Extension/Components/SystemActionLink.swift b/Loop Widget Extension/Components/SystemActionLink.swift
deleted file mode 100644
index eb62bbfa40..0000000000
--- a/Loop Widget Extension/Components/SystemActionLink.swift
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// SystemActionLink.swift
-// Loop Widget Extension
-//
-// Created by Cameron Ingham on 6/26/23.
-// Copyright © 2023 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import SwiftUI
-
-struct SystemActionLink: View {
- enum Destination: String, CaseIterable {
- case carbEntry = "carb-entry"
- case bolus = "manual-bolus"
- case preMeal = "pre-meal-preset"
- case customPreset = "custom-presets"
-
- var deeplink: URL {
- URL(string: "loop://\(rawValue)")!
- }
- }
-
- let destination: Destination
- let active: Bool
-
- init(to destination: Destination, active: Bool = false) {
- self.destination = destination
- self.active = active
- }
-
- private func foregroundColor(active: Bool) -> Color {
- switch destination {
- case .carbEntry:
- return Color("fresh")
- case .bolus:
- return Color("insulin")
- case .preMeal:
- return active ? .white : Color("fresh")
- case .customPreset:
- return active ? .white : Color("glucose")
- }
- }
-
- private func backgroundColor(active: Bool) -> Color {
- switch destination {
- case .carbEntry:
- return active ? Color("fresh") : Color("WidgetSecondaryBackground")
- case .bolus:
- return active ? Color("insulin") : Color("WidgetSecondaryBackground")
- case .preMeal:
- return active ? Color("fresh") : Color("WidgetSecondaryBackground")
- case .customPreset:
- return active ? Color("glucose") : Color("WidgetSecondaryBackground")
- }
- }
-
- private var icon: Image {
- switch destination {
- case .carbEntry:
- return Image("carbs")
- case .bolus:
- return Image("bolus")
- case .preMeal:
- return Image("premeal")
- case .customPreset:
- return Image("workout")
- }
- }
-
- var body: some View {
- Link(destination: destination.deeplink) {
- icon
- .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
- .foregroundColor(foregroundColor(active: active))
- .background(
- ContainerRelativeShape()
- .fill(backgroundColor(active: active))
- )
- }
- }
-}
diff --git a/Loop Widget Extension/DefaultAssets.xcassets/bolus.imageset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.imageset/Contents.json
similarity index 100%
rename from Loop Widget Extension/DefaultAssets.xcassets/bolus.imageset/Contents.json
rename to Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.imageset/Contents.json
diff --git a/Loop Widget Extension/DefaultAssets.xcassets/bolus.imageset/bolus.pdf b/Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.imageset/bolus.pdf
similarity index 100%
rename from Loop Widget Extension/DefaultAssets.xcassets/bolus.imageset/bolus.pdf
rename to Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.imageset/bolus.pdf
diff --git a/Loop Widget Extension/DefaultAssets.xcassets/carbs.imageset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.imageset/Contents.json
similarity index 100%
rename from Loop Widget Extension/DefaultAssets.xcassets/carbs.imageset/Contents.json
rename to Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.imageset/Contents.json
diff --git a/Loop Widget Extension/DefaultAssets.xcassets/carbs.imageset/Meal.pdf b/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.imageset/Meal.pdf
similarity index 100%
rename from Loop Widget Extension/DefaultAssets.xcassets/carbs.imageset/Meal.pdf
rename to Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.imageset/Meal.pdf
diff --git a/Loop Widget Extension/DefaultAssets.xcassets/premeal.imageset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/premeal.imageset/Contents.json
similarity index 100%
rename from Loop Widget Extension/DefaultAssets.xcassets/premeal.imageset/Contents.json
rename to Loop Widget Extension/DerivedAssetsBase.xcassets/premeal.imageset/Contents.json
diff --git a/Loop Widget Extension/DefaultAssets.xcassets/premeal.imageset/Pre-Meal.pdf b/Loop Widget Extension/DerivedAssetsBase.xcassets/premeal.imageset/Pre-Meal.pdf
similarity index 100%
rename from Loop Widget Extension/DefaultAssets.xcassets/premeal.imageset/Pre-Meal.pdf
rename to Loop Widget Extension/DerivedAssetsBase.xcassets/premeal.imageset/Pre-Meal.pdf
diff --git a/Loop Widget Extension/DefaultAssets.xcassets/workout.imageset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/workout.imageset/Contents.json
similarity index 100%
rename from Loop Widget Extension/DefaultAssets.xcassets/workout.imageset/Contents.json
rename to Loop Widget Extension/DerivedAssetsBase.xcassets/workout.imageset/Contents.json
diff --git a/Loop Widget Extension/DefaultAssets.xcassets/workout.imageset/workout.pdf b/Loop Widget Extension/DerivedAssetsBase.xcassets/workout.imageset/workout.pdf
similarity index 100%
rename from Loop Widget Extension/DefaultAssets.xcassets/workout.imageset/workout.pdf
rename to Loop Widget Extension/DerivedAssetsBase.xcassets/workout.imageset/workout.pdf
diff --git a/Loop Widget Extension/Helpers/Color.swift b/Loop Widget Extension/Helpers/Color.swift
new file mode 100644
index 0000000000..2ae525abb8
--- /dev/null
+++ b/Loop Widget Extension/Helpers/Color.swift
@@ -0,0 +1,19 @@
+//
+// Color.swift
+// Loop
+//
+// Created by Noah Brauner on 8/9/24.
+// Copyright © 2024 LoopKit Authors. All rights reserved.
+//
+
+import SwiftUI
+
+extension Color {
+ static let widgetBackground = Color(.widgetBackground)
+ static let widgetSecondaryBackground = Color(.widgetSecondaryBackground)
+ static let staleGray = Color(.systemGray3)
+
+ static let insulin = Color(.insulin)
+ static let glucose = Color(.glucose)
+ static let carbs = Color(.fresh)
+}
diff --git a/Loop Widget Extension/Helpers/ContentMargin.swift b/Loop Widget Extension/Helpers/ContentMargin.swift
index 92a2d41786..dffb63d615 100644
--- a/Loop Widget Extension/Helpers/ContentMargin.swift
+++ b/Loop Widget Extension/Helpers/ContentMargin.swift
@@ -2,8 +2,8 @@
// ContentMargin.swift
// Loop Widget Extension
//
-// Created by Cameron Ingham on 9/29/23.
-// Copyright © 2023 LoopKit Authors. All rights reserved.
+// Created by Cameron Ingham on 1/16/24.
+// Copyright © 2024 LoopKit Authors. All rights reserved.
//
import SwiftUI
diff --git a/Loop Widget Extension/Helpers/WidgetBackground.swift b/Loop Widget Extension/Helpers/WidgetBackground.swift
index f5202f092c..f8d338e6ba 100644
--- a/Loop Widget Extension/Helpers/WidgetBackground.swift
+++ b/Loop Widget Extension/Helpers/WidgetBackground.swift
@@ -12,11 +12,19 @@ extension View {
@ViewBuilder
func widgetBackground() -> some View {
if #available(iOSApplicationExtension 17.0, *) {
- self.containerBackground(for: .widget) {
- Color("WidgetBackground")
+ containerBackground(for: .widget) {
+ background { Color.widgetBackground }
}
} else {
- self.background { Color("WidgetBackground") }
+ background { Color.widgetBackground }
}
}
+
+ @ViewBuilder
+ func containerRelativeBackground(color: Color = .widgetSecondaryBackground) -> some View {
+ background(
+ ContainerRelativeShape()
+ .fill(color)
+ )
+ }
}
diff --git a/Loop Widget Extension/LoopWidgets.swift b/Loop Widget Extension/LoopWidgets.swift
index 26f92edb45..a73de9b7a7 100644
--- a/Loop Widget Extension/LoopWidgets.swift
+++ b/Loop Widget Extension/LoopWidgets.swift
@@ -10,7 +10,6 @@ import SwiftUI
@main
struct LoopWidgets: WidgetBundle {
-
@WidgetBundleBuilder
var body: some Widget {
SystemStatusWidget()
diff --git a/Loop Widget Extension/Timeline/StatusWidgetTimelimeEntry.swift b/Loop Widget Extension/Timeline/StatusWidgetTimelimeEntry.swift
index 45271bbe14..78cec95b08 100644
--- a/Loop Widget Extension/Timeline/StatusWidgetTimelimeEntry.swift
+++ b/Loop Widget Extension/Timeline/StatusWidgetTimelimeEntry.swift
@@ -10,6 +10,8 @@ import HealthKit
import LoopCore
import LoopKit
import WidgetKit
+import LoopAlgorithm
+
struct StatusWidgetTimelimeEntry: TimelineEntry {
var date: Date
@@ -17,6 +19,8 @@ struct StatusWidgetTimelimeEntry: TimelineEntry {
let contextUpdatedAt: Date
let lastLoopCompleted: Date?
+ let mostRecentGlucoseDataDate: Date?
+ let mostRecentPumpDataDate: Date?
let closeLoop: Bool
let currentGlucose: GlucoseValue?
@@ -53,6 +57,6 @@ struct StatusWidgetTimelimeEntry: TimelineEntry {
}
let glucoseAge = date - glucoseDate
- return glucoseAge >= LoopCoreConstants.inputDataRecencyInterval
+ return glucoseAge >= LoopAlgorithm.inputDataRecencyInterval
}
}
diff --git a/Loop Widget Extension/Timeline/StatusWidgetTimelineProvider.swift b/Loop Widget Extension/Timeline/StatusWidgetTimelineProvider.swift
index beb8bd2f70..b48bb1f7bf 100644
--- a/Loop Widget Extension/Timeline/StatusWidgetTimelineProvider.swift
+++ b/Loop Widget Extension/Timeline/StatusWidgetTimelineProvider.swift
@@ -11,6 +11,7 @@ import LoopCore
import LoopKit
import OSLog
import WidgetKit
+import LoopAlgorithm
class StatusWidgetTimelineProvider: TimelineProvider {
lazy var defaults = UserDefaults.appGroup
@@ -29,15 +30,21 @@ class StatusWidgetTimelineProvider: TimelineProvider {
store: cacheStore,
expireAfter: localCacheDuration)
- lazy var glucoseStore = GlucoseStore(
- cacheStore: cacheStore,
- provenanceIdentifier: HKSource.default().bundleIdentifier
- )
+ var glucoseStore: GlucoseStore!
+
+ init() {
+ Task {
+ glucoseStore = await GlucoseStore(
+ cacheStore: cacheStore,
+ provenanceIdentifier: HKSource.default().bundleIdentifier
+ )
+ }
+ }
func placeholder(in context: Context) -> StatusWidgetTimelimeEntry {
log.default("%{public}@: context=%{public}@", #function, String(describing: context))
- return StatusWidgetTimelimeEntry(date: Date(), contextUpdatedAt: Date(), lastLoopCompleted: nil, closeLoop: true, currentGlucose: nil, glucoseFetchedAt: Date(), delta: nil, unit: .milligramsPerDeciliter, sensor: nil, pumpHighlight: nil, netBasal: nil, eventualGlucose: nil, preMealPresetAllowed: true, preMealPresetActive: false, customPresetActive: false)
+ return StatusWidgetTimelimeEntry(date: Date(), contextUpdatedAt: Date(), lastLoopCompleted: nil, mostRecentGlucoseDataDate: nil, mostRecentPumpDataDate: nil, closeLoop: true, currentGlucose: nil, glucoseFetchedAt: Date(), delta: nil, unit: .milligramsPerDeciliter, sensor: nil, pumpHighlight: nil, netBasal: nil, eventualGlucose: nil, preMealPresetAllowed: true, preMealPresetActive: false, customPresetActive: false)
}
func getSnapshot(in context: Context, completion: @escaping (StatusWidgetTimelimeEntry) -> ()) {
@@ -67,7 +74,7 @@ class StatusWidgetTimelineProvider: TimelineProvider {
// Date glucose staleness changes
if let lastBGTime = newEntry.currentGlucose?.startDate {
- let staleBgRefreshTime = lastBGTime.addingTimeInterval(LoopCoreConstants.inputDataRecencyInterval+1)
+ let staleBgRefreshTime = lastBGTime.addingTimeInterval(LoopAlgorithm.inputDataRecencyInterval+1)
datesToRefreshWidget.append(staleBgRefreshTime)
}
@@ -89,29 +96,22 @@ class StatusWidgetTimelineProvider: TimelineProvider {
}
func update(completion: @escaping (StatusWidgetTimelimeEntry) -> Void) {
- let group = DispatchGroup()
- var glucose: [StoredGlucoseSample] = []
+ let startDate = Date(timeIntervalSinceNow: -LoopAlgorithm.inputDataRecencyInterval)
+
+ Task {
- let startDate = Date(timeIntervalSinceNow: -LoopCoreConstants.inputDataRecencyInterval)
+ var glucose: [StoredGlucoseSample] = []
- group.enter()
- glucoseStore.getGlucoseSamples(start: startDate) { (result) in
- switch result {
- case .failure:
+ do {
+ glucose = try await glucoseStore.getGlucoseSamples(start: startDate)
+ self.log.default("Fetched glucose: last = %{public}@, %{public}@", String(describing: glucose.last?.startDate), String(describing: glucose.last?.quantity))
+ } catch {
self.log.error("Failed to fetch glucose after %{public}@", String(describing: startDate))
- glucose = []
- case .success(let samples):
- self.log.default("Fetched glucose: last = %{public}@, %{public}@", String(describing: samples.last?.startDate), String(describing: samples.last?.quantity))
- glucose = samples
}
- group.leave()
- }
- group.wait()
- let finalGlucose = glucose
+ let finalGlucose = glucose
- Task { @MainActor in
guard let defaults = self.defaults,
let context = defaults.statusExtensionContext,
let contextUpdatedAt = context.createdAt,
@@ -158,6 +158,8 @@ class StatusWidgetTimelineProvider: TimelineProvider {
date: updateDate,
contextUpdatedAt: contextUpdatedAt,
lastLoopCompleted: lastCompleted,
+ mostRecentGlucoseDataDate: context.mostRecentGlucoseDataDate,
+ mostRecentPumpDataDate: context.mostRecentPumpDataDate,
closeLoop: closeLoop,
currentGlucose: currentGlucose,
glucoseFetchedAt: updateDate,
diff --git a/Loop Widget Extension/Widgets/SystemStatusWidget.swift b/Loop Widget Extension/Widgets/SystemStatusWidget.swift
index a64096d2ad..2cb9f7fc91 100644
--- a/Loop Widget Extension/Widgets/SystemStatusWidget.swift
+++ b/Loop Widget Extension/Widgets/SystemStatusWidget.swift
@@ -6,61 +6,81 @@
// Copyright © 2022 LoopKit Authors. All rights reserved.
//
+import LoopKit
+import LoopKitUI
import LoopUI
import SwiftUI
import WidgetKit
-struct SystemStatusWidgetEntryView : View {
-
+struct SystemStatusWidgetEntryView: View {
@Environment(\.widgetFamily) private var widgetFamily
- var entry: StatusWidgetTimelineProvider.Entry
+ var entry: StatusWidgetTimelimeEntry
+
+ var freshness: LoopCompletionFreshness {
+ var age: TimeInterval
+
+ if entry.closeLoop {
+ let lastLoopCompleted = entry.lastLoopCompleted ?? Date().addingTimeInterval(.minutes(16))
+ age = abs(min(0, lastLoopCompleted.timeIntervalSinceNow))
+ } else {
+ let mostRecentGlucoseDataDate = entry.mostRecentGlucoseDataDate ?? Date().addingTimeInterval(.minutes(16))
+ let mostRecentPumpDataDate = entry.mostRecentPumpDataDate ?? Date().addingTimeInterval(.minutes(16))
+ age = max(abs(min(0, mostRecentPumpDataDate.timeIntervalSinceNow)), abs(min(0, mostRecentGlucoseDataDate.timeIntervalSinceNow)))
+ }
+
+ return LoopCompletionFreshness(age: age)
+ }
var body: some View {
HStack(alignment: .center, spacing: 5) {
VStack(alignment: .center, spacing: 5) {
- HStack(alignment: .center, spacing: 15) {
- LoopCircleView(entry: entry)
+ HStack(alignment: .center, spacing: 0) {
+ LoopCircleView(closedLoop: entry.closeLoop, freshness: freshness)
+ .frame(maxWidth: .infinity, alignment: .center)
+ .environment(\.loopStatusColorPalette, .loopStatus)
+ .disabled(entry.contextIsStale)
GlucoseView(entry: entry)
+ .frame(maxWidth: .infinity, alignment: .center)
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
.padding(5)
- .background(
- ContainerRelativeShape()
- .fill(Color("WidgetSecondaryBackground"))
- )
+ .containerRelativeBackground()
- PumpView(entry: entry)
- .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
- .padding(5)
- .background(
- ContainerRelativeShape()
- .fill(Color("WidgetSecondaryBackground"))
- )
+ HStack(alignment: .center, spacing: 0) {
+ PumpView(entry: entry)
+ .frame(maxWidth: .infinity, alignment: .center)
+
+ EventualGlucoseView(entry: entry)
+ .frame(maxWidth: .infinity, alignment: .center)
+ }
+ .frame(maxHeight: .infinity, alignment: .center)
+ .padding(.vertical, 5)
+ .containerRelativeBackground()
}
if widgetFamily != .systemSmall {
VStack(alignment: .center, spacing: 5) {
HStack(alignment: .center, spacing: 5) {
- SystemActionLink(to: .carbEntry)
+ DeeplinkView(destination: .carbEntry)
- SystemActionLink(to: .bolus)
+ DeeplinkView(destination: .bolus)
}
HStack(alignment: .center, spacing: 5) {
if entry.preMealPresetAllowed {
- SystemActionLink(to: .preMeal, active: entry.preMealPresetActive)
+ DeeplinkView(destination: .preMeal, isActive: entry.preMealPresetActive)
}
- SystemActionLink(to: .customPreset, active: entry.customPresetActive)
+ DeeplinkView(destination: .customPresets, isActive: entry.customPresetActive)
}
}
.buttonStyle(.plain)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
}
}
- .foregroundColor(entry.contextIsStale ? Color(UIColor.systemGray3) : nil)
+ .foregroundColor(entry.contextIsStale ? .staleGray : nil)
.padding(5)
.widgetBackground()
}
diff --git a/Loop.xcodeproj/project.pbxproj b/Loop.xcodeproj/project.pbxproj
index 1181951609..dadeb401bf 100644
--- a/Loop.xcodeproj/project.pbxproj
+++ b/Loop.xcodeproj/project.pbxproj
@@ -12,9 +12,15 @@
1419606A28D955BC00BA86E0 /* MockKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C101947127DD473C004E7EB8 /* MockKitUI.framework */; };
142CB7592A60BF2E0075748A /* EditMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142CB7582A60BF2E0075748A /* EditMode.swift */; };
142CB75B2A60BFC30075748A /* FavoriteFoodsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142CB75A2A60BFC30075748A /* FavoriteFoodsView.swift */; };
- 1452F4A92A851C9400F8B9E4 /* AddEditFavoriteFoodViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1452F4A82A851C9400F8B9E4 /* AddEditFavoriteFoodViewModel.swift */; };
- 1452F4AB2A851EDF00F8B9E4 /* AddEditFavoriteFoodView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1452F4AA2A851EDF00F8B9E4 /* AddEditFavoriteFoodView.swift */; };
+ 1452F4A92A851C9400F8B9E4 /* FavoriteFoodAddEditViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1452F4A82A851C9400F8B9E4 /* FavoriteFoodAddEditViewModel.swift */; };
+ 1452F4AB2A851EDF00F8B9E4 /* FavoriteFoodAddEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1452F4AA2A851EDF00F8B9E4 /* FavoriteFoodAddEditView.swift */; };
1452F4AD2A851F8800F8B9E4 /* HowAbsorptionTimeWorksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1452F4AC2A851F8800F8B9E4 /* HowAbsorptionTimeWorksView.swift */; };
+ 1455ACA92C66665D004F44F2 /* StateColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1FB428B217806A300FAB378 /* StateColorPalette.swift */; };
+ 1455ACAB2C666F9C004F44F2 /* EventualGlucoseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1455ACAA2C666F9C004F44F2 /* EventualGlucoseView.swift */; };
+ 1455ACAD2C6675E1004F44F2 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1455ACAC2C6675DF004F44F2 /* Color.swift */; };
+ 1455ACB02C667A1F004F44F2 /* DeeplinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1455ACAF2C667A1F004F44F2 /* DeeplinkView.swift */; };
+ 1455ACB22C667BEE004F44F2 /* Deeplink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1455ACB12C667BEE004F44F2 /* Deeplink.swift */; };
+ 1455ACB32C667C16004F44F2 /* Deeplink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1455ACB12C667BEE004F44F2 /* Deeplink.swift */; };
147EFE8E2A8BCC5500272438 /* DefaultAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 147EFE8D2A8BCC5500272438 /* DefaultAssets.xcassets */; };
147EFE902A8BCD8000272438 /* DerivedAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 147EFE8F2A8BCD8000272438 /* DerivedAssets.xcassets */; };
147EFE922A8BCD8A00272438 /* DerivedAssetsBase.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 147EFE912A8BCD8A00272438 /* DerivedAssetsBase.xcassets */; };
@@ -28,7 +34,6 @@
14B1737228AEDBF6006CCD7C /* BasalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B1736E28AEDBF6006CCD7C /* BasalView.swift */; };
14B1737328AEDBF6006CCD7C /* SystemStatusWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B1736F28AEDBF6006CCD7C /* SystemStatusWidget.swift */; };
14B1737428AEDBF6006CCD7C /* GlucoseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B1737028AEDBF6006CCD7C /* GlucoseView.swift */; };
- 14B1737528AEDBF6006CCD7C /* LoopCircleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14B1737128AEDBF6006CCD7C /* LoopCircleView.swift */; };
14B1737628AEDC6C006CCD7C /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D5E1DF2459000A04910 /* HKUnit.swift */; };
14B1737728AEDC6C006CCD7C /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; };
14B1737828AEDC6C006CCD7C /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; };
@@ -41,16 +46,25 @@
14B1737F28AEDC6C006CCD7C /* PluginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16DA84122E8E112008624C2 /* PluginManager.swift */; };
14B1738028AEDC6C006CCD7C /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 892A5D58222F0A27008961AB /* Debug.swift */; };
14B1738128AEDC70006CCD7C /* StatusExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */; };
+ 14BBB3B22C629DB100ECB800 /* Character+IsEmoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14BBB3B12C629DB100ECB800 /* Character+IsEmoji.swift */; };
+ 14C970682C5991CD00E8A01B /* LoopChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C970672C5991CD00E8A01B /* LoopChartView.swift */; };
+ 14C9706A2C5A833100E8A01B /* CarbEffectChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C970692C5A833100E8A01B /* CarbEffectChartView.swift */; };
+ 14C9706C2C5A836000E8A01B /* DoseChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C9706B2C5A836000E8A01B /* DoseChartView.swift */; };
+ 14C9706E2C5A83AF00E8A01B /* IOBChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C9706D2C5A83AF00E8A01B /* IOBChartView.swift */; };
+ 14C9707E2C5A9EB600E8A01B /* GlucoseCarbChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C9707D2C5A9EB600E8A01B /* GlucoseCarbChartView.swift */; };
+ 14C970802C5C0A1500E8A01B /* FavoriteFoodInsightsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C9707F2C5C0A1500E8A01B /* FavoriteFoodInsightsViewModel.swift */; };
+ 14C970822C5C2EC100E8A01B /* FavoriteFoodInsightsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C970812C5C2EC100E8A01B /* FavoriteFoodInsightsView.swift */; };
+ 14C970842C5C2FB400E8A01B /* HowCarbEffectsWorksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C970832C5C2FB400E8A01B /* HowCarbEffectsWorksView.swift */; };
+ 14C970862C5C358C00E8A01B /* FavoriteFoodInsightsChartsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C970852C5C358C00E8A01B /* FavoriteFoodInsightsChartsView.swift */; };
14D906F42A846510006EB79A /* FavoriteFoodsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D906F32A846510006EB79A /* FavoriteFoodsViewModel.swift */; };
+ 14ED83F62C6421F9008B4A5C /* FavoriteFoodInsightsCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14ED83F52C6421F9008B4A5C /* FavoriteFoodInsightsCardView.swift */; };
1D05219B2469E9DF000EBBDE /* StoredAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D05219A2469E9DF000EBBDE /* StoredAlert.swift */; };
1D05219D2469F1F5000EBBDE /* AlertStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D05219C2469F1F5000EBBDE /* AlertStore.swift */; };
1D080CBD2473214A00356610 /* AlertStore.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1D080CBB2473214A00356610 /* AlertStore.xcdatamodeld */; };
1D12D3B92548EFDD00B53E8B /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D12D3B82548EFDD00B53E8B /* main.swift */; };
1D3F0F7526D59B6C004A5960 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 892A5D58222F0A27008961AB /* Debug.swift */; };
- 1D3F0F7626D59DCD004A5960 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 892A5D58222F0A27008961AB /* Debug.swift */; };
1D3F0F7726D59DCE004A5960 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 892A5D58222F0A27008961AB /* Debug.swift */; };
1D49795824E7289700948F05 /* ServicesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D49795724E7289700948F05 /* ServicesViewModel.swift */; };
- 1D4990E824A25931005CC357 /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E267FB2292456700A3F2AF /* FeatureFlags.swift */; };
1D4A3E2D2478628500FD601B /* StoredAlert+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D4A3E2B2478628500FD601B /* StoredAlert+CoreDataClass.swift */; };
1D4A3E2E2478628500FD601B /* StoredAlert+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D4A3E2C2478628500FD601B /* StoredAlert+CoreDataProperties.swift */; };
1D63DEA526E950D400F46FA5 /* SupportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D63DEA426E950D400F46FA5 /* SupportManager.swift */; };
@@ -59,7 +73,6 @@
1D80313D24746274002810DF /* AlertStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D80313C24746274002810DF /* AlertStoreTests.swift */; };
1D82E6A025377C6B009131FB /* TrustedTimeChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D82E69F25377C6B009131FB /* TrustedTimeChecker.swift */; };
1D8D55BC252274650044DBB6 /* BolusEntryViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D8D55BB252274650044DBB6 /* BolusEntryViewModelTests.swift */; };
- 1D9650C82523FBA100A1370B /* DeviceDataManager+BolusEntryViewModelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9650C72523FBA100A1370B /* DeviceDataManager+BolusEntryViewModelDelegate.swift */; };
1DA649A7244126CD00F61E75 /* UserNotificationAlertScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA649A6244126CD00F61E75 /* UserNotificationAlertScheduler.swift */; };
1DA649A9244126DA00F61E75 /* InAppModalAlertScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA649A8244126DA00F61E75 /* InAppModalAlertScheduler.swift */; };
1DA7A84224476EAD008257F0 /* AlertManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA7A84124476EAD008257F0 /* AlertManagerTests.swift */; };
@@ -93,9 +106,6 @@
4344628220A7A37F00C4BE6F /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4344628120A7A37E00C4BE6F /* CoreBluetooth.framework */; };
4344629220A7C19800C4BE6F /* ButtonGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4344629120A7C19800C4BE6F /* ButtonGroup.swift */; };
4344629820A8B2D700C4BE6F /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4374B5EE209D84BE00D17AA8 /* OSLog.swift */; };
- 4345E3F421F036FC009E00E5 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D848AF1E7DCBE100DADCBC /* Result.swift */; };
- 4345E3F521F036FC009E00E5 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D848AF1E7DCBE100DADCBC /* Result.swift */; };
- 4345E3FB21F04911009E00E5 /* UIColor+HIG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */; };
4345E3FC21F04911009E00E5 /* UIColor+HIG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */; };
4345E40121F67300009E00E5 /* PotentialCarbEntryUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DE92581C5479E4001FFDE1 /* PotentialCarbEntryUserInfo.swift */; };
4345E40221F67300009E00E5 /* PotentialCarbEntryUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DE92581C5479E4001FFDE1 /* PotentialCarbEntryUserInfo.swift */; };
@@ -149,12 +159,10 @@
43BFF0B51E45C1E700FF19A9 /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; };
43BFF0B71E45C20C00FF19A9 /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; };
43BFF0C61E465A4400FF19A9 /* UIColor+HIG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */; };
- 43BFF0CD1E466C8400FF19A9 /* StateColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0CC1E466C8400FF19A9 /* StateColorPalette.swift */; };
43C05CA821EB2B26006FB252 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E73471FF95A900069B5F7 /* PersistenceController.swift */; };
43C05CA921EB2B26006FB252 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E73471FF95A900069B5F7 /* PersistenceController.swift */; };
43C05CAA21EB2B49006FB252 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; };
43C05CAB21EB2B4A006FB252 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; };
- 43C05CAC21EB2B8B006FB252 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; };
43C05CAD21EB2BBF006FB252 /* NSUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B29892041F54A00BA9F93 /* NSUserDefaults.swift */; };
43C05CAF21EB2C24006FB252 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; };
43C05CB221EBD88A006FB252 /* LoopCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 43D9002A21EB209400AF44BF /* LoopCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -180,7 +188,6 @@
43DBF0531C93EC8200B3C386 /* DeviceDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DBF0521C93EC8200B3C386 /* DeviceDataManager.swift */; };
43DFB62320D4CAE7008A7BAE /* PumpManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C3B6F620BBCAA30026CAFA /* PumpManager.swift */; };
43E3449F1B9D68E900C85C07 /* StatusTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E3449E1B9D68E900C85C07 /* StatusTableViewController.swift */; };
- 43E93FB51E4675E800EAB8DB /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; };
43E93FB61E469A4000EAB8DB /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; };
43E93FB71E469A5100EAB8DB /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D5E1DF2459000A04910 /* HKUnit.swift */; };
43F41C371D3BF32400C11ED6 /* UIAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F41C361D3BF32400C11ED6 /* UIAlertController.swift */; };
@@ -190,7 +197,6 @@
43FCBBC21E51710B00343C1B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43776F9A1B8022E90074EA36 /* LaunchScreen.storyboard */; };
43FCEEA9221A615B0013DD30 /* StatusChartsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43FCEEA8221A615B0013DD30 /* StatusChartsManager.swift */; };
43FCEEAD221A66780013DD30 /* DateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43FCEEAC221A66780013DD30 /* DateFormatter.swift */; };
- 43FCEEB1221A863E0013DD30 /* StatusChartsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43FCEEB0221A863E0013DD30 /* StatusChartsManager.swift */; };
4B60626C287E286000BF8BBB /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4B60626A287E286000BF8BBB /* Localizable.strings */; };
4B60626D287E286000BF8BBB /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4B60626A287E286000BF8BBB /* Localizable.strings */; };
4B67E2C8289B4EDB002D92AF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4B67E2C6289B4EDB002D92AF /* InfoPlist.strings */; };
@@ -202,7 +208,6 @@
4F2C15741E0209F500E160D4 /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; };
4F2C15811E0495B200E160D4 /* WatchContext+WatchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2C15801E0495B200E160D4 /* WatchContext+WatchApp.swift */; };
4F2C15821E074FC600E160D4 /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; };
- 4F2C15831E0757E600E160D4 /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D5E1DF2459000A04910 /* HKUnit.swift */; };
4F2C15851E075B8700E160D4 /* LoopUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F75288D1DFE1DC600C322D6 /* LoopUI.h */; settings = {ATTRIBUTES = (Public, ); }; };
4F2C15931E09BF2C00E160D4 /* HUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2C15921E09BF2C00E160D4 /* HUDView.swift */; };
4F2C15951E09BF3C00E160D4 /* HUDView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4F2C15941E09BF3C00E160D4 /* HUDView.xib */; };
@@ -210,11 +215,7 @@
4F2C159A1E0C9E5600E160D4 /* LoopUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4F526D611DF8D9A900A04910 /* NetBasal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D601DF8D9A900A04910 /* NetBasal.swift */; };
4F6663941E905FD2009E74FC /* ChartColorPalette+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F6663931E905FD2009E74FC /* ChartColorPalette+Loop.swift */; };
- 4F70C1E11DE8DCA7006380B7 /* StatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C1E01DE8DCA7006380B7 /* StatusViewController.swift */; };
- 4F70C1E41DE8DCA7006380B7 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4F70C1E21DE8DCA7006380B7 /* MainInterface.storyboard */; };
- 4F70C1E81DE8DCA7006380B7 /* Loop Status Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4F70C1DC1DE8DCA7006380B7 /* Loop Status Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4F70C2101DE8FAC5006380B7 /* ExtensionDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C20F1DE8FAC5006380B7 /* ExtensionDataManager.swift */; };
- 4F70C2121DE900EA006380B7 /* StatusExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */; };
4F70C2131DE90339006380B7 /* StatusExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */; };
4F7528941DFE1E9500C322D6 /* LoopUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */; };
4F75289A1DFE1F6000C322D6 /* BasalRateHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437CEEBF1CD6FCD8003C8C80 /* BasalRateHUDView.swift */; };
@@ -229,31 +230,30 @@
4F7E8AC720E2AC0300AEA65E /* WatchPredictedGlucose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7E8AC620E2AC0300AEA65E /* WatchPredictedGlucose.swift */; };
4F7E8ACB20E2ACB500AEA65E /* WatchPredictedGlucose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7E8AC620E2AC0300AEA65E /* WatchPredictedGlucose.swift */; };
4F82655020E69F9A0031A8F5 /* HUDInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F82654F20E69F9A0031A8F5 /* HUDInterfaceController.swift */; };
- 4FAC02541E22F6B20087A773 /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; };
4FC8C8011DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */; };
- 4FC8C8021DEB943800A1452E /* NSUserDefaults+StatusExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */; };
4FDDD23720DC51DF00D04B16 /* LoopDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FDDD23620DC51DF00D04B16 /* LoopDataManager.swift */; };
4FF4D0F81E1725B000846527 /* NibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434F54561D287FDB002A9274 /* NibLoadable.swift */; };
4FF4D1001E18374700846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; };
4FF4D1011E18375000846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; };
63F5E17C297DDF3900A62D4B /* ckcomplication.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63F5E17A297DDF3900A62D4B /* ckcomplication.strings */; };
7D23667D21250C7E0028B67D /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D23667C21250C7E0028B67D /* LocalizedString.swift */; };
- 7D7076351FE06EDE004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076371FE06EDE004AC8EA /* Localizable.strings */; };
7D7076451FE06EE0004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076471FE06EE0004AC8EA /* InfoPlist.strings */; };
7D70764A1FE06EE1004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70764C1FE06EE1004AC8EA /* Localizable.strings */; };
7D70764F1FE06EE1004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076511FE06EE1004AC8EA /* InfoPlist.strings */; };
7D70765E1FE06EE3004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076601FE06EE3004AC8EA /* Localizable.strings */; };
7D7076631FE06EE4004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076651FE06EE4004AC8EA /* Localizable.strings */; };
7E69CFFC2A16A77E00203CBD /* ResetLoopManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E69CFFB2A16A77E00203CBD /* ResetLoopManager.swift */; };
+ 8496F7312B5711C4003E672C /* ContentMargin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8496F7302B5711C4003E672C /* ContentMargin.swift */; };
84AA81D32A4A27A3000B658B /* LoopWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AA81D22A4A27A3000B658B /* LoopWidgets.swift */; };
84AA81D62A4A28AF000B658B /* WidgetBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AA81D52A4A28AF000B658B /* WidgetBackground.swift */; };
84AA81D82A4A2910000B658B /* StatusWidgetTimelimeEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AA81D72A4A2910000B658B /* StatusWidgetTimelimeEntry.swift */; };
84AA81DB2A4A2973000B658B /* Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AA81DA2A4A2973000B658B /* Date.swift */; };
84AA81DD2A4A2999000B658B /* StatusWidgetTimelineProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AA81DC2A4A2999000B658B /* StatusWidgetTimelineProvider.swift */; };
- 84AA81E32A4A36FB000B658B /* SystemActionLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AA81E22A4A36FB000B658B /* SystemActionLink.swift */; };
84AA81E52A4A3981000B658B /* DeeplinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AA81E42A4A3981000B658B /* DeeplinkManager.swift */; };
84AA81E72A4A4DEF000B658B /* PumpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AA81E62A4A4DEF000B658B /* PumpView.swift */; };
84D2879F2AC756C8007ED283 /* ContentMargin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D2879E2AC756C8007ED283 /* ContentMargin.swift */; };
+ 84DEB10D2C18FABA00170734 /* IOSFocusModesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DEB10C2C18FABA00170734 /* IOSFocusModesView.swift */; };
+ 84EC162E2C9115CA00D220C5 /* DIYLoopUnitTestPlan.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = 84EC162D2C9115CA00D220C5 /* DIYLoopUnitTestPlan.xctestplan */; };
891B508524342BE1005DA578 /* CarbAndBolusFlowViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891B508424342BE1005DA578 /* CarbAndBolusFlowViewModel.swift */; };
892A5D59222F0A27008961AB /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 892A5D58222F0A27008961AB /* Debug.swift */; };
892A5D692230C41D008961AB /* RangeReplaceableCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 892A5D682230C41D008961AB /* RangeReplaceableCollection.swift */; };
@@ -272,7 +272,6 @@
895788B3242E69A2002CB114 /* ActionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 895788AB242E69A2002CB114 /* ActionButton.swift */; };
895FE0952201234000FCF18A /* OverrideSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 895FE0942201234000FCF18A /* OverrideSelectionViewController.swift */; };
8968B1122408B3520074BB48 /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8968B1112408B3520074BB48 /* UIFont.swift */; };
- 8968B114240C55F10074BB48 /* LoopSettingsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8968B113240C55F10074BB48 /* LoopSettingsTests.swift */; };
897A5A9624C2175B00C4E71D /* BolusEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897A5A9524C2175B00C4E71D /* BolusEntryView.swift */; };
897A5A9924C22DE800C4E71D /* BolusEntryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897A5A9824C22DE800C4E71D /* BolusEntryViewModel.swift */; };
898ECA60218ABD17001E9D35 /* GlucoseChartScaler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 898ECA5E218ABD17001E9D35 /* GlucoseChartScaler.swift */; };
@@ -294,7 +293,6 @@
89ADE13B226BFA0F0067222B /* TestingScenariosManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89ADE13A226BFA0F0067222B /* TestingScenariosManager.swift */; };
89CA2B30226C0161004D9350 /* DirectoryObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89CA2B2F226C0161004D9350 /* DirectoryObserver.swift */; };
89CA2B32226C18B8004D9350 /* TestingScenariosTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89CA2B31226C18B8004D9350 /* TestingScenariosTableViewController.swift */; };
- 89CA2B3D226E6B13004D9350 /* LocalTestingScenariosManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89CA2B3C226E6B13004D9350 /* LocalTestingScenariosManager.swift */; };
89CAB36324C8FE96009EE3CE /* PredictedGlucoseChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89CAB36224C8FE95009EE3CE /* PredictedGlucoseChartView.swift */; };
89D1503E24B506EB00EDE253 /* Dictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89D1503D24B506EB00EDE253 /* Dictionary.swift */; };
89D6953E23B6DF8A002B3066 /* PotentialCarbEntryTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89D6953D23B6DF8A002B3066 /* PotentialCarbEntryTableViewCell.swift */; };
@@ -303,7 +301,6 @@
89E08FC6242E7506000D719B /* CarbAndDateInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E08FC5242E7506000D719B /* CarbAndDateInput.swift */; };
89E08FC8242E76E9000D719B /* AnyTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E08FC7242E76E9000D719B /* AnyTransition.swift */; };
89E08FCA242E7714000D719B /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E08FC9242E7714000D719B /* UIFont.swift */; };
- 89E08FCC242E790C000D719B /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E08FCB242E790C000D719B /* Comparable.swift */; };
89E08FD0242E8B2B000D719B /* BolusConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E08FCF242E8B2B000D719B /* BolusConfirmationView.swift */; };
89E267FC2292456700A3F2AF /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E267FB2292456700A3F2AF /* FeatureFlags.swift */; };
89E267FD2292456700A3F2AF /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E267FB2292456700A3F2AF /* FeatureFlags.swift */; };
@@ -314,8 +311,6 @@
89F9119424358E4500ECCAF3 /* CarbAbsorptionTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89F9119324358E4500ECCAF3 /* CarbAbsorptionTime.swift */; };
89F9119624358E6900ECCAF3 /* BolusPickerValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89F9119524358E6900ECCAF3 /* BolusPickerValues.swift */; };
89FE21AD24AC57E30033F501 /* Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89FE21AC24AC57E30033F501 /* Collection.swift */; };
- A90EF53C25DEF06200F32D61 /* PluginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16DA84122E8E112008624C2 /* PluginManager.swift */; };
- A90EF54425DEF0A000F32D61 /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4374B5EE209D84BE00D17AA8 /* OSLog.swift */; };
A91D2A3F26CF0FF80023B075 /* IconTitleSubtitleTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A91D2A3E26CF0FF80023B075 /* IconTitleSubtitleTableViewCell.swift */; };
A91E4C2124F867A700BE9213 /* StoredAlertTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A91E4C2024F867A700BE9213 /* StoredAlertTests.swift */; };
A91E4C2324F86F1000BE9213 /* CriticalEventLogExportManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A91E4C2224F86F1000BE9213 /* CriticalEventLogExportManagerTests.swift */; };
@@ -369,24 +364,23 @@
B4001CEE28CBBC82002FB414 /* AlertManagementView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4001CED28CBBC82002FB414 /* AlertManagementView.swift */; };
B405E35924D2A75B00DD058D /* DerivedAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A966152923EA5A37005D8B29 /* DerivedAssets.xcassets */; };
B405E35A24D2B1A400DD058D /* HUDAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F2C15961E09E94E00E160D4 /* HUDAssets.xcassets */; };
- B405E35B24D2E05600DD058D /* HUDAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F2C15961E09E94E00E160D4 /* HUDAssets.xcassets */; };
B40D07C7251A89D500C1C6D7 /* GlucoseDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D07C6251A89D500C1C6D7 /* GlucoseDisplay.swift */; };
B42C951424A3C76000857C73 /* CGMStatusHUDViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B42C951324A3C76000857C73 /* CGMStatusHUDViewModel.swift */; };
B42D124328D371C400E43D22 /* AlertMuter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B42D124228D371C400E43D22 /* AlertMuter.swift */; };
B43CF07E29434EC4008A520B /* HowMuteAlertWorkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43CF07D29434EC4008A520B /* HowMuteAlertWorkView.swift */; };
B43DA44124D9C12100CAFF4E /* DismissibleHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43DA44024D9C12100CAFF4E /* DismissibleHostingController.swift */; };
+ B455C7332BD14E25002B847E /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B455C7322BD14E25002B847E /* Comparable.swift */; };
+ B455C7352BD14E30002B847E /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B455C7322BD14E25002B847E /* Comparable.swift */; };
B470F5842AB22B5100049695 /* StatefulPluggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B470F5832AB22B5100049695 /* StatefulPluggable.swift */; };
B48B0BAC24900093009A48DE /* PumpStatusHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48B0BAB24900093009A48DE /* PumpStatusHUDView.swift */; };
B490A03F24D0550F00F509FA /* GlucoseRangeCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = B490A03E24D0550F00F509FA /* GlucoseRangeCategory.swift */; };
B490A04124D0559D00F509FA /* DeviceLifecycleProgressState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B490A04024D0559D00F509FA /* DeviceLifecycleProgressState.swift */; };
B490A04324D055D900F509FA /* DeviceStatusHighlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = B490A04224D055D900F509FA /* DeviceStatusHighlight.swift */; };
- B491B09E24D0B600004CBE8F /* DerivedAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A966152523EA5A25005D8B29 /* DerivedAssets.xcassets */; };
B491B0A324D0B66D004CBE8F /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = B490A03C24D04F9400F509FA /* Color.swift */; };
B491B0A424D0B675004CBE8F /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B11E45C18400FF19A9 /* UIColor.swift */; };
B4AC0D3F24B9005300CDB0A1 /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437CEEE31CDE5C0A003C8C80 /* UIImage.swift */; };
B4BC56382518DEA900373647 /* CGMStatusHUDViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4BC56372518DEA900373647 /* CGMStatusHUDViewModelTests.swift */; };
B4C9859425D5A3BB009FD9CA /* StatusBadgeHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C9859325D5A3BB009FD9CA /* StatusBadgeHUDView.swift */; };
- B4CAD8792549D2540057946B /* LoopCompletionFreshnessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4CAD8782549D2540057946B /* LoopCompletionFreshnessTests.swift */; };
B4D4534128E5CA7900F1A8D9 /* AlertMuterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D4534028E5CA7900F1A8D9 /* AlertMuterTests.swift */; };
B4D620D424D9EDB900043B3C /* GuidanceColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D620D324D9EDB900043B3C /* GuidanceColors.swift */; };
B4D904412AA8989100CBD826 /* StatefulPluginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D904402AA8989100CBD826 /* StatefulPluginManager.swift */; };
@@ -403,7 +397,6 @@
B4FEEF7D24B8A71F00A8DF9B /* DeviceDataManager+DeviceStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4FEEF7C24B8A71F00A8DF9B /* DeviceDataManager+DeviceStatus.swift */; };
C1004DF22981F5B700B8CF94 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF02981F5B700B8CF94 /* InfoPlist.strings */; };
C1004DF52981F5B700B8CF94 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF32981F5B700B8CF94 /* Localizable.strings */; };
- C1004DF82981F5B700B8CF94 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF62981F5B700B8CF94 /* InfoPlist.strings */; };
C110888D2A3913C600BA4898 /* BuildDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C110888C2A3913C600BA4898 /* BuildDetails.swift */; };
C11613492983096D00777E7C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C11613472983096D00777E7C /* InfoPlist.strings */; };
C116134C2983096D00777E7C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C116134A2983096D00777E7C /* Localizable.strings */; };
@@ -416,14 +409,15 @@
C11BD0552523CFED00236B08 /* SimpleBolusViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C11BD0542523CFED00236B08 /* SimpleBolusViewModel.swift */; };
C1201E2C23ECDBD0002DA84A /* WatchContextRequestUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1201E2B23ECDBD0002DA84A /* WatchContextRequestUserInfo.swift */; };
C1201E2D23ECDF3D002DA84A /* WatchContextRequestUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1201E2B23ECDBD0002DA84A /* WatchContextRequestUserInfo.swift */; };
+ C129BF4A2B2791EE00DF15CB /* TemporaryPresetsManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C129BF492B2791EE00DF15CB /* TemporaryPresetsManagerTests.swift */; };
+ C129D3BF2B8697F100FEA6A9 /* TempBasalRecommendationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C129D3BE2B8697F100FEA6A9 /* TempBasalRecommendationTests.swift */; };
C13072BA2A76AF31009A7C58 /* live_capture_predicted_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = C13072B92A76AF31009A7C58 /* live_capture_predicted_glucose.json */; };
C13255D6223E7BE2008AF50C /* BolusProgressTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C1F8B1DB223862D500DD66CF /* BolusProgressTableViewCell.xib */; };
+ C138C6F82C1B8A2C00F08F1A /* GlucoseCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = C138C6F72C1B8A2C00F08F1A /* GlucoseCondition.swift */; };
C13DA2B024F6C7690098BB29 /* UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C13DA2AF24F6C7690098BB29 /* UIViewController.swift */; };
C148CEE724FD91BD00711B3B /* DeliveryUncertaintyAlertManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C148CEE624FD91BD00711B3B /* DeliveryUncertaintyAlertManager.swift */; };
- C159C825286785E000A86EC0 /* LoopUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */; };
- C159C828286785E100A86EC0 /* LoopKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C159C8192867857000A86EC0 /* LoopKitUI.framework */; };
- C159C82A286785E300A86EC0 /* MockKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C159C8212867859800A86EC0 /* MockKitUI.framework */; };
- C159C82D2867876500A86EC0 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F70C1DD1DE8DCA7006380B7 /* NotificationCenter.framework */; };
+ C152B9F52C9C7D4A00ACBC06 /* AutomationHistoryEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = C152B9F42C9C7D4A00ACBC06 /* AutomationHistoryEntry.swift */; };
+ C152B9F72C9C7EF100ACBC06 /* AutomationHistoryEntryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C152B9F62C9C7EF100ACBC06 /* AutomationHistoryEntryTests.swift */; };
C159C82F286787EF00A86EC0 /* LoopKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C159C82E286787EF00A86EC0 /* LoopKit.framework */; };
C15A8C492A7305B1009D736B /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C1E3DC4628595FAA00CA19FF /* SwiftCharts */; };
C165756F2534C468004AE16E /* SimpleBolusViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C165756E2534C468004AE16E /* SimpleBolusViewModelTests.swift */; };
@@ -434,6 +428,8 @@
C16B983E26B4893300256B05 /* DoseEnactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16B983D26B4893300256B05 /* DoseEnactor.swift */; };
C16B984026B4898800256B05 /* DoseEnactorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16B983F26B4898800256B05 /* DoseEnactorTests.swift */; };
C16DA84222E8E112008624C2 /* PluginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16DA84122E8E112008624C2 /* PluginManager.swift */; };
+ C16F51192B891DB600EFD7A1 /* StoredDataAlgorithmInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16F51182B891DB600EFD7A1 /* StoredDataAlgorithmInput.swift */; };
+ C16F511B2B89363A00EFD7A1 /* SimpleInsulinDose.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16F511A2B89363A00EFD7A1 /* SimpleInsulinDose.swift */; };
C16FC0B02A99392F0025E239 /* live_capture_input.json in Resources */ = {isa = PBXBuildFile; fileRef = C16FC0AF2A99392F0025E239 /* live_capture_input.json */; };
C1735B1E2A0809830082BB8A /* ZIPFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = C1735B1D2A0809830082BB8A /* ZIPFoundation */; };
C1742332259BEADC00399C9D /* ManualEntryDoseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1742331259BEADC00399C9D /* ManualEntryDoseView.swift */; };
@@ -444,7 +440,13 @@
C17824A51E1AD4D100D9D25C /* ManualBolusRecommendation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17824A41E1AD4D100D9D25C /* ManualBolusRecommendation.swift */; };
C17DDC9C28AC339E005FBF4C /* PersistedProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DA986B2843B6F9001D04CC /* PersistedProperty.swift */; };
C17DDC9D28AC33A1005FBF4C /* PersistedProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DA986B2843B6F9001D04CC /* PersistedProperty.swift */; };
- C18913B52524F24C007B0683 /* DeviceDataManager+SimpleBolusViewModelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18913B42524F24C007B0683 /* DeviceDataManager+SimpleBolusViewModelDelegate.swift */; };
+ C188599B2AF15E1B0010F21F /* DeviceDataManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C188599A2AF15E1B0010F21F /* DeviceDataManagerTests.swift */; };
+ C188599E2AF15FAB0010F21F /* AlertMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = C188599D2AF15FAB0010F21F /* AlertMocks.swift */; };
+ C18859A02AF1612B0010F21F /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C188599F2AF1612B0010F21F /* PersistenceController.swift */; };
+ C18859A22AF165130010F21F /* MockPumpManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18859A12AF165130010F21F /* MockPumpManager.swift */; };
+ C18859A42AF165330010F21F /* MockCGMManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18859A32AF165330010F21F /* MockCGMManager.swift */; };
+ C18859A82AF292D90010F21F /* MockTrustedTimeChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18859A72AF292D90010F21F /* MockTrustedTimeChecker.swift */; };
+ C18859AC2AF29BE50010F21F /* TemporaryPresetsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18859AB2AF29BE50010F21F /* TemporaryPresetsManager.swift */; };
C19008FE25225D3900721625 /* SimpleBolusCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19008FD25225D3900721625 /* SimpleBolusCalculator.swift */; };
C1900900252271BB00721625 /* SimpleBolusCalculatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19008FF252271BB00721625 /* SimpleBolusCalculatorTests.swift */; };
C191D2A125B3ACAA00C26C0B /* DosingStrategySelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C191D2A025B3ACAA00C26C0B /* DosingStrategySelectionView.swift */; };
@@ -459,20 +461,22 @@
C19C8C1E28663B040056D5E4 /* LoopKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4344628320A7A3BE00C4BE6F /* LoopKit.framework */; };
C19C8C1F28663B040056D5E4 /* LoopKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4344628320A7A3BE00C4BE6F /* LoopKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
C19C8C21286776C20056D5E4 /* LoopKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C19C8C20286776C20056D5E4 /* LoopKit.framework */; };
- C19E96DF23D275F8003F79B0 /* LoopCompletionFreshness.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19E96DD23D2733F003F79B0 /* LoopCompletionFreshness.swift */; };
- C19E96E023D275FA003F79B0 /* LoopCompletionFreshness.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19E96DD23D2733F003F79B0 /* LoopCompletionFreshness.swift */; };
C19F48742560ABFB003632D7 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; };
C1AD4200256D61E500164DDD /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1AD41FF256D61E500164DDD /* Comparable.swift */; };
C1AF062329426300002C1B19 /* ManualGlucoseEntryRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1AF062229426300002C1B19 /* ManualGlucoseEntryRow.swift */; };
+ C1B80D632AF97D7200AB7705 /* LoopDataManager+CarbAbsorption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1B80D622AF97D7200AB7705 /* LoopDataManager+CarbAbsorption.swift */; };
C1C660D1252E4DD5009B5C32 /* LoopConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C660D0252E4DD5009B5C32 /* LoopConstants.swift */; };
C1C73F0D1DE3D0270022FC89 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1C73F0F1DE3D0270022FC89 /* InfoPlist.strings */; };
C1CCF1122858FA900035389C /* LoopCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43D9FFCF21EAE05D00AF44BF /* LoopCore.framework */; };
- C1CCF1172858FBAD0035389C /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C1CCF1162858FBAD0035389C /* SwiftCharts */; };
C1D0B6302986D4D90098D215 /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D0B62F2986D4D90098D215 /* LocalizedString.swift */; };
C1D0B6312986D4D90098D215 /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D0B62F2986D4D90098D215 /* LocalizedString.swift */; };
C1D289B522F90A52003FFBD9 /* BasalDeliveryState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D289B422F90A52003FFBD9 /* BasalDeliveryState.swift */; };
- C1D476B42A8ED179002C1C87 /* LoopAlgorithmTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D476B32A8ED179002C1C87 /* LoopAlgorithmTests.swift */; };
C1D6EEA02A06C7270047DE5C /* MKRingProgressView in Frameworks */ = {isa = PBXBuildFile; productRef = C1D6EE9F2A06C7270047DE5C /* MKRingProgressView */; };
+ C1DA434F2B164C6C00CBD33F /* MockSettingsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DA434E2B164C6C00CBD33F /* MockSettingsProvider.swift */; };
+ C1DA43532B19310A00CBD33F /* LoopControlMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DA43522B19310A00CBD33F /* LoopControlMock.swift */; };
+ C1DA43552B193BCB00CBD33F /* MockUploadEventListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DA43542B193BCB00CBD33F /* MockUploadEventListener.swift */; };
+ C1DA43572B1A70BE00CBD33F /* SettingsManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DA43562B1A70BE00CBD33F /* SettingsManagerTests.swift */; };
+ C1DA43592B1A784900CBD33F /* MockDeliveryDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DA43582B1A784900CBD33F /* MockDeliveryDelegate.swift */; };
C1DE5D23251BFC4D00439E49 /* SimpleBolusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DE5D22251BFC4D00439E49 /* SimpleBolusView.swift */; };
C1E2773E224177C000354103 /* ClockKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1E2773D224177C000354103 /* ClockKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
C1E3862628247C6100F561A4 /* StoredLoopNotRunningNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1E3862428247B7100F561A4 /* StoredLoopNotRunningNotification.swift */; };
@@ -482,58 +486,27 @@
C1F00C60285A802A006302C5 /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C1F00C5F285A802A006302C5 /* SwiftCharts */; };
C1F00C78285A8256006302C5 /* SwiftCharts in Embed Frameworks */ = {isa = PBXBuildFile; productRef = C1F00C5F285A802A006302C5 /* SwiftCharts */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
C1F2075C26D6F9B0007AB7EB /* AppExpirationAlerter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F2075B26D6F9B0007AB7EB /* AppExpirationAlerter.swift */; };
+ C1F2CAAA2B76B3EE00D7F581 /* TempBasalRecommendation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F2CAA92B76B3EE00D7F581 /* TempBasalRecommendation.swift */; };
+ C1F2CAAC2B7A980600D7F581 /* BasalRelativeDose.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F2CAAB2B7A980600D7F581 /* BasalRelativeDose.swift */; };
C1F7822627CC056900C0919A /* SettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F7822527CC056900C0919A /* SettingsManager.swift */; };
C1F8B243223E73FD00DD66CF /* BolusProgressTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F8B1D122375E4200DD66CF /* BolusProgressTableViewCell.swift */; };
C1FB428C217806A400FAB378 /* StateColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1FB428B217806A300FAB378 /* StateColorPalette.swift */; };
- C1FB428D21791D2500FAB378 /* PumpManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C3B6F620BBCAA30026CAFA /* PumpManager.swift */; };
C1FB428F217921D600FAB378 /* PumpManagerUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1FB428E217921D600FAB378 /* PumpManagerUI.swift */; };
- C1FB4290217922A100FAB378 /* PumpManagerUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1FB428E217921D600FAB378 /* PumpManagerUI.swift */; };
DD3DBD292A33AFE9000F8B5B /* IntegralRetrospectiveCorrectionSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3DBD282A33AFE9000F8B5B /* IntegralRetrospectiveCorrectionSelectionView.swift */; };
DDC389F62A2B61750066E2E8 /* ApplicationFactorStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC389F52A2B61750066E2E8 /* ApplicationFactorStrategy.swift */; };
DDC389F82A2B620B0066E2E8 /* GlucoseBasedApplicationFactorStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC389F72A2B620B0066E2E8 /* GlucoseBasedApplicationFactorStrategy.swift */; };
DDC389FA2A2B62470066E2E8 /* ConstantApplicationFactorStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC389F92A2B62470066E2E8 /* ConstantApplicationFactorStrategy.swift */; };
DDC389FC2A2BC6670066E2E8 /* SettingsView+algorithmExperimentsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC389FB2A2BC6670066E2E8 /* SettingsView+algorithmExperimentsSection.swift */; };
DDC389FE2A2C4C830066E2E8 /* GlucoseBasedApplicationFactorSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC389FD2A2C4C830066E2E8 /* GlucoseBasedApplicationFactorSelectionView.swift */; };
- E90909D124E34AC500F963D2 /* high_and_rising_with_cob_momentum_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909CC24E34AC500F963D2 /* high_and_rising_with_cob_momentum_effect.json */; };
- E90909D224E34AC500F963D2 /* high_and_rising_with_cob_insulin_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909CD24E34AC500F963D2 /* high_and_rising_with_cob_insulin_effect.json */; };
- E90909D324E34AC500F963D2 /* high_and_rising_with_cob_predicted_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909CE24E34AC500F963D2 /* high_and_rising_with_cob_predicted_glucose.json */; };
- E90909D424E34AC500F963D2 /* high_and_rising_with_cob_carb_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909CF24E34AC500F963D2 /* high_and_rising_with_cob_carb_effect.json */; };
- E90909D524E34AC500F963D2 /* high_and_rising_with_cob_counteraction_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909D024E34AC500F963D2 /* high_and_rising_with_cob_counteraction_effect.json */; };
- E90909DC24E34F1600F963D2 /* low_and_falling_predicted_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909D724E34F1500F963D2 /* low_and_falling_predicted_glucose.json */; };
- E90909DD24E34F1600F963D2 /* low_and_falling_carb_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909D824E34F1500F963D2 /* low_and_falling_carb_effect.json */; };
- E90909DE24E34F1600F963D2 /* low_and_falling_counteraction_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909D924E34F1500F963D2 /* low_and_falling_counteraction_effect.json */; };
- E90909DF24E34F1600F963D2 /* low_and_falling_insulin_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909DA24E34F1600F963D2 /* low_and_falling_insulin_effect.json */; };
- E90909E024E34F1600F963D2 /* low_and_falling_momentum_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909DB24E34F1600F963D2 /* low_and_falling_momentum_effect.json */; };
- E90909E724E3530200F963D2 /* low_with_low_treatment_carb_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909E224E3530200F963D2 /* low_with_low_treatment_carb_effect.json */; };
- E90909E824E3530200F963D2 /* low_with_low_treatment_insulin_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909E324E3530200F963D2 /* low_with_low_treatment_insulin_effect.json */; };
- E90909E924E3530200F963D2 /* low_with_low_treatment_predicted_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909E424E3530200F963D2 /* low_with_low_treatment_predicted_glucose.json */; };
- E90909EA24E3530200F963D2 /* low_with_low_treatment_momentum_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909E524E3530200F963D2 /* low_with_low_treatment_momentum_effect.json */; };
- E90909EB24E3530200F963D2 /* low_with_low_treatment_counteraction_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909E624E3530200F963D2 /* low_with_low_treatment_counteraction_effect.json */; };
- E90909EE24E35B4000F963D2 /* high_and_falling_predicted_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909ED24E35B4000F963D2 /* high_and_falling_predicted_glucose.json */; };
- E90909F224E35B4D00F963D2 /* high_and_falling_counteraction_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909EF24E35B4C00F963D2 /* high_and_falling_counteraction_effect.json */; };
- E90909F324E35B4D00F963D2 /* high_and_falling_carb_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909F024E35B4C00F963D2 /* high_and_falling_carb_effect.json */; };
- E90909F424E35B4D00F963D2 /* high_and_falling_insulin_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909F124E35B4C00F963D2 /* high_and_falling_insulin_effect.json */; };
- E90909F624E35B7C00F963D2 /* high_and_falling_momentum_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E90909F524E35B7C00F963D2 /* high_and_falling_momentum_effect.json */; };
E93E865424DB6CBA00FF40C8 /* retrospective_output.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E865324DB6CBA00FF40C8 /* retrospective_output.json */; };
E93E865624DB731900FF40C8 /* predicted_glucose_without_retrospective.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E865524DB731900FF40C8 /* predicted_glucose_without_retrospective.json */; };
E93E865824DB75BE00FF40C8 /* predicted_glucose_very_negative.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E865724DB75BD00FF40C8 /* predicted_glucose_very_negative.json */; };
E93E86A824DDCC4400FF40C8 /* MockDoseStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = E93E86A724DDCC4400FF40C8 /* MockDoseStore.swift */; };
E93E86B024DDE1BD00FF40C8 /* MockGlucoseStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = E93E86AF24DDE1BD00FF40C8 /* MockGlucoseStore.swift */; };
E93E86B224DDE21D00FF40C8 /* MockCarbStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = E93E86B124DDE21D00FF40C8 /* MockCarbStore.swift */; };
- E93E86BA24E1FDC400FF40C8 /* flat_and_stable_insulin_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86B424E1FDC400FF40C8 /* flat_and_stable_insulin_effect.json */; };
- E93E86BB24E1FDC400FF40C8 /* flat_and_stable_momentum_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86B524E1FDC400FF40C8 /* flat_and_stable_momentum_effect.json */; };
- E93E86BC24E1FDC400FF40C8 /* flat_and_stable_predicted_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86B624E1FDC400FF40C8 /* flat_and_stable_predicted_glucose.json */; };
- E93E86BE24E1FDC400FF40C8 /* flat_and_stable_carb_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86B824E1FDC400FF40C8 /* flat_and_stable_carb_effect.json */; };
- E93E86C324E1FE6100FF40C8 /* flat_and_stable_counteraction_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86C224E1FE6100FF40C8 /* flat_and_stable_counteraction_effect.json */; };
- E93E86CA24E2E02200FF40C8 /* high_and_stable_insulin_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86C524E2E02200FF40C8 /* high_and_stable_insulin_effect.json */; };
- E93E86CB24E2E02200FF40C8 /* high_and_stable_carb_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86C624E2E02200FF40C8 /* high_and_stable_carb_effect.json */; };
- E93E86CC24E2E02200FF40C8 /* high_and_stable_predicted_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86C724E2E02200FF40C8 /* high_and_stable_predicted_glucose.json */; };
- E93E86CD24E2E02200FF40C8 /* high_and_stable_counteraction_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86C824E2E02200FF40C8 /* high_and_stable_counteraction_effect.json */; };
- E93E86CE24E2E02200FF40C8 /* high_and_stable_momentum_effect.json in Resources */ = {isa = PBXBuildFile; fileRef = E93E86C924E2E02200FF40C8 /* high_and_stable_momentum_effect.json */; };
E942DE96253BE68F00AC532D /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; };
E942DE9F253BE6A900AC532D /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; };
E942DF34253BF87F00AC532D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 43785E9B2120E7060057DED1 /* Intents.intentdefinition */; };
- E950CA9129002D9000B5B692 /* LoopDataManagerDosingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E950CA9029002D9000B5B692 /* LoopDataManagerDosingTests.swift */; };
E95D380124EADE7C005E2F50 /* DoseStoreProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E95D380024EADE7C005E2F50 /* DoseStoreProtocol.swift */; };
E95D380324EADF36005E2F50 /* CarbStoreProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E95D380224EADF36005E2F50 /* CarbStoreProtocol.swift */; };
E95D380524EADF78005E2F50 /* GlucoseStoreProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E95D380424EADF78005E2F50 /* GlucoseStoreProtocol.swift */; };
@@ -618,13 +591,6 @@
remoteGlobalIDString = 43776F8B1B8022E90074EA36;
remoteInfo = Loop;
};
- 4F70C1E61DE8DCA7006380B7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 43776F841B8022E90074EA36 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 4F70C1DB1DE8DCA7006380B7;
- remoteInfo = "Loop Status Extension";
- };
4F7528961DFE1ED400C322D6 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 43776F841B8022E90074EA36 /* Project object */;
@@ -639,13 +605,6 @@
remoteGlobalIDString = 43D9001A21EB209400AF44BF;
remoteInfo = "LoopCore-watchOS";
};
- C11B9D582867781E00500CF8 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 43776F841B8022E90074EA36 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 4F75288A1DFE1DC600C322D6;
- remoteInfo = LoopUI;
- };
C1CCF1142858FA900035389C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 43776F841B8022E90074EA36 /* Project object */;
@@ -724,7 +683,6 @@
files = (
14B1736928AED9EE006CCD7C /* Loop Widget Extension.appex in Embed App Extensions */,
E9B07F94253BBA6500BAD8F8 /* Loop Intent Extension.appex in Embed App Extensions */,
- 4F70C1E81DE8DCA7006380B7 /* Loop Status Extension.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
@@ -745,9 +703,13 @@
/* Begin PBXFileReference section */
142CB7582A60BF2E0075748A /* EditMode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditMode.swift; sourceTree = ""; };
142CB75A2A60BFC30075748A /* FavoriteFoodsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FavoriteFoodsView.swift; sourceTree = ""; };
- 1452F4A82A851C9400F8B9E4 /* AddEditFavoriteFoodViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddEditFavoriteFoodViewModel.swift; sourceTree = ""; };
- 1452F4AA2A851EDF00F8B9E4 /* AddEditFavoriteFoodView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddEditFavoriteFoodView.swift; sourceTree = ""; };
+ 1452F4A82A851C9400F8B9E4 /* FavoriteFoodAddEditViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteFoodAddEditViewModel.swift; sourceTree = ""; };
+ 1452F4AA2A851EDF00F8B9E4 /* FavoriteFoodAddEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteFoodAddEditView.swift; sourceTree = ""; };
1452F4AC2A851F8800F8B9E4 /* HowAbsorptionTimeWorksView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HowAbsorptionTimeWorksView.swift; sourceTree = ""; };
+ 1455ACAA2C666F9C004F44F2 /* EventualGlucoseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventualGlucoseView.swift; sourceTree = ""; };
+ 1455ACAC2C6675DF004F44F2 /* Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = ""; };
+ 1455ACAF2C667A1F004F44F2 /* DeeplinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeeplinkView.swift; sourceTree = ""; };
+ 1455ACB12C667BEE004F44F2 /* Deeplink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Deeplink.swift; sourceTree = ""; };
147EFE8D2A8BCC5500272438 /* DefaultAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = DefaultAssets.xcassets; sourceTree = ""; };
147EFE8F2A8BCD8000272438 /* DerivedAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = DerivedAssets.xcassets; sourceTree = ""; };
147EFE912A8BCD8A00272438 /* DerivedAssetsBase.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = DerivedAssetsBase.xcassets; sourceTree = ""; };
@@ -762,8 +724,18 @@
14B1736E28AEDBF6006CCD7C /* BasalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasalView.swift; sourceTree = ""; };
14B1736F28AEDBF6006CCD7C /* SystemStatusWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemStatusWidget.swift; sourceTree = ""; };
14B1737028AEDBF6006CCD7C /* GlucoseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucoseView.swift; sourceTree = ""; };
- 14B1737128AEDBF6006CCD7C /* LoopCircleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoopCircleView.swift; sourceTree = ""; };
+ 14BBB3B12C629DB100ECB800 /* Character+IsEmoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Character+IsEmoji.swift"; sourceTree = ""; };
+ 14C970672C5991CD00E8A01B /* LoopChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopChartView.swift; sourceTree = ""; };
+ 14C970692C5A833100E8A01B /* CarbEffectChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarbEffectChartView.swift; sourceTree = ""; };
+ 14C9706B2C5A836000E8A01B /* DoseChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoseChartView.swift; sourceTree = ""; };
+ 14C9706D2C5A83AF00E8A01B /* IOBChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOBChartView.swift; sourceTree = ""; };
+ 14C9707D2C5A9EB600E8A01B /* GlucoseCarbChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlucoseCarbChartView.swift; sourceTree = ""; };
+ 14C9707F2C5C0A1500E8A01B /* FavoriteFoodInsightsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteFoodInsightsViewModel.swift; sourceTree = ""; };
+ 14C970812C5C2EC100E8A01B /* FavoriteFoodInsightsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteFoodInsightsView.swift; sourceTree = ""; };
+ 14C970832C5C2FB400E8A01B /* HowCarbEffectsWorksView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HowCarbEffectsWorksView.swift; sourceTree = ""; };
+ 14C970852C5C358C00E8A01B /* FavoriteFoodInsightsChartsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteFoodInsightsChartsView.swift; sourceTree = ""; };
14D906F32A846510006EB79A /* FavoriteFoodsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteFoodsViewModel.swift; sourceTree = ""; };
+ 14ED83F52C6421F9008B4A5C /* FavoriteFoodInsightsCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteFoodInsightsCardView.swift; sourceTree = ""; };
1D05219A2469E9DF000EBBDE /* StoredAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoredAlert.swift; sourceTree = ""; };
1D05219C2469F1F5000EBBDE /* AlertStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertStore.swift; sourceTree = ""; };
1D080CBC2473214A00356610 /* AlertStore.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = AlertStore.xcdatamodel; sourceTree = ""; };
@@ -777,7 +749,6 @@
1D80313C24746274002810DF /* AlertStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertStoreTests.swift; sourceTree = ""; };
1D82E69F25377C6B009131FB /* TrustedTimeChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrustedTimeChecker.swift; sourceTree = ""; };
1D8D55BB252274650044DBB6 /* BolusEntryViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BolusEntryViewModelTests.swift; sourceTree = ""; };
- 1D9650C72523FBA100A1370B /* DeviceDataManager+BolusEntryViewModelDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DeviceDataManager+BolusEntryViewModelDelegate.swift"; sourceTree = ""; };
1DA46B5F2492E2E300D71A63 /* NotificationsCriticalAlertPermissionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsCriticalAlertPermissionsView.swift; sourceTree = ""; };
1DA649A6244126CD00F61E75 /* UserNotificationAlertScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserNotificationAlertScheduler.swift; sourceTree = ""; };
1DA649A8244126DA00F61E75 /* InAppModalAlertScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InAppModalAlertScheduler.swift; sourceTree = ""; };
@@ -881,7 +852,6 @@
43BFF0B11E45C18400FF19A9 /* UIColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = ""; };
43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberFormatter.swift; sourceTree = ""; };
43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+HIG.swift"; sourceTree = ""; };
- 43BFF0CC1E466C8400FF19A9 /* StateColorPalette.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StateColorPalette.swift; sourceTree = ""; };
43C05CB021EBBDB9006FB252 /* TimeInRangeLesson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeInRangeLesson.swift; sourceTree = ""; };
43C05CB421EBE274006FB252 /* Date.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Date.swift; sourceTree = ""; };
43C05CB721EBEA54006FB252 /* HKUnit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HKUnit.swift; sourceTree = ""; };
@@ -904,7 +874,6 @@
43CE7CDD1CA8B63E003CC1B0 /* Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = ""; };
43D381611EBD9759007F8C8F /* HeaderValuesTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderValuesTableViewCell.swift; sourceTree = ""; };
43D533BB1CFD1DD7009E3085 /* WatchApp Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "WatchApp Extension.entitlements"; sourceTree = ""; };
- 43D848AF1E7DCBE100DADCBC /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; };
43D9002A21EB209400AF44BF /* LoopCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LoopCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
43D9002C21EB225D00AF44BF /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/HealthKit.framework; sourceTree = DEVELOPER_DIR; };
43D9F81721EC51CC000578CD /* DateEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateEntry.swift; sourceTree = ""; };
@@ -937,7 +906,6 @@
43F89CA222BDFBBC006BB54E /* UIActivityIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIActivityIndicatorView.swift; sourceTree = ""; };
43FCEEA8221A615B0013DD30 /* StatusChartsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusChartsManager.swift; sourceTree = ""; };
43FCEEAC221A66780013DD30 /* DateFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateFormatter.swift; sourceTree = ""; };
- 43FCEEB0221A863E0013DD30 /* StatusChartsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusChartsManager.swift; sourceTree = ""; };
4B60626B287E286000BF8BBB /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
4B67E2C7289B4EDB002D92AF /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; };
4D3B40021D4A9DFE00BC6334 /* G4ShareSpy.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = G4ShareSpy.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -951,12 +919,7 @@
4F526D5E1DF2459000A04910 /* HKUnit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HKUnit.swift; sourceTree = ""; };
4F526D601DF8D9A900A04910 /* NetBasal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetBasal.swift; sourceTree = ""; };
4F6663931E905FD2009E74FC /* ChartColorPalette+Loop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ChartColorPalette+Loop.swift"; sourceTree = ""; };
- 4F70C1DC1DE8DCA7006380B7 /* Loop Status Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Loop Status Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
4F70C1DD1DE8DCA7006380B7 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; };
- 4F70C1E01DE8DCA7006380B7 /* StatusViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = StatusViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
- 4F70C1E31DE8DCA7006380B7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; };
- 4F70C1E51DE8DCA7006380B7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- 4F70C1FD1DE8E662006380B7 /* Loop Status Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Loop Status Extension.entitlements"; sourceTree = ""; };
4F70C20F1DE8FAC5006380B7 /* ExtensionDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionDataManager.swift; sourceTree = ""; };
4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusExtensionContext.swift; sourceTree = ""; };
4F75288B1DFE1DC600C322D6 /* LoopUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LoopUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -972,85 +935,65 @@
4FFEDFBE20E5CF22000BFC58 /* ChartHUDController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartHUDController.swift; sourceTree = ""; };
63F5E17B297DDF3900A62D4B /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/ckcomplication.strings; sourceTree = ""; };
7D199D93212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Main.strings; sourceTree = ""; };
- 7D199D94212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/MainInterface.strings; sourceTree = ""; };
7D199D95212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Interface.strings; sourceTree = ""; };
7D199D96212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
7D199D97212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D199D99212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
7D199D9A212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
7D199D9D212A067700241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
7D23667521250BE30028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; };
7D23667621250BF70028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D23667821250C2D0028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; };
7D23667921250C440028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; };
7D23667A21250C480028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; };
7D23667C21250C7E0028B67D /* LocalizedString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LocalizedString.swift; path = LoopUI/Common/LocalizedString.swift; sourceTree = SOURCE_ROOT; };
7D23667E21250CAC0028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; };
7D23667F21250CB80028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; };
7D23668521250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; };
- 7D23668621250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainInterface.strings; sourceTree = ""; };
7D23668721250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Interface.strings; sourceTree = ""; };
7D23668821250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
7D23668921250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D23668B21250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
7D23668C21250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
7D23668F21250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
7D23669521250D220028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = ""; };
- 7D23669621250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MainInterface.strings; sourceTree = ""; };
7D23669721250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Interface.strings; sourceTree = ""; };
7D23669821250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
7D23669921250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D23669B21250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
7D23669C21250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
7D23669F21250D240028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
7D2366A521250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = ""; };
- 7D2366A621250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/MainInterface.strings"; sourceTree = ""; };
7D2366A721250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Interface.strings"; sourceTree = ""; };
7D2366A821250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; };
7D2366A921250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; };
- 7D2366AB21250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; };
7D2366AC21250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; };
7D2366AF21250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; };
7D2366B421250D350028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Interface.strings; sourceTree = ""; };
7D2366B721250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Main.strings; sourceTree = ""; };
- 7D2366B821250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/MainInterface.strings; sourceTree = ""; };
7D2366B921250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
7D2366BA21250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D2366BC21250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
7D2366BD21250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
7D2366BF21250D370028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
7D2366C521250D3F0028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Main.strings; sourceTree = ""; };
- 7D2366C621250D3F0028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/MainInterface.strings; sourceTree = ""; };
7D2366C721250D3F0028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Interface.strings; sourceTree = ""; };
7D2366C821250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; };
7D2366C921250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D2366CB21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; };
7D2366CC21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; };
7D2366CF21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; };
7D2366D521250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Main.strings; sourceTree = ""; };
- 7D2366D621250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/MainInterface.strings; sourceTree = ""; };
7D2366D721250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Interface.strings; sourceTree = ""; };
7D2366D821250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; };
7D2366D921250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D2366DB21250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; };
7D2366DC21250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; };
7D2366DF21250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; };
7D68AAAA1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = ""; };
- 7D68AAAB1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/MainInterface.strings; sourceTree = ""; };
7D68AAAC1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Interface.strings; sourceTree = ""; };
- 7D68AAAD1FE2E8D400522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
7D68AAB31FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
7D68AAB41FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
7D68AAB71FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
7D68AAB81FE2E8D700522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
- 7D7076361FE06EDE004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
7D70764B1FE06EE1004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
7D70765F1FE06EE3004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
7D7076641FE06EE4004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
7D9BEED52335A3CB005DCFD6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
7D9BEED72335A489005DCFD6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Main.strings; sourceTree = ""; };
- 7D9BEED82335A4F7005DCFD6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
- 7D9BEEDA2335A522005DCFD6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainInterface.strings; sourceTree = ""; };
7D9BEEDB2335A587005DCFD6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
7D9BEEDD2335A5CC005DCFD6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Interface.strings; sourceTree = ""; };
7D9BEEDE2335A5F7005DCFD6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
@@ -1086,71 +1029,59 @@
7D9BEF122335D694005DCFD6 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; };
7D9BEF132335EC4B005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Intents.strings; sourceTree = ""; };
7D9BEF152335EC4B005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; };
- 7D9BEF162335EC4B005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/MainInterface.strings; sourceTree = ""; };
7D9BEF172335EC4C005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Interface.strings; sourceTree = ""; };
7D9BEF182335EC4C005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; };
7D9BEF1A2335EC4C005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF1B2335EC4C005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF1C2335EC4C005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D9BEF1E2335EC4D005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF1F2335EC4D005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF222335EC4D005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF282335EC4E005DCFD6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF292335EC58005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Intents.strings"; sourceTree = ""; };
7D9BEF2B2335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Main.strings"; sourceTree = ""; };
- 7D9BEF2C2335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/MainInterface.strings"; sourceTree = ""; };
7D9BEF2D2335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Interface.strings"; sourceTree = ""; };
7D9BEF2E2335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Main.strings"; sourceTree = ""; };
7D9BEF302335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
7D9BEF312335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
7D9BEF322335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = ""; };
- 7D9BEF342335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
7D9BEF352335EC59005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
7D9BEF382335EC5A005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
7D9BEF3E2335EC5A005DCFD6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
7D9BEF3F2335EC62005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Intents.strings; sourceTree = ""; };
7D9BEF412335EC62005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Main.strings; sourceTree = ""; };
- 7D9BEF422335EC62005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/MainInterface.strings; sourceTree = ""; };
7D9BEF432335EC62005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Interface.strings; sourceTree = ""; };
7D9BEF442335EC62005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Main.strings; sourceTree = ""; };
7D9BEF462335EC62005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF472335EC62005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
- 7D9BEF4A2335EC63005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF4B2335EC63005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF4E2335EC63005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF542335EC64005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF552335EC6E005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Intents.strings; sourceTree = ""; };
7D9BEF572335EC6E005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Main.strings; sourceTree = ""; };
- 7D9BEF582335EC6E005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/MainInterface.strings; sourceTree = ""; };
7D9BEF592335EC6E005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Interface.strings; sourceTree = ""; };
7D9BEF5A2335EC6E005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Main.strings; sourceTree = ""; };
7D9BEF5C2335EC6F005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF5D2335EC6F005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF5E2335EC6F005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D9BEF602335EC6F005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF612335EC6F005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF642335EC6F005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF6A2335EC70005DCFD6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF6B2335EC7D005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Intents.strings; sourceTree = ""; };
7D9BEF6D2335EC7D005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Main.strings; sourceTree = ""; };
- 7D9BEF6E2335EC7D005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/MainInterface.strings; sourceTree = ""; };
7D9BEF6F2335EC7D005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Interface.strings; sourceTree = ""; };
7D9BEF702335EC7D005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Main.strings; sourceTree = ""; };
7D9BEF722335EC7D005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF732335EC7D005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; };
- 7D9BEF762335EC7D005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF772335EC7E005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF7A2335EC7E005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF802335EC7E005DCFD6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF812335EC8B005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Intents.strings; sourceTree = ""; };
7D9BEF832335EC8B005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Main.strings; sourceTree = ""; };
- 7D9BEF842335EC8B005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/MainInterface.strings; sourceTree = ""; };
7D9BEF852335EC8B005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Interface.strings; sourceTree = ""; };
7D9BEF862335EC8B005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Main.strings; sourceTree = ""; };
7D9BEF882335EC8C005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF892335EC8C005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF8A2335EC8C005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D9BEF8C2335EC8C005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF8D2335EC8C005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF902335EC8C005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
7D9BEF962335EC8D005DCFD6 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
@@ -1160,30 +1091,30 @@
7D9BEF9A233600D9005DCFD6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/InfoPlist.strings; sourceTree = ""; };
7D9BF13A23370E8B005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Intents.strings; sourceTree = ""; };
7D9BF13B23370E8B005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Main.strings; sourceTree = ""; };
- 7D9BF13C23370E8B005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/MainInterface.strings; sourceTree = ""; };
7D9BF13D23370E8B005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Interface.strings; sourceTree = ""; };
7D9BF13E23370E8C005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Main.strings; sourceTree = ""; };
7D9BF13F23370E8C005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
7D9BF14023370E8C005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
7D9BF14123370E8C005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/InfoPlist.strings; sourceTree = ""; };
- 7D9BF14223370E8C005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
7D9BF14323370E8C005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
7D9BF14423370E8D005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
7D9BF14623370E8D005DCFD6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
7DD382771F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; };
- 7DD382781F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/MainInterface.strings; sourceTree = ""; };
7DD382791F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Interface.strings; sourceTree = ""; };
7E69CFFB2A16A77E00203CBD /* ResetLoopManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetLoopManager.swift; sourceTree = ""; };
80F864E52433BF5D0026EC26 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/InfoPlist.strings; sourceTree = ""; };
+ 840A2F0D2C0F978E003D5E90 /* LoopKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LoopKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8496F7302B5711C4003E672C /* ContentMargin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentMargin.swift; sourceTree = ""; };
84AA81D22A4A27A3000B658B /* LoopWidgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopWidgets.swift; sourceTree = ""; };
84AA81D52A4A28AF000B658B /* WidgetBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetBackground.swift; sourceTree = ""; };
84AA81D72A4A2910000B658B /* StatusWidgetTimelimeEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusWidgetTimelimeEntry.swift; sourceTree = ""; };
84AA81DA2A4A2973000B658B /* Date.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Date.swift; sourceTree = ""; };
84AA81DC2A4A2999000B658B /* StatusWidgetTimelineProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusWidgetTimelineProvider.swift; sourceTree = ""; };
- 84AA81E22A4A36FB000B658B /* SystemActionLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemActionLink.swift; sourceTree = ""; };
84AA81E42A4A3981000B658B /* DeeplinkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeeplinkManager.swift; sourceTree = ""; };
84AA81E62A4A4DEF000B658B /* PumpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PumpView.swift; sourceTree = ""; };
84D2879E2AC756C8007ED283 /* ContentMargin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentMargin.swift; sourceTree = ""; };
+ 84DEB10C2C18FABA00170734 /* IOSFocusModesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOSFocusModesView.swift; sourceTree = ""; };
+ 84EC162D2C9115CA00D220C5 /* DIYLoopUnitTestPlan.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = DIYLoopUnitTestPlan.xctestplan; sourceTree = ""; };
891B508424342BE1005DA578 /* CarbAndBolusFlowViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarbAndBolusFlowViewModel.swift; sourceTree = ""; };
892A5D29222EF60A008961AB /* MockKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = MockKit.framework; path = Carthage/Build/iOS/MockKit.framework; sourceTree = SOURCE_ROOT; };
892A5D2B222EF60A008961AB /* MockKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = MockKitUI.framework; path = Carthage/Build/iOS/MockKitUI.framework; sourceTree = SOURCE_ROOT; };
@@ -1205,7 +1136,6 @@
895788AB242E69A2002CB114 /* ActionButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionButton.swift; sourceTree = ""; };
895FE0942201234000FCF18A /* OverrideSelectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverrideSelectionViewController.swift; sourceTree = "