InputReader: Clear the multi-touch state when the device is reset
This is a partial revert of Change-Id:
Ic59d9fcb4e13fe262c422825c2485185004b719b
That CL introduced a behavior where the multi-touch state was never
reset, assuming there was no way to forcefully sync the state with the
kernel. This leads to issues when there are overflows of the kernel
buffer, in which case events may be dropped. Dropped events can lead to
the touch state being out of sync, which can result in behaviors such as
stuck pointers.
To avoid this, we will start resetting the touch state again when the
device is reset, such as after a buffer overflow.
We will follow this with the long-term fix of using EVIOCGMTSLOTS to
sync the multi-touch state in b/291626046.
Bug: 301332406
Test: atest inputflinger_tests
Test: manual, see b/301332406#comment24
Change-Id: If3027840bfff52adce086b853adc7284adf3777d
diff --git a/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp b/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp
index 2dd05f5..5a74a42 100644
--- a/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp
+++ b/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp
@@ -35,12 +35,10 @@
MultiTouchInputMapper::~MultiTouchInputMapper() {}
std::list<NotifyArgs> MultiTouchInputMapper::reset(nsecs_t when) {
- // The evdev multi-touch protocol does not allow userspace applications to query the initial or
- // current state of the pointers at any time. This means if we clear our accumulated state when
- // resetting the input mapper, there's no way to rebuild the full initial state of the pointers.
- // We can only wait for updates to all the pointers and axes. Rather than clearing the state and
- // rebuilding the state from scratch, we work around this kernel API limitation by never
- // fully clearing any state specific to the multi-touch protocol.
+ // TODO(b/291626046): Sync the MT state with the kernel using EVIOCGMTSLOTS.
+ mMultiTouchMotionAccumulator.reset(getDeviceContext());
+ mPointerIdBits.clear();
+
return TouchInputMapper::reset(when);
}