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