99import UIKit
1010import SnapKit
1111import MBProgressHUD
12+ import OSLog
1213
1314import BeeKit
1415
1516class TimerViewController : UIViewController {
17+ let logger = Logger ( subsystem: " com.beeminder.beeminder " , category: " TimerViewController " )
18+
1619 let timerLabel = BSLabel ( )
1720 let startStopButton = BSButton ( type: . system)
1821 let goal : Goal
1922 var timingSince : Date ?
2023 var timer : Timer ?
2124 var units : String ?
2225 var accumulatedSeconds = 0
23-
26+
27+ private var idleTimer : Timer ?
28+ private var defaultBrightnessLevel : CGFloat = UIScreen . main. brightness
29+ private let dimmedBrightnessLevel : CGFloat = 0.2
30+ private let idleTimeout : TimeInterval = 10
31+
2432 init ( goal: Goal ) {
2533 self . goal = goal
2634 super. init ( nibName: nil , bundle: nil )
@@ -90,6 +98,16 @@ class TimerViewController: UIViewController {
9098 resetButton. setTitle ( " Reset " , for: . normal)
9199 }
92100
101+ override func viewWillDisappear( _ animated: Bool ) {
102+ super. viewWillDisappear ( animated)
103+
104+ logger. info ( " (re-)enabling app idle timer, restoring screen brightness " )
105+ UIApplication . shared. isIdleTimerDisabled = false
106+ UIScreen . main. brightness = defaultBrightnessLevel
107+ idleTimer? . invalidate ( )
108+ idleTimer = nil
109+ }
110+
93111 @objc func exitButtonPressed( ) {
94112 self . presentingViewController? . dismiss ( animated: true , completion: nil )
95113 }
@@ -115,6 +133,10 @@ class TimerViewController: UIViewController {
115133
116134 @objc func startStopButtonPressed( ) {
117135 if self . timingSince == nil {
136+ if accumulatedSeconds == 0 {
137+ logger. info ( " disabling app idle timer, keeping screen awake while timer running " )
138+ UIApplication . shared. isIdleTimerDisabled = true
139+ }
118140 self . timingSince = Date ( )
119141 self . startStopButton. setTitle ( " Stop " , for: . normal)
120142 self . timer = Timer . scheduledTimer ( timeInterval: 1 , target: self , selector: #selector( self . updateTimerLabel) , userInfo: nil , repeats: true )
@@ -125,6 +147,8 @@ class TimerViewController: UIViewController {
125147 self . timer = nil
126148 self . timingSince = nil
127149 }
150+
151+ resetIdleTimer ( )
128152 }
129153
130154 @objc func resetButtonPressed( ) {
@@ -134,6 +158,9 @@ class TimerViewController: UIViewController {
134158 self . timingSince = nil
135159 self . accumulatedSeconds = 0
136160 self . updateTimerLabel ( )
161+
162+ UIApplication . shared. isIdleTimerDisabled = false
163+ resetIdleTimer ( )
137164 }
138165
139166 func urtext( ) -> String {
@@ -198,4 +225,36 @@ class TimerViewController: UIViewController {
198225 }
199226 }
200227 }
228+
229+
230+ fileprivate func restoreBrightness( ) {
231+ guard UIScreen . main. brightness < defaultBrightnessLevel else { return }
232+
233+ UIScreen . main. brightness = defaultBrightnessLevel
234+ }
235+
236+ // Reset idle timer, call whenever the user interacts
237+ private func resetIdleTimer( ) {
238+ logger. info ( " restoring screen brightness and starting a new idle timer for screen dimming " )
239+
240+ idleTimer? . invalidate ( )
241+
242+ restoreBrightness ( )
243+
244+ idleTimer = Timer . scheduledTimer ( timeInterval: idleTimeout, target: self , selector: #selector( dimScreen) , userInfo: nil , repeats: false )
245+ }
246+
247+ @objc private func dimScreen( ) {
248+ logger. info ( " dimming screen " )
249+ UIScreen . main. brightness = dimmedBrightnessLevel
250+ }
251+
252+ // Detect touches on the VC to reset idle timer and brighten screen
253+ override func touchesBegan( _ touches: Set < UITouch > , with event: UIEvent ? ) {
254+ super. touchesBegan ( touches, with: event)
255+ logger. info ( " touch detected " )
256+ resetIdleTimer ( )
257+ }
258+
259+
201260}
0 commit comments