diff options
13 files changed, 101 insertions, 114 deletions
diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp index fe70a51b81..65583e95bf 100644 --- a/services/inputflinger/reader/EventHub.cpp +++ b/services/inputflinger/reader/EventHub.cpp @@ -998,26 +998,23 @@ std::optional<PropertyMap> EventHub::getConfiguration(int32_t deviceId) const { return *device->configuration; } -status_t EventHub::getAbsoluteAxisInfo(int32_t deviceId, int axis, - RawAbsoluteAxisInfo* outAxisInfo) const { - outAxisInfo->clear(); +std::optional<RawAbsoluteAxisInfo> EventHub::getAbsoluteAxisInfo(int32_t deviceId, int axis) const { if (axis < 0 || axis > ABS_MAX) { - return NAME_NOT_FOUND; + return std::nullopt; } std::scoped_lock _l(mLock); const Device* device = getDeviceLocked(deviceId); if (device == nullptr) { - return NAME_NOT_FOUND; + return std::nullopt; } // We can read the RawAbsoluteAxisInfo even if the device is disabled and doesn't have a valid // fd, because the info is populated once when the device is first opened, and it doesn't change // throughout the device lifecycle. auto it = device->absState.find(axis); if (it == device->absState.end()) { - return NAME_NOT_FOUND; + return std::nullopt; } - *outAxisInfo = it->second.info; - return OK; + return it->second.info; } bool EventHub::hasRelativeAxis(int32_t deviceId, int axis) const { @@ -1130,22 +1127,20 @@ int32_t EventHub::getSwitchState(int32_t deviceId, int32_t sw) const { return device->swState.test(sw) ? AKEY_STATE_DOWN : AKEY_STATE_UP; } -status_t EventHub::getAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t* outValue) const { - *outValue = 0; +std::optional<int32_t> EventHub::getAbsoluteAxisValue(int32_t deviceId, int32_t axis) const { if (axis < 0 || axis > ABS_MAX) { - return NAME_NOT_FOUND; + return std::nullopt; } std::scoped_lock _l(mLock); const Device* device = getDeviceLocked(deviceId); if (device == nullptr || !device->hasValidFd()) { - return NAME_NOT_FOUND; + return std::nullopt; } const auto it = device->absState.find(axis); if (it == device->absState.end()) { - return NAME_NOT_FOUND; + return std::nullopt; } - *outValue = it->second.value; - return OK; + return it->second.value; } base::Result<std::vector<int32_t>> EventHub::getMtSlotValues(int32_t deviceId, int32_t axis, diff --git a/services/inputflinger/reader/include/EventHub.h b/services/inputflinger/reader/include/EventHub.h index 7cf584df78..2a4346694a 100644 --- a/services/inputflinger/reader/include/EventHub.h +++ b/services/inputflinger/reader/include/EventHub.h @@ -21,6 +21,7 @@ #include <filesystem> #include <functional> #include <map> +#include <optional> #include <ostream> #include <string> #include <unordered_map> @@ -278,8 +279,8 @@ public: */ virtual std::optional<PropertyMap> getConfiguration(int32_t deviceId) const = 0; - virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, - RawAbsoluteAxisInfo* outAxisInfo) const = 0; + virtual std::optional<RawAbsoluteAxisInfo> getAbsoluteAxisInfo(int32_t deviceId, + int axis) const = 0; virtual bool hasRelativeAxis(int32_t deviceId, int axis) const = 0; @@ -339,8 +340,7 @@ public: virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const = 0; virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const = 0; virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const = 0; - virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, - int32_t* outValue) const = 0; + virtual std::optional<int32_t> getAbsoluteAxisValue(int32_t deviceId, int32_t axis) const = 0; /* Query Multi-Touch slot values for an axis. Returns error or an 1 indexed array of size * (slotCount + 1). The value at the 0 index is set to queried axis. */ virtual base::Result<std::vector<int32_t>> getMtSlotValues(int32_t deviceId, int32_t axis, @@ -511,8 +511,8 @@ public: std::optional<PropertyMap> getConfiguration(int32_t deviceId) const override final; - status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, - RawAbsoluteAxisInfo* outAxisInfo) const override final; + std::optional<RawAbsoluteAxisInfo> getAbsoluteAxisInfo(int32_t deviceId, + int axis) const override final; bool hasRelativeAxis(int32_t deviceId, int axis) const override final; @@ -559,8 +559,8 @@ public: int32_t getSwitchState(int32_t deviceId, int32_t sw) const override final; int32_t getKeyCodeForKeyLocation(int32_t deviceId, int32_t locationKeyCode) const override final; - status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, - int32_t* outValue) const override final; + std::optional<int32_t> getAbsoluteAxisValue(int32_t deviceId, + int32_t axis) const override final; base::Result<std::vector<int32_t>> getMtSlotValues(int32_t deviceId, int32_t axis, size_t slotCount) const override final; diff --git a/services/inputflinger/reader/include/InputDevice.h b/services/inputflinger/reader/include/InputDevice.h index 2a7e262bf5..7fd55973c7 100644 --- a/services/inputflinger/reader/include/InputDevice.h +++ b/services/inputflinger/reader/include/InputDevice.h @@ -306,9 +306,11 @@ public: return mEventHub->getDeviceControllerNumber(mId); } inline status_t getAbsoluteAxisInfo(int32_t code, RawAbsoluteAxisInfo* axisInfo) const { - if (const auto status = mEventHub->getAbsoluteAxisInfo(mId, code, axisInfo); status != OK) { - return status; + std::optional<RawAbsoluteAxisInfo> info = mEventHub->getAbsoluteAxisInfo(mId, code); + if (!info.has_value()) { + return NAME_NOT_FOUND; } + *axisInfo = *info; // Validate axis info for InputDevice. if (axisInfo->valid && axisInfo->minValue == axisInfo->maxValue) { @@ -379,8 +381,8 @@ public: return mEventHub->getKeyCodeForKeyLocation(mId, locationKeyCode); } inline int32_t getSwitchState(int32_t sw) const { return mEventHub->getSwitchState(mId, sw); } - inline status_t getAbsoluteAxisValue(int32_t code, int32_t* outValue) const { - return mEventHub->getAbsoluteAxisValue(mId, code, outValue); + inline std::optional<int32_t> getAbsoluteAxisValue(int32_t code) const { + return mEventHub->getAbsoluteAxisValue(mId, code); } inline base::Result<std::vector<int32_t>> getMtSlotValues(int32_t axis, size_t slotCount) const { @@ -432,9 +434,8 @@ public: } inline bool hasAbsoluteAxis(int32_t code) const { - RawAbsoluteAxisInfo info; - mEventHub->getAbsoluteAxisInfo(mId, code, &info); - return info.valid; + std::optional<RawAbsoluteAxisInfo> info = mEventHub->getAbsoluteAxisInfo(mId, code); + return info.has_value() && info->valid; } inline bool isKeyPressed(int32_t scanCode) const { return mEventHub->getScanCodeState(mId, scanCode) == AKEY_STATE_DOWN; @@ -442,11 +443,6 @@ public: inline bool isKeyCodePressed(int32_t keyCode) const { return mEventHub->getKeyCodeState(mId, keyCode) == AKEY_STATE_DOWN; } - inline int32_t getAbsoluteAxisValue(int32_t code) const { - int32_t value; - mEventHub->getAbsoluteAxisValue(mId, code, &value); - return value; - } inline bool isDeviceEnabled() { return mEventHub->isDeviceEnabled(mId); } inline status_t enableDevice() { return mEventHub->enableDevice(mId); } inline status_t disableDevice() { return mEventHub->disableDevice(mId); } diff --git a/services/inputflinger/reader/mapper/accumulator/MultiTouchMotionAccumulator.cpp b/services/inputflinger/reader/mapper/accumulator/MultiTouchMotionAccumulator.cpp index 4919068201..8dc6e4d397 100644 --- a/services/inputflinger/reader/mapper/accumulator/MultiTouchMotionAccumulator.cpp +++ b/services/inputflinger/reader/mapper/accumulator/MultiTouchMotionAccumulator.cpp @@ -139,13 +139,11 @@ void MultiTouchMotionAccumulator::populateCurrentSlot( if (!mUsingSlotsProtocol) { return; } - int32_t initialSlot; - if (const auto status = deviceContext.getAbsoluteAxisValue(ABS_MT_SLOT, &initialSlot); - status == OK) { - mCurrentSlot = initialSlot; + if (const std::optional<int32_t> initialSlot = deviceContext.getAbsoluteAxisValue(ABS_MT_SLOT); + initialSlot.has_value()) { + mCurrentSlot = initialSlot.value(); } else { - ALOGE("Could not retrieve current multi-touch slot index. status=%s", - statusToString(status).c_str()); + ALOGE("Could not retrieve current multi-touch slot index"); } } diff --git a/services/inputflinger/reader/mapper/accumulator/SingleTouchMotionAccumulator.cpp b/services/inputflinger/reader/mapper/accumulator/SingleTouchMotionAccumulator.cpp index 2b82ddf33d..4cf9243653 100644 --- a/services/inputflinger/reader/mapper/accumulator/SingleTouchMotionAccumulator.cpp +++ b/services/inputflinger/reader/mapper/accumulator/SingleTouchMotionAccumulator.cpp @@ -26,13 +26,13 @@ SingleTouchMotionAccumulator::SingleTouchMotionAccumulator() { } void SingleTouchMotionAccumulator::reset(InputDeviceContext& deviceContext) { - mAbsX = deviceContext.getAbsoluteAxisValue(ABS_X); - mAbsY = deviceContext.getAbsoluteAxisValue(ABS_Y); - mAbsPressure = deviceContext.getAbsoluteAxisValue(ABS_PRESSURE); - mAbsToolWidth = deviceContext.getAbsoluteAxisValue(ABS_TOOL_WIDTH); - mAbsDistance = deviceContext.getAbsoluteAxisValue(ABS_DISTANCE); - mAbsTiltX = deviceContext.getAbsoluteAxisValue(ABS_TILT_X); - mAbsTiltY = deviceContext.getAbsoluteAxisValue(ABS_TILT_Y); + mAbsX = deviceContext.getAbsoluteAxisValue(ABS_X).value_or(0); + mAbsY = deviceContext.getAbsoluteAxisValue(ABS_Y).value_or(0); + mAbsPressure = deviceContext.getAbsoluteAxisValue(ABS_PRESSURE).value_or(0); + mAbsToolWidth = deviceContext.getAbsoluteAxisValue(ABS_TOOL_WIDTH).value_or(0); + mAbsDistance = deviceContext.getAbsoluteAxisValue(ABS_DISTANCE).value_or(0); + mAbsTiltX = deviceContext.getAbsoluteAxisValue(ABS_TILT_X).value_or(0); + mAbsTiltY = deviceContext.getAbsoluteAxisValue(ABS_TILT_Y).value_or(0); } void SingleTouchMotionAccumulator::clearAbsoluteAxes() { diff --git a/services/inputflinger/tests/FakeEventHub.cpp b/services/inputflinger/tests/FakeEventHub.cpp index daa000f2ce..12736c8cc0 100644 --- a/services/inputflinger/tests/FakeEventHub.cpp +++ b/services/inputflinger/tests/FakeEventHub.cpp @@ -16,6 +16,8 @@ #include "FakeEventHub.h" +#include <optional> + #include <android-base/thread_annotations.h> #include <gtest/gtest.h> #include <linux/input-event-codes.h> @@ -263,18 +265,16 @@ std::optional<PropertyMap> FakeEventHub::getConfiguration(int32_t deviceId) cons return device->configuration; } -status_t FakeEventHub::getAbsoluteAxisInfo(int32_t deviceId, int axis, - RawAbsoluteAxisInfo* outAxisInfo) const { +std::optional<RawAbsoluteAxisInfo> FakeEventHub::getAbsoluteAxisInfo(int32_t deviceId, + int axis) const { Device* device = getDevice(deviceId); if (device) { ssize_t index = device->absoluteAxes.indexOfKey(axis); if (index >= 0) { - *outAxisInfo = device->absoluteAxes.valueAt(index); - return OK; + return device->absoluteAxes.valueAt(index); } } - outAxisInfo->clear(); - return -1; + return std::nullopt; } bool FakeEventHub::hasRelativeAxis(int32_t deviceId, int axis) const { @@ -417,18 +417,15 @@ int32_t FakeEventHub::getSwitchState(int32_t deviceId, int32_t sw) const { return AKEY_STATE_UNKNOWN; } -status_t FakeEventHub::getAbsoluteAxisValue(int32_t deviceId, int32_t axis, - int32_t* outValue) const { +std::optional<int32_t> FakeEventHub::getAbsoluteAxisValue(int32_t deviceId, int32_t axis) const { Device* device = getDevice(deviceId); if (device) { ssize_t index = device->absoluteAxisValue.indexOfKey(axis); if (index >= 0) { - *outValue = device->absoluteAxisValue.valueAt(index); - return OK; + return device->absoluteAxisValue.valueAt(index); } } - *outValue = 0; - return -1; + return std::nullopt; } void FakeEventHub::setMtSlotValues(int32_t deviceId, int32_t axis, diff --git a/services/inputflinger/tests/FakeEventHub.h b/services/inputflinger/tests/FakeEventHub.h index f07b3441c2..c2c875f518 100644 --- a/services/inputflinger/tests/FakeEventHub.h +++ b/services/inputflinger/tests/FakeEventHub.h @@ -168,8 +168,8 @@ private: InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const override; int32_t getDeviceControllerNumber(int32_t) const override; std::optional<PropertyMap> getConfiguration(int32_t deviceId) const override; - status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, - RawAbsoluteAxisInfo* outAxisInfo) const override; + std::optional<RawAbsoluteAxisInfo> getAbsoluteAxisInfo(int32_t deviceId, + int axis) const override; bool hasRelativeAxis(int32_t deviceId, int axis) const override; bool hasInputProperty(int32_t, int) const override; bool hasMscEvent(int32_t deviceId, int mscEvent) const override final; @@ -187,7 +187,7 @@ private: std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const override; int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const override; int32_t getSwitchState(int32_t deviceId, int32_t sw) const override; - status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t* outValue) const override; + std::optional<int32_t> getAbsoluteAxisValue(int32_t deviceId, int32_t axis) const override; int32_t getKeyCodeForKeyLocation(int32_t deviceId, int32_t locationKeyCode) const override; // Return true if the device has non-empty key layout. diff --git a/services/inputflinger/tests/HardwareProperties_test.cpp b/services/inputflinger/tests/HardwareProperties_test.cpp index 8dfa8c8e0c..643fab6d44 100644 --- a/services/inputflinger/tests/HardwareProperties_test.cpp +++ b/services/inputflinger/tests/HardwareProperties_test.cpp @@ -48,24 +48,20 @@ protected: static constexpr int32_t EVENTHUB_ID = 1; void setupValidAxis(int axis, int32_t min, int32_t max, int32_t resolution) { - EXPECT_CALL(mMockEventHub, getAbsoluteAxisInfo(EVENTHUB_ID, axis, testing::_)) - .WillRepeatedly([=](int32_t, int32_t, RawAbsoluteAxisInfo* outAxisInfo) { - outAxisInfo->valid = true; - outAxisInfo->minValue = min; - outAxisInfo->maxValue = max; - outAxisInfo->flat = 0; - outAxisInfo->fuzz = 0; - outAxisInfo->resolution = resolution; - return OK; - }); + EXPECT_CALL(mMockEventHub, getAbsoluteAxisInfo(EVENTHUB_ID, axis)) + .WillRepeatedly(Return(std::optional<RawAbsoluteAxisInfo>{{ + .valid = true, + .minValue = min, + .maxValue = max, + .flat = 0, + .fuzz = 0, + .resolution = resolution, + }})); } void setupInvalidAxis(int axis) { - EXPECT_CALL(mMockEventHub, getAbsoluteAxisInfo(EVENTHUB_ID, axis, testing::_)) - .WillRepeatedly([=](int32_t, int32_t, RawAbsoluteAxisInfo* outAxisInfo) { - outAxisInfo->valid = false; - return -1; - }); + EXPECT_CALL(mMockEventHub, getAbsoluteAxisInfo(EVENTHUB_ID, axis)) + .WillRepeatedly(Return(std::nullopt)); } void setProperty(int property, bool value) { diff --git a/services/inputflinger/tests/InputMapperTest.cpp b/services/inputflinger/tests/InputMapperTest.cpp index b5c9232a78..19bc5bef66 100644 --- a/services/inputflinger/tests/InputMapperTest.cpp +++ b/services/inputflinger/tests/InputMapperTest.cpp @@ -57,16 +57,16 @@ void InputMapperUnitTest::createDevice() { void InputMapperUnitTest::setupAxis(int axis, bool valid, int32_t min, int32_t max, int32_t resolution) { - EXPECT_CALL(mMockEventHub, getAbsoluteAxisInfo(EVENTHUB_ID, axis, _)) - .WillRepeatedly([=](int32_t, int32_t, RawAbsoluteAxisInfo* outAxisInfo) { - outAxisInfo->valid = valid; - outAxisInfo->minValue = min; - outAxisInfo->maxValue = max; - outAxisInfo->flat = 0; - outAxisInfo->fuzz = 0; - outAxisInfo->resolution = resolution; - return valid ? OK : -1; - }); + EXPECT_CALL(mMockEventHub, getAbsoluteAxisInfo(EVENTHUB_ID, axis)) + .WillRepeatedly(Return(valid ? std::optional<RawAbsoluteAxisInfo>{{ + .valid = true, + .minValue = min, + .maxValue = max, + .flat = 0, + .fuzz = 0, + .resolution = resolution, + }} + : std::nullopt)); } void InputMapperUnitTest::expectScanCodes(bool present, std::set<int> scanCodes) { diff --git a/services/inputflinger/tests/InterfaceMocks.h b/services/inputflinger/tests/InterfaceMocks.h index 16d3193908..bacc6d432e 100644 --- a/services/inputflinger/tests/InterfaceMocks.h +++ b/services/inputflinger/tests/InterfaceMocks.h @@ -91,8 +91,8 @@ public: MOCK_METHOD(InputDeviceIdentifier, getDeviceIdentifier, (int32_t deviceId), (const)); MOCK_METHOD(int32_t, getDeviceControllerNumber, (int32_t deviceId), (const)); MOCK_METHOD(std::optional<PropertyMap>, getConfiguration, (int32_t deviceId), (const)); - MOCK_METHOD(status_t, getAbsoluteAxisInfo, - (int32_t deviceId, int axis, RawAbsoluteAxisInfo* outAxisInfo), (const)); + MOCK_METHOD(std::optional<RawAbsoluteAxisInfo>, getAbsoluteAxisInfo, + (int32_t deviceId, int axis), (const)); MOCK_METHOD(bool, hasRelativeAxis, (int32_t deviceId, int axis), (const)); MOCK_METHOD(bool, hasInputProperty, (int32_t deviceId, int property), (const)); MOCK_METHOD(bool, hasMscEvent, (int32_t deviceId, int mscEvent), (const)); @@ -131,7 +131,7 @@ public: MOCK_METHOD(int32_t, getKeyCodeState, (int32_t deviceId, int32_t keyCode), (const, override)); MOCK_METHOD(int32_t, getSwitchState, (int32_t deviceId, int32_t sw), (const, override)); - MOCK_METHOD(status_t, getAbsoluteAxisValue, (int32_t deviceId, int32_t axis, int32_t* outValue), + MOCK_METHOD(std::optional<int32_t>, getAbsoluteAxisValue, (int32_t deviceId, int32_t axis), (const, override)); MOCK_METHOD(base::Result<std::vector<int32_t>>, getMtSlotValues, (int32_t deviceId, int32_t axis, size_t slotCount), (const, override)); diff --git a/services/inputflinger/tests/MultiTouchInputMapper_test.cpp b/services/inputflinger/tests/MultiTouchInputMapper_test.cpp index b5f897154b..d4d3c3857f 100644 --- a/services/inputflinger/tests/MultiTouchInputMapper_test.cpp +++ b/services/inputflinger/tests/MultiTouchInputMapper_test.cpp @@ -99,11 +99,8 @@ protected: setupAxis(ABS_MT_TOOL_TYPE, /*valid=*/false, /*min=*/0, /*max=*/0, /*resolution=*/0); // reset current slot at the beginning - EXPECT_CALL(mMockEventHub, getAbsoluteAxisValue(EVENTHUB_ID, ABS_MT_SLOT, _)) - .WillRepeatedly([](int32_t, int32_t, int32_t* outValue) { - *outValue = 0; - return OK; - }); + EXPECT_CALL(mMockEventHub, getAbsoluteAxisValue(EVENTHUB_ID, ABS_MT_SLOT)) + .WillRepeatedly(Return(0)); // mark all slots not in use mockSlotValues({}); @@ -211,11 +208,8 @@ TEST_F(MultiTouchInputMapperUnitTest, MultiFingerGestureWithUnexpectedReset) { const auto pointerCoordsBeforeReset = std::get<NotifyMotionArgs>(args.back()).pointerCoords; // On buffer overflow mapper will be reset and MT slots data will be repopulated - EXPECT_CALL(mMockEventHub, getAbsoluteAxisValue(EVENTHUB_ID, ABS_MT_SLOT, _)) - .WillRepeatedly([=](int32_t, int32_t, int32_t* outValue) { - *outValue = 1; - return OK; - }); + EXPECT_CALL(mMockEventHub, getAbsoluteAxisValue(EVENTHUB_ID, ABS_MT_SLOT)) + .WillRepeatedly(Return(1)); mockSlotValues( {{1, {Point{x1, y1}, FIRST_TRACKING_ID}}, {2, {Point{x2, y2}, SECOND_TRACKING_ID}}}); diff --git a/services/inputflinger/tests/TouchpadInputMapper_test.cpp b/services/inputflinger/tests/TouchpadInputMapper_test.cpp index 2b62dd13ef..1afb4f090a 100644 --- a/services/inputflinger/tests/TouchpadInputMapper_test.cpp +++ b/services/inputflinger/tests/TouchpadInputMapper_test.cpp @@ -103,11 +103,8 @@ protected: setupAxis(ABS_MT_DISTANCE, /*valid=*/false, /*min=*/0, /*max=*/0, /*resolution=*/0); setupAxis(ABS_MT_TOOL_TYPE, /*valid=*/false, /*min=*/0, /*max=*/0, /*resolution=*/0); - EXPECT_CALL(mMockEventHub, getAbsoluteAxisValue(EVENTHUB_ID, ABS_MT_SLOT, testing::_)) - .WillRepeatedly([](int32_t eventHubId, int32_t, int32_t* outValue) { - *outValue = 0; - return OK; - }); + EXPECT_CALL(mMockEventHub, getAbsoluteAxisValue(EVENTHUB_ID, ABS_MT_SLOT)) + .WillRepeatedly(Return(0)); EXPECT_CALL(mMockEventHub, getMtSlotValues(EVENTHUB_ID, testing::_, testing::_)) .WillRepeatedly([]() -> base::Result<std::vector<int32_t>> { return base::ResultError("Axis not supported", NAME_NOT_FOUND); diff --git a/services/inputflinger/tests/fuzzers/MapperHelpers.h b/services/inputflinger/tests/fuzzers/MapperHelpers.h index ff425ddfb7..6dea540e9c 100644 --- a/services/inputflinger/tests/fuzzers/MapperHelpers.h +++ b/services/inputflinger/tests/fuzzers/MapperHelpers.h @@ -17,6 +17,7 @@ #include <map> #include <memory> +#include <optional> #include <EventHub.h> #include <InputDevice.h> @@ -119,16 +120,26 @@ public: void setAbsoluteAxisInfo(int32_t deviceId, int axis, const RawAbsoluteAxisInfo& axisInfo) { mAxes[deviceId][axis] = axisInfo; } - status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, - RawAbsoluteAxisInfo* outAxisInfo) const override { + std::optional<RawAbsoluteAxisInfo> getAbsoluteAxisInfo(int32_t deviceId, + int axis) const override { if (auto deviceAxesIt = mAxes.find(deviceId); deviceAxesIt != mAxes.end()) { const std::map<int, RawAbsoluteAxisInfo>& deviceAxes = deviceAxesIt->second; if (auto axisInfoIt = deviceAxes.find(axis); axisInfoIt != deviceAxes.end()) { - *outAxisInfo = axisInfoIt->second; - return OK; + return axisInfoIt->second; } } - return mFdp->ConsumeIntegral<status_t>(); + if (mFdp->ConsumeBool()) { + return std::optional<RawAbsoluteAxisInfo>({ + .valid = mFdp->ConsumeBool(), + .minValue = mFdp->ConsumeIntegral<int32_t>(), + .maxValue = mFdp->ConsumeIntegral<int32_t>(), + .flat = mFdp->ConsumeIntegral<int32_t>(), + .fuzz = mFdp->ConsumeIntegral<int32_t>(), + .resolution = mFdp->ConsumeIntegral<int32_t>(), + }); + } else { + return std::nullopt; + } } bool hasRelativeAxis(int32_t deviceId, int axis) const override { return mFdp->ConsumeBool(); } bool hasInputProperty(int32_t deviceId, int property) const override { @@ -197,9 +208,12 @@ public: int32_t getKeyCodeForKeyLocation(int32_t deviceId, int32_t locationKeyCode) const override { return mFdp->ConsumeIntegral<int32_t>(); } - status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, - int32_t* outValue) const override { - return mFdp->ConsumeIntegral<status_t>(); + std::optional<int32_t> getAbsoluteAxisValue(int32_t deviceId, int32_t axis) const override { + if (mFdp->ConsumeBool()) { + return mFdp->ConsumeIntegral<int32_t>(); + } else { + return std::nullopt; + } } base::Result<std::vector<int32_t>> getMtSlotValues(int32_t deviceId, int32_t axis, size_t slotCount) const override { |