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

Commit 483104c2 authored by Arpit Singh's avatar Arpit Singh
Browse files

Count active touches in MultiTouchMotionAccumulator

Counting active touches will allow us to detect first touch on the
device. This information will be used by mapper to getect start of a new
gesture, when the first touch is detected.

Bug: 301055381
Test: atest MultiTouchMotionAccumulatorTest

Change-Id: I53f65daef3e5aa324f42eec6aa85ed6d5ef01bf5
parent 82e413ed
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -152,6 +152,14 @@ void MultiTouchMotionAccumulator::warnIfNotInUse(const RawEvent& event, const Sl
    }
}

size_t MultiTouchMotionAccumulator::getActiveSlotsCount() const {
    if (!mUsingSlotsProtocol) {
        return mCurrentSlot < 0 ? 0 : mCurrentSlot;
    }
    return std::count_if(mSlots.begin(), mSlots.end(),
                         [](const Slot& slot) { return slot.mInUse; });
}

// --- MultiTouchMotionAccumulator::Slot ---

ToolType MultiTouchMotionAccumulator::Slot::getToolType() const {
+1 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ public:
    void process(const RawEvent* rawEvent);
    void finishSync();

    size_t getActiveSlotsCount() const;
    inline size_t getSlotCount() const { return mSlots.size(); }
    inline const Slot& getSlot(size_t index) const {
        LOG_ALWAYS_FATAL_IF(index < 0 || index >= mSlots.size(), "Invalid index: %zu", index);
+1 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ cc_test {
        "InputReader_test.cpp",
        "InstrumentedInputReader.cpp",
        "LatencyTracker_test.cpp",
        "MultiTouchMotionAccumulator_test.cpp",
        "NotifyArgs_test.cpp",
        "PointerChoreographer_test.cpp",
        "PreferStylusOverTouch_test.cpp",
+87 −0
Original line number Diff line number Diff line
/*
 * Copyright 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "MultiTouchMotionAccumulator.h"
#include "InputMapperTest.h"

namespace android {

class MultiTouchMotionAccumulatorTest : public InputMapperUnitTest {
protected:
    static constexpr size_t SLOT_COUNT = 8;

    MultiTouchMotionAccumulator mMotionAccumulator;

    void processMotionEvent(int32_t type, int32_t code, int32_t value) {
        RawEvent event;
        event.when = ARBITRARY_TIME;
        event.readTime = READ_TIME;
        event.deviceId = EVENTHUB_ID;
        event.type = type;
        event.code = code;
        event.value = value;
        mMotionAccumulator.process(&event);
    }
};

TEST_F(MultiTouchMotionAccumulatorTest, ActiveSlotCountUsingSlotsProtocol) {
    mMotionAccumulator.configure(*mDeviceContext, SLOT_COUNT, /*usingSlotsProtocol=*/true);
    // We expect active slot count to match the touches being tracked
    // first touch
    processMotionEvent(EV_ABS, ABS_MT_SLOT, 0);
    processMotionEvent(EV_ABS, ABS_MT_TRACKING_ID, 123);
    processMotionEvent(EV_SYN, SYN_REPORT, 0);
    ASSERT_EQ(1u, mMotionAccumulator.getActiveSlotsCount());

    // second touch
    processMotionEvent(EV_ABS, ABS_MT_SLOT, 1);
    processMotionEvent(EV_ABS, ABS_MT_TRACKING_ID, 456);
    processMotionEvent(EV_SYN, SYN_REPORT, 0);
    ASSERT_EQ(2u, mMotionAccumulator.getActiveSlotsCount());

    // second lifted
    processMotionEvent(EV_ABS, ABS_MT_TRACKING_ID, -1);
    processMotionEvent(EV_SYN, SYN_REPORT, 0);
    ASSERT_EQ(1u, mMotionAccumulator.getActiveSlotsCount());

    // first lifted
    processMotionEvent(EV_ABS, ABS_MT_SLOT, 0);
    processMotionEvent(EV_ABS, ABS_MT_TRACKING_ID, -1);
    processMotionEvent(EV_SYN, SYN_REPORT, 0);
    ASSERT_EQ(0u, mMotionAccumulator.getActiveSlotsCount());
}

TEST_F(MultiTouchMotionAccumulatorTest, ActiveSlotCountNotUsingSlotsProtocol) {
    mMotionAccumulator.configure(*mDeviceContext, SLOT_COUNT, /*usingSlotsProtocol=*/false);

    // first touch
    processMotionEvent(EV_ABS, ABS_MT_POSITION_X, 0);
    processMotionEvent(EV_ABS, ABS_MT_POSITION_Y, 0);
    processMotionEvent(EV_SYN, SYN_MT_REPORT, 0);
    ASSERT_EQ(1u, mMotionAccumulator.getActiveSlotsCount());

    // second touch
    processMotionEvent(EV_ABS, ABS_MT_POSITION_X, 50);
    processMotionEvent(EV_ABS, ABS_MT_POSITION_Y, 50);
    processMotionEvent(EV_SYN, SYN_MT_REPORT, 0);
    ASSERT_EQ(2u, mMotionAccumulator.getActiveSlotsCount());

    // reset
    mMotionAccumulator.finishSync();
    ASSERT_EQ(0u, mMotionAccumulator.getActiveSlotsCount());
}

} // namespace android