Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2c5e20e authored by Harry Cutts's avatar Harry Cutts
Browse files

Return std::optional from getAbsoluteAxisValue

This makes the methods nicer to use, and forces callers to clearly
handle the case where there's no value to return.

Test: m checkinput
Test: atest inputflinger_tests
Test: build and run inputflinger_multitouch_input_fuzzer for a while
Bug: 245989146
Flag: EXEMPT refactor
Change-Id: I51c750d21d8a95ef631d93365ee76d18ebf71d43
parent 207674d8
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -1127,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,
+3 −4
Original line number Diff line number Diff line
@@ -340,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,
@@ -560,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;

+2 −7
Original line number Diff line number Diff line
@@ -381,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 {
@@ -443,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); }
+4 −6
Original line number Diff line number Diff line
@@ -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");
    }
}

+7 −7
Original line number Diff line number Diff line
@@ -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() {
Loading