Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
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
2 changes: 0 additions & 2 deletions Loop/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,6 @@
<string>remote-notification</string>
<string>audio</string>
</array>
<key>UIDesignRequiresCompatibility</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
Expand Down
129 changes: 89 additions & 40 deletions Loop/View Controllers/StatusTableViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -273,41 +273,76 @@ final class StatusTableViewController: LoopChartsTableViewController {
deviceManager.pumpManagerHUDProvider?.visible = active && onscreen
}

private lazy var carbEntryButton = makeToolbarButton(imageNamed: "carbs", tintColor: .carbTintColor, action: #selector(userTappedAddCarbs))
private lazy var bolusButton = makeToolbarButton(imageNamed: "bolus", tintColor: .insulinTintColor, action: #selector(presentBolusScreen))
private lazy var settingsButton = makeToolbarButton(imageNamed: "settings", tintColor: .secondaryLabel, action: #selector(onSettingsTapped))

private lazy var workoutButton: UIButton = {
let button = UIButton(type: .system)
button.tintColor = .glucoseTintColor
button.addTarget(self, action: #selector(toggleWorkoutMode(_:)), for: .touchUpInside)
button.constrainToToolbarIconSize()
return button
}()

private func makeToolbarButton(imageNamed name: String, tintColor: UIColor, action: Selector) -> UIButton {
let button = UIButton(type: .system)
button.setImage(UIImage(named: name), for: .normal)
button.tintColor = tintColor
button.addTarget(self, action: action, for: .touchUpInside)
button.constrainToToolbarIconSize()
return button
}

private func setupToolbarItems() {
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
let carbs = UIBarButtonItem(image: UIImage(named: "carbs"), style: .plain, target: self, action: #selector(userTappedAddCarbs))
let bolus = UIBarButtonItem(image: UIImage(named: "bolus"), style: .plain, target: self, action: #selector(presentBolusScreen))
let settings = UIBarButtonItem(image: UIImage(named: "settings"), style: .plain, target: self, action: #selector(onSettingsTapped))

let carbs = UIBarButtonItem(customView: carbEntryButton)
let bolus = UIBarButtonItem(customView: bolusButton)
let settings = UIBarButtonItem(customView: settingsButton)

carbs.title = "Add Meal"

let preMeal = createPreMealButtonItem(selected: false, isEnabled: true)
let workout = createWorkoutButtonItem(selected: false, isEnabled: true)
toolbarItems = [
carbs,
space,
preMeal,
space,
bolus,
space,
workout,
space,
settings
]
}
updateWorkoutButton(selected: false, isEnabled: true)
let workout = UIBarButtonItem(customView: workoutButton)

func flexibleSpace() -> UIBarButtonItem {
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
}

if #available(iOS 26, *) {
toolbarItems = [carbs, preMeal, bolus, workout, settings]
} else {
toolbarItems = [
carbs,
flexibleSpace(),
preMeal,
flexibleSpace(),
bolus,
flexibleSpace(),
workout,
flexibleSpace(),
settings
]
}
}

private func updateToolbarItems() {
let isPumpOnboarded = onboardingManager.isComplete || deviceManager.pumpManager?.isOnboarded == true

toolbarItems![0].accessibilityLabel = NSLocalizedString("Add Meal", comment: "The label of the carb entry button")
toolbarItems![0].isEnabled = isPumpOnboarded
toolbarItems![0].tintColor = UIColor.carbTintColor
toolbarItems![4].accessibilityLabel = NSLocalizedString("Bolus", comment: "The label of the bolus entry button")
toolbarItems![4].isEnabled = isPumpOnboarded
toolbarItems![4].tintColor = UIColor.insulinTintColor
toolbarItems![8].accessibilityLabel = NSLocalizedString("Settings", comment: "The label of the settings button")
toolbarItems![8].tintColor = UIColor.secondaryLabel

toolbarItems![2] = createPreMealButtonItem(selected: preMealMode == true && preMealModeAllowed, isEnabled: preMealModeAllowed)
toolbarItems![6] = createWorkoutButtonItem(selected: workoutMode == true && workoutModeAllowed, isEnabled: workoutModeAllowed)
carbEntryButton.accessibilityLabel = NSLocalizedString("Add Meal", comment: "The label of the carb entry button")
carbEntryButton.isEnabled = isPumpOnboarded
bolusButton.accessibilityLabel = NSLocalizedString("Bolus", comment: "The label of the bolus entry button")
bolusButton.isEnabled = isPumpOnboarded
settingsButton.accessibilityLabel = NSLocalizedString("Settings", comment: "The label of the settings button")

let preMealIndex: Int
if #available(iOS 26, *) {
preMealIndex = 1
} else {
preMealIndex = 2
}
toolbarItems![preMealIndex] = createPreMealButtonItem(selected: preMealMode == true && preMealModeAllowed, isEnabled: preMealModeAllowed)
updateWorkoutButton(selected: workoutMode == true && workoutModeAllowed, isEnabled: workoutModeAllowed)
}

public var basalDeliveryState: PumpManagerStatus.BasalDeliveryState? = nil {
Expand Down Expand Up @@ -1459,21 +1494,20 @@ final class StatusTableViewController: LoopChartsTableViewController {
return item
}

private func createWorkoutButtonItem(selected: Bool, isEnabled: Bool) -> UIBarButtonItem {
let item = UIBarButtonItem(image: UIImage.workoutImage(selected: selected), style: .plain, target: self, action: #selector(toggleWorkoutMode(_:)))
item.accessibilityLabel = NSLocalizedString("Workout Targets", comment: "The label of the workout mode toggle button")
private func updateWorkoutButton(selected: Bool, isEnabled: Bool) {
workoutButton.setImage(UIImage.workoutImage(selected: selected), for: .normal)
workoutButton.accessibilityLabel = NSLocalizedString("Workout Targets", comment: "The label of the workout mode toggle button")

if selected {
item.accessibilityTraits.insert(.selected)
item.accessibilityHint = NSLocalizedString("Disables", comment: "The action hint of the workout mode toggle button when enabled")
workoutButton.accessibilityTraits.insert(.selected)
workoutButton.accessibilityHint = NSLocalizedString("Disables", comment: "The action hint of the workout mode toggle button when enabled")
} else {
item.accessibilityHint = NSLocalizedString("Enables", comment: "The action hint of the workout mode toggle button when disabled")
workoutButton.accessibilityTraits.remove(.selected)
workoutButton.accessibilityHint = NSLocalizedString("Enables", comment: "The action hint of the workout mode toggle button when disabled")
}

item.tintColor = UIColor.glucoseTintColor
item.isEnabled = isEnabled

return item
workoutButton.isEnabled = isEnabled
workoutButton.sizeToFit()
}

@IBAction func premealButtonTapped(_ sender: UIBarButtonItem) {
Expand Down Expand Up @@ -1544,7 +1578,13 @@ final class StatusTableViewController: LoopChartsTableViewController {
}
} else {
if FeatureFlags.sensitivityOverridesEnabled {
performSegue(withIdentifier: OverrideSelectionViewController.className, sender: toolbarItems![6])
let overridesIndex: Int
if #available(iOS 26, *) {
overridesIndex = 3
} else {
overridesIndex = 6
}
performSegue(withIdentifier: OverrideSelectionViewController.className, sender: toolbarItems![overridesIndex])
} else {
presentWorkoutModeAlertController()
}
Expand Down Expand Up @@ -2042,6 +2082,15 @@ final class StatusTableViewController: LoopChartsTableViewController {
}
}

private extension UIButton {
func constrainToToolbarIconSize() {
setContentHuggingPriority(.required, for: .horizontal)
setContentHuggingPriority(.required, for: .vertical)
setContentCompressionResistancePriority(.required, for: .horizontal)
setContentCompressionResistancePriority(.required, for: .vertical)
}
}

extension UIAlertController {
func addActivityIndicator() {
let frame = CGRect(x: 0, y: 0, width: 40, height: 40)
Expand Down