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

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

Disable new touchpad stack for Sony gamepads

The touchpads on the Sony DualShock 4 and DualSense gamepads do not work
with the gestures library, for a reason that is currently unknown. This
is tracked in b/246587538, but while we wait for that to be fixed just
check for them by vendor and product ID, and fall back to the old stack.

This shouldn't really be a few IDs hard-coded into `InputDevice` — it
should be an input device configuration property, but since those are
currently only loaded in the configuration stage that will require a
larger change.

This is a second attempt after ag/21019000 caused a hwasan failure,
which we believe was due to calling getDeviceInfo() when not all mappers
had been configured. Getting the device ID from contextPtr instead fixes
this issue.

Bug: 251196347, 246587538
Test: `setprop persist.input.touchpad.gestures_library.enabled true`,
      connect gamepads, do a pinch gesture, confirm that touch spots
      show on screen (which doesn't happen in the new stack)
Test: `setprop persist.input.touchpad.gestures_library.enabled true`,
      run android.hardware.input.cts.tests.SonyDualshock4BluetoothTest
Change-Id: Ie843a7552ae31db640a847a9a108a66f6363730e
parent 0d5e66e4
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -210,8 +210,14 @@ void InputDevice::addEventHubDevice(int32_t eventHubId, bool populateMappers) {
    // Touchscreens and touchpad devices.
    static const bool ENABLE_TOUCHPAD_GESTURES_LIBRARY =
            sysprop::InputProperties::enable_touchpad_gestures_library().value_or(false);
    // TODO(b/246587538): Fix the new touchpad stack for Sony DualShock 4 (5c4, 9cc) and DualSense
    // (ce6) touchpads, or at least load this setting from the IDC file.
    const InputDeviceIdentifier& identifier = contextPtr->getDeviceIdentifier();
    const bool isSonyGamepadTouchpad = identifier.vendor == 0x054c &&
            (identifier.product == 0x05c4 || identifier.product == 0x09cc ||
             identifier.product == 0x0ce6);
    if (ENABLE_TOUCHPAD_GESTURES_LIBRARY && classes.test(InputDeviceClass::TOUCHPAD) &&
        classes.test(InputDeviceClass::TOUCH_MT)) {
        classes.test(InputDeviceClass::TOUCH_MT) && !isSonyGamepadTouchpad) {
        mappers.push_back(std::make_unique<TouchpadInputMapper>(*contextPtr));
    } else if (classes.test(InputDeviceClass::TOUCH_MT)) {
        mappers.push_back(std::make_unique<MultiTouchInputMapper>(*contextPtr));