├── DoseMathTests
├── Base.lproj
│ └── InfoPlist.strings
├── Fixtures
│ ├── recommend_temp_basal_flat_and_high.json
│ ├── recommend_temp_basal_no_change_glucose.json
│ ├── recommend_temp_basal_correct_low_at_min.json
│ ├── recommend_temp_basal_start_high_end_low.json
│ ├── recommend_temp_basal_start_low_end_in_range.json
│ ├── recommend_temp_basal_dropping_then_rising.json
│ ├── recommend_temp_basal_high_and_falling.json
│ ├── recommend_temp_basal_high_and_rising.json
│ ├── recommend_temp_basal_in_range_and_rising.json
│ ├── recommend_temp_basal_start_high_end_in_range.json
│ ├── recommend_temp_basal_start_low_end_high.json
│ ├── recommend_temp_basal_very_low_end_in_range.json
│ ├── recommend_temp_basal_start_very_low_end_high.json
│ ├── far_future_high_bg_forecast.json
│ └── read_selected_basal_profile.json
└── Info.plist
├── Learn
├── Assets.xcassets
│ └── Contents.json
├── ar.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── da.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── de.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── en.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── fi.lproj
│ ├── Main.strings
│ ├── InfoPlist.strings
│ └── Localizable.strings
├── it.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── ja.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── nb.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── nl.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── pl.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── ro.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── vi.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── es.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── fr.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── pt-BR.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── ru.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── sv.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── zh-Hans.lproj
│ ├── Main.strings
│ └── Localizable.strings
├── Extensions
│ ├── OSLog.swift
│ ├── NSNumber.swift
│ ├── UITableViewCell.swift
│ ├── DateIntervalFormatter.swift
│ ├── Date.swift
│ └── Sequence.swift
└── Learn.entitlements
├── Loop Status Extension
├── Base.lproj
│ ├── InfoPlist.strings
│ └── Localizable.strings
├── ja.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── da.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── fi.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── nb.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── pl.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── de.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── en.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── es.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── fr.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── nl.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── ro.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── sv.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── vi.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── zh-Hans.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── ar.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── it.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── pt-BR.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── ru.lproj
│ ├── MainInterface.strings
│ └── Localizable.strings
├── Loop Status Extension.entitlements
├── StateColorPalette.swift
├── StatusChartsManager.swift
└── UIColor+Widget.swift
├── Loop
├── DefaultAssets.xcassets
│ ├── Contents.json
│ ├── carbs.imageset
│ │ ├── Meal.pdf
│ │ └── Contents.json
│ ├── bolus.imageset
│ │ ├── bolus.pdf
│ │ └── Contents.json
│ ├── workout.imageset
│ │ ├── workout.pdf
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── Icon-76.png
│ │ ├── Icon-60@2x.png
│ │ ├── Icon-60@3x.png
│ │ ├── Icon-76@2x.png
│ │ ├── Icon-Small.png
│ │ ├── Icon-83.5@2x.png
│ │ ├── Icon-Small-60.png
│ │ ├── Icon-Small@2x.png
│ │ ├── Icon-Small@3x.png
│ │ ├── Icon-Small@2x-1.png
│ │ ├── AppStore-1024pt@1x.png
│ │ ├── Icon-Small-40@2x-1.png
│ │ ├── Icon-Small-40@2x.png
│ │ ├── Icon-Small-60@2x.png
│ │ ├── Icon-Notification-20.png
│ │ ├── Icon-Notification-40.png
│ │ ├── Icon-Notification-41.png
│ │ └── Icon-Notification-42.png
│ ├── Pre-Meal.imageset
│ │ ├── Pre-Meal.pdf
│ │ └── Contents.json
│ ├── settings.imageset
│ │ ├── settings.png
│ │ ├── settings@2x.png
│ │ ├── settings@3x.png
│ │ ├── settings_compact@2x.png
│ │ ├── settings_compact@3x.png
│ │ └── Contents.json
│ ├── Uploading.imageset
│ │ ├── Uploading.pdf
│ │ └── Contents.json
│ ├── Oval Selection.imageset
│ │ ├── Oval Selection.pdf
│ │ └── Oval Selection Dark.pdf
│ ├── workout-selected.imageset
│ │ ├── workout-selected.pdf
│ │ └── Contents.json
│ └── Pre-Meal Selected.imageset
│ │ ├── Pre-Meal Selected.pdf
│ │ └── Contents.json
├── DerivedAssets.xcassets
│ └── Contents.json
├── RemoteSettings-template.plist
├── Extensions
│ ├── UITableViewCell.swift
│ ├── OverrideSelectionViewController.swift
│ ├── Data.swift
│ ├── Optional.swift
│ ├── CaseCountable.swift
│ ├── UIActivityIndicatorView.swift
│ ├── ChartColorPalette+Loop.swift
│ ├── Debug.swift
│ ├── StateColorPalette.swift
│ ├── ChartSettings+Loop.swift
│ ├── RangeReplaceableCollection.swift
│ ├── MealBolusNightscoutTreatment.swift
│ ├── NewPumpEvent.swift
│ ├── CollectionType+Loop.swift
│ ├── UserDefaults+Loop.swift
│ └── UIImage.swift
├── Views
│ ├── HUDViewTableViewCell.swift
│ ├── TitleSubtitleTextFieldTableViewCell.swift
│ ├── CircleMaskView.swift
│ ├── PredictionSettingTableViewCell.swift
│ ├── HeaderValuesTableViewCell.swift
│ ├── ChartTableViewCell.swift
│ ├── PotentialCarbEntryTableViewCell.swift
│ └── PredictionInputEffectTableViewCell.swift
├── View Controllers
│ ├── CarbEntryTableViewController.swift
│ ├── InsulinDeliveryTableViewController.swift
│ └── TextFieldTableViewController.swift
├── Models
│ ├── WatchContext+LoopKit.swift
│ ├── StatusExtensionContext+LoopKit.swift
│ ├── LoopSettings+Loop.swift
│ └── GlucoseEffectVelocity.swift
├── Loop.entitlements
├── Managers
│ ├── DiagnosticLogger+LoopKit.swift
│ └── KeychainManager+Loop.swift
├── zh-Hans.lproj
│ └── InfoPlist.strings
├── ja.lproj
│ └── InfoPlist.strings
├── nb.lproj
│ └── InfoPlist.strings
├── sv.lproj
│ └── InfoPlist.strings
├── da.lproj
│ └── InfoPlist.strings
├── it.lproj
│ └── InfoPlist.strings
├── pt-BR.lproj
│ └── InfoPlist.strings
├── Base.lproj
│ └── InfoPlist.strings
├── pl.lproj
│ └── InfoPlist.strings
└── nl.lproj
│ └── InfoPlist.strings
├── LoopUI
├── HUDAssets.xcassets
│ ├── Contents.json
│ ├── battery
│ │ ├── Contents.json
│ │ ├── battery.imageset
│ │ │ ├── battery.pdf
│ │ │ └── Contents.json
│ │ └── battery_mask.imageset
│ │ │ ├── battery_mask.pdf
│ │ │ └── Contents.json
│ └── reservoir
│ │ ├── Contents.json
│ │ ├── reservoir.imageset
│ │ ├── reservoir.pdf
│ │ └── Contents.json
│ │ └── reservoir_mask.imageset
│ │ ├── reservoir_mask.pdf
│ │ └── Contents.json
├── Base.lproj
│ └── InfoPlist.strings
├── Extensions
│ ├── DateFormatter.swift
│ ├── NibLoadable.swift
│ ├── NumberFormatter+Charts.swift
│ └── CGPoint.swift
├── LoopUI.h
├── Common
│ └── LocalizedString.swift
├── Models
│ ├── ChartColorPalette.swift
│ ├── ChartLineModel.swift
│ └── ChartAxisValueDoubleUnit.swift
└── Info.plist
├── Documentation
├── Changing the app icon.png
├── Testing
│ └── Images
│ │ ├── rewind.png
│ │ ├── mock_managers.png
│ │ ├── scenarios_url.png
│ │ └── scenarios_menu.png
├── Screenshots
│ ├── Phone Bolus.png
│ ├── Watch Bolus.png
│ ├── Watch Menu.png
│ ├── Phone Graphs.png
│ ├── Watch Carb Entry.png
│ ├── Watch Complication.png
│ ├── Phone Notification Battery.png
│ ├── Watch Notification Battery.png
│ ├── Watch Notification Reservoir.png
│ ├── Phone Notification Loop Failure.png
│ ├── Phone Notification Bolus Failure.png
│ └── Watch Notification Bolus Failure.png
├── User Icons
│ └── LoopingPump.png
├── Changing the display name.png
└── Assigning a bundle identifier.png
├── WatchApp
├── DefaultAssets.xcassets
│ ├── Contents.json
│ ├── loop
│ │ ├── Contents.json
│ │ ├── loop_aging.imageset
│ │ │ ├── loop-aging@38mm.png
│ │ │ ├── loop-aging@42mm.png
│ │ │ └── Contents.json
│ │ ├── loop_fresh.imageset
│ │ │ ├── loop-fresh@38mm.png
│ │ │ ├── loop-fresh@42mm.png
│ │ │ └── Contents.json
│ │ ├── loop_stale.imageset
│ │ │ ├── loop-stale@38mm.png
│ │ │ ├── loop-stale@42mm.png
│ │ │ └── Contents.json
│ │ └── loop_unknown.imageset
│ │ │ ├── loop-unknown@38mm.png
│ │ │ ├── loop-unknown@42mm.png
│ │ │ └── Contents.json
│ ├── Graph menu icons
│ │ ├── Contents.json
│ │ ├── 1-hour-graph-38mm.png
│ │ ├── 1-hour-graph-42mm.png
│ │ ├── 2-hour-graph-38mm.png
│ │ ├── 2-hour-graph-42mm.png
│ │ ├── 3-hour-graph-38mm.png
│ │ ├── 3-hour-graph-42mm.png
│ │ ├── 1-hour-graph.imageset
│ │ │ ├── 1-hour-graph-38mm.png
│ │ │ ├── 1-hour-graph-42mm.png
│ │ │ └── Contents.json
│ │ ├── 2-hour-graph.imageset
│ │ │ ├── 2-hour-graph-38mm.png
│ │ │ ├── 2-hour-graph-42mm.png
│ │ │ └── Contents.json
│ │ └── 3-hour-graph.imageset
│ │ │ ├── 3-hour-graph-38mm.png
│ │ │ ├── 3-hour-graph-42mm.png
│ │ │ └── Contents.json
│ ├── bolus.imageset
│ │ ├── Bolus Icon 42mm.pdf
│ │ └── Bolus icon 38mm.png
│ ├── carbs.imageset
│ │ ├── Carb Icon 42mm.pdf
│ │ └── Carbs icon 38mm.png
│ ├── workout.imageset
│ │ ├── Workout 38mm.png
│ │ └── Workout 42mm.pdf
│ ├── pre-meal.imageset
│ │ ├── Pre-Meal 38mm.png
│ │ └── Pre-Meal 42mm.pdf
│ └── AppIcon.appiconset
│ │ ├── Icon-App-Store-1024.png
│ │ ├── Icon-AppleWatch-24x24@2x.png
│ │ ├── Icon-AppleWatch-40x40@2x.png
│ │ ├── Icon-AppleWatch-44x44@2x.png
│ │ ├── Icon-AppleWatch-86x86@2x.png
│ │ ├── Icon-AppleWatch-98x98@2x.png
│ │ ├── Icon-AppleWatch-100x100@2x.png
│ │ ├── Icon-AppleWatch-216x216@2x.png
│ │ ├── Icon-AppleWatch-27.5x27.5@2x.png
│ │ ├── Icon-AppleWatch-Companion-29x29@2x.png
│ │ └── Icon-AppleWatch-Companion-29x29@3x.png
├── DerivedAssets.xcassets
│ └── Contents.json
└── Base.lproj
│ └── InfoPlist.strings
├── WatchApp Extension
├── Assets.xcassets
│ ├── Contents.json
│ ├── Complication.complicationset
│ │ ├── Modular.imageset
│ │ │ ├── Icon-Complication-26x26@2x.png
│ │ │ ├── Icon-Complication-29x29@2x.png
│ │ │ ├── Icon-Complication-32x32@2x.png
│ │ │ └── Contents.json
│ │ ├── Circular.imageset
│ │ │ ├── Icon-Complication-16x16@2x.png
│ │ │ ├── Icon-Complication-18x18@2x.png
│ │ │ └── Contents.json
│ │ ├── Graphic Bezel.imageset
│ │ │ ├── Icon-AppleWatch-42x42@2x.png
│ │ │ ├── Icon-AppleWatch-47x47@2x.png
│ │ │ └── Contents.json
│ │ ├── Utilitarian.imageset
│ │ │ ├── Icon-Complication-20x20@2x.png
│ │ │ ├── Icon-Complication-22x22@2x.png
│ │ │ ├── Icon-Complication-25x25@2x.png
│ │ │ └── Contents.json
│ │ ├── Graphic Circular.imageset
│ │ │ ├── Icon-AppleWatch-42x42@2x.png
│ │ │ ├── Icon-AppleWatch-47x47@2x.png
│ │ │ └── Contents.json
│ │ ├── Graphic Corner.imageset
│ │ │ ├── Icon-Complication-20x20@2x.png
│ │ │ ├── Icon-Complication-22x22@2x.png
│ │ │ └── Contents.json
│ │ ├── Graphic Large Rectangular.imageset
│ │ │ └── Contents.json
│ │ └── Extra Large.imageset
│ │ │ └── Contents.json
│ ├── carbs.colorset
│ │ └── Contents.json
│ ├── tint.colorset
│ │ └── Contents.json
│ ├── carbs-dark.colorset
│ │ └── Contents.json
│ ├── glucose.colorset
│ │ └── Contents.json
│ ├── insulin.colorset
│ │ └── Contents.json
│ ├── separator.colorset
│ │ └── Contents.json
│ ├── workout.colorset
│ │ └── Contents.json
│ ├── glucose-dark.colorset
│ │ └── Contents.json
│ ├── insulin-dark.colorset
│ │ └── Contents.json
│ ├── workout-dark.colorset
│ │ └── Contents.json
│ └── insulin-notification-background.colorset
│ │ └── Contents.json
├── Base.lproj
│ ├── InfoPlist.strings
│ └── ckcomplication.strings
├── Extensions
│ ├── WatchApp Extension-Bridging-Header.h
│ ├── GlucoseStore.swift
│ ├── Date.swift
│ ├── CLKTextProvider+Compound.h
│ ├── WKAlertAction.swift
│ ├── WKInterfaceImage.swift
│ ├── CGRect.swift
│ ├── NumberFormatter+WatchApp.swift
│ ├── INRelevantShortcutStore+Loop.swift
│ └── NSUserDefaults+WatchApp.swift
├── WatchApp Extension.entitlements
├── Controllers
│ ├── TextRowController.swift
│ └── NotificationController.swift
├── Models
│ └── OverridePresetRow.swift
└── PushNotificationPayload.apns
├── Common
├── ja.lproj
│ └── Intents.strings
├── zh-Hans.lproj
│ └── Intents.strings
├── da.lproj
│ └── Intents.strings
├── en.lproj
│ ├── Intents.strings
│ └── Localizable.strings
├── pl.lproj
│ ├── Intents.strings
│ └── Localizable.strings
├── fr.lproj
│ ├── Intents.strings
│ └── Localizable.strings
├── ro.lproj
│ └── Intents.strings
├── ar.lproj
│ └── Intents.strings
├── fi.lproj
│ └── Intents.strings
├── nb.lproj
│ └── Intents.strings
├── nl.lproj
│ └── Intents.strings
├── pt-BR.lproj
│ └── Intents.strings
├── de.lproj
│ ├── Intents.strings
│ └── Localizable.strings
├── sv.lproj
│ └── Intents.strings
├── it.lproj
│ └── Intents.strings
├── vi.lproj
│ ├── Intents.strings
│ └── Localizable.strings
├── ru.lproj
│ ├── Intents.strings
│ └── Localizable.strings
├── es.lproj
│ ├── Intents.strings
│ └── Localizable.strings
├── Extensions
│ ├── TextFieldTableViewCell.swift
│ ├── NewCarbEntryIntent+Loop.swift
│ ├── UIColor+HIG.swift
│ ├── Double.swift
│ ├── UserDefaults+CGM.swift
│ ├── GlucoseRangeSchedule.swift
│ ├── NSTimeInterval.swift
│ ├── SampleValue.swift
│ └── NSUserDefaults+StatusExtension.swift
├── FeatureFlags.swift
└── Models
│ ├── PumpManager.swift
│ ├── GlucoseBackfillRequestUserInfo.swift
│ └── LoopSettingsUserInfo.swift
├── Loop.xcodeproj
└── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ └── WorkspaceSettings.xcsettings
├── LoopCore
├── Result.swift
├── IdentifiableClass.swift
├── LoopCore.h
├── HKUnit.swift
├── Insulin
│ └── WalshInsulinModel.swift
├── Info.plist
└── GlucoseThreshold.swift
├── Cartfile
├── Scripts
├── build-derived-assets.sh
├── build-derived-watch-assets.sh
├── capture-build-details.sh
└── carthage.sh
├── Cartfile.resolved
├── Loop.xcconfig
├── LoopTests
└── Info.plist
└── .travis.yml
/DoseMathTests/Base.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* No Localized Strings */
2 |
--------------------------------------------------------------------------------
/Learn/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Loop Status Extension/Base.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Loop/DerivedAssets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Documentation/Changing the app icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Changing the app icon.png
--------------------------------------------------------------------------------
/Documentation/Testing/Images/rewind.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Testing/Images/rewind.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/WatchApp/DerivedAssets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Documentation/Screenshots/Phone Bolus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Phone Bolus.png
--------------------------------------------------------------------------------
/Documentation/Screenshots/Watch Bolus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Watch Bolus.png
--------------------------------------------------------------------------------
/Documentation/Screenshots/Watch Menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Watch Menu.png
--------------------------------------------------------------------------------
/Documentation/User Icons/LoopingPump.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/User Icons/LoopingPump.png
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/battery/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/reservoir/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Documentation/Changing the display name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Changing the display name.png
--------------------------------------------------------------------------------
/Documentation/Screenshots/Phone Graphs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Phone Graphs.png
--------------------------------------------------------------------------------
/Documentation/Screenshots/Watch Carb Entry.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Watch Carb Entry.png
--------------------------------------------------------------------------------
/Documentation/Testing/Images/mock_managers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Testing/Images/mock_managers.png
--------------------------------------------------------------------------------
/Documentation/Testing/Images/scenarios_url.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Testing/Images/scenarios_url.png
--------------------------------------------------------------------------------
/Documentation/Assigning a bundle identifier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Assigning a bundle identifier.png
--------------------------------------------------------------------------------
/Documentation/Screenshots/Watch Complication.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Watch Complication.png
--------------------------------------------------------------------------------
/Documentation/Testing/Images/scenarios_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Testing/Images/scenarios_menu.png
--------------------------------------------------------------------------------
/Learn/ar.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
3 | "8hF-Ij-B7m.title" = "تعلم";
4 |
--------------------------------------------------------------------------------
/Learn/da.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Learn";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/de.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Learn";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/en.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
3 | "8hF-Ij-B7m.title" = "Learn";
4 |
--------------------------------------------------------------------------------
/Learn/fi.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Learn";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/it.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Impara";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/ja.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Learn";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/nb.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Lær";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/nl.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Leer";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/pl.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
3 | "8hF-Ij-B7m.title" = "Learn";
4 |
--------------------------------------------------------------------------------
/Learn/ro.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Learn";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/vi.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Learn";
3 |
4 |
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Learn/es.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Aprender";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/fr.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Apprendre";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/pt-BR.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Learn";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/ru.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Обучение";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/sv.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Utbildning";
3 |
4 |
--------------------------------------------------------------------------------
/Learn/zh-Hans.lproj/Main.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */
2 | "8hF-Ij-B7m.title" = "Learn";
3 |
4 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/carbs.imageset/Meal.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/carbs.imageset/Meal.pdf
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/bolus.imageset/bolus.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/bolus.imageset/bolus.pdf
--------------------------------------------------------------------------------
/Documentation/Screenshots/Phone Notification Battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Phone Notification Battery.png
--------------------------------------------------------------------------------
/Documentation/Screenshots/Watch Notification Battery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Watch Notification Battery.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/workout.imageset/workout.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/workout.imageset/workout.pdf
--------------------------------------------------------------------------------
/Documentation/Screenshots/Watch Notification Reservoir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Watch Notification Reservoir.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Pre-Meal.imageset/Pre-Meal.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/Pre-Meal.imageset/Pre-Meal.pdf
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/settings.imageset/settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/settings.imageset/settings.png
--------------------------------------------------------------------------------
/Documentation/Screenshots/Phone Notification Loop Failure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Phone Notification Loop Failure.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Uploading.imageset/Uploading.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/Uploading.imageset/Uploading.pdf
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/settings.imageset/settings@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/settings.imageset/settings@2x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/settings.imageset/settings@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/settings.imageset/settings@3x.png
--------------------------------------------------------------------------------
/LoopUI/Base.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "CFBundleDisplayName" = "LoopUI";
3 |
4 | /* (No Comment) */
5 | "CFBundleName" = "$(PRODUCT_NAME)";
6 |
7 |
--------------------------------------------------------------------------------
/WatchApp/Base.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "CFBundleDisplayName" = "Loop";
3 |
4 | /* (No Comment) */
5 | "CFBundleName" = "$(PRODUCT_NAME)";
6 |
7 |
--------------------------------------------------------------------------------
/Documentation/Screenshots/Phone Notification Bolus Failure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Phone Notification Bolus Failure.png
--------------------------------------------------------------------------------
/Documentation/Screenshots/Watch Notification Bolus Failure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Documentation/Screenshots/Watch Notification Bolus Failure.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small-60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small-60.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/battery/battery.imageset/battery.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/LoopUI/HUDAssets.xcassets/battery/battery.imageset/battery.pdf
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/bolus.imageset/Bolus Icon 42mm.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/bolus.imageset/Bolus Icon 42mm.pdf
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/bolus.imageset/Bolus icon 38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/bolus.imageset/Bolus icon 38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/carbs.imageset/Carb Icon 42mm.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/carbs.imageset/Carb Icon 42mm.pdf
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/carbs.imageset/Carbs icon 38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/carbs.imageset/Carbs icon 38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/workout.imageset/Workout 38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/workout.imageset/Workout 38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/workout.imageset/Workout 42mm.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/workout.imageset/Workout 42mm.pdf
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_flat_and_high.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 200},
3 | {"date": "2015-07-19T22:00:00", "amount": 200},
4 | ]
5 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/AppStore-1024pt@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/AppStore-1024pt@1x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Small-60@2x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/settings.imageset/settings_compact@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/settings.imageset/settings_compact@2x.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/settings.imageset/settings_compact@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/settings.imageset/settings_compact@3x.png
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/reservoir/reservoir.imageset/reservoir.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/LoopUI/HUDAssets.xcassets/reservoir/reservoir.imageset/reservoir.pdf
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/pre-meal.imageset/Pre-Meal 38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/pre-meal.imageset/Pre-Meal 38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/pre-meal.imageset/Pre-Meal 42mm.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/pre-meal.imageset/Pre-Meal 42mm.pdf
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_no_change_glucose.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T20:00:00", "amount": 100},
3 | {"date": "2015-07-19T20:30:00", "amount": 100}
4 | ]
5 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Notification-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Notification-20.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Notification-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Notification-40.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Notification-41.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Notification-41.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Notification-42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/AppIcon.appiconset/Icon-Notification-42.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Oval Selection.imageset/Oval Selection.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/Oval Selection.imageset/Oval Selection.pdf
--------------------------------------------------------------------------------
/WatchApp Extension/Base.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "CFBundleDisplayName" = "WatchApp Extension";
3 |
4 | /* (No Comment) */
5 | "CFBundleName" = "$(PRODUCT_NAME)";
6 |
7 |
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph-38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph-38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph-42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph-42mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph-38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph-38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph-42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph-42mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph-38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph-38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph-42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph-42mm.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/workout-selected.imageset/workout-selected.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/workout-selected.imageset/workout-selected.pdf
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/battery/battery_mask.imageset/battery_mask.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/LoopUI/HUDAssets.xcassets/battery/battery_mask.imageset/battery_mask.pdf
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-App-Store-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-App-Store-1024.png
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Oval Selection.imageset/Oval Selection Dark.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/Oval Selection.imageset/Oval Selection Dark.pdf
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Pre-Meal Selected.imageset/Pre-Meal Selected.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/Loop/DefaultAssets.xcassets/Pre-Meal Selected.imageset/Pre-Meal Selected.pdf
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_aging.imageset/loop-aging@38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/loop/loop_aging.imageset/loop-aging@38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_aging.imageset/loop-aging@42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/loop/loop_aging.imageset/loop-aging@42mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_fresh.imageset/loop-fresh@38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/loop/loop_fresh.imageset/loop-fresh@38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_fresh.imageset/loop-fresh@42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/loop/loop_fresh.imageset/loop-fresh@42mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_stale.imageset/loop-stale@38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/loop/loop_stale.imageset/loop-stale@38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_stale.imageset/loop-stale@42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/loop/loop_stale.imageset/loop-stale@42mm.png
--------------------------------------------------------------------------------
/Common/ja.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "カーボを追加";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "カーボを追加";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "ループにカーボを追加";
9 |
10 |
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/reservoir/reservoir_mask.imageset/reservoir_mask.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/LoopUI/HUDAssets.xcassets/reservoir/reservoir_mask.imageset/reservoir_mask.pdf
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-24x24@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-24x24@2x.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-40x40@2x.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-44x44@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-44x44@2x.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-86x86@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-86x86@2x.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-98x98@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-98x98@2x.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-100x100@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-100x100@2x.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-216x216@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-216x216@2x.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_unknown.imageset/loop-unknown@38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/loop/loop_unknown.imageset/loop-unknown@38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_unknown.imageset/loop-unknown@42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/loop/loop_unknown.imageset/loop-unknown@42mm.png
--------------------------------------------------------------------------------
/Common/zh-Hans.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "添加碳水化合物";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "添加碳水化合物";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "将碳水化合物添加到Loop";
9 |
10 |
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-27.5x27.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-27.5x27.5@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/WatchApp Extension-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | //
2 | // Use this file to import your target's public headers that you would like to expose to Swift.
3 | //
4 |
5 | #import "CLKTextProvider+Compound.h"
6 |
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-Companion-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-Companion-29x29@2x.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-Companion-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/AppIcon.appiconset/Icon-AppleWatch-Companion-29x29@3x.png
--------------------------------------------------------------------------------
/Loop.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph.imageset/1-hour-graph-38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph.imageset/1-hour-graph-38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph.imageset/1-hour-graph-42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph.imageset/1-hour-graph-42mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph.imageset/2-hour-graph-38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph.imageset/2-hour-graph-38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph.imageset/2-hour-graph-42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph.imageset/2-hour-graph-42mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph.imageset/3-hour-graph-38mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph.imageset/3-hour-graph-38mm.png
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph.imageset/3-hour-graph-42mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph.imageset/3-hour-graph-42mm.png
--------------------------------------------------------------------------------
/Common/da.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Tilføj kulhydrater";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Tilføj kulhydrater";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Tilføj kulhydrater til Loop.";
9 |
10 |
--------------------------------------------------------------------------------
/Common/en.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* INIntentTitle */
2 | "80eo5o" = "Add Carb Entry";
3 |
4 | /* INIntentParameterCombinationTitle */
5 | "OcNxIj" = "Add Carb Entry";
6 |
7 | /* INIntentDescription */
8 | "yc02Yq" = "Add a carb entry to Loop";
9 |
--------------------------------------------------------------------------------
/Common/pl.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* INIntentTitle */
2 | "80eo5o" = "Add Carb Entry";
3 |
4 | /* INIntentParameterCombinationTitle */
5 | "OcNxIj" = "Add Carb Entry";
6 |
7 | /* INIntentDescription */
8 | "yc02Yq" = "Add a carb entry to Loop";
9 |
--------------------------------------------------------------------------------
/Loop/RemoteSettings-template.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/LoopCore/Result.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Result.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 |
9 | public enum Result {
10 | case success(T)
11 | case failure(Error)
12 | }
13 |
--------------------------------------------------------------------------------
/Common/fr.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Ajouter des glucides";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Ajouter des glucides";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Ajouter des glucides à Loop";
9 |
10 |
--------------------------------------------------------------------------------
/Common/ro.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Adăugare carbohidrați";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Adăugare carbohidrați";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Adaugă carbohidrați în Loop";
9 |
10 |
--------------------------------------------------------------------------------
/Common/ar.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* INIntentTitle */
2 | "80eo5o" = "أضف كمية الكارب";
3 |
4 | /* INIntentParameterCombinationTitle */
5 | "OcNxIj" = "أضف كمية الكارب";
6 |
7 | /* INIntentDescription */
8 | "yc02Yq" = "أضف كمية الكارب للتطبيق";
9 |
--------------------------------------------------------------------------------
/Common/fi.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Lisää hiilihydraatteja";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Lisää hiilihydraatteja";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Lisää hiilihydraatteja Loopiin";
9 |
10 |
--------------------------------------------------------------------------------
/Common/nb.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Legg til karbohydrater";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Legg til karbohydrater";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Legg til karbohydrater i Loop";
9 |
10 |
--------------------------------------------------------------------------------
/Common/nl.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Voeg koolhydraten toe";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Voeg koolhydraten toe";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Voeg koolhydraten toe aan Loop";
9 |
10 |
--------------------------------------------------------------------------------
/Common/pt-BR.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Adicionar Carboidratos";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Adicionar Carboidratos";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Adicionar Carboidratos ao Loop";
9 |
10 |
--------------------------------------------------------------------------------
/Common/de.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "KH-Eintrag hinzufügen";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "KH-Eintrag hinzufügen";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Fügen Sie einen KH-Eintrag zu Loop hinzu.";
9 |
10 |
--------------------------------------------------------------------------------
/Common/sv.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Lägg till kolhydrater";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Lägg till kolhydrater";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Lägg till kolhydrater för att kunna loopa";
9 |
10 |
--------------------------------------------------------------------------------
/Common/it.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Aggiungi carboidrati assunti";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Aggiungi carboidrati assunti";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Aggiungi carboidrati assunti a Loop";
9 |
10 |
--------------------------------------------------------------------------------
/Common/vi.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Khai báo khối lượng Carb";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Khai báo khối lượng Carb";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Khai báo khối lượng Carb cho Loop";
9 |
10 |
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon-Complication-26x26@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon-Complication-26x26@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon-Complication-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon-Complication-29x29@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon-Complication-32x32@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon-Complication-32x32@2x.png
--------------------------------------------------------------------------------
/Common/ru.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* (No Comment) */
2 | "80eo5o" = "Добавить запись углеводов";
3 |
4 | /* (No Comment) */
5 | "OcNxIj" = "Добавить запись углеводов";
6 |
7 | /* (No Comment) */
8 | "yc02Yq" = "Добавьте запись углеводов в алгоритм цикла";
9 |
10 |
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon-Complication-16x16@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon-Complication-16x16@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon-Complication-18x18@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon-Complication-18x18@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Icon-AppleWatch-42x42@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Icon-AppleWatch-42x42@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Icon-AppleWatch-47x47@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Icon-AppleWatch-47x47@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon-Complication-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon-Complication-20x20@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon-Complication-22x22@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon-Complication-22x22@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon-Complication-25x25@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon-Complication-25x25@2x.png
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/battery/battery_mask.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "battery_mask.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | }
12 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Icon-AppleWatch-42x42@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Icon-AppleWatch-42x42@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Icon-AppleWatch-47x47@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Icon-AppleWatch-47x47@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Icon-Complication-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Icon-Complication-20x20@2x.png
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Icon-Complication-22x22@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kdisimone/Loop/HEAD/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Icon-Complication-22x22@2x.png
--------------------------------------------------------------------------------
/Common/es.lproj/Intents.strings:
--------------------------------------------------------------------------------
1 | /* INIntentTitle */
2 | "80eo5o" = "Agregar Registro de Carbs";
3 |
4 | /* INIntentParameterCombinationTitle */
5 | "OcNxIj" = "Agregar Registro de Carbs";
6 |
7 | /* INIntentDescription */
8 | "yc02Yq" = "Agregar registro de carbs a Loop";
9 |
10 |
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/reservoir/reservoir_mask.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "reservoir_mask.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | }
12 | }
--------------------------------------------------------------------------------
/Loop Status Extension/ja.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "予想 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 U";
6 |
7 |
--------------------------------------------------------------------------------
/Cartfile:
--------------------------------------------------------------------------------
1 | github "LoopKit/LoopKit" "dev"
2 | github "LoopKit/CGMBLEKit" "dev"
3 | github "i-schuetz/SwiftCharts" == 0.6.5
4 | github "LoopKit/dexcom-share-client-swift" "dev"
5 | github "LoopKit/G4ShareSpy" "dev"
6 | github "ps2/rileylink_ios" "dev"
7 | github "LoopKit/Amplitude-iOS" "decreepify"
8 |
--------------------------------------------------------------------------------
/Common/Extensions/TextFieldTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TextFieldTableViewCell.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopKitUI
9 | import LoopUI
10 |
11 |
12 | extension TextFieldTableViewCell: NibLoadable { }
13 |
--------------------------------------------------------------------------------
/Loop Status Extension/da.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Til sidst 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 E";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/fi.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Ennuste 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/nb.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Omsider 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 E";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/pl.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
3 | "9iF-xY-Bh4.text" = "docelowo 92 mg/dL";
4 |
5 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
6 | "UPi-dG-yYD.text" = "IOB 1.0 J";
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/de.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Schließlich 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 IE";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/en.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
3 | "9iF-xY-Bh4.text" = "Eventually 92 mg/dL";
4 |
5 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
6 | "UPi-dG-yYD.text" = "IOB 1.0 U";
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/es.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Eventualmente 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/fr.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Éventuellement 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/nl.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Uiteindelijk 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 E";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/ro.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Eventually 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/sv.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Förväntat 5,1 mmol/l";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 E";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/vi.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Kết quả là 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/zh-Hans.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "最终血糖为92 毫克/分升";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 单位";
6 |
7 |
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | }
12 | }
--------------------------------------------------------------------------------
/Loop Status Extension/ar.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
3 | "9iF-xY-Bh4.text" = "متوقع 92 mg/dL";
4 |
5 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
6 | "UPi-dG-yYD.text" = "أنسولين نشط 1.0 وحدة";
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/it.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "probabile glic. 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/pt-BR.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "Eventualmente 92 mg/dL";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/ru.lproj/MainInterface.strings:
--------------------------------------------------------------------------------
1 | /* Class = "UILabel"; text = "Eventually 92 mg/dL"; ObjectID = "9iF-xY-Bh4"; */
2 | "9iF-xY-Bh4.text" = "в конечном итоге 92 мг/дл";
3 |
4 | /* Class = "UILabel"; text = "IOB 1.0 U"; ObjectID = "UPi-dG-yYD"; */
5 | "UPi-dG-yYD.text" = "IOB 1.0 ед";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/ja.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "予想 %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/pl.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Docelowo %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ J";
6 |
--------------------------------------------------------------------------------
/Loop/Extensions/UITableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 5/22/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import LoopCore
11 |
12 |
13 | extension UITableViewCell: IdentifiableClass { }
14 |
--------------------------------------------------------------------------------
/Loop/Views/HUDViewTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HUDViewTableViewCell.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import UIKit
9 | import LoopUI
10 |
11 | class HUDViewTableViewCell: UITableViewCell {
12 |
13 | @IBOutlet var hudView: HUDView!
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_correct_low_at_min.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 100},
3 | {"date": "2015-07-19T18:30:00", "amount": 90},
4 | {"date": "2015-07-19T19:00:00", "amount": 85},
5 | {"date": "2015-07-19T19:30:00", "amount": 90},
6 | {"date": "2015-07-19T20:00:00", "amount": 100}
7 | ]
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_start_high_end_low.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 200},
3 | {"date": "2015-07-19T18:30:00", "amount": 160},
4 | {"date": "2015-07-19T19:00:00", "amount": 120},
5 | {"date": "2015-07-19T19:30:00", "amount": 80},
6 | {"date": "2015-07-19T20:00:00", "amount": 60}
7 | ]
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_start_low_end_in_range.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 60},
3 | {"date": "2015-07-19T18:30:00", "amount": 70},
4 | {"date": "2015-07-19T19:00:00", "amount": 80},
5 | {"date": "2015-07-19T19:30:00", "amount": 90},
6 | {"date": "2015-07-19T20:00:00", "amount": 100}
7 | ]
--------------------------------------------------------------------------------
/Loop Status Extension/Base.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Eventually %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
--------------------------------------------------------------------------------
/Loop Status Extension/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Eventually %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
--------------------------------------------------------------------------------
/Loop Status Extension/fi.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Ennuste %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/zh-Hans.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "最终 %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ 单位";
6 |
7 |
--------------------------------------------------------------------------------
/Loop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_dropping_then_rising.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 90},
3 | {"date": "2015-07-19T19:00:00", "amount": 80},
4 | {"date": "2015-07-19T20:00:00", "amount": 100},
5 | {"date": "2015-07-19T21:00:00", "amount": 160},
6 | {"date": "2015-07-19T22:00:00", "amount": 200}
7 | ]
8 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_high_and_falling.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 240},
3 | {"date": "2015-07-19T19:00:00", "amount": 220},
4 | {"date": "2015-07-19T20:00:00", "amount": 200},
5 | {"date": "2015-07-19T21:00:00", "amount": 160},
6 | {"date": "2015-07-19T22:00:00", "amount": 124}
7 | ]
8 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_high_and_rising.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 140},
3 | {"date": "2015-07-19T19:00:00", "amount": 150},
4 | {"date": "2015-07-19T20:00:00", "amount": 160},
5 | {"date": "2015-07-19T21:00:00", "amount": 170},
6 | {"date": "2015-07-19T22:00:00", "amount": 180}
7 | ]
8 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_in_range_and_rising.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 90},
3 | {"date": "2015-07-19T19:00:00", "amount": 100},
4 | {"date": "2015-07-19T20:00:00", "amount": 110},
5 | {"date": "2015-07-19T21:00:00", "amount": 120},
6 | {"date": "2015-07-19T22:00:00", "amount": 125}
7 | ]
8 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_start_high_end_in_range.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 200},
3 | {"date": "2015-07-19T18:30:00", "amount": 180},
4 | {"date": "2015-07-19T19:00:00", "amount": 150},
5 | {"date": "2015-07-19T19:30:00", "amount": 120},
6 | {"date": "2015-07-19T20:00:00", "amount": 100}
7 | ]
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_start_low_end_high.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 60},
3 | {"date": "2015-07-19T19:00:00", "amount": 80},
4 | {"date": "2015-07-19T20:00:00", "amount": 120},
5 | {"date": "2015-07-19T21:00:00", "amount": 160},
6 | {"date": "2015-07-19T22:00:00", "amount": 200}
7 | ]
8 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_very_low_end_in_range.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 60},
3 | {"date": "2015-07-19T18:30:00", "amount": 50},
4 | {"date": "2015-07-19T19:00:00", "amount": 60},
5 | {"date": "2015-07-19T19:30:00", "amount": 70},
6 | {"date": "2015-07-19T20:00:00", "amount": 100}
7 | ]
8 |
--------------------------------------------------------------------------------
/Loop Status Extension/ar.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "متوقع %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "أنسولين نشط %1$@ وحدة";
6 |
--------------------------------------------------------------------------------
/Loop Status Extension/es.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Eventualmente %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/fr.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Éventuellement %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/ro.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Eventually %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/vi.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Kết quả là %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
7 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/recommend_temp_basal_start_very_low_end_high.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T18:00:00", "amount": 40},
3 | {"date": "2015-07-19T18:30:00", "amount": 50},
4 | {"date": "2015-07-19T19:00:00", "amount": 80},
5 | {"date": "2015-07-19T19:30:00", "amount": 160},
6 | {"date": "2015-07-19T20:00:00", "amount": 200}
7 | ]
8 |
--------------------------------------------------------------------------------
/Learn/Extensions/OSLog.swift:
--------------------------------------------------------------------------------
1 | //
2 | // OSLog.swift
3 | // Learn
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import os.log
9 |
10 |
11 | extension OSLog {
12 | convenience init(category: String) {
13 | self.init(subsystem: "com.loopkit.Learn", category: category)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Loop Status Extension/it.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Probabile Glic. %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/pt-BR.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Eventualmente %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ U";
6 |
7 |
--------------------------------------------------------------------------------
/Loop Status Extension/ru.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "В конечном итоге %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ ед";
6 |
7 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/bolus.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "bolus.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/carbs.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Meal.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Pre-Meal.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Pre-Meal.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Uploading.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Uploading.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/battery/battery.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "battery.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "template"
14 | }
15 | }
--------------------------------------------------------------------------------
/Common/Extensions/NewCarbEntryIntent+Loop.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NewCarbEntryIntent+Loop.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 | import LoopCore
10 |
11 | @available(iOS 12.0, watchOSApplicationExtension 5.0, *)
12 | extension NewCarbEntryIntent: IdentifiableClass { }
13 |
--------------------------------------------------------------------------------
/LoopUI/HUDAssets.xcassets/reservoir/reservoir.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "reservoir.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "template"
14 | }
15 | }
--------------------------------------------------------------------------------
/Loop.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/GlucoseStore.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GlucoseStore.swift
3 | // WatchApp Extension
4 | //
5 | // Created by Bharat Mediratta on 6/26/18.
6 | // Copyright © 2018 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import LoopKit
11 | import WatchConnectivity
12 |
13 | extension GlucoseStore {
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/Learn/fi.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Privacy - Health Share Usage Description */
2 | "NSHealthShareUsageDescription" = "Terveys-sovelluksen ateriatietoja käytetään glukoosivaikutusten määrittämiseen. Terveys-sovelluksen glukoositietoja käytetään graafeissa ja laskelmissa. Unitietoja käytetään Apple Watch -komplikaation toiminnan optimointiin hereillä olon aikana.";
3 |
4 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/Pre-Meal Selected.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "Pre-Meal Selected.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
--------------------------------------------------------------------------------
/Loop/Extensions/OverrideSelectionViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // OverrideSelectionViewController.swift
3 | // Loop
4 | //
5 | // Created by Michael Pangburn on 1/27/19.
6 | // Copyright © 2019 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import LoopKitUI
10 | import LoopCore
11 |
12 |
13 | extension OverrideSelectionViewController: IdentifiableClass { }
14 |
--------------------------------------------------------------------------------
/Learn/Extensions/NSNumber.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSNumber.swift
3 | // Learn
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 |
10 |
11 | extension NSNumber: Comparable {
12 | public static func < (lhs: NSNumber, rhs: NSNumber) -> Bool {
13 | return lhs.compare(rhs) == .orderedAscending
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Learn/Extensions/UITableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell.swift
3 | // Learn
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopCore
9 | import LoopKitUI
10 | import LoopUI
11 |
12 |
13 | extension DateAndDurationTableViewCell: NibLoadable { }
14 |
15 |
16 | extension TextButtonTableViewCell: IdentifiableClass { }
17 |
--------------------------------------------------------------------------------
/Loop/Extensions/Data.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSDate.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 3/27/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | extension Data {
13 | var hexadecimalString: String {
14 | return map { String(format: "%02hhx", $0) }.joined()
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Loop/View Controllers/CarbEntryTableViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CarbEntryTableViewController.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 3/11/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import LoopKitUI
10 | import LoopCore
11 |
12 |
13 | extension CarbEntryTableViewController: IdentifiableClass {
14 | }
15 |
--------------------------------------------------------------------------------
/Loop/Views/TitleSubtitleTextFieldTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TitleSubtitleTextFieldTableViewCell.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import UIKit
9 |
10 | class TitleSubtitleTextFieldTableViewCell: PredictionInputEffectTableViewCell {
11 |
12 | @IBOutlet weak var textField: UITextField!
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/Loop Status Extension/Loop Status Extension.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.application-groups
6 |
7 | $(APP_GROUP_IDENTIFIER)
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/workout.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "workout.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "template",
14 | "preserves-vector-representation" : true
15 | }
16 | }
--------------------------------------------------------------------------------
/Loop/View Controllers/InsulinDeliveryTableViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InsulinDeliveryTableViewController.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 3/11/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import LoopKitUI
10 | import LoopCore
11 |
12 |
13 | extension InsulinDeliveryTableViewController: IdentifiableClass {
14 | }
15 |
--------------------------------------------------------------------------------
/Loop/Views/CircleMaskView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CircleMaskView.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import UIKit
9 |
10 | class CircleMaskView: UIView {
11 |
12 | override func layoutSubviews() {
13 | super.layoutSubviews()
14 |
15 | self.layer.cornerRadius = self.frame.height / 2
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/workout-selected.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "workout-selected.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "template",
14 | "preserves-vector-representation" : true
15 | }
16 | }
--------------------------------------------------------------------------------
/Loop/Views/PredictionSettingTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PredictionSettingTableViewCell.swift
3 | // Loop
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopKitUI
9 |
10 | class PredictionSettingTableViewCell: SwitchTableViewCell {
11 |
12 | @IBOutlet public weak var titleLabel: UILabel?
13 |
14 | @IBOutlet public weak var subtitleLabel: UILabel?
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/LoopUI/Extensions/DateFormatter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DateFormatter.swift
3 | // LoopUI
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 |
10 | extension DateFormatter {
11 | convenience init(dateStyle: Style = .none, timeStyle: Style = .none) {
12 | self.init()
13 | self.dateStyle = dateStyle
14 | self.timeStyle = timeStyle
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Loop Status Extension/da.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Til sidst %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ E";
6 |
7 | /* The short unit display string for international units of insulin */
8 | "U" = "E";
9 |
10 |
--------------------------------------------------------------------------------
/Loop Status Extension/nb.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Omsider %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ E";
6 |
7 | /* The short unit display string for international units of insulin */
8 | "U" = "E";
9 |
10 |
--------------------------------------------------------------------------------
/Loop Status Extension/sv.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Förväntat %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ E";
6 |
7 | /* The short unit display string for international units of insulin */
8 | "U" = "E";
9 |
10 |
--------------------------------------------------------------------------------
/Loop Status Extension/de.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Schließlich %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ E";
6 |
7 | /* The short unit display string for international units of insulin */
8 | "U" = "IE";
9 |
10 |
--------------------------------------------------------------------------------
/Loop Status Extension/nl.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The subtitle format describing eventual glucose. (1: localized glucose value description) */
2 | "Eventually %1$@" = "Uiteindelijk %1$@";
3 |
4 | /* The subtitle format describing units of active insulin. (1: localized insulin value description) */
5 | "IOB %1$@ U" = "IOB %1$@ E";
6 |
7 | /* The short unit display string for international units of insulin */
8 | "U" = "E";
9 |
10 |
--------------------------------------------------------------------------------
/WatchApp Extension/WatchApp Extension.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.developer.healthkit
6 |
7 | com.apple.developer.healthkit.access
8 |
9 | com.apple.developer.siri
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/WatchApp Extension/Controllers/TextRowController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TextRowController.swift
3 | // WatchApp Extension
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopCore
9 | import WatchKit
10 |
11 | class TextRowController: NSObject, IdentifiableClass {
12 | @IBOutlet private(set) var textLabel: WKInterfaceLabel!
13 | @IBOutlet private(set) var detailTextLabel: WKInterfaceLabel!
14 | }
15 |
--------------------------------------------------------------------------------
/Loop/Extensions/Optional.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Optional.swift
3 | // Loop
4 | //
5 | // Created by Michael Pangburn on 5/19/19.
6 | // Copyright © 2019 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | extension Optional {
10 | /// Returns `nil` if the value is `nil` or if it fails the predicate.
11 | func filter(_ shouldKeep: (Wrapped) throws -> Bool) rethrows -> Optional {
12 | return try flatMap { try shouldKeep($0) ? $0 : nil }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/carbs.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "0.388",
13 | "alpha" : "1.000",
14 | "blue" : "0.220",
15 | "green" : "0.855"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/tint.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "0.298",
13 | "alpha" : "1.000",
14 | "blue" : "0.392",
15 | "green" : "0.851"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/carbs-dark.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "0.070",
13 | "alpha" : "1.000",
14 | "blue" : "0.040",
15 | "green" : "0.120"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/glucose.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "0.310",
13 | "alpha" : "1.000",
14 | "blue" : "0.973",
15 | "green" : "0.678"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/insulin.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "1.000",
13 | "alpha" : "1.000",
14 | "blue" : "0.000",
15 | "green" : "0.584"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/separator.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "0.722",
13 | "alpha" : "0.500",
14 | "blue" : "0.722",
15 | "green" : "0.722"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/workout.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "0.310",
13 | "alpha" : "1.000",
14 | "blue" : "0.973",
15 | "green" : "0.678"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/glucose-dark.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "0.020",
13 | "alpha" : "1.000",
14 | "blue" : "0.140",
15 | "green" : "0.100"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/insulin-dark.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "1.000",
13 | "alpha" : "0.150",
14 | "blue" : "0.000",
15 | "green" : "0.584"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/workout-dark.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "0.020",
13 | "alpha" : "1.000",
14 | "blue" : "0.140",
15 | "green" : "0.100"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/Learn/Learn.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.developer.healthkit
6 |
7 | com.apple.developer.healthkit.access
8 |
9 | com.apple.security.application-groups
10 |
11 | $(APP_GROUP_IDENTIFIER)
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Learn/Extensions/DateIntervalFormatter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DateIntervalFormatter.swift
3 | // Learn
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 |
10 |
11 | extension DateIntervalFormatter {
12 | convenience init(dateStyle: DateIntervalFormatter.Style = .none, timeStyle: DateIntervalFormatter.Style = .none) {
13 | self.init()
14 | self.dateStyle = dateStyle
15 | self.timeStyle = timeStyle
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Loop/Views/HeaderValuesTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HeaderValuesTableViewCell.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import UIKit
9 |
10 | class HeaderValuesTableViewCell: UITableViewCell {
11 |
12 | @IBOutlet weak var COBValueLabel: UILabel!
13 |
14 | @IBOutlet weak var COBDateLabel: UILabel!
15 |
16 | @IBOutlet weak var totalValueLabel: UILabel!
17 |
18 | @IBOutlet weak var totalDateLabel: UILabel!
19 | }
20 |
--------------------------------------------------------------------------------
/Scripts/build-derived-assets.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh -eu
2 |
3 | # build-derived-assets.sh
4 | # Loop
5 | #
6 | # Copyright © 2019 LoopKit Authors. All rights reserved.
7 |
8 |
9 | echo "Building DerivedAssets.xcassets"
10 |
11 | output="${PROJECT_DIR}/Loop/DerivedAssets.xcassets"
12 |
13 | override="${PROJECT_DIR}/../AdditionalAssets.xcassets/."
14 |
15 | if [ -d $override ]; then
16 | echo "Adding asset overrides to DerivedAssets.xcassets"
17 | cp -a "$override" "$output"
18 | fi
19 |
20 |
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/insulin-notification-background.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | },
6 | "colors" : [
7 | {
8 | "idiom" : "universal",
9 | "color" : {
10 | "color-space" : "srgb",
11 | "components" : {
12 | "red" : "1.000",
13 | "alpha" : "0.500",
14 | "blue" : "0.000",
15 | "green" : "0.584"
16 | }
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/Loop/Extensions/CaseCountable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CaseCountable.swift
3 | // Loop
4 | //
5 | // Created by Pete Schwamb on 1/1/17.
6 | // Copyright © 2017 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | protocol CaseCountable: RawRepresentable {}
10 |
11 | extension CaseCountable where RawValue == Int {
12 | static var count: Int {
13 | var i: RawValue = 0
14 | while let new = Self(rawValue: i) { i = new.rawValue.advanced(by: 1) }
15 | return i
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Loop/Extensions/UIActivityIndicatorView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIActivityIndicatorView.swift
3 | // LoopKitUI
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import UIKit
9 |
10 |
11 | extension UIActivityIndicatorView.Style {
12 | static var `default`: UIActivityIndicatorView.Style {
13 | if #available(iOSApplicationExtension 13.0, iOS 13.0, *) {
14 | return .medium
15 | } else {
16 | return .gray
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Learn/Extensions/Date.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Date.swift
3 | // Learn
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 |
10 |
11 | extension Date: Strideable {
12 | public typealias Stride = TimeInterval
13 |
14 | public func distance(to other: Date) -> TimeInterval {
15 | return other.timeIntervalSince(self)
16 | }
17 |
18 | public func advanced(by n: TimeInterval) -> Date {
19 | return addingTimeInterval(n)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/WatchApp Extension/Models/OverridePresetRow.swift:
--------------------------------------------------------------------------------
1 | //
2 | // OverridePresetRow.swift
3 | // WatchApp Extension
4 | //
5 | // Created by Michael Pangburn on 1/31/19.
6 | // Copyright © 2019 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import WatchKit
11 | import LoopKit
12 | import LoopCore
13 |
14 |
15 | final class OverridePresetRow: NSObject, IdentifiableClass {
16 | @IBOutlet var symbolLabel: WKInterfaceLabel!
17 | @IBOutlet var nameLabel: WKInterfaceLabel!
18 | }
19 |
--------------------------------------------------------------------------------
/Loop/Extensions/ChartColorPalette+Loop.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChartColorPalette+Loop.swift
3 | // Loop
4 | //
5 | // Created by Bharat Mediratta on 4/1/17.
6 | // Copyright © 2017 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import LoopUI
10 |
11 |
12 | extension ChartColorPalette {
13 | static var `default`: ChartColorPalette {
14 | return ChartColorPalette(axisLine: .axisLineColor, axisLabel: .axisLabelColor, grid: .gridColor, glucoseTint: .glucoseTintColor, doseTint: .doseTintColor)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/LoopUI/Extensions/NibLoadable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NibLoadable.swift
3 | // Loop
4 | //
5 | // Created by Nate Racklyeft on 7/2/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import LoopCore
11 |
12 |
13 | public protocol NibLoadable: IdentifiableClass {
14 | static func nib() -> UINib
15 | }
16 |
17 |
18 | extension NibLoadable {
19 | public static func nib() -> UINib {
20 | return UINib(nibName: className, bundle: Bundle(for: self))
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/Date.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Date.swift
3 | // WatchApp Extension
4 | //
5 | // Created by Bharat Mediratta on 6/26/18.
6 | // Copyright © 2018 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | extension Date {
13 | static var earliestGlucoseCutoff: Date {
14 | return Date(timeIntervalSinceNow: .hours(-3))
15 | }
16 |
17 | static var staleGlucoseCutoff: Date {
18 | return Date(timeIntervalSinceNow: .minutes(-5))
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/LoopCore/IdentifiableClass.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IdentifiableClass.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 5/22/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | public protocol IdentifiableClass: class {
13 | static var className: String { get }
14 | }
15 |
16 |
17 | extension IdentifiableClass {
18 | public static var className: String {
19 | return NSStringFromClass(self).components(separatedBy: ".").last!
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/LoopCore/LoopCore.h:
--------------------------------------------------------------------------------
1 | //
2 | // LoopCore.h
3 | // LoopCore
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | #import
9 |
10 | //! Project version number for LoopCore.
11 | FOUNDATION_EXPORT double LoopCoreVersionNumber;
12 |
13 | //! Project version string for LoopCore.
14 | FOUNDATION_EXPORT const unsigned char LoopCoreVersionString[];
15 |
16 | // In this header, you should import all the public headers of your framework using statements like #import
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Scripts/build-derived-watch-assets.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh -eu
2 |
3 | # build-derived-watch-assets.sh
4 | # Loop
5 | #
6 | # Copyright © 2019 LoopKit Authors. All rights reserved.
7 |
8 | echo "Building DerivedAssets.xcassets for Watch App"
9 |
10 | watch_output="${PROJECT_DIR}/WatchApp/DerivedAssets.xcassets"
11 |
12 | watch_override="${PROJECT_DIR}/../AdditionalWatchAssets.xcassets/."
13 |
14 | if [ -d $watch_override ]; then
15 | echo "Adding asset overrides to WatchApp/DerivedAssets.xcassets"
16 | cp -a "$watch_override" "$watch_output"
17 | fi
18 |
--------------------------------------------------------------------------------
/Loop/Extensions/Debug.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Debug.swift
3 | // Loop
4 | //
5 | // Created by Michael Pangburn on 3/5/19.
6 | // Copyright © 2019 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | var debugEnabled: Bool {
10 | #if DEBUG || IOS_SIMULATOR
11 | return true
12 | #else
13 | return false
14 | #endif
15 | }
16 |
17 | func assertDebugOnly(file: StaticString = #file, line: UInt = #line) {
18 | guard debugEnabled else {
19 | fatalError("\(file):\(line) should never be invoked in release builds", file: file, line: line)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/LoopUI/LoopUI.h:
--------------------------------------------------------------------------------
1 | //
2 | // LoopUI.h
3 | // LoopUI
4 | //
5 | // Created by Bharat Mediratta on 12/11/16.
6 | // Copyright © 2016 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for LoopUI.
12 | FOUNDATION_EXPORT double LoopUIVersionNumber;
13 |
14 | //! Project version string for LoopUI.
15 | FOUNDATION_EXPORT const unsigned char LoopUIVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Cartfile.resolved:
--------------------------------------------------------------------------------
1 | github "LoopKit/Amplitude-iOS" "2137d5fd44bf630ed33e1e72d7af6d8f8612f270"
2 | github "LoopKit/CGMBLEKit" "7b4c1022eb6b91ae3975bfc8ce93fde8e496b4f3"
3 | github "LoopKit/G4ShareSpy" "3b749bc7f6323ad8303af6c755ba9b5649eff816"
4 | github "LoopKit/LoopKit" "5f459ee56ecd17c740c5fa0142353f3eb5b6120d"
5 | github "LoopKit/MKRingProgressView" "f548a5c64832be2d37d7c91b5800e284887a2a0a"
6 | github "LoopKit/dexcom-share-client-swift" "68ea5d08588e00bf148518b126416b8352dbef64"
7 | github "i-schuetz/SwiftCharts" "0.6.5"
8 | github "ps2/rileylink_ios" "4ca67f4ac2dd5b15c6b7e19c448eb2d52b9592a7"
9 |
--------------------------------------------------------------------------------
/Loop/Extensions/StateColorPalette.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StateColorPalette.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopUI
9 | import LoopKitUI
10 |
11 | extension StateColorPalette {
12 | static let loopStatus = StateColorPalette(unknown: .unknownColor, normal: .freshColor, warning: .agingColor, error: .staleColor)
13 |
14 | static let cgmStatus = loopStatus
15 |
16 | static let pumpStatus = StateColorPalette(unknown: .unknownColor, normal: .pumpStatusNormal, warning: .agingColor, error: .staleColor)
17 | }
18 |
--------------------------------------------------------------------------------
/Loop/Models/WatchContext+LoopKit.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WatchContext+LoopKit.swift
3 | // Loop
4 | //
5 | // Created by Nathan Racklyeft on 5/29/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import HealthKit
11 | import LoopKit
12 |
13 | extension WatchContext {
14 | convenience init(glucose: GlucoseValue?, glucoseUnit: HKUnit?) {
15 | self.init()
16 |
17 | self.glucose = glucose?.quantity
18 | self.glucoseDate = glucose?.startDate
19 | self.preferredGlucoseUnit = glucoseUnit
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Loop Status Extension/StateColorPalette.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StateColorPalette.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopUI
9 | import LoopKitUI
10 |
11 | extension StateColorPalette {
12 | static let loopStatus = StateColorPalette(unknown: .unknownColor, normal: .freshColor, warning: .agingColor, error: .staleColor)
13 |
14 | static let cgmStatus = loopStatus
15 |
16 | static let pumpStatus = StateColorPalette(unknown: .unknownColor, normal: .pumpStatusNormal, warning: .agingColor, error: .staleColor)
17 | }
18 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/CLKTextProvider+Compound.h:
--------------------------------------------------------------------------------
1 | //
2 | // CLKTextProvider+Compound.h
3 | // Loop
4 | //
5 | // Created by Michael Pangburn on 10/27/18.
6 | // Copyright © 2018 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | #define CLKTextProvider_Compound_h
10 |
11 | #import
12 |
13 | NS_ASSUME_NONNULL_BEGIN
14 |
15 | @interface CLKTextProvider (Compound)
16 |
17 | + (CLKTextProvider *)textProviderByJoiningTextProviders: (NSArray *)textProviders separator:(NSString *) separator;
18 |
19 | @end
20 |
21 | NS_ASSUME_NONNULL_END
22 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/WKAlertAction.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WKAlertAction.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 3/20/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import WatchKit
11 |
12 |
13 | extension WKAlertAction {
14 | static func dismissAction() -> Self {
15 | return self.init(
16 | title: NSLocalizedString("Dismiss", comment: "The action button title to dismiss an error message"),
17 | style: .cancel,
18 | handler: { }
19 | )
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Loop/Loop.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | aps-environment
6 | development
7 | com.apple.developer.healthkit
8 |
9 | com.apple.developer.healthkit.access
10 |
11 | com.apple.developer.siri
12 |
13 | com.apple.security.application-groups
14 |
15 | $(APP_GROUP_IDENTIFIER)
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/LoopCore/HKUnit.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HKUnit.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 1/17/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import HealthKit
10 |
11 |
12 | extension HKUnit {
13 | public static let milligramsPerDeciliter: HKUnit = {
14 | return HKUnit.gramUnit(with: .milli).unitDivided(by: .literUnit(with: .deci))
15 | }()
16 |
17 | public static let millimolesPerLiter: HKUnit = {
18 | return HKUnit.moleUnit(with: .milli, molarMass: HKUnitMolarMassBloodGlucose).unitDivided(by: .liter())
19 | }()
20 | }
21 |
--------------------------------------------------------------------------------
/Loop.xcconfig:
--------------------------------------------------------------------------------
1 | //
2 | // Loop.xcconfig
3 | // Loop
4 | //
5 | // Created by Nate Racklyeft on 9/3/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | // This is automatically disambiguated by development team, but you may choose to change this to
10 | // support running multiple apps simultaneously.
11 | MAIN_APP_BUNDLE_IDENTIFIER = com.${DEVELOPMENT_TEAM}.loopkit
12 | MAIN_APP_DISPLAY_NAME = Loop
13 |
14 | LOOP_MARKETING_VERSION = 2.3.0
15 |
16 | APPICON_NAME = AppIcon
17 |
18 | // Optional workspace configuration overrides
19 | #include? "../LoopConfigOverride.xcconfig"
20 |
21 |
--------------------------------------------------------------------------------
/Loop/Extensions/ChartSettings+Loop.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChartSettings+Loop.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import SwiftCharts
9 |
10 |
11 | extension ChartSettings {
12 | static var `default`: ChartSettings {
13 | var settings = ChartSettings()
14 | settings.top = 12
15 | settings.bottom = 0
16 | settings.trailing = 8
17 | settings.axisTitleLabelsToLabelsSpacing = 0
18 | settings.labelsToAxisSpacingX = 6
19 | settings.clipInnerFrame = false
20 | return settings
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Common/Extensions/UIColor+HIG.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+HIG.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 1/23/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 |
12 | extension UIColor {
13 | // MARK: - HIG colors
14 | // See: https://developer.apple.com/ios/human-interface-guidelines/visual-design/color/
15 |
16 | // HIG Green has changed for iOS 13. This is the legacy color.
17 | static func HIGGreenColor() -> UIColor {
18 | return UIColor(red: 76 / 255, green: 217 / 255, blue: 100 / 255, alpha: 1)
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/WKInterfaceImage.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WKInterfaceImage.swift
3 | // Loop
4 | //
5 | // Created by Nathan Racklyeft on 5/29/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import WatchKit
10 |
11 | enum LoopImage: String {
12 | case fresh
13 | case aging
14 | case stale
15 | case unknown
16 |
17 | var imageName: String {
18 | return "loop_\(rawValue)"
19 | }
20 | }
21 |
22 |
23 | extension WKInterfaceImage {
24 | func setLoopImage(_ loopImage: LoopImage) {
25 | setImageNamed(loopImage.imageName)
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Common/Extensions/Double.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Double.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 |
10 |
11 | extension FloatingPoint {
12 | func floored(to increment: Self) -> Self {
13 | if increment == 0 {
14 | return self
15 | }
16 |
17 | return floor(self / increment) * increment
18 | }
19 |
20 | func ceiled(to increment: Self) -> Self {
21 | if increment == 0 {
22 | return self
23 | }
24 |
25 | return ceil(self / increment) * increment
26 | }
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/Loop/Models/StatusExtensionContext+LoopKit.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StatusExtensionContext+LoopKit.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopKit
9 |
10 |
11 | extension NetBasalContext {
12 | // var tempBasal: DoseEntry? {
13 | // guard rate != 0 else {
14 | // return nil
15 | // }
16 | //
17 | // return DoseEntry(
18 | // type: .tempBasal,
19 | // startDate: start,
20 | // endDate: end,
21 | // value: rate,
22 | // unit: .unitsPerHour
23 | // )
24 | // }
25 | }
26 |
--------------------------------------------------------------------------------
/Loop Status Extension/StatusChartsManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StatusChartsManager.swift
3 | // Loop Status Extension
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 | import LoopUI
10 | import SwiftCharts
11 | import UIKit
12 |
13 | class StatusChartsManager: ChartsManager {
14 | let predictedGlucose = PredictedGlucoseChart()
15 |
16 | init(colors: ChartColorPalette, settings: ChartSettings, traitCollection: UITraitCollection) {
17 | super.init(colors: colors, settings: settings, charts: [predictedGlucose], traitCollection: traitCollection)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/WatchApp Extension/Base.lproj/ckcomplication.strings:
--------------------------------------------------------------------------------
1 | /*
2 | ckcomplication.strings
3 | Loop
4 |
5 | Created by Nate Racklyeft on 9/18/16.
6 | Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | */
8 |
9 | /* The complication template example glucose and trend string */
10 | "120↘︎" = "120↘︎";
11 |
12 | /* The complication template example glucose string */
13 | "120" = "120";
14 |
15 | /* The complication template example time string */
16 | "3MIN" = "3MIN";
17 |
18 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */
19 | "UtilitarianLargeFlat" = "%@%@ %@";
20 |
--------------------------------------------------------------------------------
/Common/Extensions/UserDefaults+CGM.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UserDefaults+CGM.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 | import LoopKit
10 |
11 |
12 | extension UserDefaults {
13 | private enum Key: String {
14 | case cgmManagerState = "com.loopkit.Loop.CGMManagerState"
15 | }
16 |
17 | var cgmManagerState: CGMManager.RawStateValue? {
18 | get {
19 | return dictionary(forKey: Key.cgmManagerState.rawValue)
20 | }
21 | set {
22 | set(newValue, forKey: Key.cgmManagerState.rawValue)
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x",
6 | "screen-width" : "<=145"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "scale" : "2x",
11 | "screen-width" : ">161"
12 | },
13 | {
14 | "idiom" : "watch",
15 | "scale" : "2x",
16 | "screen-width" : ">145"
17 | },
18 | {
19 | "idiom" : "watch",
20 | "scale" : "2x",
21 | "screen-width" : ">183"
22 | }
23 | ],
24 | "info" : {
25 | "version" : 1,
26 | "author" : "xcode"
27 | }
28 | }
--------------------------------------------------------------------------------
/LoopCore/Insulin/WalshInsulinModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WalshInsulinModel.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopKit
9 |
10 |
11 | extension WalshInsulinModel: RawRepresentable {
12 | public typealias RawValue = [String: Any]
13 |
14 | public init?(rawValue: RawValue) {
15 | guard let duration = rawValue["actionDuration"] as? TimeInterval else {
16 | return nil
17 | }
18 |
19 | self.init(actionDuration: duration)
20 | }
21 |
22 | public var rawValue: [String : Any] {
23 | return ["actionDuration": self.actionDuration]
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/CGRect.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CGRect.swift
3 | // WatchApp Extension
4 | //
5 | // Created by Michael Pangburn on 10/17/18.
6 | // Copyright © 2018 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import CoreGraphics
10 |
11 |
12 | extension CGRect {
13 | func alignedToScreenScale(_ screenScale: CGFloat) -> CGRect {
14 | let factor = 1 / screenScale
15 |
16 | return CGRect(
17 | x: origin.x.floored(to: factor),
18 | y: origin.y.floored(to: factor),
19 | width: size.width.ceiled(to: factor),
20 | height: size.height.ceiled(to: factor)
21 | )
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Loop/Extensions/RangeReplaceableCollection.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RangeReplaceableCollection.swift
3 | // Loop
4 | //
5 | // Created by Michael Pangburn on 3/6/19.
6 | // Copyright © 2019 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | extension RangeReplaceableCollection where Element: Equatable {
10 | /// Returns `true` if the element was removed, or `false` if it is not present in the collection.
11 | @discardableResult
12 | mutating func remove(_ element: Element) -> Bool {
13 | guard let index = self.firstIndex(of: element) else {
14 | return false
15 | }
16 |
17 | remove(at: index)
18 | return true
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Loop/Managers/DiagnosticLogger+LoopKit.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DiagnosticLogger+LoopKit.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 3/25/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import HealthKit
11 | import LoopKit
12 |
13 |
14 | extension DiagnosticLogger {
15 | func addError(_ message: String, fromSource source: String) {
16 | let message = [
17 | "message": message
18 | ]
19 |
20 | forCategory(source).error(message)
21 | }
22 |
23 | func addError(_ message: Error, fromSource source: String) {
24 | forCategory(source).error(message)
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Common/FeatureFlags.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FeatureFlags.swift
3 | // Loop
4 | //
5 | // Created by Michael Pangburn on 5/19/19.
6 | // Copyright © 2019 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | let FeatureFlags = FeatureFlagConfiguration()
13 |
14 | struct FeatureFlagConfiguration: Decodable {
15 | let sensitivityOverridesEnabled: Bool
16 |
17 | fileprivate init() {
18 | // Swift compiler config is inverse, since the default state is enabled.
19 | #if FEATURE_OVERRIDES_DISABLED
20 | self.sensitivityOverridesEnabled = false
21 | #else
22 | self.sensitivityOverridesEnabled = true
23 | #endif
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Common/Extensions/GlucoseRangeSchedule.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GlucoseRangeSchedule.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopKit
9 | import HealthKit
10 |
11 |
12 | extension GlucoseRangeSchedule {
13 | func minQuantity(at date: Date) -> HKQuantity {
14 | return HKQuantity(unit: unit, doubleValue: value(at: date).minValue)
15 | }
16 | }
17 |
18 |
19 | extension ClosedRange where Bound == HKQuantity {
20 | func averageValue(for unit: HKUnit) -> Double {
21 | let minValue = lowerBound.doubleValue(for: unit)
22 | let maxValue = upperBound.doubleValue(for: unit)
23 | return (maxValue + minValue) / 2
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/1-hour-graph.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "1-hour-graph-38mm.png",
6 | "screen-width" : "<=145",
7 | "scale" : "2x"
8 | },
9 | {
10 | "idiom" : "watch",
11 | "scale" : "2x",
12 | "screen-width" : ">161"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "filename" : "1-hour-graph-42mm.png",
17 | "screen-width" : ">145",
18 | "scale" : "2x"
19 | },
20 | {
21 | "idiom" : "watch",
22 | "scale" : "2x",
23 | "screen-width" : ">183"
24 | }
25 | ],
26 | "info" : {
27 | "version" : 1,
28 | "author" : "xcode"
29 | }
30 | }
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/2-hour-graph.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "2-hour-graph-38mm.png",
6 | "screen-width" : "<=145",
7 | "scale" : "2x"
8 | },
9 | {
10 | "idiom" : "watch",
11 | "scale" : "2x",
12 | "screen-width" : ">161"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "filename" : "2-hour-graph-42mm.png",
17 | "screen-width" : ">145",
18 | "scale" : "2x"
19 | },
20 | {
21 | "idiom" : "watch",
22 | "scale" : "2x",
23 | "screen-width" : ">183"
24 | }
25 | ],
26 | "info" : {
27 | "version" : 1,
28 | "author" : "xcode"
29 | }
30 | }
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/Graph menu icons/3-hour-graph.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "3-hour-graph-38mm.png",
6 | "screen-width" : "<=145",
7 | "scale" : "2x"
8 | },
9 | {
10 | "idiom" : "watch",
11 | "scale" : "2x",
12 | "screen-width" : ">161"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "filename" : "3-hour-graph-42mm.png",
17 | "screen-width" : ">145",
18 | "scale" : "2x"
19 | },
20 | {
21 | "idiom" : "watch",
22 | "scale" : "2x",
23 | "screen-width" : ">183"
24 | }
25 | ],
26 | "info" : {
27 | "version" : 1,
28 | "author" : "xcode"
29 | }
30 | }
--------------------------------------------------------------------------------
/Loop/Views/ChartTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChartTableViewCell.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 2/19/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import LoopUI
11 |
12 |
13 | final class ChartTableViewCell: UITableViewCell {
14 |
15 | @IBOutlet weak var chartContentView: ChartContainerView!
16 |
17 | @IBOutlet weak var titleLabel: UILabel?
18 |
19 | @IBOutlet weak var subtitleLabel: UILabel?
20 |
21 | override func prepareForReuse() {
22 | super.prepareForReuse()
23 |
24 | chartContentView.chartGenerator = nil
25 | }
26 |
27 | func reloadChart() {
28 | chartContentView.reloadChart()
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Loop/Extensions/MealBolusNightscoutTreatment.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NightscoutTreatment.swift
3 | // Loop
4 | //
5 | // Created by Pete Schwamb on 10/7/16.
6 | // Copyright © 2016 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import LoopKit
11 | import NightscoutUploadKit
12 | import HealthKit
13 |
14 | extension MealBolusNightscoutTreatment {
15 | public convenience init(carbEntry: StoredCarbEntry) {
16 | let carbGrams = carbEntry.quantity.doubleValue(for: HKUnit.gram())
17 | self.init(timestamp: carbEntry.startDate, enteredBy: "loop://\(UIDevice.current.name)", id: carbEntry.externalID, carbs: lround(carbGrams), absorptionTime: carbEntry.absorptionTime, foodType: carbEntry.foodType)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/NumberFormatter+WatchApp.swift:
--------------------------------------------------------------------------------
1 |
2 |
3 | import Foundation
4 |
5 | extension NumberFormatter {
6 | class var bolus: NumberFormatter {
7 | let formatter = NumberFormatter()
8 | formatter.numberStyle = .decimal
9 | formatter.minimumIntegerDigits = 1
10 |
11 | return formatter
12 | }
13 |
14 | func string(fromBolusValue bolusValue: Double) -> String {
15 | switch bolusValue {
16 | case let x where x < 1:
17 | minimumFractionDigits = 3
18 | case let x where x < 10:
19 | minimumFractionDigits = 2
20 | default:
21 | minimumFractionDigits = 1
22 | }
23 |
24 | return string(from: bolusValue) ?? "--"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Loop/zh-Hans.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "蓝牙用于与胰岛素泵和连续血糖监测设备进行通信";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "蓝牙用于与胰岛素泵和连续血糖监测设备进行通信";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "使用人脸解锁来确认输注胰岛素剂量";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "数据库中的膳食数据用于确定葡萄糖影响。健康数据库中的葡萄糖数据用于绘图和动量计算。";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "在应用程序和手表中输入的碳水化合物膳食数据存储在健康数据库中。从CGM检索的葡萄糖数据安全地存储在HealthKit中。";
18 |
19 |
--------------------------------------------------------------------------------
/LoopUI/Common/LocalizedString.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LocalizedString.swift
3 | // LoopUI
4 | //
5 | // Created by Kathryn DiSimone on 8/15/18.
6 | // Copyright © 2018 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | private class FrameworkBundle {
12 | static let main = Bundle(for: FrameworkBundle.self)
13 | }
14 |
15 | func LocalizedString(_ key: String, tableName: String? = nil, value: String? = nil, comment: String) -> String {
16 | if let value = value {
17 | return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, value: value, comment: comment)
18 | } else {
19 | return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, comment: comment)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "Icon-Complication-16x16@2x.png",
6 | "screen-width" : "<=145",
7 | "scale" : "2x"
8 | },
9 | {
10 | "idiom" : "watch",
11 | "filename" : "Icon-Complication-18x18@2x.png",
12 | "screen-width" : ">161",
13 | "scale" : "2x"
14 | },
15 | {
16 | "idiom" : "watch",
17 | "scale" : "2x",
18 | "screen-width" : ">145"
19 | },
20 | {
21 | "idiom" : "watch",
22 | "scale" : "2x",
23 | "screen-width" : ">183"
24 | }
25 | ],
26 | "info" : {
27 | "version" : 1,
28 | "author" : "xcode"
29 | }
30 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x",
6 | "screen-width" : "<=145"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "filename" : "Icon-AppleWatch-42x42@2x.png",
11 | "screen-width" : ">161",
12 | "scale" : "2x"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "scale" : "2x",
17 | "screen-width" : ">145"
18 | },
19 | {
20 | "idiom" : "watch",
21 | "filename" : "Icon-AppleWatch-47x47@2x.png",
22 | "screen-width" : ">183",
23 | "scale" : "2x"
24 | }
25 | ],
26 | "info" : {
27 | "version" : 1,
28 | "author" : "xcode"
29 | }
30 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x",
6 | "screen-width" : "<=145"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "filename" : "Icon-AppleWatch-42x42@2x.png",
11 | "screen-width" : ">161",
12 | "scale" : "2x"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "scale" : "2x",
17 | "screen-width" : ">145"
18 | },
19 | {
20 | "idiom" : "watch",
21 | "filename" : "Icon-AppleWatch-47x47@2x.png",
22 | "screen-width" : ">183",
23 | "scale" : "2x"
24 | }
25 | ],
26 | "info" : {
27 | "version" : 1,
28 | "author" : "xcode"
29 | }
30 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x",
6 | "screen-width" : "<=145"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "filename" : "Icon-Complication-20x20@2x.png",
11 | "screen-width" : ">161",
12 | "scale" : "2x"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "scale" : "2x",
17 | "screen-width" : ">145"
18 | },
19 | {
20 | "idiom" : "watch",
21 | "filename" : "Icon-Complication-22x22@2x.png",
22 | "screen-width" : ">183",
23 | "scale" : "2x"
24 | }
25 | ],
26 | "info" : {
27 | "version" : 1,
28 | "author" : "xcode"
29 | }
30 | }
--------------------------------------------------------------------------------
/Loop/Extensions/NewPumpEvent.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NewPumpEvent.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopKit
9 |
10 |
11 | extension NewPumpEvent {
12 |
13 | /// Constructs a pump event placeholder representing a bolus just enacted.
14 | ///
15 | /// - Parameters:
16 | /// - units: The units of insulin requested
17 | /// - date: The date the bolus was enacted
18 | static func enactedBolus(dose: DoseEntry) -> NewPumpEvent {
19 | return self.init(
20 | date: dose.startDate,
21 | dose: dose,
22 | isMutable: true,
23 | raw: Data(), // This can be empty, as mutable events aren't persisted
24 | title: ""
25 | )
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Loop/View Controllers/TextFieldTableViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TextFieldTableViewController.swift
3 | // Loop
4 | //
5 | // Created by Nate Racklyeft on 7/31/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import LoopKitUI
10 | import HealthKit
11 |
12 |
13 | /// Convenience static constructors used to contain common configuration
14 | extension TextFieldTableViewController {
15 | typealias T = TextFieldTableViewController
16 |
17 | private static let valueNumberFormatter: NumberFormatter = {
18 | let formatter = NumberFormatter()
19 |
20 | formatter.numberStyle = .decimal
21 | formatter.minimumFractionDigits = 0
22 | formatter.maximumFractionDigits = 2
23 |
24 | return formatter
25 | }()
26 | }
27 |
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_aging.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "loop-aging@42mm.png",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "filename" : "loop-aging@38mm.png",
11 | "screen-width" : "<=145",
12 | "scale" : "2x"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "scale" : "2x",
17 | "screen-width" : ">161"
18 | },
19 | {
20 | "idiom" : "watch",
21 | "scale" : "2x",
22 | "screen-width" : ">145"
23 | },
24 | {
25 | "idiom" : "watch",
26 | "scale" : "2x",
27 | "screen-width" : ">183"
28 | }
29 | ],
30 | "info" : {
31 | "version" : 1,
32 | "author" : "xcode"
33 | }
34 | }
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_fresh.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "loop-fresh@42mm.png",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "filename" : "loop-fresh@38mm.png",
11 | "screen-width" : "<=145",
12 | "scale" : "2x"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "scale" : "2x",
17 | "screen-width" : ">161"
18 | },
19 | {
20 | "idiom" : "watch",
21 | "scale" : "2x",
22 | "screen-width" : ">145"
23 | },
24 | {
25 | "idiom" : "watch",
26 | "scale" : "2x",
27 | "screen-width" : ">183"
28 | }
29 | ],
30 | "info" : {
31 | "version" : 1,
32 | "author" : "xcode"
33 | }
34 | }
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_stale.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "loop-stale@42mm.png",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "filename" : "loop-stale@38mm.png",
11 | "screen-width" : "<=145",
12 | "scale" : "2x"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "scale" : "2x",
17 | "screen-width" : ">161"
18 | },
19 | {
20 | "idiom" : "watch",
21 | "scale" : "2x",
22 | "screen-width" : ">145"
23 | },
24 | {
25 | "idiom" : "watch",
26 | "scale" : "2x",
27 | "screen-width" : ">183"
28 | }
29 | ],
30 | "info" : {
31 | "version" : 1,
32 | "author" : "xcode"
33 | }
34 | }
--------------------------------------------------------------------------------
/WatchApp/DefaultAssets.xcassets/loop/loop_unknown.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "loop-unknown@42mm.png",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "filename" : "loop-unknown@38mm.png",
11 | "screen-width" : "<=145",
12 | "scale" : "2x"
13 | },
14 | {
15 | "idiom" : "watch",
16 | "scale" : "2x",
17 | "screen-width" : ">161"
18 | },
19 | {
20 | "idiom" : "watch",
21 | "scale" : "2x",
22 | "screen-width" : ">145"
23 | },
24 | {
25 | "idiom" : "watch",
26 | "scale" : "2x",
27 | "screen-width" : ">183"
28 | }
29 | ],
30 | "info" : {
31 | "version" : 1,
32 | "author" : "xcode"
33 | }
34 | }
--------------------------------------------------------------------------------
/LoopUI/Extensions/NumberFormatter+Charts.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NumberFormatter.swift
3 | // LoopUI
4 | //
5 | // Copyright © 2019 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 |
10 | extension NumberFormatter {
11 | class var dose: NumberFormatter {
12 | let numberFormatter = NumberFormatter()
13 | numberFormatter.numberStyle = .decimal
14 | numberFormatter.minimumFractionDigits = 2
15 | numberFormatter.maximumFractionDigits = 2
16 |
17 | return numberFormatter
18 | }
19 |
20 | class var integer: NumberFormatter {
21 | let numberFormatter = NumberFormatter()
22 | numberFormatter.numberStyle = .none
23 | numberFormatter.maximumFractionDigits = 0
24 |
25 | return numberFormatter
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/far_future_high_bg_forecast.json:
--------------------------------------------------------------------------------
1 | [
2 | {"date": "2015-07-19T16:30:00", "amount": 90},
3 | {"date": "2015-07-19T17:00:00", "amount": 90},
4 | {"date": "2015-07-19T17:30:00", "amount": 90},
5 | {"date": "2015-07-19T18:00:00", "amount": 90},
6 | {"date": "2015-07-19T18:30:00", "amount": 95},
7 | {"date": "2015-07-19T19:00:00", "amount": 100},
8 | {"date": "2015-07-19T19:30:00", "amount": 105},
9 | {"date": "2015-07-19T20:00:00", "amount": 110},
10 | {"date": "2015-07-19T20:30:00", "amount": 115},
11 | {"date": "2015-07-19T21:00:00", "amount": 118},
12 | {"date": "2015-07-19T21:30:00", "amount": 120},
13 | {"date": "2015-07-19T21:30:00", "amount": 140},
14 | {"date": "2015-07-19T21:30:00", "amount": 160},
15 | {"date": "2015-07-19T21:30:00", "amount": 180}
16 | ]
17 |
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "Icon-Complication-26x26@2x.png",
6 | "screen-width" : "<=145",
7 | "scale" : "2x"
8 | },
9 | {
10 | "idiom" : "watch",
11 | "filename" : "Icon-Complication-29x29@2x.png",
12 | "screen-width" : ">161",
13 | "scale" : "2x"
14 | },
15 | {
16 | "idiom" : "watch",
17 | "scale" : "2x",
18 | "screen-width" : ">145"
19 | },
20 | {
21 | "idiom" : "watch",
22 | "filename" : "Icon-Complication-32x32@2x.png",
23 | "screen-width" : ">183",
24 | "scale" : "2x"
25 | }
26 | ],
27 | "info" : {
28 | "version" : 1,
29 | "author" : "xcode"
30 | }
31 | }
--------------------------------------------------------------------------------
/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "Icon-Complication-20x20@2x.png",
6 | "screen-width" : "<=145",
7 | "scale" : "2x"
8 | },
9 | {
10 | "idiom" : "watch",
11 | "filename" : "Icon-Complication-22x22@2x.png",
12 | "screen-width" : ">161",
13 | "scale" : "2x"
14 | },
15 | {
16 | "idiom" : "watch",
17 | "scale" : "2x",
18 | "screen-width" : ">145"
19 | },
20 | {
21 | "idiom" : "watch",
22 | "filename" : "Icon-Complication-25x25@2x.png",
23 | "screen-width" : ">183",
24 | "scale" : "2x"
25 | }
26 | ],
27 | "info" : {
28 | "version" : 1,
29 | "author" : "xcode"
30 | }
31 | }
--------------------------------------------------------------------------------
/LoopUI/Extensions/CGPoint.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CGPoint.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 2/29/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 |
12 | extension CGPoint {
13 | /**
14 | Rounds the coordinates to whole-pixel values
15 |
16 | - parameter scale: The display scale to use. Defaults to the main screen scale.
17 | */
18 | mutating func makeIntegralInPlaceWithDisplayScale(_ scale: CGFloat = 0) {
19 | var scale = scale
20 |
21 | // It's possible for scale values retrieved from traitCollection objects to be 0.
22 | if scale == 0 {
23 | scale = UIScreen.main.scale
24 | }
25 | x = round(x * scale) / scale
26 | y = round(y * scale) / scale
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/LoopUI/Models/ChartColorPalette.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChartColorPalette.swift
3 | // Loop
4 | //
5 | // Created by Bharat Mediratta on 3/29/17.
6 | // Copyright © 2017 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | /// A palette of colors for displaying charts
12 | public struct ChartColorPalette {
13 | public let axisLine: UIColor
14 | public let axisLabel: UIColor
15 | public let grid: UIColor
16 | public let glucoseTint: UIColor
17 | public let doseTint: UIColor
18 |
19 | public init(axisLine: UIColor, axisLabel: UIColor, grid: UIColor, glucoseTint: UIColor, doseTint: UIColor) {
20 | self.axisLine = axisLine
21 | self.axisLabel = axisLabel
22 | self.grid = grid
23 | self.glucoseTint = glucoseTint
24 | self.doseTint = doseTint
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Scripts/capture-build-details.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh -e
2 |
3 | # capture-build-details.sh
4 | # Loop
5 | #
6 | # Copyright © 2019 LoopKit Authors. All rights reserved.
7 |
8 | echo "Gathering build details in ${SRCROOT}"
9 | cd "${SRCROOT}"
10 |
11 | plist="${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}"
12 |
13 | if [ -e .git ]; then
14 | rev=$(git rev-parse HEAD)
15 | plutil -replace com-loopkit-Loop-git-revision -string ${rev} "${plist}"
16 | branch=$(git branch | grep \* | cut -d ' ' -f2-)
17 | plutil -replace com-loopkit-Loop-git-branch -string "${branch}" "${plist}"
18 | fi;
19 | plutil -replace com-loopkit-Loop-srcroot -string "${SRCROOT}" "${plist}"
20 | plutil -replace com-loopkit-Loop-build-date -string "$(date)" "${plist}"
21 | plutil -replace com-loopkit-Loop-xcode-version -string "${XCODE_PRODUCT_BUILD_VERSION}" "${plist}"
22 |
23 |
--------------------------------------------------------------------------------
/DoseMathTests/Fixtures/read_selected_basal_profile.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "i": 0,
4 | "start": "00:00:00",
5 | "rate": 0.9,
6 | "minutes": 0
7 | },
8 | {
9 | "i": 1,
10 | "start": "04:00:00",
11 | "rate": 0.925,
12 | "minutes": 240
13 | },
14 | {
15 | "i": 2,
16 | "start": "07:00:00",
17 | "rate": 0.85,
18 | "minutes": 420
19 | },
20 | {
21 | "i": 3,
22 | "start": "10:00:00",
23 | "rate": 0.85,
24 | "minutes": 600
25 | },
26 | {
27 | "i": 4,
28 | "start": "12:00:00",
29 | "rate": 0.75,
30 | "minutes": 720
31 | },
32 | {
33 | "i": 5,
34 | "start": "15:00:00",
35 | "rate": 0.8,
36 | "minutes": 900
37 | },
38 | {
39 | "i": 6,
40 | "start": "22:00:00",
41 | "rate": 0.9,
42 | "minutes": 1320
43 | }
44 | ]
--------------------------------------------------------------------------------
/LoopCore/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)-$(PLATFORM_NAME)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 2.2.4
19 | CFBundleVersion
20 | $(CURRENT_PROJECT_VERSION)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/LoopTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 2.2.4
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/DoseMathTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 2.2.4
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Loop/ja.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "ブルートゥースは、インスリンポンプおよび連続グルコースモニタデバイスと通信するために使用されます";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "ブルートゥースは、インスリンポンプおよび連続グルコースモニタデバイスと通信するために使用されます";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "フェイスIDはインスリンボーラスの認証に使用されます";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "アプリに入力された炭水化物の食事データは、健康データベースに保存されます。 グルコースデータはHealthKitに安全に保存されます";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "健康データベースからの食事データは、グルコース効果を決定するために使用される。 グルコースデータはグラフ作成と解析のためにHealthKitから検索されます";
18 |
19 |
--------------------------------------------------------------------------------
/Common/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
2 | "%1$@ v%2$@" = "%1$@ v%2$@";
3 |
4 | /* Title of the user activity for adding carbs */
5 | "Add Carb Entry" = "Add Carb Entry";
6 |
7 | /* The short unit display string for decibles */
8 | "dB" = "dB";
9 |
10 | /* The short unit display string for grams */
11 | "g" = "g";
12 |
13 | /* The short unit display string for milligrams of glucose per decilter */
14 | "mg/dL" = "mg/dL";
15 |
16 | /* The short unit display string for millimoles of glucose per liter */
17 | "mmol/L" = "mmol/L";
18 |
19 | /* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
20 | "QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
21 |
22 | /* The short unit display string for international units of insulin */
23 | "U" = "U";
24 |
25 |
--------------------------------------------------------------------------------
/Common/ru.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
2 | "%1$@ v%2$@" = "%1$@ v%2$@";
3 |
4 | /* Title of the user activity for adding carbs */
5 | "Add Carb Entry" = "Введите углеводы";
6 |
7 | /* The short unit display string for decibles */
8 | "dB" = "dB";
9 |
10 | /* The short unit display string for grams */
11 | "g" = "г";
12 |
13 | /* The short unit display string for milligrams of glucose per decilter */
14 | "mg/dL" = "мг/дл";
15 |
16 | /* The short unit display string for millimoles of glucose per liter */
17 | "mmol/L" = "ммоль/л";
18 |
19 | /* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
20 | "QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
21 |
22 | /* The short unit display string for international units of insulin */
23 | "U" = "ед";
24 |
25 |
--------------------------------------------------------------------------------
/LoopUI/Models/ChartLineModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChartLineModel.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import SwiftCharts
9 |
10 |
11 | extension ChartLineModel {
12 | /// Creates a model configured with the dashed prediction line style
13 | ///
14 | /// - Parameters:
15 | /// - points: The points to construct the line
16 | /// - color: The line color
17 | /// - width: The line width
18 | /// - Returns: A new line model
19 | static func predictionLine(points: [T], color: UIColor, width: CGFloat) -> ChartLineModel {
20 | // TODO: Bug in ChartPointsLineLayer requires a non-zero animation to draw the dash pattern
21 | return self.init(chartPoints: points, lineColor: color, lineWidth: width, animDuration: 0.0001, animDelay: 0, dashPattern: [6, 5])
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Common/de.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
2 | "%1$@ v%2$@" = "%1$@ v%2$@";
3 |
4 | /* Title of the user activity for adding carbs */
5 | "Add Carb Entry" = "KH-Eintrag hinzufügen";
6 |
7 | /* The short unit display string for decibles */
8 | "dB" = "dB";
9 |
10 | /* The short unit display string for grams */
11 | "g" = "g";
12 |
13 | /* The short unit display string for milligrams of glucose per decilter */
14 | "mg/dL" = "mg/dL";
15 |
16 | /* The short unit display string for millimoles of glucose per liter */
17 | "mmol/L" = "mmol/L";
18 |
19 | /* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
20 | "QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
21 |
22 | /* The short unit display string for international units of insulin */
23 | "U" = "IE";
24 |
25 |
--------------------------------------------------------------------------------
/Common/pl.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
2 | "%1$@ v%2$@" = "%1$@ v%2$@";
3 |
4 | /* Title of the user activity for adding carbs */
5 | "Add Carb Entry" = "Dodaj pozycję dla węglowodanów";
6 |
7 | /* The short unit display string for decibles */
8 | "dB" = "dB";
9 |
10 | /* The short unit display string for grams */
11 | "g" = "g";
12 |
13 | /* The short unit display string for milligrams of glucose per decilter */
14 | "mg/dL" = "mg/dL";
15 |
16 | /* The short unit display string for millimoles of glucose per liter */
17 | "mmol/L" = "mmol/L";
18 |
19 | /* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
20 | "QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
21 |
22 | /* The short unit display string for international units of insulin */
23 | "U" = "J";
24 |
--------------------------------------------------------------------------------
/LoopUI/Models/ChartAxisValueDoubleUnit.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChartAxisValueDoubleUnit.swift
3 | // Loop
4 | //
5 | // Created by Nate Racklyeft on 7/16/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftCharts
11 |
12 |
13 | public final class ChartAxisValueDoubleUnit: ChartAxisValueDouble {
14 | let unitString: String
15 |
16 | public init(_ double: Double, unitString: String, formatter: NumberFormatter) {
17 | self.unitString = unitString
18 |
19 | super.init(double, formatter: formatter)
20 | }
21 |
22 | init(_ double: Double, unitString: String) {
23 | self.unitString = unitString
24 |
25 | super.init(double)
26 | }
27 |
28 | override public var description: String {
29 | return formatter.string(from: scalar, unit: unitString) ?? ""
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Common/vi.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
2 | "%1$@ v%2$@" = "%1$@ v%2$@";
3 |
4 | /* Title of the user activity for adding carbs */
5 | "Add Carb Entry" = "Khai báo khối lượng Carb";
6 |
7 | /* The short unit display string for decibles */
8 | "dB" = "dB";
9 |
10 | /* The short unit display string for grams */
11 | "g" = "g";
12 |
13 | /* The short unit display string for milligrams of glucose per decilter */
14 | "mg/dL" = "mg/dL";
15 |
16 | /* The short unit display string for millimoles of glucose per liter */
17 | "mmol/L" = "mmol/L";
18 |
19 | /* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
20 | "QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
21 |
22 | /* The short unit display string for international units of insulin */
23 | "U" = "U";
24 |
25 |
--------------------------------------------------------------------------------
/WatchApp Extension/Controllers/NotificationController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NotificationController.swift
3 | // WatchApp Extension
4 | //
5 | // Created by Nathan Racklyeft on 8/29/15.
6 | // Copyright © 2015 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import WatchKit
10 | import Foundation
11 | import UserNotifications
12 |
13 |
14 | final class NotificationController: WKUserNotificationInterfaceController {
15 |
16 | override init() {
17 | super.init()
18 | }
19 |
20 | override func willActivate() {
21 | super.willActivate()
22 | }
23 |
24 | override func didDeactivate() {
25 | super.didDeactivate()
26 | }
27 |
28 | override func didReceive(_ notification: UNNotification, withCompletion completionHandler: @escaping (WKUserNotificationInterfaceType) -> Void) {
29 | completionHandler(.default)
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/Learn/zh-Hans.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "计算在指定范围内的血糖测量值的百分比";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "继续";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "最大";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "最小";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Modal Day";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "无数据";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "范围";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "开始日期";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "在目标范围的时间";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "全天血糖数据";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "周";
33 |
34 |
--------------------------------------------------------------------------------
/Loop/Models/LoopSettings+Loop.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoopSettings+Loop.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 | import LoopCore
10 |
11 | // MARK: - Static configuration
12 | extension LoopSettings {
13 | var enabledEffects: PredictionInputEffect {
14 | var inputs = PredictionInputEffect.all
15 | if !retrospectiveCorrectionEnabled {
16 | inputs.remove(.retrospection)
17 | }
18 | return inputs
19 | }
20 |
21 | static let retrospectiveCorrectionEffectDuration = TimeInterval(hours: 1)
22 |
23 | /// Creates an instance of the enabled retrospective correction implementation
24 | var enabledRetrospectiveCorrectionAlgorithm: RetrospectiveCorrection {
25 | return StandardRetrospectiveCorrection(effectDuration: LoopSettings.retrospectiveCorrectionEffectDuration)
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Learn/ja.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "指定範囲内の測定値の割合を算出";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "次へ";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "最大";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "最小";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Modal Day";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "データがありません";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "範囲";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "開始日";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "タイムインレンジ";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "頻度の高い測定値を時間ごとに表示";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "週";
33 |
34 |
--------------------------------------------------------------------------------
/LoopUI/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | LoopUI
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | FMWK
19 | CFBundleShortVersionString
20 | 2.2.4
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Learn/Extensions/Sequence.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sequence.swift
3 | // Learn
4 | //
5 | // Created by Pete Schwamb on 4/10/19.
6 | // Copyright © 2019 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension Sequence {
12 | func proportion(where isIncluded: (Element) -> Bool) -> Double? {
13 | return average(by: { isIncluded($0) ? 1 : 0 })
14 | }
15 |
16 | func average(by getMetric: (Element) -> T) -> T? {
17 | let (sum, count) = reduce(into: (sum: 0 as T, count: 0)) { result, element in
18 | result.0 += getMetric(element)
19 | result.1 += 1
20 | }
21 |
22 | guard count > 0 else {
23 | return nil
24 | }
25 |
26 | return sum / T(count)
27 | }
28 | }
29 |
30 | extension Sequence where Element: FloatingPoint {
31 | func average() -> Element? {
32 | return average(by: { $0 })
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/WatchApp Extension/PushNotificationPayload.apns:
--------------------------------------------------------------------------------
1 | {
2 | "aps": {
3 | "alert": {
4 | "body": "RileyLink timed out. Check your pump before retrying.",
5 | "title": "Bolus",
6 | "subtitle": "3.5 U bolus failed"
7 | },
8 | "category": "bolusFailure"
9 | },
10 |
11 | "WatchKit Simulator Actions": [
12 | {
13 | "title": "Retry",
14 | "identifier": "retryBolus"
15 | }
16 | ],
17 |
18 | "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App."
19 | }
20 |
--------------------------------------------------------------------------------
/Loop/Extensions/CollectionType+Loop.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CollectionType.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 2/21/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import LoopKit
11 |
12 |
13 | public extension Sequence where Element: TimelineValue {
14 | /// Returns the closest element index in the sorted sequence prior to the specified date
15 | ///
16 | /// - parameter date: The date to use in the search
17 | ///
18 | /// - returns: The closest index, if any exist before the specified date
19 | func closestIndex(priorTo date: Date) -> Int? {
20 | var closestIndex: Int?
21 |
22 | for (index, value) in self.enumerated() {
23 | if value.startDate <= date {
24 | closestIndex = index
25 | } else {
26 | break
27 | }
28 | }
29 |
30 | return closestIndex
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Scripts/carthage.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | #
3 | # This script exists due to an issue with Carthage. The script comes from https://github.com/Carthage/Carthage/issues/3019#issuecomment-665136323
4 |
5 | # carthage.sh
6 | # Usage example: ./carthage.sh build --platform iOS
7 |
8 | set -euo pipefail
9 |
10 | xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX)
11 | trap 'rm -f "$xcconfig"' INT TERM HUP EXIT
12 |
13 | # For Xcode 12 make sure EXCLUDED_ARCHS is set to arm architectures otherwise
14 | # the build will fail on lipo due to duplicate architectures.
15 | echo 'EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_1200 = arm64 arm64e armv7 armv7s armv6 armv8' >> $xcconfig
16 | echo 'EXCLUDED_ARCHS = $(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT)__XCODE_$(XCODE_VERSION_MAJOR))' >> $xcconfig
17 |
18 | export XCODE_XCCONFIG_FILE="$xcconfig"
19 | carthage "$@"
20 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/INRelevantShortcutStore+Loop.swift:
--------------------------------------------------------------------------------
1 | //
2 | // INRelevantShortcutStore+Loop.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Intents
9 | import os.log
10 |
11 |
12 | @available(watchOSApplicationExtension 5.0, *)
13 | extension INRelevantShortcutStore {
14 | func registerShortcuts() {
15 | var shortcuts = [INRelevantShortcut]()
16 |
17 | let shortcut = INShortcut(userActivity: .forDidAddCarbEntryOnWatch())
18 | let relevance = INRelevantShortcut(shortcut: shortcut)
19 | relevance.shortcutRole = .action
20 | relevance.relevanceProviders = []
21 |
22 | shortcuts.append(relevance)
23 |
24 | setRelevantShortcuts(shortcuts) { (error) in
25 | if let error = error {
26 | os_log(.error, "Error specifying shortcuts: %{public}@", String(describing: error))
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Common/Extensions/NSTimeInterval.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSTimeInterval.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 1/9/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | extension TimeInterval {
13 | static func seconds(_ seconds: Double) -> TimeInterval {
14 | return seconds
15 | }
16 |
17 | static func minutes(_ minutes: Double) -> TimeInterval {
18 | return TimeInterval(minutes: minutes)
19 | }
20 |
21 | static func hours(_ hours: Double) -> TimeInterval {
22 | return TimeInterval(hours: hours)
23 | }
24 |
25 | init(minutes: Double) {
26 | self.init(minutes * 60)
27 | }
28 |
29 | init(hours: Double) {
30 | self.init(minutes: hours * 60)
31 | }
32 |
33 | var minutes: Double {
34 | return self / 60.0
35 | }
36 |
37 | var hours: Double {
38 | return minutes / 60.0
39 | }
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/Loop/DefaultAssets.xcassets/settings.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "settings.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "settings@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "settings@3x.png",
16 | "scale" : "3x"
17 | },
18 | {
19 | "idiom" : "universal",
20 | "scale" : "1x",
21 | "height-class" : "compact"
22 | },
23 | {
24 | "idiom" : "universal",
25 | "filename" : "settings_compact@2x.png",
26 | "height-class" : "compact",
27 | "scale" : "2x"
28 | },
29 | {
30 | "idiom" : "universal",
31 | "filename" : "settings_compact@3x.png",
32 | "height-class" : "compact",
33 | "scale" : "3x"
34 | }
35 | ],
36 | "info" : {
37 | "version" : 1,
38 | "author" : "xcode"
39 | }
40 | }
--------------------------------------------------------------------------------
/Common/Extensions/SampleValue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SampleValue.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import HealthKit
9 | import LoopKit
10 |
11 |
12 | extension Collection where Element == SampleValue {
13 | /// O(n)
14 | var quantityRange: ClosedRange? {
15 | var lowest: HKQuantity?
16 | var highest: HKQuantity?
17 |
18 | for sample in self {
19 | if let l = lowest {
20 | lowest = Swift.min(l, sample.quantity)
21 | } else {
22 | lowest = sample.quantity
23 | }
24 |
25 | if let h = highest {
26 | highest = Swift.max(h, sample.quantity)
27 | } else {
28 | highest = sample.quantity
29 | }
30 | }
31 |
32 | guard let l = lowest, let h = highest else {
33 | return nil
34 | }
35 |
36 | return l...h
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Loop/Extensions/UserDefaults+Loop.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UserDefaults+Loop.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 | import LoopKit
10 |
11 |
12 | extension UserDefaults {
13 | private enum Key: String {
14 | case pumpManagerState = "com.loopkit.Loop.PumpManagerState"
15 | }
16 |
17 | var pumpManagerRawValue: [String: Any]? {
18 | get {
19 | return dictionary(forKey: Key.pumpManagerState.rawValue)
20 | }
21 | set {
22 | set(newValue, forKey: Key.pumpManagerState.rawValue)
23 | }
24 | }
25 |
26 | var cgmManager: CGMManager? {
27 | get {
28 | guard let rawValue = cgmManagerState else {
29 | return nil
30 | }
31 |
32 | return CGMManagerFromRawValue(rawValue)
33 | }
34 | set {
35 | cgmManagerState = newValue?.rawValue
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: objective-c
2 | osx_image: xcode11
3 | # xcode_sdk: iphonesimulator11
4 | # xcode_project: Loop.xcodeproj
5 | # xcode_scheme: Loop
6 |
7 | addons:
8 | homebrew:
9 | packages:
10 | - carthage
11 | update: true
12 | before_script:
13 | - git config --global protocol.version 1
14 | - set -o pipefail && xcodebuild -project Loop.xcodeproj -target Cartfile
15 | script:
16 | # Build the app target
17 | - set -o pipefail && xcodebuild -project Loop.xcodeproj -scheme Loop build CODE_SIGN_IDENTITY="" CODE_SIGNING_ALLOWED=NO | xcpretty
18 | - set -o pipefail && xcodebuild -project Loop.xcodeproj -scheme Learn build CODE_SIGN_IDENTITY="" CODE_SIGNING_ALLOWED=NO | xcpretty
19 | # Run the test target
20 | - set -o pipefail && xcodebuild -project Loop.xcodeproj -scheme LoopTests -destination 'name=iPhone 8' test | xcpretty
21 | - set -o pipefail && xcodebuild -project Loop.xcodeproj -scheme DoseMathTests -destination 'name=iPhone 8' test | xcpretty
22 |
--------------------------------------------------------------------------------
/Loop Status Extension/UIColor+Widget.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Widget.swift
3 | // Loop
4 | //
5 | // Created by Nathan Racklyeft on 1/23/16.
6 | // Copyright © 2016 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 |
12 | extension UIColor {
13 | @nonobjc static let axisLabelColor = subtitleLabelColor
14 |
15 | @nonobjc static let axisLineColor = UIColor.clear
16 |
17 | @nonobjc static let doseTintColor = UIColor(red: 255 / 255, green: 109 / 255, blue: 0, alpha: 1)
18 |
19 | @nonobjc static let freshColor = UIColor(red: 64 / 255, green: 219 / 255, blue: 89 / 255, alpha: 1)
20 |
21 | @nonobjc static let glucoseTintColor = UIColor(red: 0 / 255, green: 122 / 255, blue: 244 / 255, alpha: 1)
22 |
23 | @nonobjc static let gridColor = subtitleLabelColor
24 |
25 | @nonobjc static let pumpStatusNormal = UIColor(red: 100 / 255, green: 101 / 255, blue: 105 / 255, alpha: 1)
26 |
27 | @nonobjc static let subtitleLabelColor = UIColor(white: 0, alpha: 0.4)
28 | }
29 |
--------------------------------------------------------------------------------
/Loop/Views/PotentialCarbEntryTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PotentialCarbEntryTableViewCell.swift
3 | // Loop
4 | //
5 | // Created by Michael Pangburn on 12/27/19.
6 | // Copyright © 2019 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 |
12 | class PotentialCarbEntryTableViewCell: UITableViewCell {
13 | @IBOutlet weak var valueLabel: UILabel!
14 | @IBOutlet weak var dateLabel: UILabel!
15 |
16 | override func layoutSubviews() {
17 | super.layoutSubviews()
18 |
19 | contentView.layoutMargins.left = separatorInset.left
20 | contentView.layoutMargins.right = separatorInset.left
21 | }
22 |
23 | override func awakeFromNib() {
24 | super.awakeFromNib()
25 |
26 | resetViews()
27 | }
28 |
29 | override func prepareForReuse() {
30 | super.prepareForReuse()
31 |
32 | resetViews()
33 | }
34 |
35 | private func resetViews() {
36 | valueLabel.text = nil
37 | dateLabel.text = nil
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Loop/nb.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "Bluetooth brukes til å kommunisere med insulinpumpe og kontinuerlige glukosemonitorer.";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "Bluetooth brukes til å kommunisere med insulinpumpe og kontinuerlige glukosemonitorer.";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "Face ID brukes til å autentisere insulin bolus.";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "Matdata fra Health-databasen brukes til å bestemme blodsukkereffekt. Blodsukkerdata hentes fra HealthKit for opptegning og analyse.";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "Angitte karbohydrater i matdataene som tastes inn i appen blir lagret i Health-databasen.";
18 |
19 |
--------------------------------------------------------------------------------
/Common/Extensions/NSUserDefaults+StatusExtension.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSUserDefaults+StatusExtension.swift
3 | // Loop
4 | //
5 | // Created by Bharat Mediratta on 11/27/16.
6 | // Copyright © 2016 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension UserDefaults {
12 |
13 | private enum Key: String {
14 | case StatusExtensionContext = "com.loopkit.Loop.StatusExtensionContext"
15 | }
16 |
17 | var statusExtensionContextObservableKey: String {
18 | return Key.StatusExtensionContext.rawValue
19 | }
20 |
21 | var statusExtensionContext: StatusExtensionContext? {
22 | get {
23 | if let rawValue = dictionary(forKey: Key.StatusExtensionContext.rawValue) {
24 | return StatusExtensionContext(rawValue: rawValue)
25 | } else {
26 | return nil
27 | }
28 | }
29 | set {
30 | set(newValue?.rawValue, forKey: Key.StatusExtensionContext.rawValue)
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Common/Models/PumpManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PumpManager.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import Foundation
9 | import LoopKit
10 | import MockKit
11 |
12 | public struct AvailableDevice {
13 | let identifier: String
14 | let localizedTitle: String
15 | }
16 |
17 |
18 | let staticPumpManagers: [PumpManager.Type] = [
19 | MockPumpManager.self,
20 | ]
21 |
22 | let staticPumpManagersByIdentifier: [String: PumpManager.Type] = staticPumpManagers.reduce(into: [:]) { (map, Type) in
23 | map[Type.managerIdentifier] = Type
24 | }
25 |
26 | let availableStaticPumpManagers = staticPumpManagers.map { (Type) -> AvailableDevice in
27 | return AvailableDevice(identifier: Type.managerIdentifier, localizedTitle: Type.localizedTitle)
28 | }
29 |
30 | extension PumpManager {
31 | var rawValue: [String: Any] {
32 | return [
33 | "managerIdentifier": type(of: self).managerIdentifier,
34 | "state": self.rawState
35 | ]
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Learn/ru.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Вычисляет процент замеров ГК в указанном диапазоне";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Продолжить";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Максимум";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Минимум";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Модальный день";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Нет данных";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Диапазон";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Дата начала";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Время в диапазоне";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Показывает самые частые значения ГК по времени суток";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Недель";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/ar.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "حساب النسبة المئوية لقراءات سكر الدم ضمن نطاق محدد";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "متابعة";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "الحد الأعلى";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "الحد الأدنى";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "يوم طبيعي";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "لا يوجد بيانات متاحة";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "النطاق";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "تاريخ البداية";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "الوقت في النطاق";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "يعرض قراءات سكر الدم الأكثر شيوعًا في أوقات مختلفة من اليوم";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "أسابيع";
33 |
--------------------------------------------------------------------------------
/Learn/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Computes the percentage of glucose measurements within a specified range";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Continue";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maximum";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimum";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Modal Day";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "No data available";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Range";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Start Date";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Time in Range";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Visualizes the most frequent glucose values by time of day";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Weeks";
33 |
--------------------------------------------------------------------------------
/Learn/pl.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Oblicza odsetek pomiarów glukozy w określonym zakresie";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Kontynuuj";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maks.";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Min.";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Dzień modalny";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Brak dostępnych danych";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Zakres";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Data rozpoczęcia";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Czas w zakresie";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Wizualizuje najczęstsze wartości glukozy według pory dnia";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Tygodnie";
33 |
--------------------------------------------------------------------------------
/Learn/de.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Computes the percentage of glucose measurements within a specified range";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Continue";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maximum";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimum";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Modal Day";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "No data available";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Range";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Start Date";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Time in Range";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Visualizes the most frequent glucose values by time of day";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Weeks";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/fi.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Laskee glukoosimittausten prosenttimäärän määritellyllä alueella";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Jatka";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maksimi";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimi";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Tyypillinen päivä";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Tietoja ei saatavilla";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Alue";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Aloitusaika";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Aika tavoitealueella";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Näyttää yleisimmät glukoosiarvot vuorokaudenajan mukaan";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Viikkoa";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/nl.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Berekent het percentage glucosemetingen in een specifiek bereik";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Ga verder";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maximum";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimum";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Model dag";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Geen data aanwezig";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Bereik";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Start datum";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Tijd in bereik";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Geeft de meest voorkomende glucose waardes weer per moment van de dag";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Weken";
33 |
34 |
--------------------------------------------------------------------------------
/Loop/sv.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "Bluetooth används för att kommunicera med insulinpump och CGM.";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "Bluetooth används för att kommunicera med insulinpump och CGM.";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "Kräv Face ID för att kunna godkänna bolus.";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "Kolhydratdata från Apple Health-databasen används för att bestämma effekten på glukosvärde. Glukosvärden från Apple Health-databasen används i diagram och för beräkning av förändring.";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "Kolhydratvärden inmatade i appen i klockan lagras i Apple Health-databasen. Glukosvärden mottagna från CGM lagras krypterat i HealthKit.";
18 |
19 |
--------------------------------------------------------------------------------
/Learn/da.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Beregner procentdelen af glukosemålinger inden for et specificeret interval";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Fortsæt";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maximum";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimum";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Modal Dag";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Ingen data tilgængelige";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Interval";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Start Dato";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Tme in Range";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Visualiserer de hyppigste blodsukker værdier fordelt på dagen";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Weeks";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/es.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Calcula el porcentaje de mediciones de glucosa en un rango específico";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Continuar";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Máximo";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Mínimo";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Día modal";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "No hay datos disponibles";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Rango";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Fecha de inicio";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Tiempo en rango";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Muestra los valores de glucosa más frecuentes en un momento del día";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Semanas";
33 |
--------------------------------------------------------------------------------
/Learn/nb.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Computes the percentage of glucose measurements within a specified range";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Fortsett";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maksimum";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimum";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Modal dag";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Ingen data tilgjengelig";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Målområde";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Startdato";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Tid i målområdet";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Visualiser de nyeste blodsukkerverdier etter tid på døgnet";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Uker";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/sv.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Beräknar procentandelen glukosmätningar inom ett specifikt målvärde";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Fortsätt";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maximum";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimum";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Genomsnittlig dag";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Ingen data tillgänglig";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Målvärde";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Starttid";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Tid inom målvärde";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Visar de vanligaste glukosvärdena under olika tider på dygnet";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Veckor";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/ro.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Calculează procentul măsurătorilor glicemice dintr-un interval specificat";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Continuă";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maxim";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minim";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Zi modală";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Date inexistente";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Interval";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Dată inițială";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Timp petrecut în interval";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Vizualizează cele mai frecvente valori glicemice în funcție de oră";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Săptămâni";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/pt-BR.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Calcula a porcentagem de medições de glicose dentro de um intervalo especificado";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Continuar";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Máximo";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Mínimo";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Dia Modal";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Não há dados disponíveis";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Variação";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Data de Início";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Tempo na Meta";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Visualiza os valores de glicose mais frequentes por hora do dia";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Semanas";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/fr.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Ceci calcule le pourcentage des mesures de glycémie dans une plage spécifique";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Continuer";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Maximum";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimum";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Journée type";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Données indisponibles";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Plage";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Date de commencement";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Temps passé dans la cible";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Visualisation des glycémies les plus fréquentes selon l’heure";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Semaines";
33 |
34 |
--------------------------------------------------------------------------------
/Loop/Views/PredictionInputEffectTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PredictionInputEffectTableViewCell.swift
3 | // Loop
4 | //
5 | // Created by Nate Racklyeft on 9/4/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class PredictionInputEffectTableViewCell: UITableViewCell {
12 |
13 | @IBOutlet weak var titleLabel: UILabel!
14 |
15 | @IBOutlet weak var subtitleLabel: UILabel!
16 |
17 | override func layoutSubviews() {
18 | super.layoutSubviews()
19 |
20 | contentView.layoutMargins.left = separatorInset.left
21 | contentView.layoutMargins.right = separatorInset.left
22 | }
23 |
24 | var enabled: Bool = true {
25 | didSet {
26 | if enabled {
27 | titleLabel.textColor = UIColor.darkText
28 | subtitleLabel.textColor = UIColor.darkText
29 | } else {
30 | titleLabel.textColor = UIColor.secondaryLabelColor
31 | subtitleLabel.textColor = UIColor.secondaryLabelColor
32 | }
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/Loop/da.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "Bluetooth bliver brugt til at kommunikere med din insulin pumpe og din glukose monitor.";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "Bluetooth bliver brugt til at kommunikere med din insulin pumpe og din glukose monitor.";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "Face ID bliver brugt til at godkende en insulin bolus.";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "Måltidsdata fra Apple Sundhed bliver brugt til at glukosens effekt på dit blodsukker. Glukose data fra Apple Sundhed bliver brugt til at danne grafer og udregninger.";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "Kulhydrater indtastet i appen og på uret gemmes i Apple Sundhedsdatabasen. Glukosedata hentet fra CGM gemmes sikkert i SundhedsKit.";
18 |
19 |
--------------------------------------------------------------------------------
/Learn/vi.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Tính tỉ lệ phần trăm của glucose trong một phạm vi nhất định";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Tiếp tục";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Tối đa";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Tối thiểu";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Ngày chuẩn";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Dữ liệu không tồn tại";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Phạm vi";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Ngày bắt đầu";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Thời gian trong phạm vi kiểm soát";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Hình dung các giá trị glucose thường xuyên nhất theo thời gian trong ngày";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Tuần";
33 |
34 |
--------------------------------------------------------------------------------
/Learn/it.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* Lesson subtitle */
2 | "Computes the percentage of glucose measurements within a specified range" = "Calcola la percentuale delle misurazioni di glucosio all’interno di un intervallo specifico";
3 |
4 | /* Title of the button to begin lesson execution */
5 | "Continue" = "Continua";
6 |
7 | /* Placeholder for upper range entry */
8 | "Maximum" = "Massimo";
9 |
10 | /* Placeholder for lower range entry */
11 | "Minimum" = "Minimo";
12 |
13 | /* Lesson title */
14 | "Modal Day" = "Modalità giornaliera";
15 |
16 | /* Lesson result text for no data */
17 | "No data available" = "Nessun dato disponibile";
18 |
19 | /* Section title for glucose range */
20 | "Range" = "Intervallo";
21 |
22 | /* Title of config entry */
23 | "Start Date" = "Data di inizio";
24 |
25 | /* Lesson title */
26 | "Time in Range" = "Tempo nell’intervallo";
27 |
28 | /* Lesson subtitle */
29 | "Visualizes the most frequent glucose values by time of day" = "Visualizza i valori di glucosio più frequenti per ora del giorno";
30 |
31 | /* Unit string for a count of calendar weeks */
32 | "Weeks" = "Settimane";
33 |
34 |
--------------------------------------------------------------------------------
/Common/Models/GlucoseBackfillRequestUserInfo.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GlucoseBackfillRequestUserInfo.swift
3 | // Loop
4 | //
5 | // Created by Bharat Mediratta on 6/21/18.
6 | // Copyright © 2018 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct GlucoseBackfillRequestUserInfo {
12 | let version = 1
13 | let startDate: Date
14 | }
15 |
16 | extension GlucoseBackfillRequestUserInfo: RawRepresentable {
17 | typealias RawValue = [String: Any]
18 |
19 | static let name = "GlucoseBackfillRequestUserInfo"
20 |
21 | init?(rawValue: RawValue) {
22 | guard
23 | rawValue["v"] as? Int == version,
24 | rawValue["name"] as? String == GlucoseBackfillRequestUserInfo.name,
25 | let startDate = rawValue["sd"] as? Date
26 | else {
27 | return nil
28 | }
29 |
30 | self.startDate = startDate
31 | }
32 |
33 | var rawValue: RawValue {
34 | return [
35 | "v": version,
36 | "name": GlucoseBackfillRequestUserInfo.name,
37 | "sd": startDate
38 | ]
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Common/Models/LoopSettingsUserInfo.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoopSettingsUserInfo.swift
3 | // Loop
4 | //
5 | // Copyright © 2018 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import LoopCore
9 |
10 |
11 | struct LoopSettingsUserInfo {
12 | let settings: LoopSettings
13 | }
14 |
15 |
16 | extension LoopSettingsUserInfo: RawRepresentable {
17 | typealias RawValue = [String: Any]
18 |
19 | static let name = "LoopSettingsUserInfo"
20 | static let version = 1
21 |
22 | init?(rawValue: RawValue) {
23 | guard rawValue["v"] as? Int == LoopSettingsUserInfo.version,
24 | rawValue["name"] as? String == LoopSettingsUserInfo.name,
25 | let settingsRaw = rawValue["s"] as? LoopSettings.RawValue,
26 | let settings = LoopSettings(rawValue: settingsRaw)
27 | else {
28 | return nil
29 | }
30 |
31 | self.settings = settings
32 | }
33 |
34 | var rawValue: RawValue {
35 | return [
36 | "v": LoopSettingsUserInfo.version,
37 | "name": LoopSettingsUserInfo.name,
38 | "s": settings.rawValue
39 | ]
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Loop/Extensions/UIImage.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIImage.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 5/7/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 |
12 | extension UIImage {
13 | private static func imageSuffixForLevel(_ level: Double?) -> String {
14 | let suffix: String
15 |
16 | switch level {
17 | case 0?:
18 | suffix = "0"
19 | case let x? where x <= 0.25:
20 | suffix = "25"
21 | case let x? where x <= 0.5:
22 | suffix = "50"
23 | case let x? where x <= 0.75:
24 | suffix = "75"
25 | case let x? where x <= 1:
26 | suffix = "100"
27 | default:
28 | suffix = "unknown"
29 | }
30 |
31 | return suffix
32 | }
33 |
34 | static func preMealImage(selected: Bool) -> UIImage? {
35 | return UIImage(named: selected ? "Pre-Meal Selected" : "Pre-Meal")
36 | }
37 |
38 | static func workoutImage(selected: Bool) -> UIImage? {
39 | return UIImage(named: selected ? "workout-selected" : "workout")
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Loop/Models/GlucoseEffectVelocity.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GlucoseEffectVelocity.swift
3 | // Loop
4 | //
5 | // Copyright © 2017 LoopKit Authors. All rights reserved.
6 | //
7 |
8 | import HealthKit
9 | import LoopKit
10 |
11 |
12 | extension GlucoseEffectVelocity: RawRepresentable {
13 | public typealias RawValue = [String: Any]
14 |
15 | static let unit = HKUnit.milligramsPerDeciliter.unitDivided(by: .minute())
16 |
17 | public init?(rawValue: RawValue) {
18 | guard let startDate = rawValue["startDate"] as? Date,
19 | let doubleValue = rawValue["doubleValue"] as? Double
20 | else {
21 | return nil
22 | }
23 |
24 | self.init(
25 | startDate: startDate,
26 | endDate: rawValue["endDate"] as? Date ?? startDate,
27 | quantity: HKQuantity(unit: type(of: self).unit, doubleValue: doubleValue)
28 | )
29 | }
30 |
31 | public var rawValue: RawValue {
32 | return [
33 | "startDate": startDate,
34 | "endDate": endDate,
35 | "doubleValue": quantity.doubleValue(for: type(of: self).unit)
36 | ]
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopCore/GlucoseThreshold.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GlucoseThreshold.swift
3 | // Loop
4 | //
5 | // Created by Pete Schwamb on 1/1/17.
6 | // Copyright © 2017 LoopKit Authors. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import HealthKit
11 |
12 | public struct GlucoseThreshold: Equatable, RawRepresentable {
13 | public typealias RawValue = [String: Any]
14 |
15 | public let value: Double
16 | public let unit: HKUnit
17 |
18 | public var quantity: HKQuantity {
19 | return HKQuantity(unit: unit, doubleValue: value)
20 | }
21 |
22 | public init(unit: HKUnit, value: Double) {
23 | self.value = value
24 | self.unit = unit
25 | }
26 |
27 | public init?(rawValue: RawValue) {
28 | guard let unitsStr = rawValue["units"] as? String, let value = rawValue["value"] as? Double else {
29 | return nil
30 | }
31 | self.unit = HKUnit(from: unitsStr)
32 | self.value = value
33 | }
34 |
35 | public var rawValue: RawValue {
36 | return [
37 | "value": value,
38 | "units": unit.unitString
39 | ]
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/WatchApp Extension/Extensions/NSUserDefaults+WatchApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSUserDefaults.swift
3 | // Naterade
4 | //
5 | // Created by Nathan Racklyeft on 3/29/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | extension UserDefaults {
13 | private enum Key: String {
14 | case StartOnChartPage = "com.loudnate.Naterade.StartOnChartPage"
15 | case VisibleDuration = "com.loudnate.Naterade.VisibleDuration"
16 | }
17 |
18 | var startOnChartPage: Bool {
19 | get {
20 | return object(forKey: Key.StartOnChartPage.rawValue) as? Bool ?? false
21 | }
22 | set {
23 | set(newValue, forKey: Key.StartOnChartPage.rawValue)
24 | }
25 | }
26 |
27 | var visibleDuration: TimeInterval {
28 | get {
29 | if let value = object(forKey: Key.VisibleDuration.rawValue) as? TimeInterval {
30 | return value
31 | }
32 | return TimeInterval (hours: 6)
33 | }
34 | set {
35 | set(newValue.rawValue, forKey: Key.VisibleDuration.rawValue)
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Loop/it.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "Il Bluetooth viene utilizzato per comunicare con il microinfusore e i dispositivi CGM.";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "Il Bluetooth viene utilizzato per comunicare con il microinfusore e i dispositivi CGM.";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "Face ID viene utilizzato per autenticare il bolo.";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "I dati sui pasti dal database Salute vengono utilizzati per determinare gli effetti del glucosio. I dati del glucosio del database Salute vengono utilizzati per il calcolo del grafico della glicemia.";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "I dati sui carboidrati inseriti nell'app e sull'orologio sono memorizzati nel database Salute. I dati relativi al glucosio recuperati dal CGM vengono memorizzati in modo sicuro in Salute.";
18 |
19 |
--------------------------------------------------------------------------------
/Loop/pt-BR.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "Bluetooth é utilizado para comunicação com a bomba de insulina e os dispositivos de monitoramento de glicose.";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "Bluetooth é utilizado para comunicação com a bomba de insulina e os dispositivos de monitoramento de glicose.";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "Face ID é utilizado para autenticar o bolus de insulina.";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "Os dados de refeições do banco de dados de saúde são utilizados para definir os efeitos da glicose para a representação gráfica e cálculo da aceleração.";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "Dados de carboidratos inseridos no aplicativo e no Apple Watch são armazenados no banco de dados de saúde. Dados de glicemia recebidos do CGM são armazenados de modo seguro no HealthKit.";
18 |
19 |
--------------------------------------------------------------------------------
/Common/es.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
2 | "%1$@ v%2$@" = "%1$@ v%2$@";
3 |
4 | /* Title of the user activity for adding carbs */
5 | "Add Carb Entry" = "Agregar Registro de Carbs";
6 |
7 | /* Lesson subtitle */
8 | "Computes the percentage of glucose measurements within a specified range" = "Calcula el porcentaje de medidas de glucosa entre una gama especificada";
9 |
10 | /* The short unit display string for decibles */
11 | "dB" = "dB";
12 |
13 | /* The short unit display string for grams */
14 | "g" = "g";
15 |
16 | /* The short unit display string for milligrams of glucose per decilter */
17 | "mg/dL" = "mg/dL";
18 |
19 | /* The short unit display string for millimoles of glucose per liter */
20 | "mmol/L" = "mmol/L";
21 |
22 | /* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
23 | "QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
24 |
25 | /* Section title for glucose range */
26 | "Range" = "Rango";
27 |
28 | /* Title of config entry */
29 | "Start Date" = "Fecha de Inicio";
30 |
31 | /* The short unit display string for international units of insulin */
32 | "U" = "U";
33 |
34 |
--------------------------------------------------------------------------------
/Loop/Base.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices.";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices.";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "Face ID is used to authenticate insulin bolus.";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "Meal data from the Health database is used to determine glucose effects. Glucose data from the Health database is used for graphing and momentum calculation. Sleep data from the Health database is used to improve the Apple Watch complication.";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "Carbohydrate meal data entered in the app and on the watch is stored in the Health database. Glucose data retrieved from the CGM is stored securely in HealthKit.";
18 |
19 |
--------------------------------------------------------------------------------
/Loop/pl.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "Bluetooth jest używany do komunikacji z pompą i urządzeniami ciągłego monitoringu glukozy.";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "Bluetooth jest używany do komunikacji z pompą i urządzeniami ciągłego monitoringu glukozy.";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "Face ID jest używane do autoryzacji podaży bolusa.";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "Dane o posiłkach z bazy aplikacji Zdrowie będą używane do określenia ich wpływu na poziom cukru. Informacje o poziomie cukru z bazy danych aplikacji Zdrowie są używane do narysowania wykresu oraz obliczenia przewidywanego poziomu cukru.";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "Posiłek węglowodanowy wprowadzony w aplikacji i na zegarku oraz dane o poziomie cukru pobrane z ciągłego monitoringu glukozy są bezpiecznie przechowywane w aplikacji Zdrowie.";
18 |
--------------------------------------------------------------------------------
/Common/fr.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /* The format string for the app name and version number. (1: bundle name)(2: bundle version) */
2 | "%1$@ v%2$@" = "%1$@ v%2$@";
3 |
4 | /* Title of the user activity for adding carbs */
5 | "Add Carb Entry" = "Ajouter des glucides";
6 |
7 | /* Lesson subtitle */
8 | "Computes the percentage of glucose measurements within a specified range" = "Ceci calcule le pourcentage des mesures de glycémie dans une plage spécifique";
9 |
10 | /* The short unit display string for decibles */
11 | "dB" = "dB";
12 |
13 | /* The short unit display string for grams */
14 | "g" = "g";
15 |
16 | /* The short unit display string for milligrams of glucose per decilter */
17 | "mg/dL" = "mg/dL";
18 |
19 | /* The short unit display string for millimoles of glucose per liter */
20 | "mmol/L" = "mmol/L";
21 |
22 | /* Format string for combining localized numeric value and unit. (1: numeric value)(2: unit) */
23 | "QUANTITY_VALUE_AND_UNIT" = "%1$@ %2$@";
24 |
25 | /* Section title for glucose range */
26 | "Range" = "Plage";
27 |
28 | /* Title of config entry */
29 | "Start Date" = "Date de commencement";
30 |
31 | /* The short unit display string for international units of insulin */
32 | "U" = "U";
33 |
34 |
--------------------------------------------------------------------------------
/Loop/Managers/KeychainManager+Loop.swift:
--------------------------------------------------------------------------------
1 | //
2 | // KeychainManager+Loop.swift
3 | // Loop
4 | //
5 | // Created by Nate Racklyeft on 6/26/16.
6 | // Copyright © 2016 Nathan Racklyeft. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import LoopKit
11 |
12 |
13 | private let NightscoutAccount = "NightscoutAPI"
14 |
15 |
16 | extension KeychainManager {
17 | func setNightscoutURL(_ url: URL?, secret: String?) {
18 | let credentials: InternetCredentials?
19 |
20 | if let url = url, let secret = secret {
21 | credentials = InternetCredentials(username: NightscoutAccount, password: secret, url: url)
22 | } else {
23 | credentials = nil
24 | }
25 |
26 | do {
27 | try replaceInternetCredentials(credentials, forAccount: NightscoutAccount)
28 | } catch {
29 | }
30 | }
31 |
32 | func getNightscoutCredentials() -> (url: URL, secret: String)? {
33 | do {
34 | let credentials = try getInternetCredentials(account: NightscoutAccount)
35 |
36 | return (url: credentials.url, secret: credentials.password)
37 | } catch {
38 | return nil
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Loop/nl.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Bundle name */
2 | "CFBundleName" = "$(PRODUCT_NAME)";
3 |
4 | /* Privacy - Bluetooth Always Usage Description */
5 | "NSBluetoothAlwaysUsageDescription" = "Bluetooth wordt gebruikt om te communiceren met de insuline pomp en de continue glucose meter.";
6 |
7 | /* Privacy - Bluetooth Peripheral Usage Description */
8 | "NSBluetoothPeripheralUsageDescription" = "Bluetooth wordt gebruikt om te communiceren met de insuline pomp en de continue glucose meter.";
9 |
10 | /* Privacy - Face ID Usage Description */
11 | "NSFaceIDUsageDescription" = "Face ID wordt gebruikt om de insuline bolus te verifiëren.";
12 |
13 | /* Privacy - Health Share Usage Description */
14 | "NSHealthShareUsageDescription" = "Maaltijd data van de Health database wordt gebruikt om de effecten op glucose te bepalen.Glucose data vanuit de Health database worden gebruikt voor het berekenen en weergeven van het momentum ";
15 |
16 | /* Privacy - Health Update Usage Description */
17 | "NSHealthUpdateUsageDescription" = "Koolhydraten van de maaltijd die worden ingevoerd in de app op de apple watch worden opgeslagen in de Gezondheid database. Glucose gegevens ontvangen van de CGM wordt veilig opgeslagen in Gezondheid.";
18 |
19 |
--------------------------------------------------------------------------------