Atoll/DynamicIsland/managers/SystemHUDManager.swift
Hariharan Mudaliar 9fa16b8c35 OSDUHelper disabler
2025-10-07 01:23:16 +05:30

202 lines
No EOL
6.7 KiB
Swift

//
// SystemHUDManager.swift
// DynamicIsland
//
// Created by GitHub Copilot on 06/09/25.
//
import Foundation
import Defaults
import Combine
class SystemHUDManager {
static let shared = SystemHUDManager()
private var changesObserver: SystemChangesObserver?
private weak var coordinator: DynamicIslandViewCoordinator?
private var isSetupComplete = false
private var isSystemOperationInProgress = false
private init() {
// Set up observer for settings changes
setupSettingsObserver()
}
private func setupSettingsObserver() {
// Observe master toggle
Defaults.publisher(.enableSystemHUD, options: []).sink { [weak self] change in
guard let self = self, self.isSetupComplete else {
return
}
Task { @MainActor in
if change.newValue {
await self.startSystemHUD()
} else {
await self.stopSystemHUD()
}
}
}.store(in: &cancellables)
// Observe individual HUD toggles
Defaults.publisher(.enableVolumeHUD, options: []).sink { [weak self] change in
guard let self = self, self.isSetupComplete, Defaults[.enableSystemHUD] else {
return
}
// When volume HUD is enabled, ensure OSD is disabled
if change.newValue {
self.disableSystemHUD()
}
}.store(in: &cancellables)
Defaults.publisher(.enableBrightnessHUD, options: []).sink { [weak self] change in
guard let self = self, self.isSetupComplete, Defaults[.enableSystemHUD] else {
return
}
// When brightness HUD is enabled, ensure OSD is disabled
if change.newValue {
self.disableSystemHUD()
}
}.store(in: &cancellables)
}
private var cancellables = Set<AnyCancellable>()
private var osdMonitorTimer: Timer?
/// Public property to check if system operations are in progress
var isOperationInProgress: Bool {
return isSystemOperationInProgress
}
func setup(coordinator: DynamicIslandViewCoordinator) {
self.coordinator = coordinator
if Defaults[.enableSystemHUD] {
Task { @MainActor in
await startSystemHUD()
self.isSetupComplete = true
}
} else {
isSetupComplete = true
}
}
@MainActor
private func startSystemHUD() async {
guard let coordinator = coordinator, !isSystemOperationInProgress else { return }
isSystemOperationInProgress = true
await stopSystemHUD() // Stop any existing observer
changesObserver = SystemChangesObserver(coordinator: coordinator)
changesObserver?.startObserving()
// Disable system HUD if possible
disableSystemHUD()
// Start periodic monitoring to ensure OSD stays disabled
startOSDMonitoring()
print("System HUD replacement started")
isSystemOperationInProgress = false
}
@MainActor
private func stopSystemHUD() async {
guard !isSystemOperationInProgress else { return }
isSystemOperationInProgress = true
changesObserver?.stopObserving()
changesObserver = nil
// Stop OSD monitoring
stopOSDMonitoring()
// Re-enable system HUD
enableOriginalSystemHUD()
print("System HUD replacement stopped")
isSystemOperationInProgress = false
}
private func disableSystemHUD() {
print("🔇 Disabling system HUD (OSDUIHelper running: \(SystemOSDManager.isOSDUIHelperRunning()))")
// Disable the system HUD using SystemOSDManager
SystemOSDManager.disableSystemHUD()
}
private func enableOriginalSystemHUD() {
print("🔊 Re-enabling system HUD (OSDUIHelper running: \(SystemOSDManager.isOSDUIHelperRunning()))")
// Re-enable the system HUD using SystemOSDManager
SystemOSDManager.enableSystemHUD()
// Check status after a reasonable delay, using async to avoid blocking
Task {
try await Task.sleep(nanoseconds: 2_000_000_000) // 2 seconds instead of 1
let isRunning = await SystemOSDManager.isOSDUIHelperRunningAsync()
print("🔍 OSDUIHelper status after re-enable: \(isRunning ? "✅ Running" : "❌ Not running")")
}
}
// MARK: - Media Key Event Handling
/// Handle volume key press events from MediaKeyApplication
public func handleVolumeKeyEvent() {
changesObserver?.handleVolumeKeyEvent()
}
/// Handle brightness key press events from MediaKeyApplication
public func handleBrightnessKeyEvent() {
changesObserver?.handleBrightnessKeyEvent()
}
// MARK: - OSD Monitoring
/// Start periodic monitoring to ensure OSD stays disabled
@MainActor
private func startOSDMonitoring() {
stopOSDMonitoring() // Stop any existing timer
osdMonitorTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) { [weak self] _ in
guard let self = self else { return }
// Check if any HUD is enabled
let anyHUDEnabled = Defaults[.enableVolumeHUD] || Defaults[.enableBrightnessHUD]
guard anyHUDEnabled else { return }
// Check if OSD is running when it shouldn't be
Task.detached(priority: .background) {
let isRunning = await SystemOSDManager.isOSDUIHelperRunningAsync()
if isRunning {
await MainActor.run {
print("⚠️ OSDUIHelper detected running while HUDs are enabled - re-disabling")
self.disableSystemHUD()
}
}
}
}
print("✅ OSD monitoring started (checks every 5 seconds)")
}
/// Stop OSD monitoring
@MainActor
private func stopOSDMonitoring() {
osdMonitorTimer?.invalidate()
osdMonitorTimer = nil
print("🛑 OSD monitoring stopped")
}
deinit {
cancellables.removeAll()
Task { @MainActor in
await stopSystemHUD()
}
// Emergency restore is available via SystemHUDManager.emergencyRestoreSystemHUD() if needed
}
/// Emergency restore function - call this if system HUD is not working
public static func emergencyRestoreSystemHUD() {
print("🚨 Emergency system HUD restore initiated")
SystemHUDDebugger.forceRestartOSDUIHelper()
}
}