summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Prabir Pradhan <prabirmsp@google.com> 2022-09-12 20:33:30 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-09-12 20:33:30 +0000
commitc3c475ee6aacdfd7dd9aebe81fa8f14a17f2ffe6 (patch)
tree7c59f2af4d7a1f4a5cbe09434cf90ae42db4ba70
parent8e36439d3c16216a21de9eec6781c2917a11758f (diff)
parente287ecd5ff7aa2212e9ab28e3176bea5f4aab5b9 (diff)
Merge "Add pipeline to get the sysfs path for an InputDevice's battery"
-rw-r--r--services/inputflinger/include/InputReaderBase.h2
-rw-r--r--services/inputflinger/reader/EventHub.cpp4
-rw-r--r--services/inputflinger/reader/InputReader.cpp32
-rw-r--r--services/inputflinger/reader/include/InputReader.h2
-rw-r--r--services/inputflinger/tests/InputReader_test.cpp23
-rw-r--r--services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp5
6 files changed, 63 insertions, 5 deletions
diff --git a/services/inputflinger/include/InputReaderBase.h b/services/inputflinger/include/InputReaderBase.h
index 44424597f8..cacb63cb8b 100644
--- a/services/inputflinger/include/InputReaderBase.h
+++ b/services/inputflinger/include/InputReaderBase.h
@@ -113,6 +113,8 @@ public:
virtual std::optional<int32_t> getBatteryCapacity(int32_t deviceId) = 0;
/* Get battery status of a particular input device. */
virtual std::optional<int32_t> getBatteryStatus(int32_t deviceId) = 0;
+ /* Get the device path for the battery of an input device. */
+ virtual std::optional<std::string> getBatteryDevicePath(int32_t deviceId) = 0;
virtual std::vector<InputDeviceLightInfo> getLights(int32_t deviceId) = 0;
diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp
index ff0b9a5f7e..c9d21dc573 100644
--- a/services/inputflinger/reader/EventHub.cpp
+++ b/services/inputflinger/reader/EventHub.cpp
@@ -1555,7 +1555,7 @@ std::optional<int32_t> EventHub::getBatteryCapacity(int32_t deviceId, int32_t ba
// the lock to prevent event processing from being blocked by this call.
std::scoped_lock _l(mLock);
- const auto infos = getBatteryInfoLocked(deviceId);
+ const auto& infos = getBatteryInfoLocked(deviceId);
auto it = infos.find(batteryId);
if (it == infos.end()) {
return std::nullopt;
@@ -1596,7 +1596,7 @@ std::optional<int32_t> EventHub::getBatteryStatus(int32_t deviceId, int32_t batt
// the lock to prevent event processing from being blocked by this call.
std::scoped_lock _l(mLock);
- const auto infos = getBatteryInfoLocked(deviceId);
+ const auto& infos = getBatteryInfoLocked(deviceId);
auto it = infos.find(batteryId);
if (it == infos.end()) {
return std::nullopt;
diff --git a/services/inputflinger/reader/InputReader.cpp b/services/inputflinger/reader/InputReader.cpp
index 4750d90fd6..4c38ce81b6 100644
--- a/services/inputflinger/reader/InputReader.cpp
+++ b/services/inputflinger/reader/InputReader.cpp
@@ -721,7 +721,10 @@ std::optional<int32_t> InputReader::getBatteryCapacity(int32_t deviceId) {
if (!eventHubId) return {};
const auto batteryIds = mEventHub->getRawBatteryIds(*eventHubId);
- if (batteryIds.empty()) return {};
+ if (batteryIds.empty()) {
+ ALOGW("%s: There are no battery ids for EventHub device %d", __func__, *eventHubId);
+ return {};
+ }
return mEventHub->getBatteryCapacity(*eventHubId, batteryIds.front());
}
@@ -741,10 +744,35 @@ std::optional<int32_t> InputReader::getBatteryStatus(int32_t deviceId) {
if (!eventHubId) return {};
const auto batteryIds = mEventHub->getRawBatteryIds(*eventHubId);
- if (batteryIds.empty()) return {};
+ if (batteryIds.empty()) {
+ ALOGW("%s: There are no battery ids for EventHub device %d", __func__, *eventHubId);
+ return {};
+ }
return mEventHub->getBatteryStatus(*eventHubId, batteryIds.front());
}
+std::optional<std::string> InputReader::getBatteryDevicePath(int32_t deviceId) {
+ std::scoped_lock _l(mLock);
+
+ InputDevice* device = findInputDeviceLocked(deviceId);
+ if (!device) return {};
+
+ std::optional<int32_t> eventHubId = device->getBatteryEventHubId();
+ if (!eventHubId) return {};
+ const auto batteryIds = mEventHub->getRawBatteryIds(*eventHubId);
+ if (batteryIds.empty()) {
+ ALOGW("%s: There are no battery ids for EventHub device %d", __func__, *eventHubId);
+ return {};
+ }
+ const auto batteryInfo = mEventHub->getRawBatteryInfo(*eventHubId, batteryIds.front());
+ if (!batteryInfo) {
+ ALOGW("%s: Failed to get RawBatteryInfo for battery %d of EventHub device %d", __func__,
+ batteryIds.front(), *eventHubId);
+ return {};
+ }
+ return batteryInfo->path;
+}
+
std::vector<InputDeviceLightInfo> InputReader::getLights(int32_t deviceId) {
std::scoped_lock _l(mLock);
diff --git a/services/inputflinger/reader/include/InputReader.h b/services/inputflinger/reader/include/InputReader.h
index 24194a73fe..fbce87f9a7 100644
--- a/services/inputflinger/reader/include/InputReader.h
+++ b/services/inputflinger/reader/include/InputReader.h
@@ -99,6 +99,8 @@ public:
std::optional<int32_t> getBatteryStatus(int32_t deviceId) override;
+ std::optional<std::string> getBatteryDevicePath(int32_t deviceId) override;
+
std::vector<InputDeviceLightInfo> getLights(int32_t deviceId) override;
std::vector<InputDeviceSensorInfo> getSensors(int32_t deviceId) override;
diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp
index 19a7d86233..ee6993ced0 100644
--- a/services/inputflinger/tests/InputReader_test.cpp
+++ b/services/inputflinger/tests/InputReader_test.cpp
@@ -81,6 +81,7 @@ static constexpr int32_t THIRD_TRACKING_ID = 2;
static constexpr int32_t DEFAULT_BATTERY = 1;
static constexpr int32_t BATTERY_STATUS = 4;
static constexpr int32_t BATTERY_CAPACITY = 66;
+static const std::string BATTERY_DEVPATH = "/sys/devices/mydevice/power_supply/mybattery";
static constexpr int32_t LIGHT_BRIGHTNESS = 0x55000000;
static constexpr int32_t LIGHT_COLOR = 0x7F448866;
static constexpr int32_t LIGHT_PLAYER_ID = 2;
@@ -1017,7 +1018,12 @@ private:
std::optional<RawBatteryInfo> getRawBatteryInfo(int32_t deviceId,
int32_t batteryId) const override {
- return std::nullopt;
+ if (batteryId != DEFAULT_BATTERY) return {};
+ static const auto BATTERY_INFO = RawBatteryInfo{.id = DEFAULT_BATTERY,
+ .name = "default battery",
+ .flags = InputBatteryClass::CAPACITY,
+ .path = BATTERY_DEVPATH};
+ return BATTERY_INFO;
}
std::vector<int32_t> getRawLightIds(int32_t deviceId) const override {
@@ -2235,6 +2241,21 @@ TEST_F(InputReaderTest, BatteryGetStatus) {
ASSERT_EQ(mReader->getBatteryStatus(deviceId), BATTERY_STATUS);
}
+TEST_F(InputReaderTest, BatteryGetDevicePath) {
+ constexpr int32_t deviceId = END_RESERVED_ID + 1000;
+ ftl::Flags<InputDeviceClass> deviceClass =
+ InputDeviceClass::KEYBOARD | InputDeviceClass::BATTERY;
+ constexpr int32_t eventHubId = 1;
+ const char* DEVICE_LOCATION = "BLUETOOTH";
+ std::shared_ptr<InputDevice> device = mReader->newDevice(deviceId, "fake", DEVICE_LOCATION);
+ device->addController<FakePeripheralController>(eventHubId);
+ mReader->pushNextDevice(device);
+
+ ASSERT_NO_FATAL_FAILURE(addDevice(eventHubId, "fake", deviceClass, nullptr));
+
+ ASSERT_EQ(mReader->getBatteryDevicePath(deviceId), BATTERY_DEVPATH);
+}
+
TEST_F(InputReaderTest, LightGetColor) {
constexpr int32_t deviceId = END_RESERVED_ID + 1000;
ftl::Flags<InputDeviceClass> deviceClass = InputDeviceClass::KEYBOARD | InputDeviceClass::LIGHT;
diff --git a/services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp b/services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp
index f15d871403..f5bd29763e 100644
--- a/services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp
+++ b/services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp
@@ -107,6 +107,10 @@ public:
return reader->getBatteryStatus(deviceId);
}
+ std::optional<std::string> getBatteryDevicePath(int32_t deviceId) {
+ return reader->getBatteryDevicePath(deviceId);
+ }
+
std::vector<InputDeviceLightInfo> getLights(int32_t deviceId) {
return reader->getLights(deviceId);
}
@@ -232,6 +236,7 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t* data, size_t size) {
},
[&]() -> void { reader->getBatteryCapacity(fdp->ConsumeIntegral<int32_t>()); },
[&]() -> void { reader->getBatteryStatus(fdp->ConsumeIntegral<int32_t>()); },
+ [&]() -> void { reader->getBatteryDevicePath(fdp->ConsumeIntegral<int32_t>()); },
[&]() -> void { reader->getLights(fdp->ConsumeIntegral<int32_t>()); },
[&]() -> void { reader->getSensors(fdp->ConsumeIntegral<int32_t>()); },
[&]() -> void {