diff options
| author | 2024-02-22 17:21:22 +0900 | |
|---|---|---|
| committer | 2024-03-13 09:43:01 +0900 | |
| commit | 25040239f17b406e33c714f56bf082d76005d20e (patch) | |
| tree | 05830242aeeecb980e232533e1695b175022c64a | |
| parent | 48d4be6d40c8a60641a9fbb3cdd27a693922f78b (diff) | |
Use input token in PointerCaptureRequest
Instead of sending boolean to indicate the capture state,
InputDispatcher now sends an input window token that requests a
pointer capture, or nullptr otherwise.
This is useful for some InputReader implementations.
Also, this token can be used to verify if a pointer capture changed
event from a reader is valid.
Bug: 259346762
Bug: 301628662
Test: inputflinger_tests
Test: android.view.cts.PointerCaptureTest WindowFocusTests#testPointerCapture
Change-Id: Ie8343db6744dc2080f7f1dcff5a630be5c87fa3e
15 files changed, 107 insertions, 71 deletions
diff --git a/include/input/Input.h b/include/input/Input.h index ddc376809e..19f4ab38e8 100644 --- a/include/input/Input.h +++ b/include/input/Input.h @@ -1192,15 +1192,17 @@ public: */ struct PointerCaptureRequest { public: - inline PointerCaptureRequest() : enable(false), seq(0) {} - inline PointerCaptureRequest(bool enable, uint32_t seq) : enable(enable), seq(seq) {} + inline PointerCaptureRequest() : window(), seq(0) {} + inline PointerCaptureRequest(sp<IBinder> window, uint32_t seq) : window(window), seq(seq) {} inline bool operator==(const PointerCaptureRequest& other) const { - return enable == other.enable && seq == other.seq; + return window == other.window && seq == other.seq; } - explicit inline operator bool() const { return enable; } + inline bool isEnable() const { return window != nullptr; } - // True iff this is a request to enable Pointer Capture. - bool enable; + // The requesting window. + // If the request is to enable the capture, this is the input token of the window that requested + // pointer capture. Otherwise, this is nullptr. + sp<IBinder> window; // The sequence number for the request. uint32_t seq; diff --git a/services/inputflinger/PointerChoreographer.cpp b/services/inputflinger/PointerChoreographer.cpp index 9db3574389..916f8c6b5f 100644 --- a/services/inputflinger/PointerChoreographer.cpp +++ b/services/inputflinger/PointerChoreographer.cpp @@ -277,7 +277,7 @@ void PointerChoreographer::processDeviceReset(const NotifyDeviceResetArgs& args) void PointerChoreographer::notifyPointerCaptureChanged( const NotifyPointerCaptureChangedArgs& args) { - if (args.request.enable) { + if (args.request.isEnable()) { std::scoped_lock _l(mLock); for (const auto& [_, mousePointerController] : mMousePointersByDisplay) { mousePointerController->fade(PointerControllerInterface::Transition::IMMEDIATE); diff --git a/services/inputflinger/dispatcher/Entry.cpp b/services/inputflinger/dispatcher/Entry.cpp index 264dc03e70..0246d606ac 100644 --- a/services/inputflinger/dispatcher/Entry.cpp +++ b/services/inputflinger/dispatcher/Entry.cpp @@ -110,7 +110,7 @@ PointerCaptureChangedEntry::PointerCaptureChangedEntry(int32_t id, nsecs_t event std::string PointerCaptureChangedEntry::getDescription() const { return StringPrintf("PointerCaptureChangedEvent(pointerCaptureEnabled=%s)", - pointerCaptureRequest.enable ? "true" : "false"); + pointerCaptureRequest.isEnable() ? "true" : "false"); } // --- DragEntry --- diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index 16875dfebd..34bb746c6c 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -1715,7 +1715,7 @@ void InputDispatcher::dispatchPointerCaptureChangedLocked( const bool haveWindowWithPointerCapture = mWindowTokenWithPointerCapture != nullptr; sp<IBinder> token; - if (entry->pointerCaptureRequest.enable) { + if (entry->pointerCaptureRequest.isEnable()) { // Enable Pointer Capture. if (haveWindowWithPointerCapture && (entry->pointerCaptureRequest == mCurrentPointerCaptureRequest)) { @@ -1724,7 +1724,7 @@ void InputDispatcher::dispatchPointerCaptureChangedLocked( ALOGI("Skipping dispatch of Pointer Capture being enabled: no state change."); return; } - if (!mCurrentPointerCaptureRequest.enable) { + if (!mCurrentPointerCaptureRequest.isEnable()) { // This can happen if a window requests capture and immediately releases capture. ALOGW("No window requested Pointer Capture."); dropReason = DropReason::NO_POINTER_CAPTURE; @@ -1737,6 +1737,8 @@ void InputDispatcher::dispatchPointerCaptureChangedLocked( token = mFocusResolver.getFocusedWindowToken(mFocusedDisplayId); LOG_ALWAYS_FATAL_IF(!token, "Cannot find focused window for Pointer Capture."); + LOG_ALWAYS_FATAL_IF(token != entry->pointerCaptureRequest.window, + "Unexpected requested window for Pointer Capture."); mWindowTokenWithPointerCapture = token; } else { // Disable Pointer Capture. @@ -1756,8 +1758,8 @@ void InputDispatcher::dispatchPointerCaptureChangedLocked( } token = mWindowTokenWithPointerCapture; mWindowTokenWithPointerCapture = nullptr; - if (mCurrentPointerCaptureRequest.enable) { - setPointerCaptureLocked(false); + if (mCurrentPointerCaptureRequest.isEnable()) { + setPointerCaptureLocked(nullptr); } } @@ -1765,8 +1767,8 @@ void InputDispatcher::dispatchPointerCaptureChangedLocked( if (connection == nullptr) { // Window has gone away, clean up Pointer Capture state. mWindowTokenWithPointerCapture = nullptr; - if (mCurrentPointerCaptureRequest.enable) { - setPointerCaptureLocked(false); + if (mCurrentPointerCaptureRequest.isEnable()) { + setPointerCaptureLocked(nullptr); } return; } @@ -3832,9 +3834,10 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime, case EventEntry::Type::POINTER_CAPTURE_CHANGED: { const auto& captureEntry = static_cast<const PointerCaptureChangedEntry&>(eventEntry); - status = connection->inputPublisher - .publishCaptureEvent(dispatchEntry->seq, captureEntry.id, - captureEntry.pointerCaptureRequest.enable); + status = + connection->inputPublisher + .publishCaptureEvent(dispatchEntry->seq, captureEntry.id, + captureEntry.pointerCaptureRequest.isEnable()); break; } @@ -4713,7 +4716,7 @@ void InputDispatcher::notifyDeviceReset(const NotifyDeviceResetArgs& args) { void InputDispatcher::notifyPointerCaptureChanged(const NotifyPointerCaptureChangedArgs& args) { if (debugInboundEventDetails()) { ALOGD("notifyPointerCaptureChanged - eventTime=%" PRId64 ", enabled=%s", args.eventTime, - args.request.enable ? "true" : "false"); + args.request.isEnable() ? "true" : "false"); } bool needWake = false; @@ -5784,7 +5787,7 @@ std::string InputDispatcher::dumpPointerCaptureStateLocked() const { std::string dump; dump += StringPrintf(INDENT "Pointer Capture Requested: %s\n", - toString(mCurrentPointerCaptureRequest.enable)); + toString(mCurrentPointerCaptureRequest.isEnable())); std::string windowName = "None"; if (mWindowTokenWithPointerCapture) { @@ -6203,7 +6206,7 @@ void InputDispatcher::requestPointerCapture(const sp<IBinder>& windowToken, bool return; } - if (enabled == mCurrentPointerCaptureRequest.enable) { + if (enabled == mCurrentPointerCaptureRequest.isEnable()) { ALOGW("Ignoring request to %s Pointer Capture: " "window has %s requested pointer capture.", enabled ? "enable" : "disable", enabled ? "already" : "not"); @@ -6219,7 +6222,7 @@ void InputDispatcher::requestPointerCapture(const sp<IBinder>& windowToken, bool } } - setPointerCaptureLocked(enabled); + setPointerCaptureLocked(enabled ? windowToken : nullptr); } // release lock // Wake the thread to process command entries. @@ -6849,14 +6852,14 @@ void InputDispatcher::onFocusChangedLocked( } void InputDispatcher::disablePointerCaptureForcedLocked() { - if (!mCurrentPointerCaptureRequest.enable && !mWindowTokenWithPointerCapture) { + if (!mCurrentPointerCaptureRequest.isEnable() && !mWindowTokenWithPointerCapture) { return; } ALOGD_IF(DEBUG_FOCUS, "Disabling Pointer Capture because the window lost focus."); - if (mCurrentPointerCaptureRequest.enable) { - setPointerCaptureLocked(false); + if (mCurrentPointerCaptureRequest.isEnable()) { + setPointerCaptureLocked(nullptr); } if (!mWindowTokenWithPointerCapture) { @@ -6876,8 +6879,8 @@ void InputDispatcher::disablePointerCaptureForcedLocked() { mInboundQueue.push_front(std::move(entry)); } -void InputDispatcher::setPointerCaptureLocked(bool enable) { - mCurrentPointerCaptureRequest.enable = enable; +void InputDispatcher::setPointerCaptureLocked(const sp<IBinder>& windowToken) { + mCurrentPointerCaptureRequest.window = windowToken; mCurrentPointerCaptureRequest.seq++; auto command = [this, request = mCurrentPointerCaptureRequest]() REQUIRES(mLock) { scoped_unlock unlock(mLock); diff --git a/services/inputflinger/dispatcher/InputDispatcher.h b/services/inputflinger/dispatcher/InputDispatcher.h index d6eba64dd0..13571b3b5f 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.h +++ b/services/inputflinger/dispatcher/InputDispatcher.h @@ -421,7 +421,8 @@ private: void disablePointerCaptureForcedLocked() REQUIRES(mLock); // Set the Pointer Capture state in the Policy. - void setPointerCaptureLocked(bool enable) REQUIRES(mLock); + // The window is not nullptr for requests to enable, otherwise it is nullptr. + void setPointerCaptureLocked(const sp<IBinder>& window) REQUIRES(mLock); // Dispatcher state at time of last ANR. std::string mLastAnrState GUARDED_BY(mLock); diff --git a/services/inputflinger/reader/mapper/CursorInputMapper.cpp b/services/inputflinger/reader/mapper/CursorInputMapper.cpp index 06f10e5445..c8cc5dcc83 100644 --- a/services/inputflinger/reader/mapper/CursorInputMapper.cpp +++ b/services/inputflinger/reader/mapper/CursorInputMapper.cpp @@ -486,7 +486,7 @@ void CursorInputMapper::configureBasicParams() { } void CursorInputMapper::configureOnPointerCapture(const InputReaderConfiguration& config) { - if (config.pointerCaptureRequest.enable) { + if (config.pointerCaptureRequest.isEnable()) { if (mParameters.mode == Parameters::Mode::POINTER) { mParameters.mode = Parameters::Mode::POINTER_RELATIVE; mSource = AINPUT_SOURCE_MOUSE_RELATIVE; diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/services/inputflinger/reader/mapper/TouchInputMapper.cpp index 3c26d1d73e..7d27d4a9ce 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchInputMapper.cpp @@ -923,7 +923,7 @@ void TouchInputMapper::configureInputDevice(nsecs_t when, bool* outResetNeeded) // Determine device mode. if (mParameters.deviceType == Parameters::DeviceType::POINTER && - mConfig.pointerGesturesEnabled && !mConfig.pointerCaptureRequest.enable) { + mConfig.pointerGesturesEnabled && !mConfig.pointerCaptureRequest.isEnable()) { mSource = AINPUT_SOURCE_MOUSE; mDeviceMode = DeviceMode::POINTER; if (hasStylus()) { @@ -1038,7 +1038,7 @@ void TouchInputMapper::configureInputDevice(nsecs_t when, bool* outResetNeeded) (mDeviceMode == DeviceMode::POINTER) || // - when pointer capture is enabled, to preserve the mouse cursor position; (mParameters.deviceType == Parameters::DeviceType::POINTER && - mConfig.pointerCaptureRequest.enable) || + mConfig.pointerCaptureRequest.isEnable()) || // - when we should be showing touches; (mDeviceMode == DeviceMode::DIRECT && mConfig.showTouches) || // - when we should be showing a pointer icon for direct styluses. @@ -1047,7 +1047,7 @@ void TouchInputMapper::configureInputDevice(nsecs_t when, bool* outResetNeeded) if (mPointerController == nullptr) { mPointerController = getContext()->getPointerController(getDeviceId()); } - if (mConfig.pointerCaptureRequest.enable) { + if (mConfig.pointerCaptureRequest.isEnable()) { mPointerController->fade(PointerControllerInterface::Transition::IMMEDIATE); } } else { diff --git a/services/inputflinger/reader/mapper/TouchpadInputMapper.cpp b/services/inputflinger/reader/mapper/TouchpadInputMapper.cpp index eacc66eeab..99f9e24169 100644 --- a/services/inputflinger/reader/mapper/TouchpadInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchpadInputMapper.cpp @@ -410,9 +410,9 @@ std::list<NotifyArgs> TouchpadInputMapper::reconfigure(nsecs_t when, .setBoolValues({config.touchpadRightClickZoneEnabled}); } std::list<NotifyArgs> out; - if ((!changes.any() && config.pointerCaptureRequest.enable) || + if ((!changes.any() && config.pointerCaptureRequest.isEnable()) || changes.test(InputReaderConfiguration::Change::POINTER_CAPTURE)) { - mPointerCaptured = config.pointerCaptureRequest.enable; + mPointerCaptured = config.pointerCaptureRequest.isEnable(); // The motion ranges are going to change, so bump the generation to clear the cached ones. bumpGeneration(); if (mPointerCaptured) { diff --git a/services/inputflinger/tests/CursorInputMapper_test.cpp b/services/inputflinger/tests/CursorInputMapper_test.cpp index de740672fc..c44f88006e 100644 --- a/services/inputflinger/tests/CursorInputMapper_test.cpp +++ b/services/inputflinger/tests/CursorInputMapper_test.cpp @@ -166,7 +166,7 @@ protected: } void setPointerCapture(bool enabled) { - mReaderConfiguration.pointerCaptureRequest.enable = enabled; + mReaderConfiguration.pointerCaptureRequest.window = enabled ? sp<BBinder>::make() : nullptr; mReaderConfiguration.pointerCaptureRequest.seq = 1; int32_t generation = mDevice->getGeneration(); std::list<NotifyArgs> args = diff --git a/services/inputflinger/tests/FakeInputReaderPolicy.cpp b/services/inputflinger/tests/FakeInputReaderPolicy.cpp index 9e9371248e..8f593b553a 100644 --- a/services/inputflinger/tests/FakeInputReaderPolicy.cpp +++ b/services/inputflinger/tests/FakeInputReaderPolicy.cpp @@ -178,8 +178,8 @@ void FakeInputReaderPolicy::setTouchAffineTransformation(const TouchAffineTransf transform = t; } -PointerCaptureRequest FakeInputReaderPolicy::setPointerCapture(bool enabled) { - mConfig.pointerCaptureRequest = {enabled, mNextPointerCaptureSequenceNumber++}; +PointerCaptureRequest FakeInputReaderPolicy::setPointerCapture(const sp<IBinder>& window) { + mConfig.pointerCaptureRequest = {window, mNextPointerCaptureSequenceNumber++}; return mConfig.pointerCaptureRequest; } diff --git a/services/inputflinger/tests/FakeInputReaderPolicy.h b/services/inputflinger/tests/FakeInputReaderPolicy.h index da5085db7c..710bb5496f 100644 --- a/services/inputflinger/tests/FakeInputReaderPolicy.h +++ b/services/inputflinger/tests/FakeInputReaderPolicy.h @@ -68,7 +68,7 @@ public: TouchAffineTransformation getTouchAffineTransformation(const std::string& inputDeviceDescriptor, ui::Rotation surfaceRotation); void setTouchAffineTransformation(const TouchAffineTransformation t); - PointerCaptureRequest setPointerCapture(bool enabled); + PointerCaptureRequest setPointerCapture(const sp<IBinder>& window); void setShowTouches(bool enabled); void setDefaultPointerDisplayId(int32_t pointerDisplayId); void setPointerGestureEnabled(bool enabled); diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index 60d598ff80..55d5f1303f 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -308,17 +308,22 @@ public: "signal"; } - PointerCaptureRequest assertSetPointerCaptureCalled(bool enabled) { + PointerCaptureRequest assertSetPointerCaptureCalled(const sp<WindowInfoHandle>& window, + bool enabled) { std::unique_lock lock(mLock); base::ScopedLockAssertion assumeLocked(mLock); - if (!mPointerCaptureChangedCondition.wait_for(lock, 100ms, - [this, enabled]() REQUIRES(mLock) { - return mPointerCaptureRequest->enable == - enabled; - })) { - ADD_FAILURE() << "Timed out waiting for setPointerCapture(" << enabled - << ") to be called."; + if (!mPointerCaptureChangedCondition + .wait_for(lock, 100ms, [this, enabled, window]() REQUIRES(mLock) { + if (enabled) { + return mPointerCaptureRequest->isEnable() && + mPointerCaptureRequest->window == window->getToken(); + } else { + return !mPointerCaptureRequest->isEnable(); + } + })) { + ADD_FAILURE() << "Timed out waiting for setPointerCapture(" << window->getName() << ", " + << enabled << ") to be called."; return {}; } auto request = *mPointerCaptureRequest; @@ -333,7 +338,7 @@ public: if (mPointerCaptureChangedCondition.wait_for(lock, 100ms) != std::cv_status::timeout) { FAIL() << "Expected setPointerCapture(request) to not be called, but was called. " "enabled = " - << std::to_string(mPointerCaptureRequest->enable); + << std::to_string(mPointerCaptureRequest->isEnable()); } mPointerCaptureRequest.reset(); } @@ -9888,7 +9893,7 @@ protected: PointerCaptureRequest requestAndVerifyPointerCapture(const sp<FakeWindowHandle>& window, bool enabled) { mDispatcher->requestPointerCapture(window->getToken(), enabled); - auto request = mFakePolicy->assertSetPointerCaptureCalled(enabled); + auto request = mFakePolicy->assertSetPointerCaptureCalled(window, enabled); notifyPointerCaptureChanged(request); window->consumeCaptureEvent(enabled); return request; @@ -9921,7 +9926,7 @@ TEST_F(InputDispatcherPointerCaptureTests, DisablesPointerCaptureAfterWindowLose mWindow->consumeCaptureEvent(false); mWindow->consumeFocusEvent(false); mSecondWindow->consumeFocusEvent(true); - mFakePolicy->assertSetPointerCaptureCalled(false); + mFakePolicy->assertSetPointerCaptureCalled(mWindow, false); // Ensure that additional state changes from InputReader are not sent to the window. notifyPointerCaptureChanged({}); @@ -9940,7 +9945,7 @@ TEST_F(InputDispatcherPointerCaptureTests, UnexpectedStateChangeDisablesPointerC notifyPointerCaptureChanged(request); // Ensure that Pointer Capture is disabled. - mFakePolicy->assertSetPointerCaptureCalled(false); + mFakePolicy->assertSetPointerCaptureCalled(mWindow, false); mWindow->consumeCaptureEvent(false); mWindow->assertNoEvents(); } @@ -9950,13 +9955,13 @@ TEST_F(InputDispatcherPointerCaptureTests, OutOfOrderRequests) { // The first window loses focus. setFocusedWindow(mSecondWindow); - mFakePolicy->assertSetPointerCaptureCalled(false); + mFakePolicy->assertSetPointerCaptureCalled(mWindow, false); mWindow->consumeCaptureEvent(false); // Request Pointer Capture from the second window before the notification from InputReader // arrives. mDispatcher->requestPointerCapture(mSecondWindow->getToken(), true); - auto request = mFakePolicy->assertSetPointerCaptureCalled(true); + auto request = mFakePolicy->assertSetPointerCaptureCalled(mSecondWindow, true); // InputReader notifies Pointer Capture was disabled (because of the focus change). notifyPointerCaptureChanged({}); @@ -9971,11 +9976,11 @@ TEST_F(InputDispatcherPointerCaptureTests, OutOfOrderRequests) { TEST_F(InputDispatcherPointerCaptureTests, EnableRequestFollowsSequenceNumbers) { // App repeatedly enables and disables capture. mDispatcher->requestPointerCapture(mWindow->getToken(), true); - auto firstRequest = mFakePolicy->assertSetPointerCaptureCalled(true); + auto firstRequest = mFakePolicy->assertSetPointerCaptureCalled(mWindow, true); mDispatcher->requestPointerCapture(mWindow->getToken(), false); - mFakePolicy->assertSetPointerCaptureCalled(false); + mFakePolicy->assertSetPointerCaptureCalled(mWindow, false); mDispatcher->requestPointerCapture(mWindow->getToken(), true); - auto secondRequest = mFakePolicy->assertSetPointerCaptureCalled(true); + auto secondRequest = mFakePolicy->assertSetPointerCaptureCalled(mWindow, true); // InputReader notifies that PointerCapture has been enabled for the first request. Since the // first request is now stale, this should do nothing. @@ -9992,10 +9997,10 @@ TEST_F(InputDispatcherPointerCaptureTests, RapidToggleRequests) { // App toggles pointer capture off and on. mDispatcher->requestPointerCapture(mWindow->getToken(), false); - mFakePolicy->assertSetPointerCaptureCalled(false); + mFakePolicy->assertSetPointerCaptureCalled(mWindow, false); mDispatcher->requestPointerCapture(mWindow->getToken(), true); - auto enableRequest = mFakePolicy->assertSetPointerCaptureCalled(true); + auto enableRequest = mFakePolicy->assertSetPointerCaptureCalled(mWindow, true); // InputReader notifies that the latest "enable" request was processed, while skipping over the // preceding "disable" request. @@ -10047,6 +10052,26 @@ TEST_F(InputDispatcherPointerCaptureTests, MouseHoverAndPointerCapture) { mWindow->assertNoEvents(); } +using InputDispatcherPointerCaptureDeathTest = InputDispatcherPointerCaptureTests; + +TEST_F(InputDispatcherPointerCaptureDeathTest, + NotifyPointerCaptureChangedWithWrongTokenAbortsDispatcher) { + testing::GTEST_FLAG(death_test_style) = "threadsafe"; + ScopedSilentDeath _silentDeath; + + mDispatcher->requestPointerCapture(mWindow->getToken(), true); + auto request = mFakePolicy->assertSetPointerCaptureCalled(mWindow, true); + + // Dispatch a pointer changed event with a wrong token. + request.window = mSecondWindow->getToken(); + ASSERT_DEATH( + { + notifyPointerCaptureChanged(request); + mSecondWindow->consumeCaptureEvent(true); + }, + "Unexpected requested window for Pointer Capture."); +} + class InputDispatcherUntrustedTouchesTest : public InputDispatcherTest { protected: constexpr static const float MAXIMUM_OBSCURING_OPACITY = 0.8; diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index 835f8b89c3..1d46c9a1e2 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -1165,18 +1165,18 @@ TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToSubdeviceMappers) { TEST_F(InputReaderTest, ChangingPointerCaptureNotifiesInputListener) { NotifyPointerCaptureChangedArgs args; - auto request = mFakePolicy->setPointerCapture(true); + auto request = mFakePolicy->setPointerCapture(/*window=*/sp<BBinder>::make()); mReader->requestRefreshConfiguration(InputReaderConfiguration::Change::POINTER_CAPTURE); mReader->loopOnce(); mFakeListener->assertNotifyCaptureWasCalled(&args); - ASSERT_TRUE(args.request.enable) << "Pointer Capture should be enabled."; + ASSERT_TRUE(args.request.isEnable()) << "Pointer Capture should be enabled."; ASSERT_EQ(args.request, request) << "Pointer Capture sequence number should match."; - mFakePolicy->setPointerCapture(false); + mFakePolicy->setPointerCapture(/*window=*/nullptr); mReader->requestRefreshConfiguration(InputReaderConfiguration::Change::POINTER_CAPTURE); mReader->loopOnce(); mFakeListener->assertNotifyCaptureWasCalled(&args); - ASSERT_FALSE(args.request.enable) << "Pointer Capture should be disabled."; + ASSERT_FALSE(args.request.isEnable()) << "Pointer Capture should be disabled."; // Verify that the Pointer Capture state is not updated when the configuration value // does not change. @@ -9802,7 +9802,7 @@ TEST_F(MultiTouchInputMapperTest, Process_TouchpadCapture) { prepareAxes(POSITION | ID | SLOT); mFakeEventHub->addKey(EVENTHUB_ID, BTN_LEFT, 0, AKEYCODE_UNKNOWN, 0); mFakeEventHub->addKey(EVENTHUB_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0); - mFakePolicy->setPointerCapture(true); + mFakePolicy->setPointerCapture(/*window=*/sp<BBinder>::make()); mFakePolicy->setPointerController(fakePointerController); MultiTouchInputMapper& mapper = constructAndAddMapper<MultiTouchInputMapper>(); @@ -9934,7 +9934,7 @@ TEST_F(MultiTouchInputMapperTest, Process_TouchpadCapture) { ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); // non captured touchpad should be a mouse source - mFakePolicy->setPointerCapture(false); + mFakePolicy->setPointerCapture(/*window=*/nullptr); configureDevice(InputReaderConfiguration::Change::POINTER_CAPTURE); ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs)); ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper.getSources()); @@ -10012,14 +10012,14 @@ TEST_F(MultiTouchInputMapperTest, WhenCapturedAndNotCaptured_GetSources) { prepareAxes(POSITION | ID | SLOT); mFakeEventHub->addKey(EVENTHUB_ID, BTN_LEFT, 0, AKEYCODE_UNKNOWN, 0); mFakePolicy->setPointerController(fakePointerController); - mFakePolicy->setPointerCapture(false); + mFakePolicy->setPointerCapture(/*window=*/nullptr); MultiTouchInputMapper& mapper = constructAndAddMapper<MultiTouchInputMapper>(); // uncaptured touchpad should be a pointer device ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper.getSources()); // captured touchpad should be a touchpad device - mFakePolicy->setPointerCapture(true); + mFakePolicy->setPointerCapture(/*window=*/sp<BBinder>::make()); configureDevice(InputReaderConfiguration::Change::POINTER_CAPTURE); ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper.getSources()); } @@ -10090,7 +10090,7 @@ protected: prepareAbsoluteAxisResolution(xAxisResolution, yAxisResolution); // In order to enable swipe and freeform gesture in pointer mode, pointer capture // needs to be disabled, and the pointer gesture needs to be enabled. - mFakePolicy->setPointerCapture(false); + mFakePolicy->setPointerCapture(/*window=*/nullptr); mFakePolicy->setPointerGestureEnabled(true); mFakePolicy->setPointerController(fakePointerController); diff --git a/services/inputflinger/tests/PointerChoreographer_test.cpp b/services/inputflinger/tests/PointerChoreographer_test.cpp index e9e50619ee..cbfb28faea 100644 --- a/services/inputflinger/tests/PointerChoreographer_test.cpp +++ b/services/inputflinger/tests/PointerChoreographer_test.cpp @@ -413,7 +413,8 @@ TEST_F(PointerChoreographerTest, DoesNotMovePointerForMouseRelativeSource) { {generateTestDeviceInfo(DEVICE_ID, AINPUT_SOURCE_MOUSE_RELATIVE, ADISPLAY_ID_NONE)}}); mChoreographer.notifyPointerCaptureChanged( NotifyPointerCaptureChangedArgs(/*id=*/2, systemTime(SYSTEM_TIME_MONOTONIC), - PointerCaptureRequest(/*enable=*/true, /*seq=*/0))); + PointerCaptureRequest(/*window=*/sp<BBinder>::make(), + /*seq=*/0))); // Notify motion as if pointer capture is enabled. mChoreographer.notifyMotion( @@ -450,7 +451,8 @@ TEST_F(PointerChoreographerTest, WhenPointerCaptureEnabledHidesPointer) { // Enable pointer capture and check if the PointerController hid the pointer. mChoreographer.notifyPointerCaptureChanged( NotifyPointerCaptureChangedArgs(/*id=*/1, systemTime(SYSTEM_TIME_MONOTONIC), - PointerCaptureRequest(/*enable=*/true, /*seq=*/0))); + PointerCaptureRequest(/*window=*/sp<BBinder>::make(), + /*seq=*/0))); ASSERT_FALSE(pc->isPointerShown()); } @@ -1295,7 +1297,8 @@ TEST_F(PointerChoreographerTest, DoesNotMovePointerForTouchpadSource) { // Assume that pointer capture is enabled. mChoreographer.notifyPointerCaptureChanged( NotifyPointerCaptureChangedArgs(/*id=*/1, systemTime(SYSTEM_TIME_MONOTONIC), - PointerCaptureRequest(/*enable=*/true, /*seq=*/0))); + PointerCaptureRequest(/*window=*/sp<BBinder>::make(), + /*seq=*/0))); // Notify motion as if pointer capture is enabled. mChoreographer.notifyMotion(MotionArgsBuilder(AMOTION_EVENT_ACTION_DOWN, AINPUT_SOURCE_TOUCHPAD) @@ -1329,7 +1332,8 @@ TEST_F(PointerChoreographerTest, WhenPointerCaptureEnabledTouchpadHidesPointer) // Enable pointer capture and check if the PointerController hid the pointer. mChoreographer.notifyPointerCaptureChanged( NotifyPointerCaptureChangedArgs(/*id=*/1, systemTime(SYSTEM_TIME_MONOTONIC), - PointerCaptureRequest(/*enable=*/true, /*seq=*/0))); + PointerCaptureRequest(/*window=*/sp<BBinder>::make(), + /*seq=*/0))); ASSERT_FALSE(pc->isPointerShown()); } diff --git a/services/inputflinger/tests/fuzzers/TouchpadInputFuzzer.cpp b/services/inputflinger/tests/fuzzers/TouchpadInputFuzzer.cpp index c2bf275611..643e8b9f97 100644 --- a/services/inputflinger/tests/fuzzers/TouchpadInputFuzzer.cpp +++ b/services/inputflinger/tests/fuzzers/TouchpadInputFuzzer.cpp @@ -125,6 +125,9 @@ void setTouchpadSettings(ThreadSafeFuzzedDataProvider& fdp, InputReaderConfigura config.touchpadTapToClickEnabled = fdp.ConsumeBool(); config.touchpadTapDraggingEnabled = fdp.ConsumeBool(); config.touchpadRightClickZoneEnabled = fdp.ConsumeBool(); + + config.pointerCaptureRequest.window = fdp.ConsumeBool() ? sp<BBinder>::make() : nullptr; + config.pointerCaptureRequest.seq = fdp.ConsumeIntegral<uint32_t>(); } } // namespace @@ -145,7 +148,6 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t* data, size_t size) { // Some settings are fuzzed here, as well as in the main loop, to provide randomized data to the // TouchpadInputMapper constructor. setTouchpadSettings(*fdp, policyConfig); - policyConfig.pointerCaptureRequest.enable = fdp->ConsumeBool(); TouchpadInputMapper& mapper = getMapperForDevice<ThreadSafeFuzzedDataProvider, TouchpadInputMapper>(*fdp, device, policyConfig); @@ -164,7 +166,6 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t* data, size_t size) { [&]() -> void { mapper.getSources(); }, [&]() -> void { setTouchpadSettings(*fdp, policyConfig); - policyConfig.pointerCaptureRequest.enable = fdp->ConsumeBool(); std::list<NotifyArgs> unused = mapper.reconfigure(fdp->ConsumeIntegral<nsecs_t>(), policyConfig, InputReaderConfiguration::Change( |