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

Commit eb38d461 authored by Prabir Pradhan's avatar Prabir Pradhan Committed by Android (Google) Code Review
Browse files

Merge changes from topic "inputdevice-supportsusi"

* changes:
  Determine whether an input device supports USI using IDC files
  TouchInputMapper: Cancel ongoing gesture when resetting
  TouchInputMapper: Use early return in populateDeviceInfo
parents 87717eaf 167c270e
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -280,6 +280,9 @@ public:

    std::vector<InputDeviceLightInfo> getLights();

    inline void setSupportsUsi(bool supportsUsi) { mSupportsUsi = supportsUsi; }
    inline bool supportsUsi() const { return mSupportsUsi; }

private:
    int32_t mId;
    int32_t mGeneration;
@@ -292,6 +295,8 @@ private:
    uint32_t mSources;
    int32_t mKeyboardType;
    std::shared_ptr<KeyCharacterMap> mKeyCharacterMap;
    // Whether this device supports the Universal Stylus Initiative (USI) protocol for styluses.
    bool mSupportsUsi;

    bool mHasVibrator;
    bool mHasBattery;
+2 −0
Original line number Diff line number Diff line
@@ -182,6 +182,7 @@ InputDeviceInfo::InputDeviceInfo(const InputDeviceInfo& other)
        mSources(other.mSources),
        mKeyboardType(other.mKeyboardType),
        mKeyCharacterMap(other.mKeyCharacterMap),
        mSupportsUsi(other.mSupportsUsi),
        mHasVibrator(other.mHasVibrator),
        mHasBattery(other.mHasBattery),
        mHasButtonUnderPad(other.mHasButtonUnderPad),
