From 6e3d2cbc19ac24923b265ac6e03bd7d93e90c6d3 Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 21 Dec 2016 23:17:54 +1000 Subject: [PATCH 1/2] Add support for more complications Adds support for Modular Large, Circular Small and Extra Large complication styles --- .../ComplicationController.swift | 128 ++++++++++++++++-- .../Extensions/CLKComplicationTemplate.swift | 43 ++++++ WatchApp Extension/Info.plist | 3 + 3 files changed, 161 insertions(+), 13 deletions(-) diff --git a/WatchApp Extension/ComplicationController.swift b/WatchApp Extension/ComplicationController.swift index 63884fbbf0..139b33aa83 100644 --- a/WatchApp Extension/ComplicationController.swift +++ b/WatchApp Extension/ComplicationController.swift @@ -44,6 +44,7 @@ final class ComplicationController: NSObject, CLKComplicationDataSource { func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: (@escaping (CLKComplicationTimelineEntry?) -> Void)) { + var templateEntry: CLKComplicationTimelineEntry? switch complication.family { case .modularSmall: if let context = ExtensionDelegate.shared().lastContext, @@ -53,13 +54,50 @@ final class ComplicationController: NSObject, CLKComplicationDataSource { let date = context.glucoseDate, date.timeIntervalSinceNow.minutes >= -15, let template = CLKComplicationTemplateModularSmallStackText(line1: glucoseString, date: date) { - handler(CLKComplicationTimelineEntry(date: date, complicationTemplate: template)) + templateEntry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) } else { - handler(nil) + templateEntry = nil + } + case .modularLarge: + if let context = ExtensionDelegate.shared().lastContext, + let glucose = context.glucose, + let unit = context.preferredGlucoseUnit, + let glucoseString = formatter.string(from: NSNumber(value: glucose.doubleValue(for: unit))), + let date = context.glucoseDate, date.timeIntervalSinceNow.minutes >= -15, + let template = CLKComplicationTemplateModularLargeTallBody(line1: glucoseString, date: date) + { + templateEntry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) + } else { + templateEntry = nil + } + case .circularSmall: + if let context = ExtensionDelegate.shared().lastContext, + let glucose = context.glucose, + let unit = context.preferredGlucoseUnit, + let glucoseString = formatter.string(from: NSNumber(value: glucose.doubleValue(for: unit))), + let date = context.glucoseDate, date.timeIntervalSinceNow.minutes >= -15, + let template = CLKComplicationTemplateCircularSmallStackText(line1: glucoseString, date: date) + { + templateEntry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) + } else { + templateEntry = nil + } + case .extraLarge: + if let context = ExtensionDelegate.shared().lastContext, + let glucose = context.glucose, + let unit = context.preferredGlucoseUnit, + let glucoseString = formatter.string(from: NSNumber(value: glucose.doubleValue(for: unit))), + let date = context.glucoseDate, date.timeIntervalSinceNow.minutes >= -15, + let template = CLKComplicationTemplateExtraLargeStackText(line1: glucoseString, date: date) + { + templateEntry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) + } else { + templateEntry = nil } default: - handler(nil) + templateEntry = nil } + handler(templateEntry) } func getTimelineEntries(for complication: CLKComplication, before date: Date, limit: Int, withHandler handler: (@escaping ([CLKComplicationTimelineEntry]?) -> Void)) { @@ -69,17 +107,60 @@ final class ComplicationController: NSObject, CLKComplicationDataSource { func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: (@escaping ([CLKComplicationTimelineEntry]?) -> Void)) { // Call the handler with the timeline entries after to the given date - if let context = ExtensionDelegate.shared().lastContext, - let glucose = context.glucose, - let unit = context.preferredGlucoseUnit, - let glucoseString = formatter.string(from: NSNumber(value: glucose.doubleValue(for: unit))), - let glucoseDate = context.glucoseDate, glucoseDate.timeIntervalSince(date) > 0, - let template = CLKComplicationTemplateModularSmallStackText(line1: glucoseString, date: glucoseDate) - { - handler([CLKComplicationTimelineEntry(date: glucoseDate, complicationTemplate: template)]) - } else { - handler(nil) + var templateEntry: [CLKComplicationTimelineEntry]? + switch complication.family { + case .modularSmall: + if let context = ExtensionDelegate.shared().lastContext, + let glucose = context.glucose, + let unit = context.preferredGlucoseUnit, + let glucoseString = formatter.string(from: NSNumber(value: glucose.doubleValue(for: unit))), + let glucoseDate = context.glucoseDate, glucoseDate.timeIntervalSince(date) > 0, + let template = CLKComplicationTemplateModularSmallStackText(line1: glucoseString, date: glucoseDate) + { + templateEntry = [CLKComplicationTimelineEntry(date: glucoseDate, complicationTemplate: template)] + } else { + templateEntry = nil + } + case .modularLarge: + if let context = ExtensionDelegate.shared().lastContext, + let glucose = context.glucose, + let unit = context.preferredGlucoseUnit, + let glucoseString = formatter.string(from: NSNumber(value: glucose.doubleValue(for: unit))), + let glucoseDate = context.glucoseDate, glucoseDate.timeIntervalSince(date) > 0, + let template = CLKComplicationTemplateModularLargeTallBody(line1: glucoseString, date: glucoseDate) + { + templateEntry = [CLKComplicationTimelineEntry(date: glucoseDate, complicationTemplate: template)] + } else { + templateEntry = nil + } + case .circularSmall: + if let context = ExtensionDelegate.shared().lastContext, + let glucose = context.glucose, + let unit = context.preferredGlucoseUnit, + let glucoseString = formatter.string(from: NSNumber(value: glucose.doubleValue(for: unit))), + let glucoseDate = context.glucoseDate, glucoseDate.timeIntervalSince(date) > 0, + let template = CLKComplicationTemplateCircularSmallStackText(line1: glucoseString, date: glucoseDate) + { + templateEntry = [CLKComplicationTimelineEntry(date: glucoseDate, complicationTemplate: template)] + } else { + templateEntry = nil + } + case .extraLarge: + if let context = ExtensionDelegate.shared().lastContext, + let glucose = context.glucose, + let unit = context.preferredGlucoseUnit, + let glucoseString = formatter.string(from: NSNumber(value: glucose.doubleValue(for: unit))), + let glucoseDate = context.glucoseDate, glucoseDate.timeIntervalSince(date) > 0, + let template = CLKComplicationTemplateExtraLargeStackText(line1: glucoseString, date: glucoseDate) + { + templateEntry = [CLKComplicationTimelineEntry(date: glucoseDate, complicationTemplate: template)] + } else { + templateEntry = nil + } + default: + templateEntry = nil } + handler(templateEntry) } // MARK: - Placeholder Templates @@ -92,6 +173,27 @@ final class ComplicationController: NSObject, CLKComplicationDataSource { template.line1TextProvider = CLKSimpleTextProvider(text: "--", shortText: "--", accessibilityLabel: "No glucose value available") template.line2TextProvider = CLKSimpleTextProvider.localizableTextProvider(withStringsFileTextKey: "mg/dL") + handler(template) + case .modularLarge: + let template = CLKComplicationTemplateModularLargeTallBody() + + template.bodyTextProvider = CLKSimpleTextProvider(text: "--", shortText: "--", accessibilityLabel: "No glucose value available") + template.headerTextProvider = CLKSimpleTextProvider.localizableTextProvider(withStringsFileTextKey: "mg/dL") + + handler(template) + case .circularSmall: + let template = CLKComplicationTemplateCircularSmallStackText() + + template.line1TextProvider = CLKSimpleTextProvider(text: "--", shortText: "--", accessibilityLabel: "No glucose value available") + template.line2TextProvider = CLKSimpleTextProvider.localizableTextProvider(withStringsFileTextKey: "mg/dL") + + handler(template) + case .extraLarge: + let template = CLKComplicationTemplateExtraLargeStackText() + + template.line1TextProvider = CLKSimpleTextProvider(text: "--", shortText: "--", accessibilityLabel: "No glucose value available") + template.line2TextProvider = CLKSimpleTextProvider.localizableTextProvider(withStringsFileTextKey: "mg/dL") + handler(template) default: handler(nil) diff --git a/WatchApp Extension/Extensions/CLKComplicationTemplate.swift b/WatchApp Extension/Extensions/CLKComplicationTemplate.swift index cd30289801..378942f2fc 100644 --- a/WatchApp Extension/Extensions/CLKComplicationTemplate.swift +++ b/WatchApp Extension/Extensions/CLKComplicationTemplate.swift @@ -24,3 +24,46 @@ extension CLKComplicationTemplateModularSmallStackText { } } +extension CLKComplicationTemplateCircularSmallStackText { + + convenience init?(line1: String?, date: Date?) { + guard let line1 = line1, let date = date else { + return nil + } + + self.init() + + line1TextProvider = CLKSimpleTextProvider(text: line1) + line2TextProvider = CLKTimeTextProvider(date: date) + } + +} +extension CLKComplicationTemplateModularLargeTallBody { + + convenience init?(line1: String?, date: Date?) { + guard let line1 = line1, let date = date else { + return nil + } + + self.init() + + bodyTextProvider = CLKSimpleTextProvider(text: line1) + headerTextProvider = CLKTimeTextProvider(date: date) + } + +} +extension CLKComplicationTemplateExtraLargeStackText { + + convenience init?(line1: String?, date: Date?) { + guard let line1 = line1, let date = date else { + return nil + } + + self.init() + + highlightLine2 = false + line1TextProvider = CLKSimpleTextProvider(text: line1) + line2TextProvider = CLKTimeTextProvider(date: date) + } + +} diff --git a/WatchApp Extension/Info.plist b/WatchApp Extension/Info.plist index 50f23199d8..927a9e8bd6 100644 --- a/WatchApp Extension/Info.plist +++ b/WatchApp Extension/Info.plist @@ -27,6 +27,9 @@ CLKComplicationSupportedFamilies CLKComplicationFamilyModularSmall + CLKComplicationFamilyModularLarge + CLKComplicationFamilyCircularSmall + CLKComplicationFamilyExtraLarge NSExtension From ae560510c20d6befaae0105a4f7922ce0d2996a2 Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 24 Dec 2016 11:14:28 +1000 Subject: [PATCH 2/2] Change time to relative time Changes time to relative time to make age values more easily parseable at a glance. --- .../Extensions/CLKComplicationTemplate.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/WatchApp Extension/Extensions/CLKComplicationTemplate.swift b/WatchApp Extension/Extensions/CLKComplicationTemplate.swift index 378942f2fc..285ffcf96c 100644 --- a/WatchApp Extension/Extensions/CLKComplicationTemplate.swift +++ b/WatchApp Extension/Extensions/CLKComplicationTemplate.swift @@ -20,7 +20,7 @@ extension CLKComplicationTemplateModularSmallStackText { self.init() line1TextProvider = CLKSimpleTextProvider(text: line1) - line2TextProvider = CLKTimeTextProvider(date: date) + line2TextProvider = CLKRelativeDateTextProvider(date: date, style: .natural, units: .minute) } } @@ -34,7 +34,7 @@ extension CLKComplicationTemplateCircularSmallStackText { self.init() line1TextProvider = CLKSimpleTextProvider(text: line1) - line2TextProvider = CLKTimeTextProvider(date: date) + line2TextProvider = CLKRelativeDateTextProvider(date: date, style: .natural, units: .minute) } } @@ -48,7 +48,7 @@ extension CLKComplicationTemplateModularLargeTallBody { self.init() bodyTextProvider = CLKSimpleTextProvider(text: line1) - headerTextProvider = CLKTimeTextProvider(date: date) + headerTextProvider = CLKRelativeDateTextProvider(date: date, style: .natural, units: .minute) } } @@ -63,7 +63,7 @@ extension CLKComplicationTemplateExtraLargeStackText { highlightLine2 = false line1TextProvider = CLKSimpleTextProvider(text: line1) - line2TextProvider = CLKTimeTextProvider(date: date) + line2TextProvider = CLKRelativeDateTextProvider(date: date, style: .natural, units: .minute) } }