Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
1722a24
[LOOP-5903] only display 2 decimal places (#928)
nhamming May 11, 2026
4861ed4
[LOOP-5874 & LOOP-5769] Remove Unused CorrectionRangeInformationView …
Camji55 May 12, 2026
86e1450
[LOOP-5733] Update Watch Last Loop When Disconnected (#930)
Camji55 May 13, 2026
c1d9012
Bump minimum iOS version to 18.6 (#931)
ps2 Jun 2, 2026
3650aa7
LOOP-5926 Remove IPHONEOS_DEPLOYMENT_TARGET from project (#932)
ps2 Jun 2, 2026
ada2424
[LOOP-5769] Temporarily revert LOOP-5769 (#933)
Camji55 Jun 2, 2026
3dc800c
Add tests for basal reissue logic (#934)
ps2 Jun 2, 2026
35f8ad9
[LOOP-5769] Re-apply bug fix for status modal sync (#935)
Camji55 Jun 30, 2026
a7e7c02
iOS 27 & Toolbar fix (#937)
Camji55 Jun 30, 2026
cdb643e
[LOOP-5958] Toolbar Orientation Fix (#938)
Camji55 Jul 8, 2026
5bc2672
[LOOP-5957] Replace SimpleBolusView and BolusEntryView "X" dismiss wi…
Camji55 Jul 23, 2026
3b72534
[LOOP-5955] Remove Top Divider When All App Sounds are Muted (#941)
Camji55 Jul 23, 2026
93cbdcd
[LOOP-5964] Migrate Pump/CGM/Service Pickers to Alert to Avert Broken…
Camji55 Jul 24, 2026
e1a2275
[LOOP-5951] Always Render the Critical Alerts Triangle in Color (#942)
Camji55 Jul 24, 2026
d30b4a1
[LOOP-5961] Fix Toolbar on SE (#939)
Camji55 Jul 24, 2026
1b0943b
[LOOP-5951] Allow Text Attachment Tinting with Liquid Glass (#944)
Camji55 Jul 30, 2026
2867ceb
Fix CarbMath preconditionFailure when a carb entry predates the ISF w…
ps2 Aug 13, 2026
b2cf4b6
[KELP-83] only redraw when the prediction line changes (#947)
nhamming Sep 22, 2026
1aee37d
Merge tidepool-org/Loop dev
ps2 Oct 13, 2026
1a6a173
Restore the Performance History entry point in Presets
ps2 Oct 13, 2026
35f752b
Keep the watch Last Loop row when the phone is unreachable
ps2 Oct 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions Loop.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,6 @@
C10C57FC2E70B8B900A4825C /* EnvironmentValues+GlucoseDisplayUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C10C57FB2E70B87500A4825C /* EnvironmentValues+GlucoseDisplayUnit.swift */; };
C10C57FE2E71E87D00A4825C /* ActiveOverrideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C10C57FD2E71E87400A4825C /* ActiveOverrideView.swift */; };
C110888D2A3913C600BA4898 /* BuildDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C110888C2A3913C600BA4898 /* BuildDetails.swift */; };
C11445B22DA98A3400034864 /* CorrectionRangeInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C11445B12DA98A2D00034864 /* CorrectionRangeInformationView.swift */; };
C11B9D5B286778A800500CF8 /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C11B9D5A286778A800500CF8 /* SwiftCharts */; };
C11B9D5E286778D000500CF8 /* LoopKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C11B9D5D286778D000500CF8 /* LoopKitUI.framework */; };
C11B9D62286779C000500CF8 /* MockKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C11B9D60286779C000500CF8 /* MockKit.framework */; };
Expand Down Expand Up @@ -1274,7 +1273,6 @@
C10C57FB2E70B87500A4825C /* EnvironmentValues+GlucoseDisplayUnit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EnvironmentValues+GlucoseDisplayUnit.swift"; sourceTree = "<group>"; };
C10C57FD2E71E87400A4825C /* ActiveOverrideView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveOverrideView.swift; sourceTree = "<group>"; };
C110888C2A3913C600BA4898 /* BuildDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildDetails.swift; sourceTree = "<group>"; };
C11445B12DA98A2D00034864 /* CorrectionRangeInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CorrectionRangeInformationView.swift; sourceTree = "<group>"; };
C11AA5C7258736CF00BDE12F /* DerivedAssetsBase.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = DerivedAssetsBase.xcassets; sourceTree = "<group>"; };
C11B9D5D286778D000500CF8 /* LoopKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LoopKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C11B9D60286779C000500CF8 /* MockKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MockKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -2401,7 +2399,6 @@
84E8BBAF2CC979300078E6CF /* Presets */ = {
isa = PBXGroup;
children = (
C11445B12DA98A2D00034864 /* CorrectionRangeInformationView.swift */,
84FA9D322CF7FD0D004162B4 /* PresetsHistoryView.swift */,
84B67A8C2F63558A004C783B /* PresetPerformanceHistoryView.swift */,
8446319E2F5A2AA9003825AE /* PresetsPerformanceHistoryViewModel.swift */,
Expand Down Expand Up @@ -3472,7 +3469,6 @@
A96DAC242838325900D94E38 /* DiagnosticLog.swift in Sources */,
A9CBE45A248ACBE1008E7BA2 /* DosingDecisionStore+SimulatedCoreData.swift in Sources */,
A9C62D8A2331703100535612 /* ServicesManager.swift in Sources */,
C11445B22DA98A3400034864 /* CorrectionRangeInformationView.swift in Sources */,
43DBF0531C93EC8200B3C386 /* DeviceDataManager.swift in Sources */,
A9347F2F24E7508A00C99C34 /* WatchHistoricalCarbs.swift in Sources */,
C10509792D8B636900118A37 /* Environment+TemporaryPresetsManager.swift in Sources */,
Expand Down Expand Up @@ -4275,7 +4271,6 @@
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
LOCALIZED_STRING_MACRO_NAMES = (
NSLocalizedString,
Expand Down Expand Up @@ -4387,7 +4382,6 @@
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
LOCALIZED_STRING_MACRO_NAMES = (
NSLocalizedString,
Expand Down Expand Up @@ -4808,7 +4802,6 @@
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LOCALIZED_STRING_MACRO_NAMES = (
NSLocalizedString,
CFLocalizedString,
Expand Down
6 changes: 4 additions & 2 deletions Loop/Managers/AlertPermissionsChecker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,10 @@ extension AlertPermissionsChecker {
message: alert.alertBody,
preferredStyle: .alert)
let titleImageAttachment = NSTextAttachment()
titleImageAttachment.image = UIImage(systemName: "exclamationmark.triangle.fill")?.withTintColor(.critical, renderingMode: .alwaysOriginal)
titleImageAttachment.bounds = CGRect(x: titleImageAttachment.bounds.origin.x, y: -10, width: 40, height: 35)
let iconSize = CGSize(width: 40, height: 35)
titleImageAttachment.image = UIImage(systemName: "exclamationmark.triangle.fill")?
.tintedForTextAttachment(.critical, size: iconSize)
titleImageAttachment.bounds = CGRect(x: titleImageAttachment.bounds.origin.x, y: -10, width: iconSize.width, height: iconSize.height)
let titleWithImage = NSMutableAttributedString(attachment: titleImageAttachment)
titleWithImage.append(NSMutableAttributedString(string: "\n\n", attributes: [.font: UIFont.systemFont(ofSize: 8)]))
titleWithImage.append(NSMutableAttributedString(string: alert.alertTitle, attributes: [.font: UIFont.preferredFont(forTextStyle: .headline)]))
Expand Down
9 changes: 9 additions & 0 deletions Loop/Managers/StatusChartsManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ class StatusChartsManager: ChartsManager {
let iob: IOBChart
let cob: COBChart

fileprivate var lastPredictedGlucoseValues: [GlucoseValue] = []

init(colors: ChartColorPalette, settings: ChartSettings, traitCollection: UITraitCollection) {
let glucose = PredictedGlucoseChart(predictedGlucoseBounds: FeatureFlags.predictedGlucoseChartClampEnabled ? .default : nil,
yAxisStepSizeMGDLOverride: FeatureFlags.predictedGlucoseChartClampEnabled ? 40 : nil)
Expand Down Expand Up @@ -59,6 +61,13 @@ extension StatusChartsManager {
}

func setPredictedGlucoseValues(_ glucoseValues: [GlucoseValue]) {
// Skip invalidating the chart when the prediction is unchanged to avoid needless redraws
if glucoseValues.count == lastPredictedGlucoseValues.count,
zip(glucoseValues, lastPredictedGlucoseValues).allSatisfy({ $0.startDate == $1.startDate && $0.quantity == $1.quantity })
{
return
}
lastPredictedGlucoseValues = glucoseValues
glucose.setPredictedGlucoseValues(glucoseValues)
invalidateChart(atIndex: ChartIndex.glucose.rawValue)
}
Expand Down
2 changes: 1 addition & 1 deletion Loop/View Controllers/StatusTableViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ final class StatusTableViewController: LoopChartsTableViewController {

lazy var insulinFormatter: QuantityFormatter = {
let formatter = QuantityFormatter(for: .internationalUnit)
formatter.numberFormatter.maximumFractionDigits = 3
formatter.numberFormatter.maximumFractionDigits = 2
return formatter
}()

Expand Down
8 changes: 6 additions & 2 deletions Loop/Views/LoopStatusModalView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,11 @@ class LoopStatusModalViewModel {
guard let ago,
let timeString = ago.truncatedTimeAgoString
else { return nil }

return NSLocalizedString("\(timeString) ago", comment: "last loop completed string")

if ago > .hours(1) {
return String(format: NSLocalizedString(">%@ ago", comment: "last loop completed string with greater than sign. (1: truncated time ago)"), timeString)
} else {
return String(format: NSLocalizedString("%@ ago", comment: "last loop completed string. (1: truncated time ago)"), timeString)
}
}
}
87 changes: 0 additions & 87 deletions Loop/Views/Presets/CorrectionRangeInformationView.swift

This file was deleted.

53 changes: 45 additions & 8 deletions Loop/Views/Presets/PresetsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ enum ActiveSheet: Identifiable {

struct PresetsView: View {

// Define navigation routes
enum NavigationDestination: Hashable {
case presetsHistory
}

@EnvironmentObject private var displayGlucosePreference: DisplayGlucosePreference
@Environment(\.appName) private var appName
@Environment(\.settingsManager) private var settingsManager
Expand Down Expand Up @@ -182,13 +187,33 @@ struct PresetsView: View {
}
}

if trainingCompletion.isComplete {
// Support Section
VStack(alignment: .leading, spacing: 16) {
Text("Support")
.font(.headline.weight(.semibold))
.padding(.horizontal, 10)

// Support Section
VStack(alignment: .leading, spacing: 16) {
Text("Support")
.font(.headline.weight(.semibold))
.padding(.horizontal, 10)

NavigationLink(value: NavigationDestination.presetsHistory) {
HStack {
Image("performance-history-empty")
.resizable()
.scaledToFit()
.frame(width: 32, height: 32)

Text("Performance History")
Spacer()
Image(systemName: "chevron.right")
.foregroundColor(.gray)
}
}
.padding(10)
.foregroundStyle(.primary)
.background(RoundedRectangle(cornerRadius: 8)
.fill(Color(UIColor.tertiarySystemBackground))
.stroke(Color(UIColor.secondarySystemBackground), lineWidth: 1)
.frame(maxWidth: .infinity))

if trainingCompletion.isComplete {
Button {
activeSheet = .training()
} label: {
Expand All @@ -197,7 +222,7 @@ struct PresetsView: View {
.resizable()
.scaledToFit()
.frame(width: 32, height: 32)

Text("Learning Hub")
Spacer()
Image(systemName: "chevron.right")
Expand All @@ -219,6 +244,18 @@ struct PresetsView: View {
.background(Color(UIColor.secondarySystemBackground))
.navigationTitle(Text("Presets", comment: "Presets screen title"))
.navigationBarItems(trailing: dismissButton)
.navigationDestination(for: NavigationDestination.self) { route in
switch route {
case .presetsHistory:
PresetsHistoryView(
temporaryPresetsManager: temporaryPresetsManager,
glucoseStore: glucoseStore,
carbStore: carbStore,
doseStore: doseStore,
automationHistory: automationHistory
)
}
}
}
.sheet(item: $activeSheet) { sheet in
switch sheet {
Expand Down
Loading