healthd: Don't take device-scoped battery as the main system battery.

Some devices expose the battery state of stylus etc in sysfs,
in addition to the whole system's main battery. Android only
recognizes the first battery enumerated here. We need to
filter out such HID-specific battery to let Android correctly
monitor the main battery status.

Bug: 136111013
Test: CtsBatterySavingTestCases on arcada
Change-Id: I4cbf6e3bf883fb3d107bedd2849d8ad525538629
This commit is contained in:
Kazuhiro Inaba 2019-06-12 13:46:08 +09:00
parent 01c8eccca3
commit 8e4d982d52
2 changed files with 15 additions and 0 deletions

View file

@ -233,6 +233,15 @@ int BatteryMonitor::getIntField(const String8& path) {
return value;
}
bool BatteryMonitor::isScopedPowerSupply(const char* name) {
constexpr char kScopeDevice[] = "Device";
String8 path;
path.appendFormat("%s/%s/scope", POWER_SUPPLY_SYSFS_PATH, name);
std::string scope;
return (readFromFile(path, &scope) > 0 && scope == kScopeDevice);
}
void BatteryMonitor::updateValues(void) {
initHealthInfo(mHealthInfo.get());
@ -547,6 +556,11 @@ void BatteryMonitor::init(struct healthd_config *hc) {
break;
case ANDROID_POWER_SUPPLY_TYPE_BATTERY:
// Some devices expose the battery status of sub-component like
// stylus. Such a device-scoped battery info needs to be skipped
// in BatteryMonitor, which is intended to report the status of
// the battery supplying the power to the whole system.
if (isScopedPowerSupply(name)) continue;
mBatteryDevicePresent = true;
if (mHealthdConfig->batteryStatusPath.isEmpty()) {

View file

@ -78,6 +78,7 @@ class BatteryMonitor {
PowerSupplyType readPowerSupplyType(const String8& path);
bool getBooleanField(const String8& path);
int getIntField(const String8& path);
bool isScopedPowerSupply(const char* name);
};
}; // namespace android