Skip to content

Commit 0b50ae4

Browse files
authored
Merge branch 'LoopKit:dev' into profiles
2 parents b6879d9 + 3034e45 commit 0b50ae4

File tree

48 files changed

+362
-340
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+362
-340
lines changed

Common/Extensions/NSBundle.swift

+1-41
Original file line numberDiff line numberDiff line change
@@ -53,47 +53,6 @@ extension Bundle {
5353
}
5454
}
5555

56-
var gitRevision: String? {
57-
return object(forInfoDictionaryKey: "com-loopkit-Loop-git-revision") as? String
58-
}
59-
60-
var gitBranch: String? {
61-
return object(forInfoDictionaryKey: "com-loopkit-Loop-git-branch") as? String
62-
}
63-
64-
var sourceRoot: String? {
65-
return object(forInfoDictionaryKey: "com-loopkit-Loop-srcroot") as? String
66-
}
67-
68-
var buildDateString: String? {
69-
return object(forInfoDictionaryKey: "com-loopkit-Loop-build-date") as? String
70-
}
71-
72-
var xcodeVersion: String? {
73-
return object(forInfoDictionaryKey: "com-loopkit-Loop-xcode-version") as? String
74-
}
75-
76-
var profileExpiration: Date? {
77-
return object(forInfoDictionaryKey: "com-loopkit-Loop-profile-expiration") as? Date
78-
}
79-
80-
var profileExpirationString: String {
81-
if let profileExpiration = profileExpiration {
82-
return "\(profileExpiration)"
83-
} else {
84-
return "N/A"
85-
}
86-
}
87-
88-
// These strings are only configured if it is a workspace build
89-
var workspaceGitRevision: String? {
90-
return object(forInfoDictionaryKey: "com-loopkit-LoopWorkspace-git-revision") as? String
91-
}
92-
93-
var workspaceGitBranch: String? {
94-
return object(forInfoDictionaryKey: "com-loopkit-LoopWorkspace-git-branch") as? String
95-
}
96-
9756
var localCacheDuration: TimeInterval {
9857
guard let localCacheDurationDaysString = object(forInfoDictionaryKey: "LoopLocalCacheDurationDays") as? String,
9958
let localCacheDurationDays = Double(localCacheDurationDaysString) else {
@@ -102,3 +61,4 @@ extension Bundle {
10261
return .days(localCacheDurationDays)
10362
}
10463
}
64+

Common/Models/BuildDetails.swift

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//
2+
// BuildDetails.swift
3+
// Loop
4+
//
5+
// Created by Pete Schwamb on 6/13/23.
6+
// Copyright © 2023 LoopKit Authors. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
class BuildDetails {
12+
13+
static var `default` = BuildDetails()
14+
15+
let dict: [String: Any]
16+
17+
init() {
18+
guard let url = Bundle.main.url(forResource: "BuildDetails", withExtension: ".plist"),
19+
let data = try? Data(contentsOf: url),
20+
let parsed = try? PropertyListSerialization.propertyList(from: data, format: nil) as? [String: Any] else
21+
{
22+
dict = [:]
23+
return
24+
}
25+
dict = parsed
26+
}
27+
28+
var buildDateString: String? {
29+
return dict["com-loopkit-Loop-build-date"] as? String
30+
}
31+
32+
var xcodeVersion: String? {
33+
return dict["com-loopkit-Loop-xcode-version"] as? String
34+
}
35+
36+
var gitRevision: String? {
37+
return dict["com-loopkit-Loop-git-revision"] as? String
38+
}
39+
40+
var gitBranch: String? {
41+
return dict["com-loopkit-Loop-git-branch"] as? String
42+
}
43+
44+
var sourceRoot: String? {
45+
return dict["com-loopkit-Loop-srcroot"] as? String
46+
}
47+
48+
var profileExpiration: Date? {
49+
return dict["com-loopkit-Loop-profile-expiration"] as? Date
50+
}
51+
52+
var profileExpirationString: String {
53+
if let profileExpiration = profileExpiration {
54+
return "\(profileExpiration)"
55+
} else {
56+
return "N/A"
57+
}
58+
}
59+
60+
// These strings are only configured if it is a workspace build
61+
var workspaceGitRevision: String? {
62+
return dict["com-loopkit-LoopWorkspace-git-revision"] as? String
63+
}
64+
65+
var workspaceGitBranch: String? {
66+
return dict["com-loopkit-LoopWorkspace-git-branch"] as? String
67+
}
68+
}
69+

Loop Status Extension/StatusViewController.swift

+2-14
Original file line numberDiff line numberDiff line change
@@ -84,20 +84,12 @@ class StatusViewController: UIViewController, NCWidgetProviding {
8484
expireAfter: localCacheDuration)
8585

8686
lazy var glucoseStore = GlucoseStore(
87-
healthStore: healthStore,
88-
observeHealthKitSamplesFromOtherApps: FeatureFlags.observeHealthKitGlucoseSamplesFromOtherApps,
89-
storeSamplesToHealthKit: false,
9087
cacheStore: cacheStore,
91-
observationEnabled: false,
9288
provenanceIdentifier: HKSource.default().bundleIdentifier
9389
)
9490

9591
lazy var doseStore = DoseStore(
96-
healthStore: healthStore,
97-
observeHealthKitSamplesFromOtherApps: FeatureFlags.observeHealthKitDoseSamplesFromOtherApps,
98-
storeSamplesToHealthKit: false,
9992
cacheStore: cacheStore,
100-
observationEnabled: false,
10193
insulinModelProvider: PresetInsulinModelProvider(defaultRapidActingModel: settingsStore.latestSettings?.defaultRapidActingModel?.presetForRapidActingInsulin),
10294
longestEffectDuration: ExponentialInsulinModelPreset.rapidActingAdult.effectDuration,
10395
basalProfile: settingsStore.latestSettings?.basalRateSchedule,
@@ -275,11 +267,10 @@ class StatusViewController: UIViewController, NCWidgetProviding {
275267
self.hudView.pumpStatusHUD.lifecycleProgress = context.pumpLifecycleProgressContext
276268

277269
// Active carbs
278-
let carbsFormatter = QuantityFormatter()
279-
carbsFormatter.setPreferredNumberFormatter(for: carbUnit)
270+
let carbsFormatter = QuantityFormatter(for: carbUnit)
280271

281272
if let carbsOnBoard = context.carbsOnBoard,
282-
let activeCarbsNumberString = carbsFormatter.string(from: HKQuantity(unit: carbUnit, doubleValue: carbsOnBoard), for: carbUnit)
273+
let activeCarbsNumberString = carbsFormatter.string(from: HKQuantity(unit: carbUnit, doubleValue: carbsOnBoard))
283274
{
284275
self.activeCarbsAmountLabel.text = String(format: NSLocalizedString("%1$@", comment: "The subtitle format describing the grams of active carbs. (1: localized carb value description)"), activeCarbsNumberString)
285276
} else {
@@ -307,9 +298,6 @@ class StatusViewController: UIViewController, NCWidgetProviding {
307298
}
308299

309300
// Charts
310-
let glucoseFormatter = QuantityFormatter()
311-
glucoseFormatter.setPreferredNumberFormatter(for: unit)
312-
313301
self.charts.predictedGlucose.glucoseUnit = unit
314302
self.charts.predictedGlucose.setGlucoseValues(glucose)
315303

Loop.xcodeproj/project.pbxproj

+8-1
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@
429429
C1004DF52981F5B700B8CF94 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF32981F5B700B8CF94 /* Localizable.strings */; };
430430
C1004DF82981F5B700B8CF94 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF62981F5B700B8CF94 /* InfoPlist.strings */; };
431431
C10B28461EA9BA5E006EA1FC /* far_future_high_bg_forecast.json in Resources */ = {isa = PBXBuildFile; fileRef = C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */; };
432+
C110888D2A3913C600BA4898 /* BuildDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C110888C2A3913C600BA4898 /* BuildDetails.swift */; };
432433
C11613492983096D00777E7C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C11613472983096D00777E7C /* InfoPlist.strings */; };
433434
C116134C2983096D00777E7C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C116134A2983096D00777E7C /* Localizable.strings */; };
434435
C11B9D5B286778A800500CF8 /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C11B9D5A286778A800500CF8 /* SwiftCharts */; };
@@ -506,6 +507,7 @@
506507
C1E3DC4728595FAA00CA19FF /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C1E3DC4628595FAA00CA19FF /* SwiftCharts */; };
507508
C1E3DC4928595FAA00CA19FF /* SwiftCharts in Embed Frameworks */ = {isa = PBXBuildFile; productRef = C1E3DC4628595FAA00CA19FF /* SwiftCharts */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
508509
C1E71723292E918F00DA646F /* SmallStatusWidgetEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1E71721292E90CC00DA646F /* SmallStatusWidgetEntryView.swift */; };
510+
C1EE9E812A38D0FB0064784A /* BuildDetails.plist in Resources */ = {isa = PBXBuildFile; fileRef = C1EE9E802A38D0FB0064784A /* BuildDetails.plist */; };
509511
C1EF747228D6A44A00C8C083 /* CrashRecoveryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EF747128D6A44A00C8C083 /* CrashRecoveryManager.swift */; };
510512
C1F00C60285A802A006302C5 /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C1F00C5F285A802A006302C5 /* SwiftCharts */; };
511513
C1F00C78285A8256006302C5 /* SwiftCharts in Embed Frameworks */ = {isa = PBXBuildFile; productRef = C1F00C5F285A802A006302C5 /* SwiftCharts */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
@@ -1468,6 +1470,7 @@
14681470
C101947127DD473C004E7EB8 /* MockKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MockKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
14691471
C1092BFD29F8116700AE3D1C /* apply-info-customizations.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "apply-info-customizations.sh"; sourceTree = "<group>"; };
14701472
C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = far_future_high_bg_forecast.json; sourceTree = "<group>"; };
1473+
C110888C2A3913C600BA4898 /* BuildDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildDetails.swift; sourceTree = "<group>"; };
14711474
C11613482983096D00777E7C /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = "<group>"; };
14721475
C116134B2983096D00777E7C /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = "<group>"; };
14731476
C116134D2983096D00777E7C /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/ckcomplication.strings; sourceTree = "<group>"; };
@@ -1646,6 +1649,7 @@
16461649
C1EB0D20299581D900628475 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
16471650
C1EB0D21299581D900628475 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
16481651
C1EB0D22299581D900628475 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ckcomplication.strings; sourceTree = "<group>"; };
1652+
C1EE9E802A38D0FB0064784A /* BuildDetails.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = BuildDetails.plist; sourceTree = "<group>"; };
16491653
C1EF747128D6A44A00C8C083 /* CrashRecoveryManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashRecoveryManager.swift; sourceTree = "<group>"; };
16501654
C1F2075B26D6F9B0007AB7EB /* ProfileExpirationAlerter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileExpirationAlerter.swift; sourceTree = "<group>"; };
16511655
C1F48FF62995821600C8BD69 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -2105,6 +2109,7 @@
21052109
7D7076511FE06EE1004AC8EA /* InfoPlist.strings */,
21062110
43EDEE6B1CF2E12A00393BE3 /* Loop.entitlements */,
21072111
43F5C2D41B92A4A6003EB13D /* Info.plist */,
2112+
C1EE9E802A38D0FB0064784A /* BuildDetails.plist */,
21082113
43776F8F1B8022E90074EA36 /* AppDelegate.swift */,
21092114
1D12D3B82548EFDD00B53E8B /* main.swift */,
21102115
43776F9A1B8022E90074EA36 /* LaunchScreen.storyboard */,
@@ -2614,6 +2619,7 @@
26142619
4F11D3C120DD80B3006E072C /* WatchHistoricalGlucose.swift */,
26152620
4F7E8AC620E2AC0300AEA65E /* WatchPredictedGlucose.swift */,
26162621
E9B08020253BBDE900BAD8F8 /* IntentExtensionInfo.swift */,
2622+
C110888C2A3913C600BA4898 /* BuildDetails.swift */,
26172623
);
26182624
path = Models;
26192625
sourceTree = "<group>";
@@ -3500,6 +3506,7 @@
35003506
buildActionMask = 2147483647;
35013507
files = (
35023508
C13255D6223E7BE2008AF50C /* BolusProgressTableViewCell.xib in Resources */,
3509+
C1EE9E812A38D0FB0064784A /* BuildDetails.plist in Resources */,
35033510
43FCBBC21E51710B00343C1B /* LaunchScreen.storyboard in Resources */,
35043511
B405E35A24D2B1A400DD058D /* HUDAssets.xcassets in Resources */,
35053512
A966152623EA5A26005D8B29 /* DefaultAssets.xcassets in Resources */,
@@ -3745,7 +3752,6 @@
37453752
inputFileListPaths = (
37463753
);
37473754
inputPaths = (
3748-
"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}",
37493755
);
37503756
name = "Capture Build Details";
37513757
outputFileListPaths = (
@@ -3912,6 +3918,7 @@
39123918
A98556852493F901000FD662 /* AlertStore+SimulatedCoreData.swift in Sources */,
39133919
899433B823FE129800FA4BEA /* OverrideBadgeView.swift in Sources */,
39143920
89D1503E24B506EB00EDE253 /* Dictionary.swift in Sources */,
3921+
C110888D2A3913C600BA4898 /* BuildDetails.swift in Sources */,
39153922
A96DAC2C2838F31200D94E38 /* SharedLogging.swift in Sources */,
39163923
4302F4E31D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift in Sources */,
39173924
1D63DEA526E950D400F46FA5 /* SupportManager.swift in Sources */,

Loop/BuildDetails.plist

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<!--
4+
BuildDetails.plist
5+
Loop
6+
7+
Created by Pete Schwamb on 6/13/23.
8+
Copyright (c) 2023 LoopKit Authors. All rights reserved.
9+
-->
10+
<plist version="1.0">
11+
<dict/>
12+
</plist>

Loop/Extensions/DeviceDataManager+BolusEntryViewModelDelegate.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ extension DeviceDataManager: BolusEntryViewModelDelegate, ManualDoseViewModelDel
7070
}
7171

7272
var preferredGlucoseUnit: HKUnit {
73-
return glucoseStore.preferredUnit ?? .milligramsPerDeciliter
73+
return displayGlucosePreference.unit
7474
}
7575

7676
var pumpInsulinType: InsulinType? {

Loop/Extensions/DeviceDataManager+DeviceStatus.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ extension DeviceDataManager {
8787
{
8888
return .openAppURL(url)
8989
} else if let cgmManagerUI = (cgmManager as? CGMManagerUI) {
90-
return .presentViewController(cgmManagerUI.settingsViewController(bluetoothProvider: bluetoothProvider, displayGlucoseUnitObservable: displayGlucoseUnitObservable, colorPalette: .default, allowDebugFeatures: FeatureFlags.allowDebugFeatures))
90+
return .presentViewController(cgmManagerUI.settingsViewController(bluetoothProvider: bluetoothProvider, displayGlucosePreference: displayGlucosePreference, colorPalette: .default, allowDebugFeatures: FeatureFlags.allowDebugFeatures))
9191
} else {
9292
return .setupNewCGM
9393
}

Loop/Managers/Alerts/AlertManager.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -799,8 +799,10 @@ extension AlertManager {
799799
}
800800

801801
func presentCouldNotResetLoopAlert(error: Error) {
802-
let alert = UIAlertController(title: "Could Not Restart Loop", message: "While trying to restart Loop an error occured.\n\n\(error.localizedDescription)", preferredStyle: .alert)
803-
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
802+
let titleString = String(format: NSLocalizedString("Could Not Restart %1$@", comment: "Format string for title of reset loop alert. (1: App name)"), Bundle.main.bundleDisplayName)
803+
let message = String(format: NSLocalizedString("While trying to restart %1$@ an error occured.\n\n%2$@", comment: "Format string for message of reset loop alert. (1: App name) (2: error description)"), Bundle.main.bundleDisplayName, error.localizedDescription)
804+
let alert = UIAlertController(title: titleString, message: message, preferredStyle: .alert)
805+
alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: "Cancel button for reset loop alert"), style: .cancel))
804806

805807
alertPresenter.present(alert, animated: true)
806808
}

0 commit comments

Comments
 (0)