├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── inactive_issues.yml ├── .gitignore ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── Common ├── Base.lproj │ └── Intents.intentdefinition ├── Extensions │ ├── Comparable.swift │ ├── Double.swift │ ├── GlucoseRangeSchedule.swift │ ├── HKUnit.swift │ ├── NSBundle.swift │ ├── NSTimeInterval.swift │ ├── NSUserActivity.swift │ ├── NSUserDefaults+StatusExtension.swift │ ├── NewCarbEntryIntent+Loop.swift │ ├── NumberFormatter.swift │ ├── OSLog.swift │ ├── SampleValue.swift │ ├── TextFieldTableViewCell.swift │ ├── UIColor+HIG.swift │ └── UserDefaults+LoopIntents.swift ├── FeatureFlags.swift ├── Models │ ├── BuildDetails.swift │ ├── CarbAbsorptionTime.swift │ ├── CarbBackfillRequestUserInfo.swift │ ├── GlucoseBackfillRequestUserInfo.swift │ ├── IntentExtensionInfo.swift │ ├── LoopSettingsUserInfo.swift │ ├── PumpManager.swift │ ├── PumpManagerUI.swift │ ├── SetBolusUserInfo.swift │ ├── StatusExtensionContext.swift │ ├── SupportedBolusVolumesUserInfo.swift │ ├── WatchContext.swift │ ├── WatchContextRequestUserInfo.swift │ ├── WatchHistoricalCarbs.swift │ ├── WatchHistoricalGlucose.swift │ └── WatchPredictedGlucose.swift ├── ar.lproj │ ├── Intents.strings │ └── Localizable.strings ├── cs.lproj │ └── Intents.strings ├── da.lproj │ ├── Intents.strings │ └── Localizable.strings ├── de.lproj │ ├── Intents.strings │ └── Localizable.strings ├── en.lproj │ ├── Intents.strings │ └── Localizable.strings ├── es.lproj │ ├── Intents.strings │ └── Localizable.strings ├── fi.lproj │ ├── Intents.strings │ └── Localizable.strings ├── fr.lproj │ ├── Intents.strings │ └── Localizable.strings ├── he.lproj │ ├── Intents.strings │ └── Localizable.strings ├── hi.lproj │ └── Intents.strings ├── it.lproj │ ├── Intents.strings │ └── Localizable.strings ├── ja.lproj │ ├── Intents.strings │ └── Localizable.strings ├── nb.lproj │ ├── Intents.strings │ └── Localizable.strings ├── nl.lproj │ ├── Intents.strings │ └── Localizable.strings ├── pl.lproj │ ├── Intents.strings │ └── Localizable.strings ├── pt-BR.lproj │ ├── Intents.strings │ └── Localizable.strings ├── ro.lproj │ ├── Intents.strings │ └── Localizable.strings ├── ru.lproj │ ├── Intents.strings │ └── Localizable.strings ├── sk.lproj │ ├── Intents.strings │ └── Localizable.strings ├── sv.lproj │ ├── Intents.strings │ └── Localizable.strings ├── tr.lproj │ ├── Intents.strings │ └── Localizable.strings ├── vi.lproj │ ├── Intents.strings │ └── Localizable.strings └── zh-Hans.lproj │ ├── Intents.strings │ └── Localizable.strings ├── Documentation ├── Assigning a bundle identifier.png ├── Changing the app icon.png ├── Changing the display name.png ├── Screenshots │ ├── Phone Bolus.png │ ├── Phone Graphs.png │ ├── Phone Notification Battery.png │ ├── Phone Notification Bolus Failure.png │ ├── Phone Notification Loop Failure.png │ ├── Watch Bolus.png │ ├── Watch Carb Entry.png │ ├── Watch Complication.png │ ├── Watch Menu.png │ ├── Watch Notification Battery.png │ ├── Watch Notification Bolus Failure.png │ └── Watch Notification Reservoir.png ├── Testing │ ├── Images │ │ ├── mock_managers.png │ │ ├── rewind.png │ │ ├── scenarios_menu.png │ │ └── scenarios_url.png │ └── Scenarios.md └── User Icons │ └── LoopingPump.png ├── DoseMathTests └── Base.lproj │ └── InfoPlist.strings ├── Interface.strings ├── LICENSE.md ├── Learn ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── Base.lproj │ └── Main.storyboard ├── Configuration │ ├── DateEntry.swift │ ├── DateIntervalEntry.swift │ ├── NumberEntry.swift │ ├── NumberRangeEntry.swift │ └── QuantityRangeEntry.swift ├── Display │ ├── DatesAndNumberCell.swift │ └── TextCell.swift ├── Extensions │ ├── Date.swift │ ├── DateIntervalFormatter.swift │ ├── NSNumber.swift │ ├── OSLog.swift │ ├── Sequence.swift │ └── UITableViewCell.swift ├── Info.plist ├── Learn.entitlements ├── Lesson.swift ├── Lessons │ ├── ModalDayLesson.swift │ └── TimeInRangeLesson.swift ├── Managers │ ├── DataManager.swift │ └── DayCalculator.swift ├── Models │ └── TimeComponents.swift ├── View Controllers │ ├── LessonConfigurationViewController.swift │ ├── LessonResultsViewController.swift │ └── LessonsViewController.swift ├── ar.lproj │ ├── Localizable.strings │ └── Main.strings ├── da.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── de.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── en.lproj │ ├── Localizable.strings │ └── Main.strings ├── es.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── fi.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── fr.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── he.lproj │ ├── Localizable.strings │ └── Main.strings ├── it.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ja.lproj │ ├── Localizable.strings │ └── Main.strings ├── nb.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── nl.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── pl.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── pt-BR.lproj │ ├── Localizable.strings │ └── Main.strings ├── ro.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ru.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── sk.lproj │ └── InfoPlist.strings ├── sv.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── tr.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── vi.lproj │ ├── Localizable.strings │ └── Main.strings └── zh-Hans.lproj │ ├── Localizable.strings │ └── Main.strings ├── Loop Intent Extension ├── Info.plist ├── IntentHandler.swift ├── Loop Intent Extension.entitlements ├── OverrideIntentHandler.swift ├── ar.lproj │ └── Localizable.strings ├── da.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── de.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── es.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── fi.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── fr.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── he.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── it.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ja.lproj │ └── Localizable.strings ├── nb.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── nl.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── pl.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── pt-BR.lproj │ └── Localizable.strings ├── ro.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ru.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── sk.lproj │ └── Localizable.strings ├── sv.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── tr.lproj │ ├── InfoPlist.strings │ └── Localizable.strings └── vi.lproj │ └── Localizable.strings ├── Loop Status Extension └── Base.lproj │ └── InfoPlist.strings ├── Loop Widget Extension ├── Bootstrap │ ├── Info.plist │ ├── LoopWidgetExtension.entitlements │ ├── ar.lproj │ │ └── Localizable.strings │ ├── da.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── de.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── es.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── fi.lproj │ │ └── Localizable.strings │ ├── fr.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── he.lproj │ │ └── Localizable.strings │ ├── it.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── ja.lproj │ │ └── Localizable.strings │ ├── nb.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── nl.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── pl.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── pt-BR.lproj │ │ └── Localizable.strings │ ├── ro.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── ru.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── sk.lproj │ │ └── Localizable.strings │ ├── sv.lproj │ │ └── Localizable.strings │ ├── tr.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ └── vi.lproj │ │ └── Localizable.strings ├── Components │ ├── BasalView.swift │ ├── DeeplinkView.swift │ ├── EventualGlucoseView.swift │ ├── GlucoseView.swift │ └── PumpView.swift ├── DefaultAssets.xcassets │ ├── Contents.json │ ├── WidgetBackground.colorset │ │ └── Contents.json │ └── WidgetSecondaryBackground.colorset │ │ └── Contents.json ├── DerivedAssets.xcassets │ └── Contents.json ├── DerivedAssetsBase.xcassets │ ├── Contents.json │ ├── bolus.imageset │ │ ├── Contents.json │ │ └── bolus.pdf │ ├── carbs.imageset │ │ ├── Contents.json │ │ └── Meal.pdf │ ├── fresh.colorset │ │ └── Contents.json │ ├── glucose.colorset │ │ └── Contents.json │ ├── insulin.colorset │ │ └── Contents.json │ ├── premeal.imageset │ │ ├── Contents.json │ │ └── Pre-Meal.pdf │ ├── warning.colorset │ │ └── Contents.json │ └── workout.imageset │ │ ├── Contents.json │ │ └── workout.pdf ├── Helpers │ ├── Color.swift │ ├── ContentMargin.swift │ ├── Date.swift │ └── WidgetBackground.swift ├── LoopWidgets.swift ├── Timeline │ ├── StatusWidgetTimelimeEntry.swift │ └── StatusWidgetTimelineProvider.swift └── Widgets │ └── SystemStatusWidget.swift ├── Loop.xcconfig ├── Loop.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── xcshareddata │ └── xcschemes │ ├── DoseMathTests.xcscheme │ ├── Loop Intent Extension.xcscheme │ ├── Loop Status Extension.xcscheme │ ├── Loop.xcscheme │ ├── LoopTests.xcscheme │ ├── SmallStatusWidgetExtension.xcscheme │ └── WatchApp.xcscheme ├── Loop ├── AppDelegate.swift ├── Base.lproj │ ├── InfoPlist.strings │ ├── LaunchScreen.storyboard │ ├── Localizable.strings │ └── Main.storyboard ├── BuildDetails.plist ├── DefaultAssets.xcassets │ ├── Contents.json │ ├── Favorite Foods Icon.imageset │ │ ├── Contents.json │ │ ├── Favorite Foods Icon.png │ │ ├── Favorite Foods Icon@2x.png │ │ └── Favorite Foods Icon@3x.png │ ├── Open Loop.imageset │ │ ├── Contents.json │ │ └── Open Loop.pdf │ ├── Oval Selection.imageset │ │ ├── Contents.json │ │ ├── Oval Selection Dark.pdf │ │ └── Oval Selection.pdf │ ├── Presets Icon.imageset │ │ ├── Contents.json │ │ ├── Presets Icon.png │ │ ├── Presets Icon@2x.png │ │ └── Presets Icon@3x.png │ ├── Therapy Icon.imageset │ │ ├── Contents.json │ │ ├── Therapy Icon 1x.png │ │ ├── Therapy Icon 2x.png │ │ └── Therapy Icon 3x.png │ ├── Uploading.imageset │ │ ├── Contents.json │ │ └── Uploading.pdf │ ├── drop.circle.imageset │ │ ├── Contents.json │ │ └── drop.circle.pdf │ ├── hardware.imageset │ │ ├── Contents.json │ │ └── hardware.pdf │ ├── notification-permissions-on.imageset │ │ ├── Contents.json │ │ └── notification-permissions-on.png │ └── phone.imageset │ │ ├── Contents.json │ │ └── phone.pdf ├── DerivedAssets.xcassets │ └── Contents.json ├── DerivedAssetsBase.xcassets │ ├── AppIcon.appiconset │ │ ├── AppStore-1024pt@1x.png │ │ ├── Contents.json │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-76.png │ │ ├── Icon-76@2x.png │ │ ├── Icon-83.5@2x.png │ │ ├── Icon-Notification-20.png │ │ ├── Icon-Notification-40.png │ │ ├── Icon-Notification-41.png │ │ ├── Icon-Notification-42.png │ │ ├── Icon-Small-40@2x-1.png │ │ ├── Icon-Small-40@2x.png │ │ ├── Icon-Small-60.png │ │ ├── Icon-Small-60@2x.png │ │ ├── Icon-Small.png │ │ ├── Icon-Small@2x-1.png │ │ ├── Icon-Small@2x.png │ │ └── Icon-Small@3x.png │ ├── Contents.json │ ├── Pre-Meal Selected.imageset │ │ ├── Contents.json │ │ └── Pre-Meal Selected.pdf │ ├── Pre-Meal-symbol.symbolset │ │ ├── Contents.json │ │ └── premeal.DIY.svg │ ├── Pre-Meal.imageset │ │ ├── Contents.json │ │ └── Pre-Meal.pdf │ ├── accent.colorset │ │ └── Contents.json │ ├── bolus.imageset │ │ ├── Contents.json │ │ └── bolus.pdf │ ├── carbs.colorset │ │ └── Contents.json │ ├── carbs.imageset │ │ ├── Contents.json │ │ └── Meal.pdf │ ├── fresh.colorset │ │ └── Contents.json │ ├── glucose.colorset │ │ └── Contents.json │ ├── insulin.colorset │ │ └── Contents.json │ ├── presets-selected.imageset │ │ ├── Contents.json │ │ └── Temp Presets.pdf │ ├── presets.colorset │ │ └── Contents.json │ ├── presets.imageset │ │ ├── Contents.json │ │ └── Temp Presets-2.pdf │ ├── settings.imageset │ │ ├── Contents.json │ │ └── settings@3x.png │ ├── warning.colorset │ │ └── Contents.json │ ├── workout-selected.imageset │ │ ├── Contents.json │ │ └── workout-selected.pdf │ ├── workout-symbol.symbolset │ │ ├── Contents.json │ │ └── heart.pulse.svg │ └── workout.imageset │ │ ├── Contents.json │ │ └── workout.pdf ├── Extensions │ ├── AlertStore+SimulatedCoreData.swift │ ├── BasalDeliveryState.swift │ ├── BasalRelativeDose.swift │ ├── CarbStore+SimulatedCoreData.swift │ ├── CaseCountable.swift │ ├── Character+IsEmoji.swift │ ├── ChartColorPalette+Loop.swift │ ├── ChartSettings+Loop.swift │ ├── CollectionType+Loop.swift │ ├── Data.swift │ ├── Debug.swift │ ├── DeviceDataManager+DeviceStatus.swift │ ├── DiagnosticLog+Subsystem.swift │ ├── DiagnosticLog.swift │ ├── Dictionary.swift │ ├── DirectoryObserver.swift │ ├── DoseStore+SimulatedCoreData.swift │ ├── DosingDecisionStore+SimulatedCoreData.swift │ ├── DosingDecisionStore.swift │ ├── EditMode.swift │ ├── Environment+SettingsManager.swift │ ├── Environment+TemporaryPresetsManager.swift │ ├── GlucoseStore+SimulatedCoreData.swift │ ├── Image+Optional.swift │ ├── LoopUIColorPalette+Default.swift │ ├── Optional.swift │ ├── OutputStream.swift │ ├── OverrideSelectionViewController.swift │ ├── PersistentDeviceLog+SimulatedCoreData.swift │ ├── Publisher.swift │ ├── PumpManagerError.swift │ ├── RangeReplaceableCollection.swift │ ├── SettingsStore+SimulatedCoreData.swift │ ├── StateColorPalette.swift │ ├── TempBasalRecommendation.swift │ ├── UIActivityIndicatorView.swift │ ├── UIAlertController.swift │ ├── UIDevice+Loop.swift │ ├── UIFont.swift │ ├── UIImage.swift │ ├── UITableViewCell.swift │ ├── UIViewController.swift │ ├── UserDefaults+Loop.swift │ └── UserNotifications+Loop.swift ├── Info.plist ├── Loop.entitlements ├── Managers │ ├── AlertMuter.swift │ ├── AlertPermissionsChecker.swift │ ├── Alerts │ │ ├── AlertManager.swift │ │ ├── AlertStore.swift │ │ ├── AlertStore.xcdatamodeld │ │ │ └── AlertStore.xcdatamodel │ │ │ │ └── contents │ │ ├── InAppModalAlertScheduler.swift │ │ ├── StoredAlert+CoreDataClass.swift │ │ ├── StoredAlert+CoreDataProperties.swift │ │ ├── StoredAlert.swift │ │ └── UserNotificationAlertScheduler.swift │ ├── AnalyticsServicesManager.swift │ ├── AppExpirationAlerter.swift │ ├── BluetoothStateManager.swift │ ├── CGMManager.swift │ ├── CGMStalenessMonitor.swift │ ├── CriticalEventLogExportManager.swift │ ├── DeeplinkManager.swift │ ├── DeliveryUncertaintyAlertManager.swift │ ├── DeviceDataManager.swift │ ├── DoseEnactor.swift │ ├── ExtensionDataManager.swift │ ├── LoggingServicesManager.swift │ ├── LoopAppManager.swift │ ├── LoopDataManager+CarbAbsorption.swift │ ├── LoopDataManager.swift │ ├── Missed Meal Detection │ │ ├── MealDetectionManager.swift │ │ └── MissedMealSettings.swift │ ├── NotificationManager.swift │ ├── OnboardingManager.swift │ ├── RemoteDataServicesManager.swift │ ├── ResetLoopManager.swift │ ├── Service.swift │ ├── ServicesManager.swift │ ├── SettingsManager.swift │ ├── SharedLogging.swift │ ├── SleepStore.swift │ ├── StatefulPluggable.swift │ ├── StatefulPluginManager.swift │ ├── StatusChartsManager.swift │ ├── Store Protocols │ │ ├── CarbStoreProtocol.swift │ │ ├── DoseStoreProtocol.swift │ │ ├── DosingDecisionStoreProtocol.swift │ │ ├── GlucoseStoreProtocol.swift │ │ └── LatestStoredSettingsProvider.swift │ ├── SupportManager.swift │ ├── TemporaryPresetsManager.swift │ ├── TestingScenariosManager.swift │ ├── TrustedTimeChecker.swift │ └── WatchDataManager.swift ├── Models │ ├── ApplicationFactorStrategy.swift │ ├── AutomaticDosingStatus.swift │ ├── AutomationHistoryEntry.swift │ ├── BolusDosingDecision.swift │ ├── ConstantApplicationFactorStrategy.swift │ ├── CrashRecoveryManager.swift │ ├── Deeplink.swift │ ├── GlucoseBasedApplicationFactorStrategy.swift │ ├── GlucoseDisplay.swift │ ├── GlucoseEffectVelocity.swift │ ├── LoopConstants.swift │ ├── LoopError.swift │ ├── LoopSettings+Loop.swift │ ├── LoopWarning.swift │ ├── ManualBolusRecommendation.swift │ ├── NetBasal.swift │ ├── PredictionInputEffect.swift │ ├── SelectablePreset.swift │ ├── SimpleBolusCalculator.swift │ ├── SimpleInsulinDose.swift │ ├── StoredDataAlgorithmInput.swift │ ├── StoredLoopNotRunningNotification.swift │ ├── WatchContext+LoopKit.swift │ └── ZipArchive.swift ├── Plugins │ └── PluginManager.swift ├── RemoteSettings-template.plist ├── View Controllers │ ├── CarbAbsorptionViewController.swift │ ├── CommandResponseViewController.swift │ ├── GlucoseThresholdTableViewController.swift │ ├── InsulinDeliveryTableViewController.swift │ ├── LoopChartsTableViewController.swift │ ├── PredictionTableViewController.swift │ ├── RootNavigationController.swift │ ├── StatusTableViewController.swift │ ├── TestingScenariosTableViewController.swift │ └── TextFieldTableViewController.swift ├── View Models │ ├── BolusEntryViewModel.swift │ ├── CarbEntryViewModel.swift │ ├── CriticalEventLogExportViewModel.swift │ ├── FavoriteFoodAddEditViewModel.swift │ ├── FavoriteFoodInsightsViewModel.swift │ ├── FavoriteFoodsViewModel.swift │ ├── ManualEntryDoseViewModel.swift │ ├── PresetsTrainingViewModel.swift │ ├── ServicesViewModel.swift │ ├── SettingsViewModel.swift │ ├── SimpleBolusViewModel.swift │ ├── StatusTableViewModel.swift │ └── VersionUpdateViewModel.swift ├── Views │ ├── AlertManagementView.swift │ ├── BolusEntryView.swift │ ├── BolusProgressTableViewCell.swift │ ├── BolusProgressTableViewCell.xib │ ├── CarbEntryTableViewCell.swift │ ├── CarbEntryView.swift │ ├── Charts │ │ ├── CarbEffectChartView.swift │ │ ├── DoseChartView.swift │ │ ├── GlucoseCarbChartView.swift │ │ ├── IOBChartView.swift │ │ ├── LoopChartView.swift │ │ └── PredictedGlucoseChartView.swift │ ├── CircleMaskView.swift │ ├── CriticalEventLogExportView.swift │ ├── DosingStrategySelectionView.swift │ ├── Favorite Foods │ │ ├── FavoriteFoodAddEditView.swift │ │ ├── FavoriteFoodDetailView.swift │ │ ├── FavoriteFoodInsightsCardView.swift │ │ ├── FavoriteFoodInsightsChartsView.swift │ │ ├── FavoriteFoodInsightsView.swift │ │ └── FavoriteFoodsView.swift │ ├── GlucoseBasedApplicationFactorSelectionView.swift │ ├── HUDViewTableViewCell.swift │ ├── HeaderValuesTableViewCell.swift │ ├── HowAbsorptionTimeWorksView.swift │ ├── HowCarbEffectsWorksView.swift │ ├── HowMuteAlertWorkView.swift │ ├── IOSFocusModesView.swift │ ├── IconTitleSubtitleTableViewCell.swift │ ├── IntegralRetrospectiveCorrectionSelectionView.swift │ ├── ManualEntryDoseView.swift │ ├── ManualGlucoseEntryRow.swift │ ├── NotificationsCriticalAlertPermissionsView.swift │ ├── OverrideBadgeView.swift │ ├── PotentialCarbEntryTableViewCell.swift │ ├── PredictionInputEffectTableViewCell.swift │ ├── PredictionSettingTableViewCell.swift │ ├── Presets │ │ ├── Components │ │ │ ├── AdjustedGlucoseRangeView.swift │ │ │ ├── CardSection.swift │ │ │ ├── CardSectionScrollView.swift │ │ │ ├── CorrectionRangePreview.swift │ │ │ ├── DayPickerPopup.swift │ │ │ ├── EditPresetDurationView.swift │ │ │ ├── ImpactView.swift │ │ │ ├── InsulinScaleAdjustView.swift │ │ │ ├── PercentPickerView.swift │ │ │ ├── PresetCard.swift │ │ │ ├── PresetDetentView.swift │ │ │ ├── PresetStatsView.swift │ │ │ ├── PresetsTrainingCard.swift │ │ │ ├── PresetsTrainingContentContainerView.swift │ │ │ ├── RepeatOptionsView.swift │ │ │ └── TherapySettingsExampleView.swift │ │ ├── CorrectionRangeInformationView.swift │ │ ├── CreatePresetNameAndScheduledEdit.swift │ │ ├── CreatePresetView.swift │ │ ├── DurationPickerView.swift │ │ ├── EditPresetRangeView.swift │ │ ├── EditPresetView.swift │ │ ├── ExistingPresetInsulinNeedsEdit.swift │ │ ├── ExistingPresetRangeEdit.swift │ │ ├── InsulinScaleInformationView.swift │ │ ├── NewCustomPreset.swift │ │ ├── NewPresetRangeEdit.swift │ │ ├── NoticeView.swift │ │ ├── PresetRangeEditor.swift │ │ ├── PresetsHistoryView.swift │ │ ├── PresetsTrainingView.swift │ │ ├── PresetsView.swift │ │ ├── ReviewNewPresetView.swift │ │ └── Training Content │ │ │ ├── CreatingYourOwnPresetsContentView.swift │ │ │ ├── HowTheyWorkContentView.swift │ │ │ ├── PresetsAndExerciseContentView.swift │ │ │ └── PresetsAndIllnessContentView.swift │ ├── SettingsView+algorithmExperimentsSection.swift │ ├── SettingsView.swift │ ├── SimpleBolusView.swift │ ├── StatusTableView.swift │ ├── TitleSubtitleTableViewCell.swift │ └── TitleSubtitleTextFieldTableViewCell.swift ├── ar.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── cs.lproj │ ├── Localizable.strings │ └── Main.strings ├── da.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── de.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── en.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── es.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── fi.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── fr.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── he.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── hi.lproj │ ├── Localizable.strings │ └── Main.strings ├── it.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ja.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── main.swift ├── nb.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── nl.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── pl.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── pt-BR.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ro.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ru.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── sk.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── sv.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── tr.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── vi.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings └── zh-Hans.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── LoopCore ├── HKUnit.swift ├── IdentifiableClass.swift ├── Info.plist ├── LocalizedString.swift ├── LoopCore.h ├── LoopCoreConstants.swift ├── LoopSettings.swift ├── MissedMealNotification.swift ├── NSUserDefaults.swift ├── PersistedProperty.swift ├── PersistenceController.swift ├── PotentialCarbEntryUserInfo.swift ├── ar.lproj │ └── Localizable.strings ├── da.lproj │ └── Localizable.strings ├── de.lproj │ └── Localizable.strings ├── en.lproj │ └── Localizable.strings ├── es.lproj │ └── Localizable.strings ├── fi.lproj │ └── Localizable.strings ├── fr.lproj │ └── Localizable.strings ├── he.lproj │ └── Localizable.strings ├── it.lproj │ └── Localizable.strings ├── ja.lproj │ └── Localizable.strings ├── nb.lproj │ └── Localizable.strings ├── nl.lproj │ └── Localizable.strings ├── pl.lproj │ └── Localizable.strings ├── pt-BR.lproj │ └── Localizable.strings ├── ro.lproj │ └── Localizable.strings ├── ru.lproj │ └── Localizable.strings ├── sk.lproj │ └── Localizable.strings ├── sv.lproj │ └── Localizable.strings ├── tr.lproj │ └── Localizable.strings └── vi.lproj │ └── Localizable.strings ├── LoopTests ├── CriticalEventLogTests.swift ├── DIYLoopUnitTestPlan.xctestplan ├── DiagnosticLogTests.swift ├── Fixtures │ ├── basal_profile.json │ ├── counteraction_effect_falling_glucose.json │ ├── dynamic_glucose_effect_partially_observed.json │ ├── insulin_effect.json │ ├── live_capture │ │ ├── live_capture_input.json │ │ └── live_capture_predicted_glucose.json │ ├── meal_detection │ │ ├── dynamic_autofill_counteraction_effect.json │ │ ├── long_interval_counteraction_effect.json │ │ ├── missed_meal_counteraction_effect.json │ │ ├── needs_clamping_counteraction_effect.json │ │ ├── noisy_cgm_counteraction_effect.json │ │ └── realistic_report_counteraction_effect.json │ ├── momentum_effect_bouncing.json │ ├── predicted_glucose_very_negative.json │ ├── predicted_glucose_without_retrospective.json │ └── retrospective_output.json ├── Info.plist ├── LoopTests.swift ├── Managers │ ├── Alerts │ │ ├── AlertManagerTests.swift │ │ ├── AlertMuterTests.swift │ │ ├── AlertStoreTests.swift │ │ ├── InAppModalAlertSchedulerTests.swift │ │ ├── StoredAlertTests.swift │ │ └── UserNotificationAlertSchedulerTests.swift │ ├── CGMStalenessMonitorTests.swift │ ├── CriticalEventLogExportManagerTests.swift │ ├── DeviceDataManagerTests.swift │ ├── DoseEnactorTests.swift │ ├── LoopDataManagerTests.swift │ ├── MealDetectionManagerTests.swift │ ├── SettingsManagerTests.swift │ ├── SupportManagerTests.swift │ ├── TemporaryPresetsManagerTests.swift │ └── ZipArchiveTests.swift ├── Mock Stores │ ├── HKHealthStoreMock.swift │ ├── MockCarbStore.swift │ ├── MockDoseStore.swift │ ├── MockDosingDecisionStore.swift │ ├── MockGlucoseStore.swift │ └── MockSettingsStore.swift ├── Mocks │ ├── AlertMocks.swift │ ├── LoopControlMock.swift │ ├── MockCGMManager.swift │ ├── MockDeliveryDelegate.swift │ ├── MockPumpManager.swift │ ├── MockSettingsProvider.swift │ ├── MockTrustedTimeChecker.swift │ ├── MockUploadEventListener.swift │ └── PersistenceController.swift ├── Models │ ├── AutomationHistoryEntryTests.swift │ ├── CarbBackfillRequestUserInfoTests.swift │ ├── SetBolusUserInfoTests.swift │ ├── SimpleBolusCalculatorTests.swift │ ├── TempBasalRecommendationTests.swift │ ├── TestLocalizedError.swift │ ├── WatchHistoricalCarbsTests.swift │ └── WatchHistoricalGlucoseTest.swift └── ViewModels │ ├── BolusEntryViewModelTests.swift │ ├── CGMStatusHUDViewModelTests.swift │ ├── ManualEntryDoseViewModelTests.swift │ └── SimpleBolusViewModelTests.swift ├── LoopUI ├── Base.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── Common │ └── LocalizedString.swift ├── Extensions │ ├── AuthenticationTableViewCell+NibLoadable.swift │ ├── Color.swift │ ├── Comparable.swift │ ├── DateFormatter.swift │ ├── DeviceLifecycleProgressState.swift │ ├── DeviceStatusHighlight.swift │ ├── DismissibleHostingController.swift │ ├── GlucoseRangeCategory.swift │ ├── GuidanceColors.swift │ ├── Image.swift │ ├── NibLoadable.swift │ └── UIColor.swift ├── HUDAssets.xcassets │ ├── Contents.json │ ├── battery │ │ ├── Contents.json │ │ ├── battery.imageset │ │ │ ├── Contents.json │ │ │ └── battery.pdf │ │ └── battery_mask.imageset │ │ │ ├── Contents.json │ │ │ └── battery_mask.pdf │ ├── reservoir │ │ ├── Contents.json │ │ ├── reservoir.imageset │ │ │ ├── Contents.json │ │ │ └── reservoir.pdf │ │ └── reservoir_mask.imageset │ │ │ ├── Contents.json │ │ │ └── reservoir_mask.pdf │ └── status-bar-symbols │ │ ├── Contents.json │ │ ├── bluetooth.disabled.symbolset │ │ ├── Contents.json │ │ └── bluetooth.disabled.svg │ │ └── drop.circle.fill.symbolset │ │ ├── Contents.json │ │ └── drop.circle.fill.svg ├── HUDView.xib ├── Info.plist ├── LoopUI.h ├── Models │ └── ChartLineModel.swift ├── StatusBarHUDView.xib ├── StatusHighlightHUDView.xib ├── ViewModel │ └── CGMStatusHUDViewModel.swift ├── Views │ ├── BasalRateHUDView.swift │ ├── CGMStatusHUDView.swift │ ├── DeviceStatusHUDView.swift │ ├── GlucoseHUDView.swift │ ├── GlucoseTrendHUDView.swift │ ├── GlucoseValueHUDView.swift │ ├── HUDView.swift │ ├── LoopCompletionHUDView.swift │ ├── LoopStateView.swift │ ├── PumpStatusHUDView.swift │ ├── StatusBadgeHUDView.swift │ ├── StatusBarHUDView.swift │ ├── StatusHighlightHUDView.swift │ └── TreatmentArrowStateView.swift ├── ar.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── cs.lproj │ └── Localizable.strings ├── da.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── de.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── en.lproj │ └── Localizable.strings ├── es.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── fi.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── fr.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── he.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── hi.lproj │ └── Localizable.strings ├── it.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ja.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── nb.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── nl.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── pl.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── pt-BR.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ro.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ru.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── sk.lproj │ └── Localizable.strings ├── sv.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── tr.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── vi.lproj │ ├── InfoPlist.strings │ └── Localizable.strings └── zh-Hans.lproj │ └── Localizable.strings ├── README.md ├── Scripts ├── apply-info-customizations.sh ├── build-derived-assets.sh ├── capture-build-details.sh ├── copy-plugins.sh ├── install-scenarios.sh └── make_scenario.py ├── Shortcuts ├── Cancel Override.shortcut ├── Loop Remote Overrides.shortcut └── Loop.shortcut ├── Version.xcconfig ├── WatchApp Extension ├── Assets.xcassets │ ├── Complication.complicationset │ │ ├── Circular.imageset │ │ │ ├── Contents.json │ │ │ ├── Icon-Complication-16x16@2x.png │ │ │ └── Icon-Complication-18x18@2x.png │ │ ├── Contents.json │ │ ├── Extra Large.imageset │ │ │ └── Contents.json │ │ ├── Graphic Bezel.imageset │ │ │ ├── Contents.json │ │ │ ├── Icon-AppleWatch-42x42@2x.png │ │ │ └── Icon-AppleWatch-47x47@2x.png │ │ ├── Graphic Circular.imageset │ │ │ ├── Contents.json │ │ │ ├── Icon-AppleWatch-42x42@2x.png │ │ │ └── Icon-AppleWatch-47x47@2x.png │ │ ├── Graphic Corner.imageset │ │ │ ├── Contents.json │ │ │ ├── Icon-Complication-20x20@2x.png │ │ │ └── Icon-Complication-22x22@2x.png │ │ ├── Graphic Extra Large.imageset │ │ │ └── Contents.json │ │ ├── Graphic Large Rectangular.imageset │ │ │ └── Contents.json │ │ ├── Modular.imageset │ │ │ ├── Contents.json │ │ │ ├── Icon-Complication-26x26@2x.png │ │ │ ├── Icon-Complication-29x29@2x.png │ │ │ └── Icon-Complication-32x32@2x.png │ │ └── Utilitarian.imageset │ │ │ ├── Contents.json │ │ │ ├── Icon-Complication-20x20@2x.png │ │ │ ├── Icon-Complication-22x22@2x.png │ │ │ └── Icon-Complication-25x25@2x.png │ ├── Contents.json │ └── separator.colorset │ │ └── Contents.json ├── Base.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── ComplicationController.swift ├── Controllers │ ├── ActionHUDController.swift │ ├── CarbAndBolusFlowController.swift │ ├── CarbEntryListController.swift │ ├── ChartHUDController.swift │ ├── HUDInterfaceController.swift │ ├── HUDRowController.swift │ ├── NotificationController.swift │ ├── OnOffSelectionController.swift │ ├── OverrideSelectionController.swift │ └── TextRowController.swift ├── ExtensionDelegate.swift ├── Extensions │ ├── ButtonGroup.swift │ ├── CGRect.swift │ ├── CLKComplicationTemplate.swift │ ├── CLKTextProvider+Compound.h │ ├── CLKTextProvider+Compound.m │ ├── Collection.swift │ ├── Date.swift │ ├── GlucoseCondition.swift │ ├── INRelevantShortcutStore+Loop.swift │ ├── NSUserDefaults+WatchApp.swift │ ├── UIColor.swift │ ├── WCSession.swift │ ├── WKAlertAction.swift │ ├── WKInterfaceImage.swift │ ├── WKInterfaceLabel.swift │ ├── WatchApp Extension-Bridging-Header.h │ └── WatchContext+WatchApp.swift ├── Info.plist ├── Managers │ ├── ComplicationChartManager.swift │ └── LoopDataManager.swift ├── Models │ ├── GlucoseChartData.swift │ ├── GlucoseChartScaler.swift │ └── OverridePresetRow.swift ├── PushNotificationPayload.apns ├── Scenes │ ├── GlucoseChartScene.swift │ └── GlucoseChartValueHashable.swift ├── View Models │ ├── CarbAndBolusFlowViewModel.swift │ └── OnOffSelectionViewModel.swift ├── Views │ ├── ActionButton.swift │ ├── Carb Entry & Bolus │ │ ├── AbsorptionTimeSelection.swift │ │ ├── BolusArrow.swift │ │ ├── BolusConfirmationView.swift │ │ ├── BolusConfirmationVisual.swift │ │ ├── BolusInput.swift │ │ ├── CarbAmountInput.swift │ │ ├── CarbAmountLabel.swift │ │ ├── CarbAndBolusFlow.swift │ │ ├── CarbAndDateInput.swift │ │ ├── DoseVolumeInput.swift │ │ ├── GramLabel.swift │ │ ├── Models │ │ │ ├── BolusPickerValues.swift │ │ │ └── CarbEntryInputMode.swift │ │ └── Preference Keys │ │ │ ├── CarbAmountPositionKey.swift │ │ │ └── GramLabelPositionKey.swift │ ├── Checkmark.swift │ ├── CircularAccessoryButtonStyle.swift │ ├── CompletionCheckmark.swift │ ├── Extensions │ │ ├── AnyTransition.swift │ │ ├── Color.swift │ │ ├── DigitalCrownRotation.swift │ │ ├── Environment+SizeClass.swift │ │ ├── PeriodicPublisher.swift │ │ └── UIFont.swift │ ├── OnOffSelectionView.swift │ ├── ScalablePositionedText.swift │ ├── TopDownTriangle.swift │ └── View+Position.swift ├── WatchApp Extension.entitlements ├── ar.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── cs.lproj │ └── Localizable.strings ├── da.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── de.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── en.lproj │ └── Localizable.strings ├── es.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── fi.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── fr.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── he.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── hi.lproj │ └── Localizable.strings ├── it.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── ja.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── nb.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── nl.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── pl.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── pt-BR.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── ro.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── ru.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── sk.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── sv.lproj │ ├── InfoPlist.strings │ └── Localizable.strings ├── tr.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── ckcomplication.strings ├── vi.lproj │ ├── InfoPlist.strings │ └── Localizable.strings └── zh-Hans.lproj │ └── Localizable.strings └── WatchApp ├── Base.lproj ├── InfoPlist.strings └── Interface.storyboard ├── DefaultAssets.xcassets ├── Contents.json ├── loop_closed │ ├── Contents.json │ ├── loop_aging_closed.imageset │ │ ├── Contents.json │ │ ├── loop-aging-closed@38mm.png │ │ └── loop-aging-closed@42mm.png │ ├── loop_fresh_closed.imageset │ │ ├── Contents.json │ │ ├── loop-fresh-closed@38mm.png │ │ └── loop-fresh-closed@42mm.png │ ├── loop_stale_closed.imageset │ │ ├── Contents.json │ │ ├── loop-stale-closed@38mm.png │ │ └── loop-stale-closed@42mm.png │ └── loop_unknown_closed.imageset │ │ ├── Contents.json │ │ ├── loop-unknown-closed@38mm.png │ │ └── loop-unknown-closed@42mm.png └── loop_open │ ├── Contents.json │ ├── loop_aging_open.imageset │ ├── Contents.json │ ├── loop-aging-open@38mm.png │ └── loop-aging-open@42mm.png │ ├── loop_fresh_open.imageset │ ├── Contents.json │ ├── loop-fresh-open@38mm.png │ └── loop-fresh-open@42mm.png │ ├── loop_stale_open.imageset │ ├── Contents.json │ ├── loop-stale-open@38mm.png │ └── loop-stale-open@42mm.png │ └── loop_unknown_open.imageset │ ├── Contents.json │ ├── loop-unknown-open@38mm.png │ └── loop-unknown-open@42mm.png ├── DerivedAssets.xcassets └── Contents.json ├── DerivedAssetsBase.xcassets ├── AppIcon.appiconset │ ├── Contents.json │ ├── Icon-App-Store-1024.png │ ├── Icon-AppleWatch-100x100@2x.png │ ├── Icon-AppleWatch-216x216@2x.png │ ├── Icon-AppleWatch-24x24@2x.png │ ├── Icon-AppleWatch-27.5x27.5@2x.png │ ├── Icon-AppleWatch-40x40@2x.png │ ├── Icon-AppleWatch-44x44@2x.png │ ├── Icon-AppleWatch-86x86@2x.png │ ├── Icon-AppleWatch-98x98@2x.png │ ├── Icon-AppleWatch-Companion-29x29@2x.png │ └── Icon-AppleWatch-Companion-29x29@3x.png ├── Contents.json ├── accent.colorset │ └── Contents.json ├── bolus.imageset │ ├── Bolus Icon 42mm.pdf │ ├── Bolus icon 38mm.png │ ├── Bolus.pdf │ └── Contents.json ├── carbs-dark.colorset │ └── Contents.json ├── carbs.colorset │ └── Contents.json ├── carbs.imageset │ ├── Carb Icon 42mm.pdf │ ├── Carbs icon 38mm.png │ ├── Contents.json │ └── Meal.pdf ├── glucose-dark.colorset │ └── Contents.json ├── glucose.colorset │ └── Contents.json ├── insulin-dark.colorset │ └── Contents.json ├── insulin-notification-background.colorset │ └── Contents.json ├── insulin.colorset │ └── Contents.json ├── pre-meal.imageset │ ├── Contents.json │ ├── Meal Soon Inactive.pdf │ ├── Pre-Meal 38mm.png │ └── Pre-Meal 42mm.pdf ├── tint.colorset │ └── Contents.json ├── warning.colorset │ └── Contents.json ├── workout-dark.colorset │ └── Contents.json ├── workout.colorset │ └── Contents.json └── workout.imageset │ ├── Contents.json │ ├── Workout 38mm.png │ ├── Workout 42mm.pdf │ └── Workout Inactive.pdf ├── Info.plist ├── ar.lproj ├── InfoPlist.strings └── Interface.strings ├── cs.lproj └── Interface.strings ├── da.lproj ├── InfoPlist.strings └── Interface.strings ├── de.lproj ├── InfoPlist.strings └── Interface.strings ├── en.lproj └── Interface.strings ├── es.lproj ├── InfoPlist.strings └── Interface.strings ├── fi.lproj ├── InfoPlist.strings └── Interface.strings ├── fr.lproj ├── InfoPlist.strings └── Interface.strings ├── he.lproj ├── InfoPlist.strings └── Interface.strings ├── hi.lproj └── Interface.strings ├── it.lproj ├── InfoPlist.strings └── Interface.strings ├── ja.lproj ├── InfoPlist.strings └── Interface.strings ├── nb.lproj ├── InfoPlist.strings └── Interface.strings ├── nl.lproj ├── InfoPlist.strings └── Interface.strings ├── pl.lproj ├── InfoPlist.strings └── Interface.strings ├── pt-BR.lproj ├── InfoPlist.strings └── Interface.strings ├── ro.lproj ├── InfoPlist.strings └── Interface.strings ├── ru.lproj ├── InfoPlist.strings └── Interface.strings ├── sk.lproj ├── InfoPlist.strings └── Interface.strings ├── sv.lproj ├── InfoPlist.strings └── Interface.strings ├── tr.lproj ├── InfoPlist.strings └── Interface.strings ├── vi.lproj ├── InfoPlist.strings └── Interface.strings └── zh-Hans.lproj └── Interface.strings /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /Common/Extensions/Comparable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Comparable.swift 3 | // Loop 4 | // 5 | // Created by Michael Pangburn on 3/27/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | extension Comparable { 10 | func clamped(to range: ClosedRange) -> Self { 11 | if self < range.lowerBound { 12 | return range.lowerBound 13 | } else if self > range.upperBound { 14 | return range.upperBound 15 | } else { 16 | return self 17 | } 18 | } 19 | 20 | mutating func clamp(to range: ClosedRange) { 21 | self = clamped(to: range) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /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 LoopAlgorithm 10 | 11 | 12 | extension GlucoseRangeSchedule { 13 | func minQuantity(at date: Date) -> LoopQuantity { 14 | return LoopQuantity(unit: unit, doubleValue: value(at: date).minValue) 15 | } 16 | func maxQuantity(at date: Date) -> LoopQuantity { 17 | return LoopQuantity(unit: unit, doubleValue: value(at: date).maxValue) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /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(watchOSApplicationExtension 5.0, *) 12 | extension NewCarbEntryIntent: IdentifiableClass { } 13 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Common/Models/CarbAbsorptionTime.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CarbAbsorptionTime.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 4/1/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | enum CarbAbsorptionTime: Int, CaseIterable { 10 | case fast = 0 11 | case medium 12 | case slow 13 | 14 | var emoji: String { 15 | switch self { 16 | case .fast: 17 | return "🍭" 18 | case .medium: 19 | return "🌮" 20 | case .slow: 21 | return "🍕" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /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 | 10 | "9KhaIS" = "I've set the preset"; 11 | "I4OZy8" = "Enable Override Preset"; 12 | "XNNmtH" = "Enable preset in Loop"; 13 | "ZZ3mtM" = "Enable an override preset in Loop"; 14 | "b085BW" = "I wasn't able to set the preset."; 15 | "lYMuWV" = "Override Name"; 16 | "nDKAmn" = "What's the name of the override you'd like to set?"; 17 | "oLQSsJ" = "Enable '${overrideName}' Override Preset"; 18 | "yBzwCL" = "Override Selection"; 19 | -------------------------------------------------------------------------------- /Common/hi.lproj/Intents.strings: -------------------------------------------------------------------------------- 1 | "80eo5o" = "Add Carb Entry"; 2 | 3 | "9KhaIS" = "I've set the preset"; 4 | 5 | "I4OZy8" = "Enable Override Preset"; 6 | 7 | "OcNxIj" = "Add Carb Entry"; 8 | 9 | "XNNmtH" = "Enable preset in Loop"; 10 | 11 | "ZZ3mtM" = "Enable an override preset in Loop"; 12 | 13 | "b085BW" = "I wasn't able to set the preset."; 14 | 15 | "lYMuWV" = "Override Name"; 16 | 17 | "nDKAmn" = "What's the name of the override you'd like to set?"; 18 | 19 | "oLQSsJ" = "Enable '${overrideName}' Override Preset"; 20 | 21 | "yBzwCL" = "Override Selection"; 22 | 23 | "yc02Yq" = "Add a carb entry to Loop"; 24 | 25 | -------------------------------------------------------------------------------- /Documentation/Assigning a bundle identifier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Assigning a bundle identifier.png -------------------------------------------------------------------------------- /Documentation/Changing the app icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Changing the app icon.png -------------------------------------------------------------------------------- /Documentation/Changing the display name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Changing the display name.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Phone Bolus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Phone Bolus.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Phone Graphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Phone Graphs.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Phone Notification Battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Phone Notification Battery.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Phone Notification Bolus Failure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Phone Notification Bolus Failure.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Phone Notification Loop Failure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Phone Notification Loop Failure.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Watch Bolus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Watch Bolus.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Watch Carb Entry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Watch Carb Entry.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Watch Complication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Watch Complication.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Watch Menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Watch Menu.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Watch Notification Battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Watch Notification Battery.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Watch Notification Bolus Failure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Watch Notification Bolus Failure.png -------------------------------------------------------------------------------- /Documentation/Screenshots/Watch Notification Reservoir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Screenshots/Watch Notification Reservoir.png -------------------------------------------------------------------------------- /Documentation/Testing/Images/mock_managers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Testing/Images/mock_managers.png -------------------------------------------------------------------------------- /Documentation/Testing/Images/rewind.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Testing/Images/rewind.png -------------------------------------------------------------------------------- /Documentation/Testing/Images/scenarios_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Testing/Images/scenarios_menu.png -------------------------------------------------------------------------------- /Documentation/Testing/Images/scenarios_url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/Testing/Images/scenarios_url.png -------------------------------------------------------------------------------- /Documentation/User Icons/LoopingPump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Documentation/User Icons/LoopingPump.png -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/ar.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "تعلم"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/da.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Lær"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Mad-data fra Health-databasen bruges til at bestemme blodsukkereffekten. Blodsukkerdata fra Health-databasen bruges til graftegning og momentumberegning. Søvndata fra sundhedsdatabasen bruges til at optimere leveringen af opdateringer om komplikationer af Apple Watch i den tid, du er vågen."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/da.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Lær"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Lerne"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Mahlzeitendaten aus der Health Datenbank werden verwendet, um die Glukoseeffekte zu bestimmen. Glukosedaten aus der Health Datenbank werden zur grafischen Darstellung und Impulsberechnung verwendet. Schlafdaten aus der Health-Datenbank werden verwendet, um die Bereitstellung von Apple Watch-Komplikationsupdates während Ihrer Wachzeit zu optimieren."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/de.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Lernen"; 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/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Aprender"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Los datos de alimentos de la base de datos de Salud se utilizan para determinar los efectos en el nivel de glucosa. Los datos de glucosa de la base de datos de Salud se utilizan para graficar y determinar cálculos de momento. Los datos de Sueño de la base de datos de Salud se utilizan para optimizar la entrega de actualizaciones de las complicaciones del Apple Watch durante el tiempo que está despierto."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/es.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Aprender"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/fi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Opettele"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "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."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/fi.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Learn"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Apprendre"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Les données sur les repas provenant de la base de données Santé sont utilisées pour déterminer les effets du glucose. Les données relatives au glucose provenant de la base de données Santé sont utilisées pour la création de graphiques et le calcul de l'élan. Les données relatives au sommeil provenant de la base de données Santé sont utilisées pour optimiser l'envoi des mises à jour des complications de l'Apple Watch pendant la période où vous êtes éveillé(e)."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/fr.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Apprendre"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/he.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Learn"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Impara"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "I dati sui pasti del database Salute vengono utilizzati per determinare gli effetti del glucosio. I dati sul glucosio del database Salute vengono utilizzati per la rappresentazione grafica e il calcolo del momento. I dati sul sonno del database Salute vengono utilizzati per ottimizzare la consegna degli aggiornamenti delle complicazioni di Apple Watch durante il periodo di veglia."; 6 | 7 | -------------------------------------------------------------------------------- /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/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Lære"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Måltidsdata fra helsedatabasen brukes til å bestemme glukoseeffekter. Glukosedata fra helsedatabasen brukes til grafer og momentumberegning. Søvndata fra helsedatabasen brukes til å optimalisere leveringen av Apple Watch-komplikasjonsoppdateringer når du er våken."; 6 | 7 | -------------------------------------------------------------------------------- /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/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Leer"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Maaltijdgegevens uit de database Gezondheid worden gebruikt om glucose-effecenten te bepalen. Glucosegegevens uit de database Gezondheid worden gebruikt voor grafieken en het berekenen van trendlijnen. Slaapgegevens uit de database Gezondheid worden gebruikt om de Apple Watch complicatie bij te werken wanneer je wakker bent."; 6 | 7 | -------------------------------------------------------------------------------- /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/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Learn"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Dane posiłków z bazy danych aplikacji Zdrowie służą do określania wpływu glukozy. Dane dotyczące glukozy z bazy danych aplikacji Zdrowie są wykorzystywane do tworzenia wykresów i wyznaczania trendu. Dane dotyczące snu z bazy danych aplikacji Zdrowie służą do optymalizacji dostarczania aktualizacji komplikacji Apple Watch w czasie, gdy nie śpisz."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/pl.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Learn"; 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/ro.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Learn"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Datele mesei din baza de date din aplicația Sănătate sunt folosite pentru a determina efectele glicemice. Datele despre glicemie din baza de date Sănătate sunt folosite pentru construirea graficelor și calcularea influențelor glicemice. Datele de somn din baza de date Sănătate sunt folosite pentru a optimiza livrarea de actualizări de datele ale ceasului Apple pe perioada când sunteți treaz."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/ro.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Learn"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/ru.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Узнать"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/ru.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Обучение"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/sk.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Health Share Usage Description */ 2 | "NSHealthShareUsageDescription" = "Údaje o jedle z databázy Health sa používajú na určenie účinkov glukózy. Údaje o glukóze z databázy Health sa používajú na vytváranie grafov a výpočet hybnosti. Údaje o spánku z databázy Health sa používajú na optimalizáciu doručovania aktualizácií komplikácií Apple Watch v čase, keď ste hore."; 3 | 4 | -------------------------------------------------------------------------------- /Learn/sv.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Learn"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Kolhydratdata från Apple Health-databasen används för att avgöra blodsockereffekt. Blodsockervärden från Apple Health-databasen används i diagram och för beräkning av förändring."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/sv.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Utbildning"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/tr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle name */ 2 | "CFBundleName" = "Öğren"; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "NSHealthShareUsageDescription" = "Sağlık veri tabanından alınan yemek verileri, glikoz etkilerini belirlemek için kullanılır. Sağlık veri tabanından alınan glikoz verileri, grafik ve momentum hesaplaması için kullanılır. Sağlık veritabanındaki uyku verileri, uyanık olduğunuz süre boyunca Apple Watch komplikasyon güncellemelerinin teslimini optimize etmek için kullanılır."; 6 | 7 | -------------------------------------------------------------------------------- /Learn/tr.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Öğren"; 3 | 4 | -------------------------------------------------------------------------------- /Learn/vi.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Learn"; ObjectID = "8hF-Ij-B7m"; */ 2 | "8hF-Ij-B7m.title" = "Learn"; 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 Intent Extension/IntentHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IntentHandler.swift 3 | // Loop Intent Extension 4 | // 5 | // Created by Anna Quinlan on 10/17/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Intents 10 | 11 | class IntentHandler: INExtension { 12 | override func handler(for intent: INIntent) -> Any { 13 | if intent is EnableOverridePresetIntent { 14 | return OverrideIntentHandler() 15 | } 16 | return self 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Loop Intent Extension/Loop Intent Extension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | $(APP_GROUP_IDENTIFIER) 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Loop Intent Extension/ar.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/da.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Intent-udvidelse"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Intent-udvidelse"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/da.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Absichts Erweiterung"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Absichts Erweiterung"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/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 | -------------------------------------------------------------------------------- /Loop Intent Extension/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Extensión de Intención de Loop"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Extensión de Intención de Loop"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/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 | -------------------------------------------------------------------------------- /Loop Intent Extension/fi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Intent Extension"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Intent Extension"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/fi.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Intent Extension"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Intent Extension"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/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 | -------------------------------------------------------------------------------- /Loop Intent Extension/he.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Intent Extension"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Intent Extension"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/he.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Estensione dell'intento di Loop"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Estensione dell'intento di Loop"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/it.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$@ contro %2$@"; 3 | 4 | -------------------------------------------------------------------------------- /Loop Intent Extension/ja.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/nb.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Utvidelse av Loop intensjon"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Utvidelse av Loop intensjon"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/nb.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/nl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Intent Extensie"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Intent Extensie"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/nl.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/pl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Intent Extension"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Intent Extension"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/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 | -------------------------------------------------------------------------------- /Loop Intent Extension/pt-BR.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/ro.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Extensie Intent Loop"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Extensie Intent Loop"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/ro.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/ru.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Intent Extension"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Intent Extension"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/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$@ версии %2$@"; 3 | 4 | -------------------------------------------------------------------------------- /Loop Intent Extension/sk.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/sv.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Intent Extension"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Loop Intent Extension"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/sv.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/tr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Döngü Amaç Uzantısı"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "Döngü Amaç Uzantısı"; 6 | 7 | -------------------------------------------------------------------------------- /Loop Intent Extension/tr.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 | -------------------------------------------------------------------------------- /Loop Intent Extension/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 | -------------------------------------------------------------------------------- /Loop Status Extension/Base.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleName" = "$(PRODUCT_NAME)"; 3 | 4 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/LoopWidgetExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | $(APP_GROUP_IDENTIFIER) 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/da.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 LoopKit Authors. All rights reserved."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 LoopKit-Autoren. Alle Rechte vorbehalten."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 Autores del LoopKit. Todos los derechos reservados."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 LoopKit Authors. Tous droits réservés."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 Autori di LoopKit. Tutti i diritti riservati."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/nb.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 LoopKit Authors. Alle rettigheter forbeholdt."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/nl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 LoopKit Auteurs. Alle rechten voorbehouden."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/pl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2023 Autorzy LoopKit. Wszelkie prawa zastrzeżone."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/ro.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 Autori LoopKit. Toate drepturile rezervate."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/ru.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Copyright © 2022 LoopKit Authors. Все права защищены."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/Bootstrap/tr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "Loop Widgets"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "LoopWidgetExtension"; 6 | 7 | /* Copyright (human-readable) */ 8 | "NSHumanReadableCopyright" = "Telif Hakkı © 2022 LoopKit Yazarları. Tüm hakları Saklıdır."; 9 | 10 | -------------------------------------------------------------------------------- /Loop Widget Extension/DefaultAssets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "bolus.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.imageset/bolus.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.imageset/bolus.pdf -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Meal.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.imageset/Meal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.imageset/Meal.pdf -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/fresh.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.392", 9 | "green" : "0.851", 10 | "red" : "0.298" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/insulin.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "ios", 6 | "reference" : "systemOrangeColor" 7 | }, 8 | "idiom" : "universal" 9 | } 10 | ], 11 | "info" : { 12 | "author" : "xcode", 13 | "version" : 1 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/premeal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Pre-Meal.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/premeal.imageset/Pre-Meal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop Widget Extension/DerivedAssetsBase.xcassets/premeal.imageset/Pre-Meal.pdf -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/workout.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "workout.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Loop Widget Extension/DerivedAssetsBase.xcassets/workout.imageset/workout.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop Widget Extension/DerivedAssetsBase.xcassets/workout.imageset/workout.pdf -------------------------------------------------------------------------------- /Loop Widget Extension/Helpers/Color.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Color.swift 3 | // Loop 4 | // 5 | // Created by Noah Brauner on 8/9/24. 6 | // Copyright © 2024 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | extension Color { 12 | static let widgetBackground = Color(.widgetBackground) 13 | static let widgetSecondaryBackground = Color(.widgetSecondaryBackground) 14 | static let staleGray = Color(.systemGray3) 15 | 16 | static let insulin = Color(.insulin) 17 | static let glucose = Color(.glucose) 18 | static let carbs = Color(.fresh) 19 | } 20 | -------------------------------------------------------------------------------- /Loop Widget Extension/Helpers/ContentMargin.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentMargin.swift 3 | // Loop Widget Extension 4 | // 5 | // Created by Cameron Ingham on 1/16/24. 6 | // Copyright © 2024 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import WidgetKit 11 | 12 | extension WidgetConfiguration { 13 | func contentMarginsDisabledIfAvailable() -> some WidgetConfiguration { 14 | if #available(iOSApplicationExtension 17.0, *) { 15 | return self.contentMarginsDisabled() 16 | } else { 17 | return self 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Loop Widget Extension/Helpers/Date.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Date.swift 3 | // Loop Widget Extension 4 | // 5 | // Created by Cameron Ingham on 6/26/23. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Date { 12 | static func - (lhs: Date, rhs: Date) -> TimeInterval { 13 | return lhs.timeIntervalSinceReferenceDate - rhs.timeIntervalSinceReferenceDate 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Loop Widget Extension/LoopWidgets.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoopWidgets.swift 3 | // Loop Widget Extension 4 | // 5 | // Created by Cameron Ingham on 6/26/23. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | @main 12 | struct LoopWidgets: WidgetBundle { 13 | @WidgetBundleBuilder 14 | var body: some Widget { 15 | SystemStatusWidget() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Loop.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Loop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Loop.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Loop/BuildDetails.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Favorite Foods Icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Favorite Foods Icon.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Favorite Foods Icon@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "Favorite Foods Icon@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Favorite Foods Icon.imageset/Favorite Foods Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Favorite Foods Icon.imageset/Favorite Foods Icon.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Favorite Foods Icon.imageset/Favorite Foods Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Favorite Foods Icon.imageset/Favorite Foods Icon@2x.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Favorite Foods Icon.imageset/Favorite Foods Icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Favorite Foods Icon.imageset/Favorite Foods Icon@3x.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Open Loop.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Open Loop.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Oval Selection.imageset/Oval Selection Dark.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Oval Selection.imageset/Oval Selection Dark.pdf -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Oval Selection.imageset/Oval Selection.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Oval Selection.imageset/Oval Selection.pdf -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Presets Icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Presets Icon.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Presets Icon@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "Presets Icon@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Presets Icon.imageset/Presets Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Presets Icon.imageset/Presets Icon.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Presets Icon.imageset/Presets Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Presets Icon.imageset/Presets Icon@2x.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Presets Icon.imageset/Presets Icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Presets Icon.imageset/Presets Icon@3x.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Therapy Icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Therapy Icon 1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Therapy Icon 2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "Therapy Icon 3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Therapy Icon.imageset/Therapy Icon 1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Therapy Icon.imageset/Therapy Icon 1x.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Therapy Icon.imageset/Therapy Icon 2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Therapy Icon.imageset/Therapy Icon 2x.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Therapy Icon.imageset/Therapy Icon 3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Therapy Icon.imageset/Therapy Icon 3x.png -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/Uploading.imageset/Uploading.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/Uploading.imageset/Uploading.pdf -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/drop.circle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "drop.circle.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/hardware.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "hardware.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/notification-permissions-on.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "notification-permissions-on.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/notification-permissions-on.imageset/notification-permissions-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DefaultAssets.xcassets/notification-permissions-on.imageset/notification-permissions-on.png -------------------------------------------------------------------------------- /Loop/DefaultAssets.xcassets/phone.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "phone.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Loop/DerivedAssets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/AppStore-1024pt@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/AppStore-1024pt@1x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-83.5@2x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Notification-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Notification-20.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Notification-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Notification-40.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Notification-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Notification-41.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Notification-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Notification-42.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small-60.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small-60@2x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small@2x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-Small@3x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.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/DerivedAssetsBase.xcassets/Pre-Meal Selected.imageset/Pre-Meal Selected.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/Pre-Meal Selected.imageset/Pre-Meal Selected.pdf -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/Pre-Meal-symbol.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "premeal.DIY.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.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/DerivedAssetsBase.xcassets/Pre-Meal.imageset/Pre-Meal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/Pre-Meal.imageset/Pre-Meal.pdf -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/accent.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "ios", 6 | "reference" : "systemBlueColor" 7 | }, 8 | "idiom" : "universal" 9 | } 10 | ], 11 | "info" : { 12 | "author" : "xcode", 13 | "version" : 1 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.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/DerivedAssetsBase.xcassets/bolus.imageset/bolus.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/bolus.imageset/bolus.pdf -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.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/DerivedAssetsBase.xcassets/carbs.imageset/Meal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/carbs.imageset/Meal.pdf -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/fresh.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "100", 9 | "green" : "217", 10 | "red" : "76" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/insulin.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "ios", 6 | "reference" : "systemOrangeColor" 7 | }, 8 | "idiom" : "universal" 9 | } 10 | ], 11 | "info" : { 12 | "author" : "xcode", 13 | "version" : 1 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/presets-selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Temp Presets.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/presets-selected.imageset/Temp Presets.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/presets-selected.imageset/Temp Presets.pdf -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/presets.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Temp Presets-2.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/presets.imageset/Temp Presets-2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/presets.imageset/Temp Presets-2.pdf -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/settings.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "settings@3x.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/settings.imageset/settings@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/settings.imageset/settings@3x.png -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.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/DerivedAssetsBase.xcassets/workout-selected.imageset/workout-selected.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/workout-selected.imageset/workout-selected.pdf -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.xcassets/workout-symbol.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "heart.pulse.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /Loop/DerivedAssetsBase.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/DerivedAssetsBase.xcassets/workout.imageset/workout.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Loop/DerivedAssetsBase.xcassets/workout.imageset/workout.pdf -------------------------------------------------------------------------------- /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/Character+IsEmoji.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Character+IsEmoji.swift 3 | // Loop 4 | // 5 | // Created by Noah Brauner on 8/6/24. 6 | // Copyright © 2024 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Character { 12 | public var isEmoji: Bool { 13 | unicodeScalars.contains(where: { $0.properties.isEmoji }) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /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 | import LoopKitUI 11 | 12 | 13 | extension ChartColorPalette { 14 | static var primary: ChartColorPalette { 15 | return ChartColorPalette(axisLine: .axisLineColor, axisLabel: .axisLabelColor, grid: .gridColor, presetTint: .presets, glucoseTint: .glucoseTintColor, insulinTint: .insulinTintColor, carbTint: .carbTintColor) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /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 | extension ChartSettings { 11 | static var `default`: ChartSettings { 12 | var settings = ChartSettings() 13 | settings.top = 12 14 | settings.bottom = 0 15 | settings.trailing = 8 16 | settings.axisTitleLabelsToLabelsSpacing = 0 17 | settings.labelsToAxisSpacingX = 6 18 | settings.clipInnerFrame = false 19 | return settings 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /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/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 || targetEnvironment(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 | -------------------------------------------------------------------------------- /Loop/Extensions/DiagnosticLog+Subsystem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DiagnosticLog+Subsystem.swift 3 | // Loop 4 | // 5 | // Created by Darin Krauss on 6/12/19. 6 | // Copyright © 2019 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKit 10 | 11 | extension DiagnosticLog { 12 | 13 | convenience init(category: String) { 14 | self.init(subsystem: "com.loopkit.Loop", category: category) 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Loop/Extensions/Dictionary.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Dictionary.swift 3 | // Loop 4 | // 5 | // Created by Michael Pangburn on 7/7/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | extension Dictionary { 10 | func compactMapValuesWithKeys(_ transform: (Element) throws -> NewValue?) rethrows -> [Key: NewValue] { 11 | try reduce(into: [:]) { result, element in 12 | if let newValue = try transform(element) { 13 | result[element.key] = newValue 14 | } 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Loop/Extensions/EditMode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditMode.swift 3 | // Loop 4 | // 5 | // Created by Noah Brauner on 7/13/23. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | extension EditMode { 12 | var title: String { 13 | self == .active ? "Done" : "Edit" 14 | } 15 | 16 | mutating func toggle() { 17 | self = self == .active ? .inactive : .active 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Loop/Extensions/Environment+SettingsManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Environment+SettingsProvider.swift 3 | // Loop 4 | // 5 | // Created by Pete Schwamb on 3/19/25. 6 | // Copyright © 2025 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import LoopKit 11 | import LoopAlgorithm 12 | 13 | 14 | @MainActor 15 | private struct SettingsManagerKey: @preconcurrency EnvironmentKey { 16 | static let defaultValue: SettingsManager = SettingsManager.placeholder 17 | } 18 | 19 | extension EnvironmentValues { 20 | var settingsManager: SettingsManager { 21 | get { self[SettingsManagerKey.self] } 22 | set { self[SettingsManagerKey.self] = newValue } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Loop/Extensions/Environment+TemporaryPresetsManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Environment+TemporaryPresetManager.swift 3 | // Loop 4 | // 5 | // Created by Pete Schwamb on 3/19/25. 6 | // Copyright © 2025 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import LoopKit 11 | 12 | @MainActor 13 | private struct TemporaryPresetsManagerKey: @preconcurrency EnvironmentKey { 14 | // Default value should never really be used 15 | static let defaultValue: TemporaryPresetsManager = TemporaryPresetsManager.placeholder 16 | } 17 | 18 | extension EnvironmentValues { 19 | var temporaryPresetsManager: TemporaryPresetsManager { 20 | get { self[TemporaryPresetsManagerKey.self] } 21 | set { self[TemporaryPresetsManagerKey.self] = newValue } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Loop/Extensions/Image+Optional.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Image+Optional.swift 3 | // Loop 4 | // 5 | // Created by Cameron Ingham on 1/7/25. 6 | // Copyright © 2025 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | // Since this `Image` initializer provides a view even if the asset is not found in the bundle, it can double the spacing between adjacent elements in a `VStack`, `HStack`, etc. 12 | extension Image { 13 | init?(_ name: String, bundle: Bundle? = nil) { 14 | if let _ = UIImage(named: name, in: bundle, with: nil) { 15 | self = Image(name, bundle: bundle) 16 | } else { 17 | return nil 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Loop/Extensions/LoopUIColorPalette+Default.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoopUIColorPalette+Default.swift 3 | // LoopUI 4 | // 5 | // Created by Darin Krauss on 1/14/21. 6 | // Copyright © 2021 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKitUI 10 | 11 | extension LoopUIColorPalette { 12 | public static var `default`: LoopUIColorPalette { 13 | return LoopUIColorPalette(guidanceColors: .default, 14 | carbTintColor: .carbTintColor, 15 | glucoseTintColor: .glucoseTintColor, 16 | insulinTintColor: .insulinTintColor, 17 | loopStatusColorPalette: .loopStatus, 18 | chartColorPalette: .primary) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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/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 | return .medium 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /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/Managers/Service.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Service.swift 3 | // Loop 4 | // 5 | // Created by Darin Krauss on 5/17/19. 6 | // Copyright © 2019 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKit 10 | import LoopKitUI 11 | import MockKit 12 | 13 | let staticServices: [Service.Type] = [MockService.self] 14 | 15 | let staticServicesByIdentifier: [String: Service.Type] = [ 16 | MockService.serviceIdentifier: MockService.self 17 | ] 18 | 19 | var availableStaticServices: [ServiceDescriptor] { 20 | if FeatureFlags.allowSimulators { 21 | return [ 22 | ServiceDescriptor(identifier: MockService.serviceIdentifier, localizedTitle: MockService.localizedTitle) 23 | ] 24 | } else { 25 | return [] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Loop/Managers/SharedLogging.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SharedLogging.swift 3 | // Loop 4 | // 5 | // Created by Bill Gestrich on 5/21/22. 6 | // Copyright © 2022 LoopKit Authors. All rights reserved. 7 | // 8 | import LoopKit 9 | 10 | public class SharedLogging { 11 | 12 | /// A shared, global instance of Logging. 13 | public static var instance: Logging? 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Loop/Managers/StatefulPluggable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StatefulPluggable.swift 3 | // Loop 4 | // 5 | // Created by Nathaniel Hamming on 2023-09-13. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKit 10 | 11 | extension StatefulPluggable { 12 | typealias RawValue = [String: Any] 13 | 14 | var rawValue: RawValue { 15 | return [ 16 | "statefulPluginIdentifier": pluginIdentifier, 17 | "state": rawState 18 | ] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Loop/Managers/Store Protocols/DoseStoreProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DoseStoreProtocol.swift 3 | // Loop 4 | // 5 | // Created by Anna Quinlan on 8/17/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKit 10 | import HealthKit 11 | import LoopAlgorithm 12 | 13 | protocol DoseStoreProtocol: AnyObject { 14 | func getNormalizedDoseEntries(start: Date, end: Date?) async throws -> [DoseEntry] 15 | 16 | func addDoses(_ doses: [DoseEntry], from device: HKDevice?) async throws 17 | 18 | var lastReservoirValue: ReservoirValue? { get } 19 | 20 | var lastAddedPumpData: Date { get } 21 | } 22 | 23 | extension DoseStore: DoseStoreProtocol {} 24 | -------------------------------------------------------------------------------- /Loop/Managers/Store Protocols/GlucoseStoreProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GlucoseStoreProtocol.swift 3 | // Loop 4 | // 5 | // Created by Anna Quinlan on 8/17/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKit 10 | import LoopAlgorithm 11 | 12 | protocol GlucoseStoreProtocol: AnyObject { 13 | var latestGlucose: GlucoseSampleValue? { get } 14 | func getGlucoseSamples(start: Date?, end: Date?) async throws -> [StoredGlucoseSample] 15 | func addGlucoseSamples(_ samples: [NewGlucoseSample]) async throws -> [StoredGlucoseSample] 16 | } 17 | 18 | extension GlucoseStore: GlucoseStoreProtocol { } 19 | -------------------------------------------------------------------------------- /Loop/Managers/Store Protocols/LatestStoredSettingsProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LatestStoredSettingsProvider.swift 3 | // Loop 4 | // 5 | // Created by Anna Quinlan on 8/19/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKit 10 | 11 | protocol LatestStoredSettingsProvider: AnyObject { 12 | var settings: StoredSettings { get } 13 | } 14 | 15 | extension SettingsManager: LatestStoredSettingsProvider { } 16 | -------------------------------------------------------------------------------- /Loop/Models/ApplicationFactorStrategy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ApplicationFactorStrategy.swift 3 | // Loop 4 | // 5 | // Created by Jonas Björkert on 2023-06-03. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import LoopAlgorithm 11 | import LoopKit 12 | import LoopCore 13 | 14 | protocol ApplicationFactorStrategy { 15 | func calculateDosingFactor( 16 | for glucose: LoopQuantity, 17 | correctionRange: ClosedRange 18 | ) -> Double 19 | } 20 | -------------------------------------------------------------------------------- /Loop/Models/AutomaticDosingStatus.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AutomaticDosingStatus.swift 3 | // Loop 4 | // 5 | // Created by Nathaniel Hamming on 2021-05-28. 6 | // Copyright © 2021 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | @Observable 12 | public class AutomaticDosingStatus { 13 | public var automaticDosingEnabled: Bool 14 | public var isAutomaticDosingAllowed: Bool 15 | 16 | public init(automaticDosingEnabled: Bool, 17 | isAutomaticDosingAllowed: Bool) 18 | { 19 | self.automaticDosingEnabled = automaticDosingEnabled 20 | self.isAutomaticDosingAllowed = isAutomaticDosingAllowed 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Loop/Models/ConstantApplicationFactorStrategy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConstantDosingStrategy.swift 3 | // Loop 4 | // 5 | // Created by Jonas Björkert on 2023-06-03. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import LoopKit 11 | import LoopCore 12 | import LoopAlgorithm 13 | 14 | struct ConstantApplicationFactorStrategy: ApplicationFactorStrategy { 15 | func calculateDosingFactor( 16 | for glucose: LoopQuantity, 17 | correctionRange: ClosedRange 18 | ) -> Double { 19 | // The original strategy uses a constant dosing factor. 20 | return LoopAlgorithm.defaultBolusPartialApplicationFactor 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Loop/Models/Deeplink.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Deeplink.swift 3 | // Loop 4 | // 5 | // Created by Noah Brauner on 8/9/24. 6 | // Copyright © 2024 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | enum Deeplink: String, CaseIterable { 12 | case carbEntry = "carb-entry" 13 | case bolus = "manual-bolus" 14 | case preMeal = "pre-meal-preset" 15 | case customPresets = "custom-presets" 16 | 17 | init?(url: URL?) { 18 | guard let url, let host = url.host, let deeplink = Deeplink.allCases.first(where: { $0.rawValue == host }) else { 19 | return nil 20 | } 21 | 22 | self = deeplink 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /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 !LoopConstants.retrospectiveCorrectionEnabled { 16 | inputs.remove(.retrospection) 17 | } 18 | return inputs 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Loop/Models/StoredLoopNotRunningNotification.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoredLoopNotRunningNotification.swift 3 | // LoopCore 4 | // 5 | // Created by Pete Schwamb on 5/5/22. 6 | // Copyright © 2022 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct StoredLoopNotRunningNotification: Codable { 12 | var alertAt: Date 13 | var title: String 14 | var body: String 15 | var isCritical: Bool 16 | } 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 LoopKit 11 | import LoopAlgorithm 12 | 13 | extension WatchContext { 14 | convenience init(glucose: GlucoseSampleValue?, glucoseUnit: LoopUnit?) { 15 | self.init() 16 | 17 | self.glucose = glucose?.quantity 18 | self.glucoseCondition = glucose?.condition 19 | self.glucoseDate = glucose?.startDate 20 | self.glucoseIsDisplayOnly = glucose?.isDisplayOnly 21 | self.glucoseWasUserEntered = glucose?.wasUserEntered 22 | self.displayGlucoseUnit = glucoseUnit 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Loop/RemoteSettings-template.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /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 | 11 | 12 | /// Convenience static constructors used to contain common configuration 13 | extension TextFieldTableViewController { 14 | typealias T = TextFieldTableViewController 15 | 16 | private static let valueNumberFormatter: NumberFormatter = { 17 | let formatter = NumberFormatter() 18 | 19 | formatter.numberStyle = .decimal 20 | formatter.minimumFractionDigits = 0 21 | formatter.maximumFractionDigits = 2 22 | 23 | return formatter 24 | }() 25 | } 26 | -------------------------------------------------------------------------------- /Loop/Views/Charts/DoseChartView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DoseChartView.swift 3 | // Loop 4 | // 5 | // Created by Noah Brauner on 7/22/24. 6 | // Copyright © 2024 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import LoopKit 11 | import LoopKitUI 12 | import LoopAlgorithm 13 | 14 | struct DoseChartView: View { 15 | let chartManager: ChartsManager 16 | var doses: [BasalRelativeDose] 17 | var dateInterval: DateInterval 18 | 19 | @Binding var isInteractingWithChart: Bool 20 | 21 | var body: some View { 22 | LoopChartView(chartManager: chartManager, dateInterval: dateInterval, isInteractingWithChart: $isInteractingWithChart) { doseChart in 23 | doseChart.doseEntries = doses 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Loop/Views/Charts/IOBChartView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IOBChartView.swift 3 | // Loop 4 | // 5 | // Created by Noah Brauner on 7/22/24. 6 | // Copyright © 2024 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import LoopKit 11 | import LoopKitUI 12 | import LoopAlgorithm 13 | 14 | struct IOBChartView: View { 15 | let chartManager: ChartsManager 16 | var iobValues: [InsulinValue] 17 | var dateInterval: DateInterval 18 | 19 | @Binding var isInteractingWithChart: Bool 20 | 21 | var body: some View { 22 | LoopChartView(chartManager: chartManager, dateInterval: dateInterval, isInteractingWithChart: $isInteractingWithChart) { iobChart in 23 | iobChart.setIOBValues(iobValues) 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /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/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: StatusBarHUDView! 14 | 15 | } 16 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/cs.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UINavigationItem"; title = "Status"; ObjectID = "3kU-n2-fha"; */ 2 | "3kU-n2-fha.title" = "Status"; 3 | 4 | /* Class = "UILabel"; text = "Glucose"; ObjectID = "tuw-av-A3x"; */ 5 | "tuw-av-A3x.text" = "Glukóza"; 6 | 7 | -------------------------------------------------------------------------------- /Loop/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Face ID Usage Description */ 2 | "NSFaceIDUsageDescription" = "Face ID is used to authenticate insulin bolus."; 3 | 4 | /* Privacy - Health Share Usage Description */ 5 | "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 optimize delivery of Apple Watch complication updates during the time you are awake."; 6 | 7 | -------------------------------------------------------------------------------- /Loop/en.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UILabel"; text = "g Active Carbs"; ObjectID = "SQx-au-ZcM"; */ 2 | "SQx-au-ZcM.text" = "g Active Carbs"; 3 | 4 | -------------------------------------------------------------------------------- /Loop/hi.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* No glucose value representation (3 dashes for mg/dL) */ 2 | "– – –" = "– – –"; 3 | 4 | /* The title of the nightscout API secret credential */ 5 | "API Secret" = "एपीआई पास्वर्ड"; 6 | 7 | /* The title of the cancel action in an action sheet */ 8 | "Cancel" = "निरस्त"; 9 | 10 | /* Default alert dismissal */ 11 | "Continue" = "जारी"; 12 | 13 | /* The title of the glucose and prediction graph */ 14 | "Glucose" = "शुगर"; 15 | 16 | -------------------------------------------------------------------------------- /Loop/hi.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "UILabel"; text = "Glucose"; ObjectID = "tuw-av-A3x"; */ 2 | "tuw-av-A3x.text" = "शुगर"; 3 | 4 | -------------------------------------------------------------------------------- /Loop/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // Loop 4 | // 5 | // Created by Rick Pasetto on 10/27/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | #if FORCE_ENGLISH 12 | UserDefaults.standard.set(["en"], forKey: "AppleLanguages") 13 | UserDefaults.standard.synchronize() 14 | #endif 15 | 16 | UIApplicationMain( 17 | CommandLine.argc, 18 | CommandLine.unsafeArgv, 19 | NSStringFromClass(UIApplication.self), 20 | NSStringFromClass(AppDelegate.self) 21 | ) 22 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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: AnyObject { 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/LocalizedString.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LocalizedString.swift 3 | // Loop 4 | // 5 | // Created by Pete Schwamb on 1/29/23. 6 | // Copyright © 2023 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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /LoopCore/MissedMealNotification.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MissedMealNotification.swift 3 | // Loop 4 | // 5 | // Created by Anna Quinlan on 11/18/22. 6 | // Copyright © 2022 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Information about a missed meal notification 12 | public struct MissedMealNotification: Equatable, Codable { 13 | public let deliveryTime: Date 14 | public let carbAmount: Double 15 | 16 | public init(deliveryTime: Date, carbAmount: Double) { 17 | self.deliveryTime = deliveryTime 18 | self.carbAmount = carbAmount 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LoopCore/ar.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 | -------------------------------------------------------------------------------- /LoopCore/da.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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Automatisk bolus"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Kun midlertidig basal"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Automatischer Bolus"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Nur temporäre Basalrate"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Automatic Bolus"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Temp Basal Only"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Bolo automático"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Solo basal temporal"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/fi.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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Automaattinen bolus"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Vain tilapäinen basaali"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Bolus Automatique"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Basal temporaire uniquement"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/he.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 | -------------------------------------------------------------------------------- /LoopCore/it.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$@ contro %2$@"; 3 | 4 | /* Title string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Bolo Automatico"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Solo basale temporanea"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/ja.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 | -------------------------------------------------------------------------------- /LoopCore/nb.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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Automatisk bolus"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Kun midlertidig basal"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/nl.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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Automatisch Bolussen"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Alleen Tijdelijk Basaal"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Automatyczny bolus"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Tymczasowa dawka podstawowa"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/pt-BR.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 | -------------------------------------------------------------------------------- /LoopCore/ro.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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Bolus automat"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Doar bazală temporară"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/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$@ версии %2$@"; 3 | 4 | /* Title string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Автоматические болюсы"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Только ВБС (без автоболюсов)"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/sk.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 | -------------------------------------------------------------------------------- /LoopCore/sv.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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Automatisk bolus"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Endast temporär basal"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/tr.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 string for automatic bolus dosing strategy */ 5 | "Automatic Bolus" = "Otomatik Bolus"; 6 | 7 | /* Title string for temp basal only dosing strategy */ 8 | "Temp Basal Only" = "Sadece Geçici Bazal"; 9 | 10 | -------------------------------------------------------------------------------- /LoopCore/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 | -------------------------------------------------------------------------------- /LoopTests/Fixtures/basal_profile.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "i": 0, 4 | "start": "00:00:00", 5 | "rate": 1, 6 | "minutes": 0 7 | }, 8 | { 9 | "i": 1, 10 | "start": "15:00:00", 11 | "rate": 0.85, 12 | "minutes": 900 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /LoopTests/Fixtures/counteraction_effect_falling_glucose.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "value" : -4.5999999999999988, 4 | "startDate" : "2015-10-25T19:15:00", 5 | "unit" : "mg\/min·dL", 6 | "endDate" : "2015-10-25T19:20:00" 7 | }, 8 | { 9 | "value" : -2.5999999999999996, 10 | "startDate" : "2015-10-25T19:20:00", 11 | "unit" : "mg\/min·dL", 12 | "endDate" : "2015-10-25T19:25:00" 13 | }, 14 | { 15 | "value" : -0.59999999999999998, 16 | "startDate" : "2015-10-25T19:25:00", 17 | "unit" : "mg\/min·dL", 18 | "endDate" : "2015-10-25T19:30:00" 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /LoopTests/Fixtures/meal_detection/long_interval_counteraction_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "startDate": "2022-10-17T01:06:47", 4 | "endDate": "2022-10-17T02:49:16", 5 | "unit": "mg\/min·dL", 6 | "value": 1.0556978820387204 7 | }, 8 | { 9 | "startDate": "2022-10-17T02:49:16", 10 | "endDate": "2022-10-17T02:57:50", 11 | "unit": "mg\/min·dL", 12 | "value": 2.0566560442527893 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /LoopTests/Fixtures/meal_detection/needs_clamping_counteraction_effect.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "startDate": "2022-10-16T01:06:47", 4 | "endDate": "2022-10-17T02:49:16", 5 | "unit": "mg\/min·dL", 6 | "value": 0.5556978820387204 7 | }, 8 | { 9 | "startDate": "2022-10-17T02:49:16", 10 | "endDate": "2022-10-20T02:57:50", 11 | "unit": "mg\/min·dL", 12 | "value": 0.0566560442527893 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /LoopTests/Mock Stores/MockSettingsStore.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MockSettingsStore.swift 3 | // LoopTests 4 | // 5 | // Created by Anna Quinlan on 8/19/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKit 10 | @testable import Loop 11 | 12 | class MockLatestStoredSettingsProvider: LatestStoredSettingsProvider { 13 | var settings: StoredSettings { StoredSettings() } 14 | func storeSettings(_ settings: StoredSettings, completion: @escaping () -> Void) { 15 | completion() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LoopTests/Mocks/MockTrustedTimeChecker.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MockTrustedTimeChecker.swift 3 | // LoopTests 4 | // 5 | // Created by Pete Schwamb on 11/1/23. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | @testable import Loop 11 | 12 | class MockTrustedTimeChecker: TrustedTimeChecker { 13 | var detectedSystemTimeOffset: TimeInterval = 0 14 | } 15 | -------------------------------------------------------------------------------- /LoopTests/Mocks/MockUploadEventListener.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MockUploadEventListener.swift 3 | // LoopTests 4 | // 5 | // Created by Pete Schwamb on 11/30/23. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | @testable import Loop 11 | 12 | class MockUploadEventListener: UploadEventListener { 13 | var lastUploadTriggeringType: RemoteDataType? 14 | func triggerUpload(for triggeringType: RemoteDataType) { 15 | self.lastUploadTriggeringType = triggeringType 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LoopTests/Mocks/PersistenceController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PersistenceController.swift 3 | // LoopTests 4 | // 5 | // Created by Pete Schwamb on 10/31/23. 6 | // Copyright © 2023 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import LoopKit 11 | 12 | extension PersistenceController { 13 | static func mock() -> PersistenceController { 14 | return PersistenceController(directoryURL: URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent(UUID().uuidString, isDirectory: true)) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LoopUI/Base.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /LoopUI/Extensions/AuthenticationTableViewCell+NibLoadable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AuthenticationTableViewCell+NibLoadable.swift 3 | // LoopUI 4 | // 5 | // Created by Darin Krauss on 6/18/19. 6 | // Copyright © 2019 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKitUI 10 | 11 | 12 | /// Allow AuthenticationTableViewCell to be loaded from nib 13 | extension AuthenticationTableViewCell: NibLoadable { } 14 | -------------------------------------------------------------------------------- /LoopUI/Extensions/Comparable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Comparable.swift 3 | // LoopKit 4 | // 5 | // Created by Michael Pangburn on 11/20/18. 6 | // Copyright © 2018 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | extension Comparable { 10 | func clamped(to range: ClosedRange) -> Self { 11 | if self < range.lowerBound { 12 | return range.lowerBound 13 | } else if self > range.upperBound { 14 | return range.upperBound 15 | } else { 16 | return self 17 | } 18 | } 19 | 20 | mutating func clamp(to range: ClosedRange) { 21 | self = clamped(to: range) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /LoopUI/Extensions/DeviceLifecycleProgressState.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeviceLifecycleProgressState.swift 3 | // LoopUI 4 | // 5 | // Created by Nathaniel Hamming on 2020-07-28. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKit 10 | import SwiftUI 11 | 12 | extension DeviceLifecycleProgressState { 13 | public var color: UIColor { 14 | switch self { 15 | case .critical: 16 | return .critical 17 | case .dimmed: 18 | return UIColor(Color.secondary) 19 | case .normalCGM: 20 | return .glucose 21 | case .normalPump: 22 | return .insulin 23 | case .warning: 24 | return .warning 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LoopUI/Extensions/GuidanceColors.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GuidanceColors.swift 3 | // LoopUI 4 | // 5 | // Created by Nathaniel Hamming on 2020-08-04. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import LoopKitUI 10 | 11 | extension GuidanceColors { 12 | public static var `default`: GuidanceColors { 13 | return GuidanceColors(acceptable: .primary, warning: .warning, critical: .critical) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LoopUI/Extensions/Image.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Image.swift 3 | // LoopUI 4 | // 5 | // Created by Rick Pasetto on 6/25/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | private class FrameworkBundle { 12 | static let main = Bundle(for: FrameworkBundle.self) 13 | } 14 | 15 | extension Image { 16 | init(frameworkImage name: String, decorative: Bool = false) { 17 | if decorative { 18 | self.init(decorative: name, bundle: FrameworkBundle.main) 19 | } else { 20 | self.init(name, bundle: FrameworkBundle.main) 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/battery/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/battery/battery.imageset/battery.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/LoopUI/HUDAssets.xcassets/battery/battery.imageset/battery.pdf -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/battery/battery_mask.imageset/battery_mask.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/LoopUI/HUDAssets.xcassets/battery/battery_mask.imageset/battery_mask.pdf -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/reservoir/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/reservoir/reservoir.imageset/reservoir.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/LoopUI/HUDAssets.xcassets/reservoir/reservoir.imageset/reservoir.pdf -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/reservoir/reservoir_mask.imageset/reservoir_mask.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/LoopUI/HUDAssets.xcassets/reservoir/reservoir_mask.imageset/reservoir_mask.pdf -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/status-bar-symbols/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/status-bar-symbols/bluetooth.disabled.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "bluetooth.disabled.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /LoopUI/HUDAssets.xcassets/status-bar-symbols/drop.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "drop.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /LoopUI/Views/StatusBadgeHUDView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StatusBadgeHUDView.swift 3 | // LoopUI 4 | // 5 | // Created by Nathaniel Hamming on 2021-02-11. 6 | // Copyright © 2021 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public final class StatusBadgeHUDView: UIView { 12 | 13 | @IBOutlet private weak var badgeIcon: UIImageView! { 14 | didSet { 15 | // badge common (default) color is warning 16 | badgeIcon.tintColor = .warning 17 | } 18 | } 19 | 20 | public func setBadgeIcon(_ icon: UIImage?) { 21 | badgeIcon.image = icon 22 | } 23 | 24 | override public func tintColorDidChange() { 25 | badgeIcon.tintColor = self.tintColor 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LoopUI/ar.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/cs.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* No glucose value representation (3 dashes for mg/dL) */ 2 | "– – –" = "– – –"; 3 | 4 | -------------------------------------------------------------------------------- /LoopUI/da.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/fi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/he.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/hi.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* No glucose value representation (3 dashes for mg/dL) */ 2 | "– – –" = "– – –"; 3 | 4 | /* String displayed instead of a glucose value above the CGM range */ 5 | "HIGH" = "HIGH"; 6 | 7 | /* String displayed instead of a glucose value below the CGM range */ 8 | "LOW" = "LOW"; 9 | 10 | -------------------------------------------------------------------------------- /LoopUI/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/ja.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleName" = "$(PRODUCT_NAME)"; 3 | 4 | -------------------------------------------------------------------------------- /LoopUI/nb.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/nl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/pl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/pt-BR.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleName" = "$(PRODUCT_NAME)"; 3 | 4 | -------------------------------------------------------------------------------- /LoopUI/ro.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/ru.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/sv.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/tr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "LoopUI"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /LoopUI/vi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleName" = "$(PRODUCT_NAME)"; 3 | 4 | -------------------------------------------------------------------------------- /Scripts/install-scenarios.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # install-scenarios.sh 4 | # Loop 5 | # 6 | # Created by Pete Schwamb on 12/19/22. 7 | # Copyright © 2022 LoopKit Authors. All rights reserved. 8 | 9 | SCENARIOS_DIR="$WORKSPACE_ROOT"/Scenarios 10 | 11 | if [ -d "$SCENARIOS_DIR" ] 12 | then 13 | echo "$SCENARIOS_DIR exists. Installing scenarios." 14 | echo cp -a "$SCENARIOS_DIR" "${BUILT_PRODUCTS_DIR}/Scenarios" 15 | cp -a "$SCENARIOS_DIR" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Scenarios" 16 | else 17 | echo "Scenarios missing or not configured... Not installing." 18 | fi 19 | -------------------------------------------------------------------------------- /Shortcuts/Cancel Override.shortcut: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Shortcuts/Cancel Override.shortcut -------------------------------------------------------------------------------- /Shortcuts/Loop Remote Overrides.shortcut: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Shortcuts/Loop Remote Overrides.shortcut -------------------------------------------------------------------------------- /Shortcuts/Loop.shortcut: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/Shortcuts/Loop.shortcut -------------------------------------------------------------------------------- /Version.xcconfig: -------------------------------------------------------------------------------- 1 | // 2 | // Version.xcconfig 3 | // Loop 4 | // 5 | // Created by Darin Krauss on 1/30/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | // Version [DEFAULT] 10 | LOOP_MARKETING_VERSION = 3.3.0 11 | CURRENT_PROJECT_VERSION = 57 12 | 13 | // Optional override 14 | #include? "VersionOverride.xcconfig" 15 | -------------------------------------------------------------------------------- /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/Circular.imageset/Icon-Complication-16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/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/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Icon-Complication-18x18@2x.png -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /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 Bezel.imageset/Icon-AppleWatch-42x42@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/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/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Icon-AppleWatch-47x47@2x.png -------------------------------------------------------------------------------- /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 Circular.imageset/Icon-AppleWatch-42x42@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/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/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Icon-AppleWatch-47x47@2x.png -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Icon-Complication-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/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/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Icon-Complication-22x22@2x.png -------------------------------------------------------------------------------- /WatchApp Extension/Assets.xcassets/Complication.complicationset/Graphic 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 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon-Complication-26x26@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/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/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/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/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Icon-Complication-32x32@2x.png -------------------------------------------------------------------------------- /WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon-Complication-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/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/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/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/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Icon-Complication-25x25@2x.png -------------------------------------------------------------------------------- /WatchApp Extension/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /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/Base.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "WatchApp Extension"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/Collection.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Collection.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 6/30/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | extension Collection { 10 | /// Returns a sequence containing adjacent pairs of elements in the ordered collection. 11 | func adjacentPairs() -> Zip2Sequence { 12 | return zip(self, dropFirst()) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /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(-6)) 15 | } 16 | 17 | static var staleGlucoseCutoff: Date { 18 | return Date(timeIntervalSinceNow: .minutes(-5)) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp Extension/Extensions/GlucoseCondition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GlucoseCondition.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Pete Schwamb on 6/13/24. 6 | // Copyright © 2024 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import LoopAlgorithm 11 | 12 | extension GlucoseCondition { 13 | var localizedDescription: String { 14 | switch self { 15 | case .aboveRange: 16 | return NSLocalizedString("HIGH", comment: "String displayed instead of a glucose value above the CGM range") 17 | case .belowRange: 18 | return NSLocalizedString("LOW", comment: "String displayed instead of a glucose value below the CGM range") 19 | } 20 | } 21 | } 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 | -------------------------------------------------------------------------------- /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 | func imageName(isClosedLoop: Bool) -> String { 18 | let suffix = isClosedLoop ? "closed" : "open" 19 | return "loop_\(rawValue)_\(suffix)" 20 | } 21 | } 22 | 23 | 24 | extension WKInterfaceImage { 25 | func setLoopImage(isClosedLoop: Bool, _ loopImage: LoopImage) { 26 | setImageNamed(loopImage.imageName(isClosedLoop: isClosedLoop)) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /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 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 | -------------------------------------------------------------------------------- /WatchApp Extension/Views/Carb Entry & Bolus/Models/CarbEntryInputMode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CarbEntryInputMode.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 4/1/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | enum CarbEntryInputMode { 10 | case carbs 11 | case date 12 | 13 | mutating func toggle() { 14 | switch self { 15 | case .carbs: 16 | self = .date 17 | case .date: 18 | self = .carbs 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /WatchApp Extension/Views/Carb Entry & Bolus/Preference Keys/CarbAmountPositionKey.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CarbAmountPositionKey.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 3/27/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | 12 | struct CarbAmountPositionKey: PreferenceKey { 13 | static var defaultValue: Anchor? { nil } 14 | 15 | static func reduce(value: inout Anchor?, nextValue: () -> Anchor?) { 16 | value = value ?? nextValue() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /WatchApp Extension/Views/Carb Entry & Bolus/Preference Keys/GramLabelPositionKey.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GramLabelPositionKey.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 3/27/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | 12 | struct GramLabelPositionKey: PreferenceKey { 13 | static var defaultValue: Anchor? { nil } 14 | 15 | static func reduce(value: inout Anchor?, nextValue: () -> Anchor?) { 16 | value = value ?? nextValue() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /WatchApp Extension/Views/Checkmark.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Checkmark.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 3/30/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | 12 | /// A checkmark based on unit ratios of 13 | /// {0, 20} -> {17, 0} -> {45, 43} 14 | struct Checkmark: Shape { 15 | func path(in rect: CGRect) -> Path { 16 | Path { path in 17 | path.move(to: CGPoint(x: rect.minX, y: rect.maxY - 20 / 43 * rect.height)) 18 | path.addLine(to: CGPoint(x: rect.minX + 17 / 45 * rect.width, y: rect.maxY)) 19 | path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY)) 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /WatchApp Extension/Views/CircularAccessoryButtonStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CircularAccessoryButtonStyle.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 3/24/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | 12 | struct CircularAccessoryButtonStyle: ButtonStyle { 13 | var color: Color 14 | 15 | func makeBody(configuration: Configuration) -> some View { 16 | Circle() 17 | .fill(color.opacity(0.14)) 18 | .overlay(configuration.label.foregroundColor(color)) 19 | .padding(configuration.isPressed ? 1 : 0) 20 | .frame(width: 22, height: 22) 21 | .overlay(Color.black.opacity(configuration.isPressed ? 0.35 : 0)) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /WatchApp Extension/Views/Extensions/Color.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Color.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 3/24/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | 12 | extension Color { 13 | static let carbs = Color(.carbsColor) 14 | static let darkCarbs = Color(.darkCarbsColor) 15 | 16 | static let insulin = Color(.insulin) 17 | static let darkInsulin = Color(.darkInsulin) 18 | 19 | static let defaultWatchButtonGray = Color(white: 35 / 255) 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp Extension/Views/TopDownTriangle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TopDownTriangle.swift 3 | // WatchApp Extension 4 | // 5 | // Created by Michael Pangburn on 3/30/20. 6 | // Copyright © 2020 LoopKit Authors. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | 12 | /// An isosceles triangle, pointed downward. 13 | struct TopDownTriangle: Shape { 14 | func path(in rect: CGRect) -> Path { 15 | Path { path in 16 | path.move(to: CGPoint(x: rect.minX, y: rect.minY)) 17 | path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY)) 18 | path.addLine(to: CGPoint(x: rect.midX, y: rect.maxY)) 19 | path.closeSubpath() 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /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/ar.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Health Update Usage Description */ 2 | "NSHealthUpdateUsageDescription" = "بيانات كربوهيدرات الوجبة المدخلة للتطبيق و الساعة محفوظة في قواعد بيانات تطبيق صحتي. يتم تخزين بيانات سكر الدم المستردة من نظام متابعة سكر الدم المستمرة بشكل آمن في تطبيق صحتي."; 3 | 4 | -------------------------------------------------------------------------------- /WatchApp Extension/ar.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@%@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/cs.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* No glucose value representation (3 dashes for mg/dL) */ 2 | "– – –" = "– – –"; 3 | 4 | /* Button text to continue from carb entry to bolus entry on Apple Watch */ 5 | "Continue" = "Pokračovat"; 6 | 7 | /* Label for off button */ 8 | "Off" = "Vypnuto"; 9 | 10 | /* No comment provided by engineer. */ 11 | "OK" = "OK"; 12 | 13 | /* Label for on button */ 14 | "On" = "Zapnuto"; 15 | 16 | /* Button text to confirm carb entry without bolusing on Apple Watch */ 17 | "Save" = "Uložit"; 18 | 19 | -------------------------------------------------------------------------------- /WatchApp Extension/da.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "6,5"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "6,5↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@%@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/de.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@%@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/es.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@ %@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/fr.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@%@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/he.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Health Update Usage Description */ 2 | "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."; 3 | 4 | -------------------------------------------------------------------------------- /WatchApp Extension/hi.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* No glucose value representation (3 dashes for mg/dL) */ 2 | "– – –" = "– – –"; 3 | 4 | /* Button text to continue from carb entry to bolus entry on Apple Watch */ 5 | "Continue" = "जारी"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp Extension/it.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@ %@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/ja.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Health Update Usage Description */ 2 | "NSHealthUpdateUsageDescription" = "健康データベースからの食事データは、グルコース効果を決定するために使用される。 グルコースデータはグラフ作成と解析のためにHealthKitから検索されます"; 3 | 4 | -------------------------------------------------------------------------------- /WatchApp Extension/nb.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "WatchApp-utvidelse"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "WatchApp-utvidelse"; 6 | 7 | /* Privacy - Health Share Usage Description */ 8 | "NSHealthShareUsageDescription" = "Måltidsdata fra helsedatabasen brukes til å bestemme glukoseeffekter. Glukosedata fra helsedatabasen brukes til grafer og momentumberegning. Søvndata fra helsedatabasen brukes til å optimalisere leveringen av Apple Watch-komplikasjonsoppdateringer når du er våken."; 9 | 10 | /* Privacy - Health Update Usage Description */ 11 | "NSHealthUpdateUsageDescription" = "Karbohydratmåltidsdata som legges inn i appen og på klokken lagres i Helsedatabasen. Glukosedata hentet fra CGM lagres sikkert i HealthKit."; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/nb.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@ %@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/nl.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "6,7"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "6,7 ↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@%@%@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/pl.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3 min"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@%@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/pt-BR.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Health Update Usage Description */ 2 | "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."; 3 | 4 | -------------------------------------------------------------------------------- /WatchApp Extension/ro.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3MIN"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@ %@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/ru.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3МИН"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@%@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/sk.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Health Share Usage Description */ 2 | "NSHealthShareUsageDescription" = "Údaje o jedle z databázy Health sa používajú na určenie účinkov glukózy. Údaje o glukóze z databázy Health sa používajú na vytváranie grafov a výpočet hybnosti. Údaje o spánku z databázy Health sa používajú na optimalizáciu doručovania aktualizácií komplikácií Apple Watch v čase, keď ste hore."; 3 | 4 | /* Privacy - Health Update Usage Description */ 5 | "NSHealthUpdateUsageDescription" = "Údaje o uhlohydrátoch zadané v aplikácii a na hodinkách sú uložené v databáze Health. Údaje o glukóze získané z CGM sú bezpečne uložené v HealthKit."; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp Extension/sv.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Bundle display name */ 2 | "CFBundleDisplayName" = "WatchApp Extension"; 3 | 4 | /* Bundle name */ 5 | "CFBundleName" = "WatchApp Extension"; 6 | 7 | /* Privacy - Health Share Usage Description */ 8 | "NSHealthShareUsageDescription" = "Kolhydratdata från Apple Health-databasen används för att avgöra blodsockereffekt. Blodsockervärden från Apple Health-databasen används i diagram och för beräkning av förändring."; 9 | 10 | /* Privacy - Health Update Usage Description */ 11 | "NSHealthUpdateUsageDescription" = "Kolhydratvärden inmatade i appen i klockan lagras i Apple Health-databasen. Glukosvärden mottagna från CGM lagras krypterat i HealthKit."; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/tr.lproj/ckcomplication.strings: -------------------------------------------------------------------------------- 1 | /* The complication template example time string */ 2 | "3MIN" = "3DK"; 3 | 4 | /* The complication template example glucose string */ 5 | "120" = "120"; 6 | 7 | /* The complication template example glucose and trend string */ 8 | "120↘︎" = "120↘︎"; 9 | 10 | /* Utilitarian large flat format string (1: Glucose & Trend symbol) (2: Eventual Glucose) (3: Time) */ 11 | "UtilitarianLargeFlat" = "%@%@ %@"; 12 | 13 | -------------------------------------------------------------------------------- /WatchApp Extension/vi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Health Update Usage Description */ 2 | "NSHealthUpdateUsageDescription" = "Dữ liệu Carbohydrate của bữa ăn được nhập trên phần mềm và trên đồng hồ thông minh sẽ được lưu trữ tại app Health. Các thông số glucose được lấy từ thiết bị theo dõi đường huyết liên tục/CGM sẽ được lưu trữ an toàn trong HealthKit."; 3 | 4 | -------------------------------------------------------------------------------- /WatchApp/Base.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/loop_aging_closed.imageset/loop-aging-closed@38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_closed/loop_aging_closed.imageset/loop-aging-closed@38mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/loop_aging_closed.imageset/loop-aging-closed@42mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_closed/loop_aging_closed.imageset/loop-aging-closed@42mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/loop_fresh_closed.imageset/loop-fresh-closed@38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_closed/loop_fresh_closed.imageset/loop-fresh-closed@38mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/loop_fresh_closed.imageset/loop-fresh-closed@42mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_closed/loop_fresh_closed.imageset/loop-fresh-closed@42mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/loop_stale_closed.imageset/loop-stale-closed@38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_closed/loop_stale_closed.imageset/loop-stale-closed@38mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/loop_stale_closed.imageset/loop-stale-closed@42mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_closed/loop_stale_closed.imageset/loop-stale-closed@42mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/loop_unknown_closed.imageset/loop-unknown-closed@38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_closed/loop_unknown_closed.imageset/loop-unknown-closed@38mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_closed/loop_unknown_closed.imageset/loop-unknown-closed@42mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_closed/loop_unknown_closed.imageset/loop-unknown-closed@42mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/loop_aging_open.imageset/loop-aging-open@38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_open/loop_aging_open.imageset/loop-aging-open@38mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/loop_aging_open.imageset/loop-aging-open@42mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_open/loop_aging_open.imageset/loop-aging-open@42mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/loop_fresh_open.imageset/loop-fresh-open@38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_open/loop_fresh_open.imageset/loop-fresh-open@38mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/loop_fresh_open.imageset/loop-fresh-open@42mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_open/loop_fresh_open.imageset/loop-fresh-open@42mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/loop_stale_open.imageset/loop-stale-open@38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_open/loop_stale_open.imageset/loop-stale-open@38mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/loop_stale_open.imageset/loop-stale-open@42mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_open/loop_stale_open.imageset/loop-stale-open@42mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/loop_unknown_open.imageset/loop-unknown-open@38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_open/loop_unknown_open.imageset/loop-unknown-open@38mm.png -------------------------------------------------------------------------------- /WatchApp/DefaultAssets.xcassets/loop_open/loop_unknown_open.imageset/loop-unknown-open@42mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DefaultAssets.xcassets/loop_open/loop_unknown_open.imageset/loop-unknown-open@42mm.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-App-Store-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-App-Store-1024.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-100x100@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-100x100@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-216x216@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-216x216@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-24x24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-24x24@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-27.5x27.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-27.5x27.5@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-40x40@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-44x44@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-44x44@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-86x86@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-86x86@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-98x98@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-98x98@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-Companion-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-Companion-29x29@2x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-Companion-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/AppIcon.appiconset/Icon-AppleWatch-Companion-29x29@3x.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/accent.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "ios", 6 | "reference" : "systemBlueColor" 7 | }, 8 | "idiom" : "universal" 9 | } 10 | ], 11 | "info" : { 12 | "author" : "xcode", 13 | "version" : 1 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/bolus.imageset/Bolus Icon 42mm.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/bolus.imageset/Bolus Icon 42mm.pdf -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/bolus.imageset/Bolus icon 38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/bolus.imageset/Bolus icon 38mm.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/carbs-dark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.040", 9 | "green" : "0.120", 10 | "red" : "0.070" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/carbs.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.220", 9 | "green" : "0.855", 10 | "red" : "0.388" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/carbs.imageset/Carb Icon 42mm.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/carbs.imageset/Carb Icon 42mm.pdf -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/carbs.imageset/Carbs icon 38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/carbs.imageset/Carbs icon 38mm.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/glucose-dark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.140", 9 | "green" : "0.100", 10 | "red" : "0.020" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/glucose.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.973", 9 | "green" : "0.678", 10 | "red" : "0.310" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/insulin-dark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.150", 8 | "blue" : "0.000", 9 | "green" : "0.584", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/insulin-notification-background.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.500", 8 | "blue" : "0.000", 9 | "green" : "0.584", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/insulin.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.000", 9 | "green" : "0.584", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/pre-meal.imageset/Pre-Meal 38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/pre-meal.imageset/Pre-Meal 38mm.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/pre-meal.imageset/Pre-Meal 42mm.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/pre-meal.imageset/Pre-Meal 42mm.pdf -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/tint.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.392", 9 | "green" : "0.851", 10 | "red" : "0.298" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/warning.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "ios", 6 | "reference" : "systemYellowColor" 7 | }, 8 | "idiom" : "universal" 9 | } 10 | ], 11 | "info" : { 12 | "author" : "xcode", 13 | "version" : 1 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/workout-dark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.140", 9 | "green" : "0.100", 10 | "red" : "0.020" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/workout.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.973", 9 | "green" : "0.678", 10 | "red" : "0.310" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/workout.imageset/Workout 38mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/workout.imageset/Workout 38mm.png -------------------------------------------------------------------------------- /WatchApp/DerivedAssetsBase.xcassets/workout.imageset/Workout 42mm.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tidepool-org/Loop/2fb1fde5b9336e8bf631c383fccac7a674968abe/WatchApp/DerivedAssetsBase.xcassets/workout.imageset/Workout 42mm.pdf -------------------------------------------------------------------------------- /WatchApp/ar.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/cs.lproj/Interface.strings: -------------------------------------------------------------------------------- 1 | /* Class = "WKInterfaceLabel"; text = "– – –"; ObjectID = "Dt1-kz-jMZ"; */ 2 | "Dt1-kz-jMZ.text" = "– – –"; 3 | 4 | /* Class = "WKInterfaceLabel"; text = "– – –"; ObjectID = "yl8-ZP-c3l"; */ 5 | "yl8-ZP-c3l.text" = "– – –"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/da.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/en.lproj/Interface.strings: -------------------------------------------------------------------------------- 1 | /* Class = "WKInterfaceLabel"; text = "–"; ObjectID = "CsQ-fc-KLC"; */ 2 | "CsQ-fc-KLC.text" = "—"; 3 | 4 | /* Class = "WKInterfaceLabel"; text = "– – –"; ObjectID = "Dt1-kz-jMZ"; */ 5 | "Dt1-kz-jMZ.text" = "---"; 6 | 7 | /* Class = "WKInterfaceLabel"; text = "–"; ObjectID = "IRi-4t-ESO"; */ 8 | "IRi-4t-ESO.text" = "—"; 9 | 10 | /* Class = "WKInterfaceLabel"; text = "–"; ObjectID = "Mhe-aR-kQQ"; */ 11 | "Mhe-aR-kQQ.text" = "—"; 12 | 13 | /* Class = "WKInterfaceLabel"; text = "– – –"; ObjectID = "yl8-ZP-c3l"; */ 14 | "yl8-ZP-c3l.text" = "---"; 15 | 16 | -------------------------------------------------------------------------------- /WatchApp/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/fi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/he.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/hi.lproj/Interface.strings: -------------------------------------------------------------------------------- 1 | /* Class = "WKInterfaceLabel"; text = "– – –"; ObjectID = "Dt1-kz-jMZ"; */ 2 | "Dt1-kz-jMZ.text" = "– – –"; 3 | 4 | /* Class = "WKInterfaceLabel"; text = "– – –"; ObjectID = "yl8-ZP-c3l"; */ 5 | "yl8-ZP-c3l.text" = "– – –"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/ja.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "ループ"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/nb.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/nl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/pl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/pt-BR.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/ro.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/ru.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/sk.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | -------------------------------------------------------------------------------- /WatchApp/sk.lproj/Interface.strings: -------------------------------------------------------------------------------- 1 | /* Class = "WKInterfaceLabel"; text = "– – –"; ObjectID = "Dt1-kz-jMZ"; */ 2 | "Dt1-kz-jMZ.text" = "– – –"; 3 | 4 | /* Class = "WKInterfaceController"; title = "Loop"; ObjectID = "rNf-Mh-tID"; */ 5 | "rNf-Mh-tID.title" = "Loop"; 6 | 7 | /* Class = "WKInterfaceLabel"; text = "Bolus"; ObjectID = "smL-Rc-IZh"; */ 8 | "smL-Rc-IZh.text" = "Bolus"; 9 | 10 | /* Class = "WKInterfaceController"; title = "Loop"; ObjectID = "v5b-sO-bb8"; */ 11 | "v5b-sO-bb8.title" = "Loop"; 12 | 13 | /* Class = "WKInterfaceLabel"; text = "– – –"; ObjectID = "yl8-ZP-c3l"; */ 14 | "yl8-ZP-c3l.text" = "– – –"; 15 | 16 | -------------------------------------------------------------------------------- /WatchApp/sv.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/tr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | -------------------------------------------------------------------------------- /WatchApp/vi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Comment) */ 2 | "CFBundleDisplayName" = "Loop"; 3 | 4 | /* (No Comment) */ 5 | "CFBundleName" = "$(PRODUCT_NAME)"; 6 | 7 | --------------------------------------------------------------------------------