@@ -210,6 +211,7 @@ void InputDeviceInfo::initialize(int32_t id, int32_t generation, int32_t control
    mHasBattery = false;
    mHasButtonUnderPad = false;
    mHasSensor = false;
    mSupportsUsi = false;
    mMotionRanges.clear();
    mSensors.clear();
    mLights.clear();
+77 −72
Original line number Diff line number Diff line
@@ -189,7 +189,10 @@ uint32_t TouchInputMapper::getSources() const {
void TouchInputMapper::populateDeviceInfo(InputDeviceInfo* info) {
    InputMapper::populateDeviceInfo(info);

    if (mDeviceMode != DeviceMode::DISABLED) {
    if (mDeviceMode == DeviceMode::DISABLED) {
        return;
    }

    info->addMotionRange(mOrientedRanges.x);
    info->addMotionRange(mOrientedRanges.y);
    info->addMotionRange(mOrientedRanges.pressure);
@@ -202,10 +205,10 @@ void TouchInputMapper::populateDeviceInfo(InputDeviceInfo* info) {
        // touchpad in one sample cycle.
        const InputDeviceInfo::MotionRange& x = mOrientedRanges.x;
        const InputDeviceInfo::MotionRange& y = mOrientedRanges.y;
            info->addMotionRange(AMOTION_EVENT_AXIS_RELATIVE_X, mSource, -x.max, x.max, x.flat,
                                 x.fuzz, x.resolution);
            info->addMotionRange(AMOTION_EVENT_AXIS_RELATIVE_Y, mSource, -y.max, y.max, y.flat,
                                 y.fuzz, y.resolution);
        info->addMotionRange(AMOTION_EVENT_AXIS_RELATIVE_X, mSource, -x.max, x.max, x.flat, x.fuzz,
                             x.resolution);
        info->addMotionRange(AMOTION_EVENT_AXIS_RELATIVE_Y, mSource, -y.max, y.max, y.flat, y.fuzz,
                             y.resolution);
    }

    if (mOrientedRanges.size) {
@@ -235,27 +238,25 @@ void TouchInputMapper::populateDeviceInfo(InputDeviceInfo* info) {
    }

    if (mCursorScrollAccumulator.haveRelativeVWheel()) {
            info->addMotionRange(AMOTION_EVENT_AXIS_VSCROLL, mSource, -1.0f, 1.0f, 0.0f, 0.0f,
                                 0.0f);
        info->addMotionRange(AMOTION_EVENT_AXIS_VSCROLL, mSource, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f);
    }
    if (mCursorScrollAccumulator.haveRelativeHWheel()) {
            info->addMotionRange(AMOTION_EVENT_AXIS_HSCROLL, mSource, -1.0f, 1.0f, 0.0f, 0.0f,
                                 0.0f);
        info->addMotionRange(AMOTION_EVENT_AXIS_HSCROLL, mSource, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f);
    }
    if (mCalibration.coverageCalibration == Calibration::CoverageCalibration::BOX) {
        const InputDeviceInfo::MotionRange& x = mOrientedRanges.x;
        const InputDeviceInfo::MotionRange& y = mOrientedRanges.y;
            info->addMotionRange(AMOTION_EVENT_AXIS_GENERIC_1, mSource, x.min, x.max, x.flat,
                                 x.fuzz, x.resolution);
            info->addMotionRange(AMOTION_EVENT_AXIS_GENERIC_2, mSource, y.min, y.max, y.flat,
                                 y.fuzz, y.resolution);
            info->addMotionRange(AMOTION_EVENT_AXIS_GENERIC_3, mSource, x.min, x.max, x.flat,
                                 x.fuzz, x.resolution);
            info->addMotionRange(AMOTION_EVENT_AXIS_GENERIC_4, mSource, y.min, y.max, y.flat,
                                 y.fuzz, y.resolution);
        info->addMotionRange(AMOTION_EVENT_AXIS_GENERIC_1, mSource, x.min, x.max, x.flat, x.fuzz,
                             x.resolution);
        info->addMotionRange(AMOTION_EVENT_AXIS_GENERIC_2, mSource, y.min, y.max, y.flat, y.fuzz,
                             y.resolution);
        info->addMotionRange(AMOTION_EVENT_AXIS_GENERIC_3, mSource, x.min, x.max, x.flat, x.fuzz,
                             x.resolution);
        info->addMotionRange(AMOTION_EVENT_AXIS_GENERIC_4, mSource, y.min, y.max, y.flat, y.fuzz,
                             y.resolution);
    }
    info->setButtonUnderPad(mParameters.hasButtonUnderPad);
    }
    info->setSupportsUsi(mParameters.supportsUsi);
}

void TouchInputMapper::dump(std::string& dump) {
@@ -395,13 +396,11 @@ std::list<NotifyArgs> TouchInputMapper::configure(nsecs_t when,
    }

    if (changes && resetNeeded) {
        // If the device needs to be reset, cancel any ongoing gestures and reset the state.
        out += cancelTouch(when, when);
        out += reset(when);

        // Send reset, unless this is the first time the device has been configured,
        // in which case the reader will call reset itself after all mappers are ready.
        out.push_back(NotifyDeviceResetArgs(getContext()->getNextId(), when, getDeviceId()));
        out.emplace_back(NotifyDeviceResetArgs(getContext()->getNextId(), when, getDeviceId()));
    }
    return out;
}
@@ -507,6 +506,10 @@ void TouchInputMapper::configureParameters() {
    // up in your pocket but you can enable it using the input device configuration.
    mParameters.wake = getDeviceContext().isExternal();
    getDeviceContext().getConfiguration().tryGetProperty("touch.wake", mParameters.wake);

    mParameters.supportsUsi = false;
    getDeviceContext().getConfiguration().tryGetProperty("touch.supportsUsi",
                                                         mParameters.supportsUsi);
}

void TouchInputMapper::dumpParameters(std::string& dump) {
@@ -523,6 +526,7 @@ void TouchInputMapper::dumpParameters(std::string& dump) {
                         mParameters.uniqueDisplayId.c_str());
    dump += StringPrintf(INDENT4 "OrientationAware: %s\n", toString(mParameters.orientationAware));
    dump += INDENT4 "Orientation: " + ftl::enum_string(mParameters.orientation) + "\n";
    dump += StringPrintf(INDENT4 "SupportsUsi: %s\n", toString(mParameters.supportsUsi));
}

void TouchInputMapper::configureRawPointerAxes() {
@@ -1440,6 +1444,9 @@ void TouchInputMapper::updateAffineTransformation() {
}

std::list<NotifyArgs> TouchInputMapper::reset(nsecs_t when) {
    std::list<NotifyArgs> out = cancelTouch(when, when);
    updateTouchSpots();

    mCursorButtonAccumulator.reset(getDeviceContext());
    mCursorScrollAccumulator.reset(getDeviceContext());
    mTouchButtonAccumulator.reset(getDeviceContext());
@@ -1470,7 +1477,7 @@ std::list<NotifyArgs> TouchInputMapper::reset(nsecs_t when) {
        mPointerController->clearSpots();
    }

    return InputMapper::reset(when);
    return out += InputMapper::reset(when);
}

void TouchInputMapper::resetExternalStylus() {
@@ -1554,10 +1561,7 @@ std::list<NotifyArgs> TouchInputMapper::sync(nsecs_t when, nsecs_t readTime) {
std::list<NotifyArgs> TouchInputMapper::processRawTouches(bool timeout) {
    std::list<NotifyArgs> out;
    if (mDeviceMode == DeviceMode::DISABLED) {
        // Drop all input if the device is disabled.
        out += cancelTouch(mCurrentRawState.when, mCurrentRawState.readTime);
        mCurrentCookedState.clear();
        updateTouchSpots();
        // Do not process raw event while the device is disabled.
        return out;
    }

@@ -1976,8 +1980,8 @@ std::list<NotifyArgs> TouchInputMapper::abortTouches(nsecs_t when, nsecs_t readT
        int32_t metaState = getContext()->getGlobalMetaState();
        int32_t buttonState = mCurrentCookedState.buttonState;
        out.push_back(dispatchMotion(when, readTime, policyFlags, mSource,
                                     AMOTION_EVENT_ACTION_CANCEL, 0, 0, metaState, buttonState,
                                     AMOTION_EVENT_EDGE_FLAG_NONE,
                                     AMOTION_EVENT_ACTION_CANCEL, 0, AMOTION_EVENT_FLAG_CANCELED,
                                     metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
                                     mCurrentCookedState.cookedPointerData.pointerProperties,
                                     mCurrentCookedState.cookedPointerData.pointerCoords,
                                     mCurrentCookedState.cookedPointerData.idToIndex, currentIdBits,
@@ -2617,8 +2621,9 @@ std::list<NotifyArgs> TouchInputMapper::dispatchPointerGestures(nsecs_t when, ns
    BitSet32 dispatchedGestureIdBits(mPointerGesture.lastGestureIdBits);
    if (!dispatchedGestureIdBits.isEmpty()) {
        if (cancelPreviousGesture) {
            const uint32_t cancelFlags = flags | AMOTION_EVENT_FLAG_CANCELED;
            out.push_back(dispatchMotion(when, readTime, policyFlags, mSource,
                                         AMOTION_EVENT_ACTION_CANCEL, 0, flags, metaState,
                                         AMOTION_EVENT_ACTION_CANCEL, 0, cancelFlags, metaState,
                                         buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
                                         mPointerGesture.lastGestureProperties,
                                         mPointerGesture.lastGestureCoords,
@@ -2754,8 +2759,8 @@ std::list<NotifyArgs> TouchInputMapper::abortPointerGestures(nsecs_t when, nsecs
        int32_t metaState = getContext()->getGlobalMetaState();
        int32_t buttonState = mCurrentRawState.buttonState;
        out.push_back(dispatchMotion(when, readTime, policyFlags, mSource,
                                     AMOTION_EVENT_ACTION_CANCEL, 0, 0, metaState, buttonState,
                                     AMOTION_EVENT_EDGE_FLAG_NONE,
                                     AMOTION_EVENT_ACTION_CANCEL, 0, AMOTION_EVENT_FLAG_CANCELED,
                                     metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
                                     mPointerGesture.lastGestureProperties,
                                     mPointerGesture.lastGestureCoords,
                                     mPointerGesture.lastGestureIdToIndex,
+3 −0
Original line number Diff line number Diff line
@@ -232,6 +232,9 @@ protected:
        GestureMode gestureMode;

        bool wake;

        // Whether the device supports the Universal Stylus Initiative (USI) protocol for styluses.
        bool supportsUsi;
    } mParameters;

    // Immutable calibration parameters in parsed form.
+39 −6
Original line number Diff line number Diff line
@@ -3112,6 +3112,15 @@ protected:
        return processArgList;
    }

    void resetMapper(InputMapper& mapper, nsecs_t when) {
        const auto resetArgs = mapper.reset(when);
        for (const auto args : resetArgs) {
            mFakeListener->notify(args);
        }
        // Loop the reader to flush the input listener queue.
        mReader->loopOnce();
    }

    static void assertMotionRange(const InputDeviceInfo& info,
            int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
        const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
@@ -6864,6 +6873,28 @@ TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsV
            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
}

TEST_F(SingleTouchInputMapperTest, Reset_CancelsOngoingGesture) {
    addConfigurationProperty("touch.deviceType", "touchScreen");
    prepareDisplay(DISPLAY_ORIENTATION_0);
    prepareButtons();
    prepareAxes(POSITION | PRESSURE);
    SingleTouchInputMapper& mapper = addMapperAndConfigure<SingleTouchInputMapper>();

    // Touch down.
    processDown(mapper, 100, 200);
    processPressure(mapper, 1);
    processSync(mapper);
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(
            WithMotionAction(AMOTION_EVENT_ACTION_DOWN)));

    // Reset the mapper. This should cancel the ongoing gesture.
    resetMapper(mapper, ARBITRARY_TIME);
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(
            WithMotionAction(AMOTION_EVENT_ACTION_CANCEL)));

    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
}

TEST_F(SingleTouchInputMapperTest, Reset_RecreatesTouchState) {
    addConfigurationProperty("touch.deviceType", "touchScreen");
    prepareDisplay(DISPLAY_ORIENTATION_0);
@@ -6878,8 +6909,9 @@ TEST_F(SingleTouchInputMapperTest, Reset_RecreatesTouchState) {
    mFakeEventHub->setScanCodeState(EVENTHUB_ID, BTN_TOUCH, 1);

    // Reset the mapper. When the mapper is reset, we expect it to attempt to recreate the touch
    // state by reading the current axis values.
    std::list<NotifyArgs> unused = mapper.reset(ARBITRARY_TIME);
    // state by reading the current axis values. Since there was no ongoing gesture, calling reset
    // does not generate any events.
    resetMapper(mapper, ARBITRARY_TIME);

    // Send a sync to simulate an empty touch frame where nothing changes. The mapper should use
    // the recreated touch state to generate a down event.
@@ -9530,9 +9562,10 @@ TEST_F(MultiTouchInputMapperTest, Reset_PreservesLastTouchState) {
            mFakeListener->assertNotifyMotionWasCalled(WithMotionAction(ACTION_POINTER_1_DOWN)));

    // Reset the mapper. When the mapper is reset, we expect the current multi-touch state to be
    // preserved. Resetting should not generate any events.
    std::list<NotifyArgs> unused = mapper.reset(ARBITRARY_TIME);
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
    // preserved. Resetting should cancel the ongoing gesture.
    resetMapper(mapper, ARBITRARY_TIME);
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(
            WithMotionAction(AMOTION_EVENT_ACTION_CANCEL)));

    // Send a sync to simulate an empty touch frame where nothing changes. The mapper should use
    // the existing touch state to generate a down event.
@@ -9566,7 +9599,7 @@ TEST_F(MultiTouchInputMapperTest, Reset_PreservesLastTouchState_NoPointersDown)

    // Reset the mapper. When the mapper is reset, we expect it to restore the latest
    // raw state where no pointers are down.
    std::list<NotifyArgs> unused = mapper.reset(ARBITRARY_TIME);
    resetMapper(mapper, ARBITRARY_TIME);
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());

    // Send an empty sync frame. Since there are no pointers, no events are generated.
Loading