diff options
| author | 2022-07-29 17:44:18 +0000 | |
|---|---|---|
| committer | 2022-07-29 17:44:18 +0000 | |
| commit | dbbf3d243a20ef97f7c7e564d2fa8f0b13faecd6 (patch) | |
| tree | 3dd9c50db62e4441851f28b2a8a1fa829f37bd18 | |
| parent | 7c1c124bb6a8101bb871051915f3bb4cd4df4d1b (diff) | |
| parent | 70e413d08ff6305f9c4a7489d77457eb7ce38097 (diff) | |
Merge "Fix spot not disappear when display id changed"
| -rw-r--r-- | services/inputflinger/reader/mapper/TouchInputMapper.cpp | 11 | ||||
| -rw-r--r-- | services/inputflinger/tests/InputReader_test.cpp | 34 |
2 files changed, 45 insertions, 0 deletions
diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/services/inputflinger/reader/mapper/TouchInputMapper.cpp index 17bbff8817..ffc1d8c326 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchInputMapper.cpp @@ -395,6 +395,10 @@ void TouchInputMapper::configure(nsecs_t when, const InputReaderConfiguration* c } if (changes && resetNeeded) { + // If device was reset, cancel touch event and update touch spot state. + cancelTouch(mCurrentRawState.when, mCurrentRawState.readTime); + mCurrentCookedState.clear(); + updateTouchSpots(); // 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. NotifyDeviceResetArgs args(getContext()->getNextId(), when, getDeviceId()); @@ -679,6 +683,7 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) { bool skipViewportUpdate = false; if (viewportChanged) { bool viewportOrientationChanged = mViewport.orientation != newViewport->orientation; + const bool viewportDisplayIdChanged = mViewport.displayId != newViewport->displayId; mViewport = *newViewport; if (mDeviceMode == DeviceMode::DIRECT || mDeviceMode == DeviceMode::POINTER) { @@ -792,6 +797,8 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) { mSurfaceTop = 0; mSurfaceOrientation = DISPLAY_ORIENTATION_0; } + // If displayId changed, do not skip viewport update. + skipViewportUpdate &= !viewportDisplayIdChanged; } // If moving between pointer modes, need to reset some state. @@ -1927,6 +1934,10 @@ void TouchInputMapper::dispatchVirtualKey(nsecs_t when, nsecs_t readTime, uint32 } void TouchInputMapper::abortTouches(nsecs_t when, nsecs_t readTime, uint32_t policyFlags) { + if (mCurrentMotionAborted) { + // Current motion event was already aborted. + return; + } BitSet32 currentIdBits = mCurrentCookedState.cookedPointerData.touchingIdBits; if (!currentIdBits.isEmpty()) { int32_t metaState = getContext()->getGlobalMetaState(); diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index 0d5d06a569..38e328bc7e 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -6251,6 +6251,36 @@ TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsV toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); } +TEST_F(SingleTouchInputMapperTest, + Process_WhenViewportDisplayIdChanged_TouchIsCanceledAndDeviceIsReset) { + addConfigurationProperty("touch.deviceType", "touchScreen"); + prepareDisplay(DISPLAY_ORIENTATION_0); + prepareButtons(); + prepareAxes(POSITION); + SingleTouchInputMapper& mapper = addMapperAndConfigure<SingleTouchInputMapper>(); + NotifyMotionArgs motionArgs; + + // Down. + int32_t x = 100; + int32_t y = 200; + processDown(mapper, x, y); + processSync(mapper); + + // We should receive a down event + ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); + ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); + + // Change display id + clearViewports(); + prepareSecondaryDisplay(ViewportType::INTERNAL); + + // We should receive a cancel event + ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); + ASSERT_EQ(AMOTION_EVENT_ACTION_CANCEL, motionArgs.action); + // Then receive reset called + ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled()); +} + // --- MultiTouchInputMapperTest --- class MultiTouchInputMapperTest : public TouchInputMapperTest { @@ -8072,6 +8102,10 @@ TEST_F(MultiTouchInputMapperTest, VideoFrames_WhenNotOrientationAware_AreRotated // window's coordinate space. frames[0].rotate(getInverseRotation(orientation)); ASSERT_EQ(frames, motionArgs.videoFrames); + + // Release finger. + processSync(mapper); + ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); } } |