feat(ios): implement getPowerState, requestBatteryOptimizationExemption, and setAdaptiveScheduling methods

Implemented power and scheduling utility methods:

getPowerState():
- Returns power state code (0=unknown, 1=unplugged, 2=charging, 3=full)
- Returns isOptimizationExempt (always false on iOS)
- Uses UIDevice battery monitoring

requestBatteryOptimizationExemption():
- No-op on iOS (battery optimization not applicable)
- Exists for API compatibility with Android
- Background App Refresh is user-controlled in Settings

setAdaptiveScheduling():
- Enables/disables adaptive scheduling
- Stores setting in UserDefaults
- Matches Android behavior

iOS Adaptations:
- Battery optimization not applicable (Background App Refresh is system setting)
- Power state derived from battery state
- Adaptive scheduling stored in UserDefaults

Progress: 24/52 methods implemented (46% complete)
This commit is contained in:
Matthew Raymer
2025-11-11 02:10:39 -08:00
parent d2b1ab07cd
commit ca40b971c5

View File

@@ -922,6 +922,96 @@ public class DailyNotificationPlugin: CAPPlugin {
}
}
/**
* Get power state
*
* Returns power state information.
*
* Equivalent to Android's getPowerState method.
*/
@objc func getPowerState(_ call: CAPPluginCall) {
print("DNP-PLUGIN: Getting power state")
// iOS doesn't have battery optimization like Android
// Background App Refresh is the closest equivalent, but we can't check it directly
let isOptimizationExempt = false
// Get battery state for power state code
UIDevice.current.isBatteryMonitoringEnabled = true
let batteryState = UIDevice.current.batteryState
// Map battery state to power state code (same as getBatteryStatus)
let powerState: Int
switch batteryState {
case .unknown:
powerState = 0
case .unplugged:
powerState = 1
case .charging:
powerState = 2
case .full:
powerState = 3
@unknown default:
powerState = 0
}
let result: [String: Any] = [
"powerState": powerState,
"isOptimizationExempt": isOptimizationExempt
]
print("DNP-PLUGIN: Power state: \(powerState), optimizationExempt=\(isOptimizationExempt)")
call.resolve(result)
}
/**
* Request battery optimization exemption
*
* On iOS, this is a no-op as iOS doesn't have battery optimization settings
* like Android. Background App Refresh is controlled by the user in Settings.
*
* Equivalent to Android's requestBatteryOptimizationExemption method.
*/
@objc func requestBatteryOptimizationExemption(_ call: CAPPluginCall) {
print("DNP-PLUGIN: Requesting battery optimization exemption (iOS: no-op)")
// iOS doesn't have battery optimization exemption like Android
// Background App Refresh is a system setting that users control
// We can't programmatically request exemption on iOS
// This method exists for API compatibility but does nothing
call.resolve()
}
/**
* Set adaptive scheduling
*
* Enables or disables adaptive scheduling features.
*
* Equivalent to Android's setAdaptiveScheduling method.
*/
@objc func setAdaptiveScheduling(_ call: CAPPluginCall) {
guard let options = call.options else {
call.reject("Options are required")
return
}
guard let enabled = options["enabled"] as? Bool else {
call.reject("enabled boolean is required")
return
}
print("DNP-PLUGIN: Setting adaptive scheduling: enabled=\(enabled)")
// Store adaptive scheduling setting in UserDefaults
UserDefaults.standard.set(enabled, forKey: "DailyNotificationAdaptiveScheduling")
UserDefaults.standard.synchronize()
print("DNP-PLUGIN: Adaptive scheduling set successfully")
call.resolve()
}
// MARK: - Private Implementation Methods
private func setupBackgroundTasks() {