1 import ABI49_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 {
definitionnull8   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
batteryLevelListenernull71   func batteryLevelListener() {
72     sendEvent(batteryLevelDidChange, [
73       "batteryLevel": UIDevice.current.batteryLevel
74     ])
75   }
76 
77   @objc
batteryStateListenernull78   func batteryStateListener() {
79     sendEvent(batteryStateDidChange, [
80       "batteryState": UIDevice.current.batteryState.rawValue
81     ])
82   }
83 
84   @objc
powerModeListenernull85   func powerModeListener() {
86     sendEvent(powerModeDidChange, [
87       "lowPowerMode": ProcessInfo.processInfo.isLowPowerModeEnabled
88     ])
89   }
90 }
91 
isSupportednull92 func isSupported() -> Bool {
93   #if targetEnvironment(simulator)
94     return false
95   #else
96     return true
97   #endif
98 }
99