Add Granular Control for Volume/Brightness

This commit is contained in:
Hariharan Mudaliar 2025-11-06 23:54:25 +05:30
commit 1bdad16eff
3 changed files with 64 additions and 17 deletions

View file

@ -445,8 +445,11 @@ final class SystemBrightnessController {
private var brightnessAnimationStart: Float = 0
private var brightnessAnimationTarget: Float = 0
private var brightnessAnimationStartDate: Date?
private let brightnessAnimationDuration: TimeInterval = 0.18
private var currentBrightnessAnimationDuration: TimeInterval = 0.18
private let brightnessAnimationSteps = 10
private let minimumBrightnessAnimationDuration: TimeInterval = 0.08
private let maximumBrightnessAnimationDuration: TimeInterval = 0.3
private let brightnessAnimationDurationScale: TimeInterval = 1.6
private var lastEmittedBrightness: Float = 0.5
private init() {
@ -507,8 +510,9 @@ final class SystemBrightnessController {
brightnessAnimationStart = start
brightnessAnimationTarget = target
brightnessAnimationStartDate = Date()
currentBrightnessAnimationDuration = animationDuration(forDelta: abs(target - start))
let interval = brightnessAnimationDuration / Double(brightnessAnimationSteps)
let interval = currentBrightnessAnimationDuration / Double(brightnessAnimationSteps)
let timer = Timer(timeInterval: interval, repeats: true) { [weak self] timer in
guard let self else { return }
guard let startDate = self.brightnessAnimationStartDate else {
@ -517,7 +521,7 @@ final class SystemBrightnessController {
return
}
let elapsed = Date().timeIntervalSince(startDate)
let progress = min(elapsed / self.brightnessAnimationDuration, 1)
let progress = min(elapsed / self.currentBrightnessAnimationDuration, 1)
let eased = self.ease(progress)
let value = self.brightnessAnimationStart + (self.brightnessAnimationTarget - self.brightnessAnimationStart) * Float(eased)
self.applyBrightness(value)
@ -532,6 +536,11 @@ final class SystemBrightnessController {
timer.fire()
}
private func animationDuration(forDelta delta: Float) -> TimeInterval {
let scaled = minimumBrightnessAnimationDuration + TimeInterval(delta) * brightnessAnimationDurationScale
return min(maximumBrightnessAnimationDuration, max(minimumBrightnessAnimationDuration, scaled))
}
private func applyBrightness(_ value: Float) {
let clamped = max(0, min(1, value))
if setBrightnessViaDisplayServices(clamped) {