You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							153 lines
						
					
					
						
							5.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							153 lines
						
					
					
						
							5.1 KiB
						
					
					
				
								/**
							 | 
						|
								 * DailyNotificationPowerManager.swift
							 | 
						|
								 * Daily Notification Plugin for Capacitor
							 | 
						|
								 *
							 | 
						|
								 * Manages power state and battery optimization for notifications
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								import Foundation
							 | 
						|
								import UIKit
							 | 
						|
								import UserNotifications
							 | 
						|
								
							 | 
						|
								/// Manages power state and battery optimization for the notification plugin
							 | 
						|
								public class DailyNotificationPowerManager {
							 | 
						|
								    /// Shared instance for singleton access
							 | 
						|
								    public static let shared = DailyNotificationPowerManager()
							 | 
						|
								    
							 | 
						|
								    private var batteryLevel: Float = 1.0
							 | 
						|
								    private var isCharging = false
							 | 
						|
								    private var lastBatteryCheck: Date = Date()
							 | 
						|
								    private var powerState: UIDevice.BatteryState = .unknown
							 | 
						|
								    private var adaptiveSchedulingEnabled = true
							 | 
						|
								    
							 | 
						|
								    private init() {
							 | 
						|
								        setupBatteryMonitoring()
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    private func setupBatteryMonitoring() {
							 | 
						|
								        UIDevice.current.isBatteryMonitoringEnabled = true
							 | 
						|
								        updateBatteryStatus()
							 | 
						|
								        
							 | 
						|
								        NotificationCenter.default.addObserver(
							 | 
						|
								            self,
							 | 
						|
								            selector: #selector(batteryLevelDidChange),
							 | 
						|
								            name: UIDevice.batteryLevelDidChangeNotification,
							 | 
						|
								            object: nil
							 | 
						|
								        )
							 | 
						|
								        
							 | 
						|
								        NotificationCenter.default.addObserver(
							 | 
						|
								            self,
							 | 
						|
								            selector: #selector(batteryStateDidChange),
							 | 
						|
								            name: UIDevice.batteryStateDidChangeNotification,
							 | 
						|
								            object: nil
							 | 
						|
								        )
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    @objc private func batteryLevelDidChange() {
							 | 
						|
								        updateBatteryStatus()
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    @objc private func batteryStateDidChange() {
							 | 
						|
								        updateBatteryStatus()
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    private func updateBatteryStatus() {
							 | 
						|
								        batteryLevel = UIDevice.current.batteryLevel
							 | 
						|
								        isCharging = UIDevice.current.batteryState == .charging
							 | 
						|
								        powerState = UIDevice.current.batteryState
							 | 
						|
								        lastBatteryCheck = Date()
							 | 
						|
								        
							 | 
						|
								        DailyNotificationLogger.shared.log(
							 | 
						|
								            .debug,
							 | 
						|
								            "Battery status updated: \(Int(batteryLevel * 100))% (\(isCharging ? "charging" : "not charging"))"
							 | 
						|
								        )
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    /// Gets the current battery status
							 | 
						|
								    /// - Returns: Dictionary containing battery information
							 | 
						|
								    public func getBatteryStatus() -> [String: Any] {
							 | 
						|
								        return [
							 | 
						|
								            "level": Int(batteryLevel * 100),
							 | 
						|
								            "isCharging": isCharging,
							 | 
						|
								            "lastCheck": lastBatteryCheck.timeIntervalSince1970,
							 | 
						|
								            "powerState": getPowerStateString()
							 | 
						|
								        ]
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    /// Gets the current power state
							 | 
						|
								    /// - Returns: Dictionary containing power state information
							 | 
						|
								    public func getPowerState() -> [String: Any] {
							 | 
						|
								        return [
							 | 
						|
								            "powerState": getPowerStateString(),
							 | 
						|
								            "adaptiveScheduling": adaptiveSchedulingEnabled,
							 | 
						|
								            "batteryLevel": Int(batteryLevel * 100),
							 | 
						|
								            "isCharging": isCharging,
							 | 
						|
								            "lastCheck": lastBatteryCheck.timeIntervalSince1970
							 | 
						|
								        ]
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    /// Sets whether adaptive scheduling is enabled
							 | 
						|
								    /// - Parameter enabled: Whether to enable adaptive scheduling
							 | 
						|
								    public func setAdaptiveScheduling(_ enabled: Bool) {
							 | 
						|
								        adaptiveSchedulingEnabled = enabled
							 | 
						|
								        DailyNotificationLogger.shared.log(
							 | 
						|
								            .info,
							 | 
						|
								            "Adaptive scheduling \(enabled ? "enabled" : "disabled")"
							 | 
						|
								        )
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    /// Gets the appropriate scheduling interval based on battery level
							 | 
						|
								    /// - Returns: TimeInterval for scheduling
							 | 
						|
								    public func getSchedulingInterval() -> TimeInterval {
							 | 
						|
								        guard adaptiveSchedulingEnabled else {
							 | 
						|
								            return DailyNotificationConfig.SchedulingIntervals.normal
							 | 
						|
								        }
							 | 
						|
								        
							 | 
						|
								        let batteryPercentage = Int(batteryLevel * 100)
							 | 
						|
								        
							 | 
						|
								        switch batteryPercentage {
							 | 
						|
								        case ..<DailyNotificationConfig.BatteryThresholds.critical:
							 | 
						|
								            return DailyNotificationConfig.SchedulingIntervals.critical
							 | 
						|
								        case ..<DailyNotificationConfig.BatteryThresholds.low:
							 | 
						|
								            return DailyNotificationConfig.SchedulingIntervals.low
							 | 
						|
								        case ..<DailyNotificationConfig.BatteryThresholds.medium:
							 | 
						|
								            return DailyNotificationConfig.SchedulingIntervals.medium
							 | 
						|
								        default:
							 | 
						|
								            return DailyNotificationConfig.SchedulingIntervals.normal
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    /// Gets the appropriate wake lock duration based on battery level
							 | 
						|
								    /// - Returns: TimeInterval for wake lock
							 | 
						|
								    public func getWakeLockDuration() -> TimeInterval {
							 | 
						|
								        let batteryPercentage = Int(batteryLevel * 100)
							 | 
						|
								        
							 | 
						|
								        switch batteryPercentage {
							 | 
						|
								        case ..<DailyNotificationConfig.BatteryThresholds.critical:
							 | 
						|
								            return DailyNotificationConfig.WakeLockDurations.critical
							 | 
						|
								        case ..<DailyNotificationConfig.BatteryThresholds.low:
							 | 
						|
								            return DailyNotificationConfig.WakeLockDurations.low
							 | 
						|
								        default:
							 | 
						|
								            return DailyNotificationConfig.WakeLockDurations.normal
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    private func getPowerStateString() -> String {
							 | 
						|
								        switch powerState {
							 | 
						|
								        case .charging:
							 | 
						|
								            return "CHARGING"
							 | 
						|
								        case .full:
							 | 
						|
								            return "FULL"
							 | 
						|
								        case .unplugged:
							 | 
						|
								            return "UNPLUGGED"
							 | 
						|
								        case .unknown:
							 | 
						|
								            return "UNKNOWN"
							 | 
						|
								        @unknown default:
							 | 
						|
								            return "UNKNOWN"
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    deinit {
							 | 
						|
								        NotificationCenter.default.removeObserver(self)
							 | 
						|
								    }
							 | 
						|
								} 
							 |