@@ -12,14 +12,22 @@ import HealthKit
1212
1313import UICountingLabel
1414
15-
1615class TodayViewController : UIViewController , NCWidgetProviding {
1716
17+ @IBOutlet weak var stepsLabel2 : UICountingLabel !
18+ @IBOutlet weak var stepsLabel : UILabel !
19+ @IBOutlet weak var averageLabel : UILabel !
20+
21+
1822 let healthStore = HKHealthStore ( )
1923 let cal = Calendar . current
2024 let numberFormatter = NumberFormatter ( )
2125
22- @IBOutlet weak var stepsLabel2 : UICountingLabel !
26+ var stepsToday : Double = 0.0
27+ var sevenDayStepAverage : Double = 100000.0
28+ var sevenDayStepAverageLastUpdated : Date = Date . distantPast
29+
30+
2331
2432 override func viewDidLoad( ) {
2533 super. viewDidLoad ( )
@@ -37,19 +45,23 @@ class TodayViewController: UIViewController, NCWidgetProviding {
3745 }
3846 }
3947 stepsLabel2. textAlignment = . center
48+
49+ stepsLabel2. isEnabled = false
4050
4151 checkHealthKitAuthorization ( )
4252
4353 updateView ( )
4454 }
4555
56+
4657 override func viewDidAppear( _ animated: Bool ) {
4758 super. viewDidAppear ( animated)
4859 print ( " viewDidAppear " )
4960
5061 updateView ( )
5162 }
5263
64+
5365 override func didReceiveMemoryWarning( ) {
5466 super. didReceiveMemoryWarning ( )
5567 // Dispose of any resources that can be recreated.
@@ -84,20 +96,54 @@ class TodayViewController: UIViewController, NCWidgetProviding {
8496
8597
8698 func updateView ( ) {
87- let energyFormatter = EnergyFormatter ( )
88- energyFormatter. numberFormatter. maximumFractionDigits = 0
89-
9099 let numberFormatter = NumberFormatter ( )
91100 numberFormatter. maximumFractionDigits = 0
92101 numberFormatter. numberStyle = NumberFormatter . Style. decimal
93102
103+ /*
94104 getTodayStepCount (completion: { (steps) in
95105 if steps != -1.0 {
96106 OperationQueue.main.addOperation {
97107 self.stepsLabel2.countFromCurrentValue(to: CGFloat(steps!), withDuration: 0.5)
98108 }
99109 }
100110 })
111+ */
112+
113+ getTodayStepCount ( completion: { ( steps) in
114+ if steps != - 1.0 {
115+ OperationQueue . main. addOperation {
116+ let numberString = self . numberFormatter. string ( from: steps! as NSNumber )
117+ self . stepsLabel. text = numberString!
118+
119+ if ( self . stepsToday > self . sevenDayStepAverage) {
120+ self . stepsLabel. textColor = UIColor ( red: 0 , green: 0.25 , blue: 0 , alpha: 1.0 ) // pale green
121+ } else {
122+ self . stepsLabel. textColor = . black
123+ }
124+ }
125+ }
126+ } )
127+
128+ // only update if not updated already today
129+ if ( !cal. isDateInToday ( sevenDayStepAverageLastUpdated) ) {
130+ getSevenDayStepAverage ( completion: { ( averageSteps) in
131+ if averageSteps != - 1.0 {
132+ self . sevenDayStepAverage = averageSteps!
133+ self . sevenDayStepAverageLastUpdated = Date ( )
134+ OperationQueue . main. addOperation {
135+ let numberString = self . numberFormatter. string ( from: averageSteps! as NSNumber )
136+ self . averageLabel. text = numberString!
137+
138+ if ( self . stepsToday > self . sevenDayStepAverage) {
139+ self . stepsLabel. textColor = UIColor ( red: 0 , green: 0.25 , blue: 0 , alpha: 1.0 ) // pale green
140+ } else {
141+ self . stepsLabel. textColor = . black
142+ }
143+ }
144+ }
145+ } )
146+ }
101147 }
102148
103149
@@ -154,5 +200,33 @@ class TodayViewController: UIViewController, NCWidgetProviding {
154200 }
155201 healthStore. execute ( query)
156202 }
203+
204+
205+ func getSevenDayStepAverage( completion: @escaping ( Double ? ) -> ( ) )
206+ {
207+ // Define the sample type
208+ let type = HKQuantityType . quantityType ( forIdentifier: HKQuantityTypeIdentifier . stepCount)
209+
210+ let cal = Calendar . current
211+ let endDate = cal. startOfDay ( for: Date ( ) )
212+ let startDate = cal. date ( byAdding: . day, value: - 7 , to: endDate)
213+
214+ // Set the predicate
215+ let predicate = HKQuery . predicateForSamples ( withStart: startDate, end: endDate, options: [ ] )
216+
217+ let query = HKStatisticsQuery ( quantityType: type!, quantitySamplePredicate: predicate, options: . cumulativeSum) { query, results, error in
218+ let quantity = results? . sumQuantity ( )
219+ let unit = HKUnit . count ( )
220+ let steps = quantity? . doubleValue ( for: unit)
221+
222+ if steps != nil {
223+ completion ( steps! / 7.0 )
224+ } else {
225+ print ( " getStepsAverage: results are nil - returning zero steps " )
226+ completion ( - 1.0 )
227+ }
228+ }
229+ healthStore. execute ( query)
230+ }
157231
158232}
0 commit comments