1 import ABI47_0_0ExpoModulesCore 2 3 let batteryLevelDidChange: String = "Expo.batteryLevelDidChange" 4 let batteryStateDidChange: String = "Expo.batteryStateDidChange" 5 let powerModeDidChange: String = "Expo.powerModeDidChange" 6 7 public class BatteryModule: Module { 8 public func definition() -> ModuleDefinition { 9 Name("ExpoBattery") 10 11 Constants([ 12 "isSupported": isSupported() 13 ]) 14 15 Events(batteryLevelDidChange, batteryStateDidChange, powerModeDidChange) 16 17 AsyncFunction("getBatteryLevelAsync") { () -> Float in 18 return UIDevice.current.batteryLevel 19 } 20 21 AsyncFunction("isLowPowerModeEnabledAsync") { () -> Bool in 22 return ProcessInfo.processInfo.isLowPowerModeEnabled 23 } 24 25 AsyncFunction("getBatteryStateAsync") { () -> Int in 26 // Apple's enum values directly correspond to Expo's 27 // enum values for battery state and are in sync, so 28 // we can return the rawValue from Apple's enum directly 29 return UIDevice.current.batteryState.rawValue 30 } 31 32 OnCreate { 33 UIDevice.current.isBatteryMonitoringEnabled = true 34 } 35 36 OnDestroy { 37 UIDevice.current.isBatteryMonitoringEnabled = false 38 } 39 40 OnStartObserving { 41 NotificationCenter.default.addObserver( 42 self, 43 selector: #selector(self.batteryLevelListener), 44 name: UIDevice.batteryLevelDidChangeNotification, 45 object: nil 46 ) 47 48 NotificationCenter.default.addObserver( 49 self, 50 selector: #selector(self.batteryStateListener), 51 name: UIDevice.batteryStateDidChangeNotification, 52 object: nil 53 ) 54 55 NotificationCenter.default.addObserver( 56 self, 57 selector: #selector(self.powerModeListener), 58 name: Notification.Name.NSProcessInfoPowerStateDidChange, 59 object: nil 60 ) 61 } 62 63 OnStopObserving { 64 NotificationCenter.default.removeObserver(self, name: UIDevice.batteryLevelDidChangeNotification, object: nil) 65 NotificationCenter.default.removeObserver(self, name: UIDevice.batteryStateDidChangeNotification, object: nil) 66 NotificationCenter.default.removeObserver(self, name: Notification.Name.NSProcessInfoPowerStateDidChange, object: nil) 67 } 68 } 69 70 @objc 71 func batteryLevelListener() { 72 sendEvent(batteryLevelDidChange, [ 73 "batteryLevel": UIDevice.current.batteryLevel 74 ]) 75 } 76 77 @objc 78 func batteryStateListener() { 79 sendEvent(batteryStateDidChange, [ 80 "batteryState": UIDevice.current.batteryState.rawValue 81 ]) 82 } 83 84 @objc 85 func powerModeListener() { 86 sendEvent(powerModeDidChange, [ 87 "lowPowerMode": ProcessInfo.processInfo.isLowPowerModeEnabled 88 ]) 89 } 90 } 91 92 func isSupported() -> Bool { 93 #if targetEnvironment(simulator) 94 return false 95 #else 96 return true 97 #endif 98 } 99