Skip to content

Commit 8cb1085

Browse files
committed
keep screen on, albeit dimmed, with active timer on timer screen
fixes: #268
1 parent 5be8685 commit 8cb1085

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

BeeSwift/TimerViewController.swift

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,26 @@
99
import UIKit
1010
import SnapKit
1111
import MBProgressHUD
12+
import OSLog
1213

1314
import BeeKit
1415

1516
class 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

Comments
 (0)