Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Stasis/StatusBarManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ struct StatusBarContentView: View {
BatteryIndicatorView(
batteryLevel: viewModel.displayPercentage,
chargingMode: viewModel.chargingMode,
isLowPowerModeEnabled: viewModel.isLowPowerModeEnabled,
showPercentage: showPercentage,
showState: showState
)
Expand Down
18 changes: 18 additions & 0 deletions Stasis/ViewModels/MenuViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class MenuViewModel {
var systemPower: Double = 0
var powerSource: PowerSource = .battery
var isCharging: Bool = false
var isLowPowerModeEnabled: Bool = false

var chargeLimitOverrideActive: Bool { chargeManager.chargeLimitOverrideActive }
var forceDischargeActive: Bool { chargeManager.forceDischargeActive }
Expand All @@ -37,13 +38,15 @@ class MenuViewModel {
private var metricsObservation: Task<Void, Never>?
private var settingsObservation: Task<Void, Never>?
private var uptimeTask: Task<Void, Never>?
private var powerModeObservation: Task<Void, Never>?
Comment thread
srimanachanta marked this conversation as resolved.

init(batteryService: BatteryService, chargeManager: ChargeManager) {
self.batteryService = batteryService
self.chargeManager = chargeManager
self.bootTimestamp = SystemService.bootTimestamp()
startObservingMetrics()
startObservingSettings()
startObservingPowerMode()
}

private func startObservingMetrics() {
Expand Down Expand Up @@ -80,6 +83,20 @@ class MenuViewModel {
}
}

private func startObservingPowerMode() {
isLowPowerModeEnabled = ProcessInfo.processInfo.isLowPowerModeEnabled

powerModeObservation = Task { [weak self] in
let notifications = NotificationCenter.default.notifications(
named: .NSProcessInfoPowerStateDidChange,
object: ProcessInfo.processInfo
)
for await _ in notifications {
self?.isLowPowerModeEnabled = ProcessInfo.processInfo.isLowPowerModeEnabled
}
}
}

Comment thread
srimanachanta marked this conversation as resolved.
func toggleChargeLimitOverride() {
chargeManager.toggleChargeLimitOverride()
}
Expand Down Expand Up @@ -217,6 +234,7 @@ class MenuViewModel {
metricsObservation?.cancel()
settingsObservation?.cancel()
uptimeTask?.cancel()
powerModeObservation?.cancel()
}
}
}
27 changes: 27 additions & 0 deletions Stasis/Views/BatteryIndicatorView.swift
Comment thread
srimanachanta marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@ import SwiftUI
struct BatteryIndicatorView: View {
let batteryLevel: Int
let chargingMode: ChargingMode
var isLowPowerModeEnabled: Bool = false
var showPercentage: Bool = false
var showState: Bool = false

private var fillColor: Color {
// Critical level takes priority over Low Power Mode.
if showState && batteryLevel <= 10 {
return .red
}
if isLowPowerModeEnabled {
return .yellow
}
return .primary
}

Comment thread
srimanachanta marked this conversation as resolved.
Expand Down Expand Up @@ -118,6 +123,28 @@ struct BatteryTerminal: View {
)
}
}

Divider()

Text("Low Power Mode (yellow; critical red takes priority)")
.font(.caption)
.foregroundStyle(.secondary)

ForEach([100, 50, 10, 5], id: \.self) { level in
HStack(spacing: 20) {
BatteryIndicatorView(
batteryLevel: level,
chargingMode: .discharging,
isLowPowerModeEnabled: true,
showState: true
)
BatteryIndicatorView(
batteryLevel: level,
chargingMode: .charging,
isLowPowerModeEnabled: true
)
}
}
}
.padding()
.background(Color(NSColor.windowBackgroundColor))
Expand Down