1import * as Battery from 'expo-battery';
2import * as React from 'react';
3import { ScrollView } from 'react-native';
4
5import MonoText from '../components/MonoText';
6
7export default function BatteryScreen() {
8  const [isAvailable, setIsAvailable] = React.useState<boolean | null>(null);
9  const [batteryLevel, setBatteryLevel] = React.useState(-1);
10  const [batteryState, setBatteryState] = React.useState(Battery.BatteryState.UNKNOWN);
11  const [lowPowerMode, setLowPowerMode] = React.useState(false);
12  const [batteryOptimizationState, setBatteryOptimizationState] = React.useState(false);
13
14  React.useEffect(() => {
15    (async () => {
16      const [isAvailable, batteryLevel, batteryState, lowPowerMode, batteryOptimizationState] =
17        await Promise.all([
18          Battery.isAvailableAsync(),
19          Battery.getBatteryLevelAsync(),
20          Battery.getBatteryStateAsync(),
21          Battery.isLowPowerModeEnabledAsync(),
22          Battery.isBatteryOptimizationEnabledAsync(),
23        ]);
24
25      setIsAvailable(isAvailable || false);
26      setBatteryLevel(batteryLevel);
27      setBatteryState(batteryState);
28      setLowPowerMode(lowPowerMode);
29      setBatteryOptimizationState(batteryOptimizationState);
30    })();
31    const batteryLevelListener = Battery.addBatteryLevelListener(({ batteryLevel }) =>
32      setBatteryLevel(batteryLevel)
33    );
34    const batteryStateListener = Battery.addBatteryStateListener(({ batteryState }) =>
35      setBatteryState(batteryState)
36    );
37    const lowPowerModeListener = Battery.addLowPowerModeListener(({ lowPowerMode }) =>
38      setLowPowerMode(lowPowerMode)
39    );
40    return () => {
41      batteryLevelListener && batteryLevelListener.remove();
42      batteryStateListener && batteryStateListener.remove();
43      lowPowerModeListener && lowPowerModeListener.remove();
44    };
45  }, []);
46
47  return (
48    <ScrollView style={{ padding: 10 }}>
49      <MonoText>
50        {isAvailable
51          ? JSON.stringify(
52              {
53                batteryLevel,
54                batteryState: getBatteryStateString(batteryState),
55                lowPowerMode,
56                batteryOptimizationState,
57              },
58              null,
59              2
60            )
61          : 'Battery API is not supported on this device'}
62      </MonoText>
63    </ScrollView>
64  );
65}
66
67function getBatteryStateString(batteryState: Battery.BatteryState): string {
68  switch (batteryState) {
69    case Battery.BatteryState.UNPLUGGED:
70      return 'UNPLUGGED';
71    case Battery.BatteryState.CHARGING:
72      return 'CHARGING';
73    case Battery.BatteryState.FULL:
74      return 'FULL';
75    case Battery.BatteryState.UNKNOWN:
76    default:
77      return 'UNKNOWN';
78  }
79}
80