diff options
| -rw-r--r-- | services/inputflinger/tests/InputDispatcher_test.cpp | 244 |
1 files changed, 131 insertions, 113 deletions
diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index c92736ebf1..c0465d8496 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -861,30 +861,31 @@ public: explicit FakeInputReceiver(std::unique_ptr<InputChannel> clientChannel, const std::string name) : mConsumer(std::move(clientChannel)), mName(name) {} - InputEvent* consume(std::chrono::milliseconds timeout, bool handled = false) { - InputEvent* event; - std::optional<uint32_t> consumeSeq = receiveEvent(timeout, &event); + std::unique_ptr<InputEvent> consume(std::chrono::milliseconds timeout, bool handled = false) { + auto [consumeSeq, event] = receiveEvent(timeout); if (!consumeSeq) { return nullptr; } finishEvent(*consumeSeq, handled); - return event; + return std::move(event); } /** * Receive an event without acknowledging it. * Return the sequence number that could later be used to send finished signal. */ - std::optional<uint32_t> receiveEvent(std::chrono::milliseconds timeout, - InputEvent** outEvent = nullptr) { + std::pair<std::optional<uint32_t>, std::unique_ptr<InputEvent>> receiveEvent( + std::chrono::milliseconds timeout) { uint32_t consumeSeq; - InputEvent* event; + std::unique_ptr<InputEvent> event; std::chrono::time_point start = std::chrono::steady_clock::now(); status_t status = WOULD_BLOCK; while (status == WOULD_BLOCK) { + InputEvent* rawEventPtr = nullptr; status = mConsumer.consume(&mEventFactory, /*consumeBatches=*/true, -1, &consumeSeq, - &event); + &rawEventPtr); + event = std::unique_ptr<InputEvent>(rawEventPtr); std::chrono::duration elapsed = std::chrono::steady_clock::now() - start; if (elapsed > timeout) { break; @@ -893,21 +894,17 @@ public: if (status == WOULD_BLOCK) { // Just means there's no event available. - return std::nullopt; + return std::make_pair(std::nullopt, nullptr); } if (status != OK) { ADD_FAILURE() << mName.c_str() << ": consumer consume should return OK."; - return std::nullopt; + return std::make_pair(std::nullopt, nullptr); } if (event == nullptr) { ADD_FAILURE() << "Consumed correctly, but received NULL event from consumer"; - return std::nullopt; } - if (outEvent != nullptr) { - *outEvent = event; - } - return consumeSeq; + return std::make_pair(consumeSeq, std::move(event)); } /** @@ -926,7 +923,7 @@ public: void consumeEvent(InputEventType expectedEventType, int32_t expectedAction, std::optional<int32_t> expectedDisplayId, std::optional<int32_t> expectedFlags) { - InputEvent* event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); ASSERT_NE(nullptr, event) << mName.c_str() << ": consumer should have returned non-NULL event."; @@ -970,8 +967,8 @@ public: } } - MotionEvent* consumeMotion() { - InputEvent* event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); + std::unique_ptr<MotionEvent> consumeMotion() { + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); if (event == nullptr) { ADD_FAILURE() << mName << ": expected a MotionEvent, but didn't get one."; @@ -982,17 +979,17 @@ public: ADD_FAILURE() << mName << " expected a MotionEvent, got " << *event; return nullptr; } - return static_cast<MotionEvent*>(event); + return std::unique_ptr<MotionEvent>(static_cast<MotionEvent*>(event.release())); } void consumeMotionEvent(const ::testing::Matcher<MotionEvent>& matcher) { - MotionEvent* motionEvent = consumeMotion(); + std::unique_ptr<MotionEvent> motionEvent = consumeMotion(); ASSERT_NE(nullptr, motionEvent) << "Did not get a motion event, but expected " << matcher; ASSERT_THAT(*motionEvent, matcher); } void consumeFocusEvent(bool hasFocus, bool inTouchMode) { - InputEvent* event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); ASSERT_NE(nullptr, event) << mName.c_str() << ": consumer should have returned non-NULL event."; ASSERT_EQ(InputEventType::FOCUS, event->getType()) @@ -1001,12 +998,12 @@ public: ASSERT_EQ(ADISPLAY_ID_NONE, event->getDisplayId()) << mName.c_str() << ": event displayId should always be NONE."; - FocusEvent* focusEvent = static_cast<FocusEvent*>(event); - EXPECT_EQ(hasFocus, focusEvent->getHasFocus()); + FocusEvent& focusEvent = static_cast<FocusEvent&>(*event); + EXPECT_EQ(hasFocus, focusEvent.getHasFocus()); } void consumeCaptureEvent(bool hasCapture) { - const InputEvent* event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); ASSERT_NE(nullptr, event) << mName.c_str() << ": consumer should have returned non-NULL event."; ASSERT_EQ(InputEventType::CAPTURE, event->getType()) @@ -1020,7 +1017,7 @@ public: } void consumeDragEvent(bool isExiting, float x, float y) { - const InputEvent* event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); ASSERT_NE(nullptr, event) << mName.c_str() << ": consumer should have returned non-NULL event."; ASSERT_EQ(InputEventType::DRAG, event->getType()) << "Instead of DragEvent, got " << *event; @@ -1035,7 +1032,7 @@ public: } void consumeTouchModeEvent(bool inTouchMode) { - const InputEvent* event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); ASSERT_NE(nullptr, event) << mName.c_str() << ": consumer should have returned non-NULL event."; ASSERT_EQ(InputEventType::TOUCH_MODE, event->getType()) @@ -1048,7 +1045,7 @@ public: } void assertNoEvents() { - InputEvent* event = consume(CONSUME_TIMEOUT_NO_EVENT_EXPECTED); + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_NO_EVENT_EXPECTED); if (event == nullptr) { return; } @@ -1081,7 +1078,7 @@ public: private: InputConsumer mConsumer; - PreallocatedInputEventFactory mEventFactory; + DynamicInputEventFactory mEventFactory; std::string mName; }; @@ -1228,17 +1225,23 @@ public: void setWindowOffset(float offsetX, float offsetY) { mInfo.transform.set(offsetX, offsetY); } - const KeyEvent& consumeKey(bool handled = true) { - const InputEvent& event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED, handled); - if (event.getType() != InputEventType::KEY) { - LOG(FATAL) << "Instead of key event, got " << event; + std::unique_ptr<KeyEvent> consumeKey(bool handled = true) { + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED, handled); + if (event == nullptr) { + ADD_FAILURE() << "No event"; + return nullptr; } - return static_cast<const KeyEvent&>(event); + if (event->getType() != InputEventType::KEY) { + ADD_FAILURE() << "Instead of key event, got " << event; + return nullptr; + } + return std::unique_ptr<KeyEvent>(static_cast<KeyEvent*>(event.release())); } void consumeKeyEvent(const ::testing::Matcher<KeyEvent>& matcher) { - const KeyEvent& keyEvent = consumeKey(); - ASSERT_THAT(keyEvent, matcher); + std::unique_ptr<KeyEvent> keyEvent = consumeKey(); + ASSERT_NE(nullptr, keyEvent); + ASSERT_THAT(*keyEvent, matcher); } void consumeKeyDown(int32_t expectedDisplayId, int32_t expectedFlags = 0) { @@ -1324,14 +1327,20 @@ public: mInputReceiver->consumeCaptureEvent(hasCapture); } - const MotionEvent& consumeMotionEvent( + std::unique_ptr<MotionEvent> consumeMotionEvent( const ::testing::Matcher<MotionEvent>& matcher = testing::_) { - const InputEvent& event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); - if (event.getType() != InputEventType::MOTION) { - LOG(FATAL) << "Instead of motion event, got " << event; + std::unique_ptr<InputEvent> event = consume(CONSUME_TIMEOUT_EVENT_EXPECTED); + if (event == nullptr) { + ADD_FAILURE() << "No event"; + return nullptr; + } + if (event->getType() != InputEventType::MOTION) { + ADD_FAILURE() << "Instead of motion event, got " << *event; + return nullptr; } - const auto& motionEvent = static_cast<const MotionEvent&>(event); - EXPECT_THAT(motionEvent, matcher); + std::unique_ptr<MotionEvent> motionEvent = + std::unique_ptr<MotionEvent>(static_cast<MotionEvent*>(event.release())); + EXPECT_THAT(*motionEvent, matcher); return motionEvent; } @@ -1345,12 +1354,12 @@ public: mInputReceiver->consumeTouchModeEvent(inTouchMode); } - std::optional<uint32_t> receiveEvent(InputEvent** outEvent = nullptr) { + std::pair<std::optional<uint32_t>, std::unique_ptr<InputEvent>> receiveEvent() { if (mInputReceiver == nullptr) { ADD_FAILURE() << "Invalid receive event on window with no receiver"; - return std::nullopt; + return std::make_pair(std::nullopt, nullptr); } - return mInputReceiver->receiveEvent(CONSUME_TIMEOUT_EVENT_EXPECTED, outEvent); + return mInputReceiver->receiveEvent(CONSUME_TIMEOUT_EVENT_EXPECTED); } void finishEvent(uint32_t sequenceNum) { @@ -1395,15 +1404,15 @@ private: static std::atomic<int32_t> sId; // each window gets a unique id, like in surfaceflinger friend class sp<FakeWindowHandle>; - const InputEvent& consume(std::chrono::milliseconds timeout, bool handled = true) { + std::unique_ptr<InputEvent> consume(std::chrono::milliseconds timeout, bool handled = true) { if (mInputReceiver == nullptr) { LOG(FATAL) << "Cannot consume event from a window with no input event receiver"; } - InputEvent* event = mInputReceiver->consume(timeout, handled); + std::unique_ptr<InputEvent> event = mInputReceiver->consume(timeout, handled); if (event == nullptr) { - LOG(FATAL) << "Consume failed: no event"; + ADD_FAILURE() << "Consume failed: no event"; } - return *event; + return event; } }; @@ -1422,7 +1431,8 @@ public: } std::optional<int32_t> receiveEvent() { - return mInputReceiver.receiveEvent(CONSUME_TIMEOUT_EVENT_EXPECTED); + const auto [sequenceNum, _] = mInputReceiver.receiveEvent(CONSUME_TIMEOUT_EVENT_EXPECTED); + return sequenceNum; } void finishEvent(uint32_t consumeSeq) { return mInputReceiver.finishEvent(consumeSeq); } @@ -1460,7 +1470,7 @@ public: mInputReceiver.consumeMotionEvent(matcher); } - MotionEvent* consumeMotion() { return mInputReceiver.consumeMotion(); } + std::unique_ptr<MotionEvent> consumeMotion() { return mInputReceiver.consumeMotion(); } void assertNoEvents() { mInputReceiver.assertNoEvents(); } @@ -3760,18 +3770,20 @@ TEST_F(InputDispatcherTest, SplitTouchesSendCorrectActionDownTime) { mDispatcher->waitForIdle(); - const MotionEvent& motionEvent1 = window1->consumeMotionEvent(); + std::unique_ptr<MotionEvent> motionEvent1 = window1->consumeMotionEvent(); + ASSERT_NE(nullptr, motionEvent1); window2->assertNoEvents(); - nsecs_t downTimeForWindow1 = motionEvent1.getDownTime(); - ASSERT_EQ(motionEvent1.getDownTime(), motionEvent1.getEventTime()); + nsecs_t downTimeForWindow1 = motionEvent1->getDownTime(); + ASSERT_EQ(motionEvent1->getDownTime(), motionEvent1->getEventTime()); // Now touch down on the window with another pointer mDispatcher->notifyMotion(generateTouchArgs(POINTER_1_DOWN, {{50, 50}, {150, 50}})); mDispatcher->waitForIdle(); - const MotionEvent& motionEvent2 = window2->consumeMotionEvent(); - nsecs_t downTimeForWindow2 = motionEvent2.getDownTime(); + std::unique_ptr<MotionEvent> motionEvent2 = window2->consumeMotionEvent(); + ASSERT_NE(nullptr, motionEvent2); + nsecs_t downTimeForWindow2 = motionEvent2->getDownTime(); ASSERT_NE(downTimeForWindow1, downTimeForWindow2); - ASSERT_EQ(motionEvent2.getDownTime(), motionEvent2.getEventTime()); + ASSERT_EQ(motionEvent2->getDownTime(), motionEvent2->getEventTime()); // Now move the pointer on the second window mDispatcher->notifyMotion(generateTouchArgs(AMOTION_EVENT_ACTION_MOVE, {{50, 50}, {151, 51}})); @@ -4605,12 +4617,13 @@ TEST_F(InputDispatcherTest, NonSplitTouchableWindowReceivesMultiTouch) { InputEventInjectionSync::WAIT_FOR_RESULT)) << "Inject motion event should return InputEventInjectionResult::SUCCEEDED"; - const MotionEvent& event = window->consumeMotionEvent(); - EXPECT_EQ(POINTER_1_DOWN, event.getAction()); - EXPECT_EQ(70, event.getX(0)); // 50 + 20 - EXPECT_EQ(90, event.getY(0)); // 50 + 40 - EXPECT_EQ(-10, event.getX(1)); // -30 + 20 - EXPECT_EQ(-10, event.getY(1)); // -50 + 40 + std::unique_ptr<MotionEvent> event = window->consumeMotionEvent(); + ASSERT_NE(nullptr, event); + EXPECT_EQ(POINTER_1_DOWN, event->getAction()); + EXPECT_EQ(70, event->getX(0)); // 50 + 20 + EXPECT_EQ(90, event->getY(0)); // 50 + 40 + EXPECT_EQ(-10, event->getX(1)); // -30 + 20 + EXPECT_EQ(-10, event->getY(1)); // -50 + 40 } /** @@ -4876,15 +4889,16 @@ TEST_F(InputDispatcherTest, WhenMultiDisplayWindowSameToken_DispatchCancelToTarg EXPECT_EQ(OK, mDispatcher->pilferPointers(spyWindowDefaultDisplay->getToken())); // windowDefaultDisplay gets cancel - const MotionEvent& event = windowDefaultDisplay->consumeMotionEvent(); - EXPECT_EQ(AMOTION_EVENT_ACTION_CANCEL, event.getAction()); + std::unique_ptr<MotionEvent> event = windowDefaultDisplay->consumeMotionEvent(); + ASSERT_NE(nullptr, event); + EXPECT_EQ(AMOTION_EVENT_ACTION_CANCEL, event->getAction()); // The cancel event is sent to windowDefaultDisplay of the ADISPLAY_ID_DEFAULT display, so the // coordinates of the cancel are converted by windowDefaultDisplay's transform, the x and y // coordinates are both 100, otherwise if the cancel event is sent to windowSecondDisplay of // SECOND_DISPLAY_ID, the x and y coordinates are 200 - EXPECT_EQ(100, event.getX(0)); - EXPECT_EQ(100, event.getY(0)); + EXPECT_EQ(100, event->getX(0)); + EXPECT_EQ(100, event->getY(0)); } /** @@ -5014,18 +5028,19 @@ TEST_F(InputDispatcherDisplayProjectionTest, WindowGetsEventsInCorrectCoordinate {PointF{150, 220}})); firstWindow->assertNoEvents(); - const MotionEvent& event = secondWindow->consumeMotionEvent(); - EXPECT_EQ(AMOTION_EVENT_ACTION_DOWN, event.getAction()); + std::unique_ptr<MotionEvent> event = secondWindow->consumeMotionEvent(); + ASSERT_NE(nullptr, event); + EXPECT_EQ(AMOTION_EVENT_ACTION_DOWN, event->getAction()); // Ensure that the events from the "getRaw" API are in logical display coordinates. - EXPECT_EQ(300, event.getRawX(0)); - EXPECT_EQ(880, event.getRawY(0)); + EXPECT_EQ(300, event->getRawX(0)); + EXPECT_EQ(880, event->getRawY(0)); // Ensure that the x and y values are in the window's coordinate space. // The left-top of the second window is at (100, 200) in display space, which is (200, 800) in // the logical display space. This will be the origin of the window space. - EXPECT_EQ(100, event.getX(0)); - EXPECT_EQ(80, event.getY(0)); + EXPECT_EQ(100, event->getX(0)); + EXPECT_EQ(80, event->getY(0)); } TEST_F(InputDispatcherDisplayProjectionTest, CancelMotionWithCorrectCoordinates) { @@ -6062,7 +6077,8 @@ TEST_F(InputDispatcherMonitorTest, NoWindowTransform) { injectMotionDown(*mDispatcher, AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT)) << "Inject motion event should return InputEventInjectionResult::SUCCEEDED"; window->consumeMotionDown(ADISPLAY_ID_DEFAULT); - MotionEvent* event = monitor.consumeMotion(); + std::unique_ptr<MotionEvent> event = monitor.consumeMotion(); + ASSERT_NE(nullptr, event); // Even though window has transform, gesture monitor must not. ASSERT_EQ(ui::Transform(), event->getTransform()); } @@ -6169,9 +6185,9 @@ TEST_F(InputDispatcherTest, VerifyInputEvent_KeyEvent) { const NotifyKeyArgs keyArgs = generateKeyArgs(AKEY_EVENT_ACTION_DOWN); mDispatcher->notifyKey(keyArgs); - const KeyEvent& event = window->consumeKey(); - - std::unique_ptr<VerifiedInputEvent> verified = mDispatcher->verifyInputEvent(event); + std::unique_ptr<KeyEvent> event = window->consumeKey(); + ASSERT_NE(event, nullptr); + std::unique_ptr<VerifiedInputEvent> verified = mDispatcher->verifyInputEvent(*event); ASSERT_NE(verified, nullptr); ASSERT_EQ(verified->type, VerifiedInputEvent::Type::KEY); @@ -6212,9 +6228,9 @@ TEST_F(InputDispatcherTest, VerifyInputEvent_MotionEvent) { ADISPLAY_ID_DEFAULT); mDispatcher->notifyMotion(motionArgs); - const MotionEvent& event = window->consumeMotionEvent(); - - std::unique_ptr<VerifiedInputEvent> verified = mDispatcher->verifyInputEvent(event); + std::unique_ptr<MotionEvent> event = window->consumeMotionEvent(); + ASSERT_NE(nullptr, event); + std::unique_ptr<VerifiedInputEvent> verified = mDispatcher->verifyInputEvent(*event); ASSERT_NE(verified, nullptr); ASSERT_EQ(verified->type, VerifiedInputEvent::Type::MOTION); @@ -6741,13 +6757,13 @@ TEST_F(InputDispatcherTest, HoverEnterExitSynthesisUsesNewEventId) { ADISPLAY_ID_DEFAULT, {PointF{50, 50}}); mDispatcher->notifyMotion(notifyArgs); - const MotionEvent& leftEnter = left->consumeMotionEvent( + std::unique_ptr<MotionEvent> leftEnter = left->consumeMotionEvent( AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); - + ASSERT_NE(nullptr, leftEnter); spy->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), - Not(WithEventId(leftEnter.getId())), + Not(WithEventId(leftEnter->getId())), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); // Send move to the right window, and ensure hover exit and enter are synthesized with new ids. @@ -6755,13 +6771,13 @@ TEST_F(InputDispatcherTest, HoverEnterExitSynthesisUsesNewEventId) { {PointF{150, 50}}); mDispatcher->notifyMotion(notifyArgs); - const MotionEvent& leftExit = left->consumeMotionEvent( + std::unique_ptr<MotionEvent> leftExit = left->consumeMotionEvent( AllOf(WithMotionAction(ACTION_HOVER_EXIT), Not(WithEventId(notifyArgs.id)), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); - + ASSERT_NE(nullptr, leftExit); right->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), - Not(WithEventId(leftExit.getId())), + Not(WithEventId(leftExit->getId())), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); spy->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_MOVE), WithEventId(notifyArgs.id))); @@ -6792,8 +6808,9 @@ protected: } void consumeKey(bool handled, const ::testing::Matcher<KeyEvent>& matcher) { - const KeyEvent& event = mWindow->consumeKey(handled); - ASSERT_THAT(event, matcher); + std::unique_ptr<KeyEvent> event = mWindow->consumeKey(handled); + ASSERT_NE(nullptr, event); + ASSERT_THAT(*event, matcher); } }; @@ -7094,9 +7111,10 @@ TEST_F(InputDispatcherKeyRepeatTest, FocusedWindow_RepeatKeyEventsUseEventIdFrom GTEST_SKIP() << "Flaky test (b/270393106)"; sendAndConsumeKeyDown(/*deviceId=*/1); for (int32_t repeatCount = 1; repeatCount <= 10; ++repeatCount) { - const KeyEvent& repeatEvent = mWindow->consumeKey(); + std::unique_ptr<KeyEvent> repeatEvent = mWindow->consumeKey(); + ASSERT_NE(nullptr, repeatEvent); EXPECT_EQ(IdGenerator::Source::INPUT_DISPATCHER, - IdGenerator::getSource(repeatEvent.getId())); + IdGenerator::getSource(repeatEvent->getId())); } } @@ -7106,8 +7124,9 @@ TEST_F(InputDispatcherKeyRepeatTest, FocusedWindow_RepeatKeyEventsUseUniqueEvent std::unordered_set<int32_t> idSet; for (int32_t repeatCount = 1; repeatCount <= 10; ++repeatCount) { - const KeyEvent& repeatEvent = mWindow->consumeKey(); - int32_t id = repeatEvent.getId(); + std::unique_ptr<KeyEvent> repeatEvent = mWindow->consumeKey(); + ASSERT_NE(nullptr, repeatEvent); + int32_t id = repeatEvent->getId(); EXPECT_EQ(idSet.end(), idSet.find(id)); idSet.insert(id); } @@ -7674,21 +7693,21 @@ protected: void consumeMotionEvent(const sp<FakeWindowHandle>& window, int32_t expectedAction, const std::vector<PointF>& points) { const std::string name = window->getName(); - const MotionEvent& motionEvent = + std::unique_ptr<MotionEvent> motionEvent = window->consumeMotionEvent(WithMotionAction(expectedAction)); - - ASSERT_EQ(points.size(), motionEvent.getPointerCount()); + ASSERT_NE(nullptr, motionEvent); + ASSERT_EQ(points.size(), motionEvent->getPointerCount()); for (size_t i = 0; i < points.size(); i++) { float expectedX = points[i].x; float expectedY = points[i].y; - EXPECT_EQ(expectedX, motionEvent.getX(i)) + EXPECT_EQ(expectedX, motionEvent->getX(i)) << "expected " << expectedX << " for x[" << i << "] coord of " << name.c_str() - << ", got " << motionEvent.getX(i); - EXPECT_EQ(expectedY, motionEvent.getY(i)) + << ", got " << motionEvent->getX(i); + EXPECT_EQ(expectedY, motionEvent->getY(i)) << "expected " << expectedY << " for y[" << i << "] coord of " << name.c_str() - << ", got " << motionEvent.getY(i); + << ", got " << motionEvent->getY(i); } } @@ -7976,7 +7995,7 @@ TEST_F(InputDispatcherSingleWindowAnr, OnPointerDown_BasicAnr) { injectMotionDown(*mDispatcher, AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT, WINDOW_LOCATION)); - std::optional<uint32_t> sequenceNum = mWindow->receiveEvent(); // ACTION_DOWN + const auto [sequenceNum, _] = mWindow->receiveEvent(); // ACTION_DOWN ASSERT_TRUE(sequenceNum); const std::chrono::duration timeout = mWindow->getDispatchingTimeout(DISPATCHING_TIMEOUT); mFakePolicy->assertNotifyWindowUnresponsiveWasCalled(timeout, mWindow); @@ -7992,7 +8011,7 @@ TEST_F(InputDispatcherSingleWindowAnr, OnPointerDown_BasicAnr) { TEST_F(InputDispatcherSingleWindowAnr, OnKeyDown_BasicAnr) { // Inject a key, and don't respond - expect that ANR is called. ASSERT_EQ(InputEventInjectionResult::SUCCEEDED, injectKeyDownNoRepeat(*mDispatcher)); - std::optional<uint32_t> sequenceNum = mWindow->receiveEvent(); + const auto [sequenceNum, _] = mWindow->receiveEvent(); ASSERT_TRUE(sequenceNum); const std::chrono::duration timeout = mWindow->getDispatchingTimeout(DISPATCHING_TIMEOUT); mFakePolicy->assertNotifyWindowUnresponsiveWasCalled(timeout, mWindow); @@ -8152,7 +8171,7 @@ TEST_F(InputDispatcherSingleWindowAnr, SpyWindowAnr) { WINDOW_LOCATION)); mWindow->consumeMotionDown(); - std::optional<uint32_t> sequenceNum = spy->receiveEvent(); // ACTION_DOWN + const auto [sequenceNum, _] = spy->receiveEvent(); // ACTION_DOWN ASSERT_TRUE(sequenceNum); const std::chrono::duration timeout = spy->getDispatchingTimeout(DISPATCHING_TIMEOUT); mFakePolicy->assertNotifyWindowUnresponsiveWasCalled(timeout, spy); @@ -8307,9 +8326,9 @@ TEST_F(InputDispatcherSingleWindowAnr, Key_StaysPendingWhileMotionIsProcessed) { mDispatcher->onWindowInfosChanged({{*mWindow->getInfo()}, {}, 0, 0}); tapOnWindow(); - std::optional<uint32_t> downSequenceNum = mWindow->receiveEvent(); + const auto& [downSequenceNum, downEvent] = mWindow->receiveEvent(); ASSERT_TRUE(downSequenceNum); - std::optional<uint32_t> upSequenceNum = mWindow->receiveEvent(); + const auto& [upSequenceNum, upEvent] = mWindow->receiveEvent(); ASSERT_TRUE(upSequenceNum); // Don't finish the events yet, and send a key // Injection will "succeed" because we will eventually give up and send the key to the focused @@ -8347,9 +8366,9 @@ TEST_F(InputDispatcherSingleWindowAnr, mDispatcher->onWindowInfosChanged({{*mWindow->getInfo()}, {}, 0, 0}); tapOnWindow(); - std::optional<uint32_t> downSequenceNum = mWindow->receiveEvent(); + const auto& [downSequenceNum, _] = mWindow->receiveEvent(); ASSERT_TRUE(downSequenceNum); - std::optional<uint32_t> upSequenceNum = mWindow->receiveEvent(); + const auto& [upSequenceNum, upEvent] = mWindow->receiveEvent(); ASSERT_TRUE(upSequenceNum); // Don't finish the events yet, and send a key mDispatcher->notifyKey( @@ -8385,7 +8404,7 @@ TEST_F(InputDispatcherSingleWindowAnr, TwoGesturesWithAnr) { .pointer(PointerBuilder(0, ToolType::FINGER).x(10).y(10)) .build()); - std::optional<uint32_t> sequenceNum = mWindow->receiveEvent(); // ACTION_DOWN + const auto [sequenceNum, _] = mWindow->receiveEvent(); // ACTION_DOWN ASSERT_TRUE(sequenceNum); const std::chrono::duration timeout = mWindow->getDispatchingTimeout(DISPATCHING_TIMEOUT); mFakePolicy->assertNotifyWindowUnresponsiveWasCalled(timeout, mWindow); @@ -8514,7 +8533,7 @@ TEST_F(InputDispatcherMultiWindowAnr, TwoWindows_BothUnresponsive) { .x(FOCUSED_WINDOW_LOCATION.x) .y(FOCUSED_WINDOW_LOCATION.y)) .build())); - std::optional<uint32_t> unfocusedSequenceNum = mUnfocusedWindow->receiveEvent(); + const auto [unfocusedSequenceNum, _] = mUnfocusedWindow->receiveEvent(); ASSERT_TRUE(unfocusedSequenceNum); const std::chrono::duration timeout = @@ -8579,9 +8598,9 @@ TEST_F(InputDispatcherMultiWindowAnr, DuringAnr_SecondTapIsIgnored) { tapOnFocusedWindow(); mUnfocusedWindow->consumeMotionOutside(ADISPLAY_ID_DEFAULT, /*flags=*/0); // Receive the events, but don't respond - std::optional<uint32_t> downEventSequenceNum = mFocusedWindow->receiveEvent(); // ACTION_DOWN + const auto [downEventSequenceNum, downEvent] = mFocusedWindow->receiveEvent(); // ACTION_DOWN ASSERT_TRUE(downEventSequenceNum); - std::optional<uint32_t> upEventSequenceNum = mFocusedWindow->receiveEvent(); // ACTION_UP + const auto [upEventSequenceNum, upEvent] = mFocusedWindow->receiveEvent(); // ACTION_UP ASSERT_TRUE(upEventSequenceNum); const std::chrono::duration timeout = mFocusedWindow->getDispatchingTimeout(DISPATCHING_TIMEOUT); @@ -8659,9 +8678,9 @@ TEST_F(InputDispatcherMultiWindowAnr, PendingKey_GoesToNewlyFocusedWindow) { {{*mFocusedWindow->getInfo(), *mUnfocusedWindow->getInfo()}, {}, 0, 0}); tapOnUnfocusedWindow(); - std::optional<uint32_t> downSequenceNum = mUnfocusedWindow->receiveEvent(); + const auto [downSequenceNum, downEvent] = mUnfocusedWindow->receiveEvent(); ASSERT_TRUE(downSequenceNum); - std::optional<uint32_t> upSequenceNum = mUnfocusedWindow->receiveEvent(); + const auto [upSequenceNum, upEvent] = mUnfocusedWindow->receiveEvent(); ASSERT_TRUE(upSequenceNum); // Don't finish the events yet, and send a key // Injection will succeed because we will eventually give up and send the key to the focused @@ -8724,8 +8743,7 @@ TEST_F(InputDispatcherMultiWindowAnr, SplitTouch_SingleWindowAnr) { mFocusedWindow->consumeMotionDown(); // Focused window may or may not receive ACTION_MOVE // But it should definitely receive ACTION_CANCEL due to the ANR - InputEvent* event; - std::optional<int32_t> moveOrCancelSequenceNum = mFocusedWindow->receiveEvent(&event); + const auto [moveOrCancelSequenceNum, event] = mFocusedWindow->receiveEvent(); ASSERT_TRUE(moveOrCancelSequenceNum); mFocusedWindow->finishEvent(*moveOrCancelSequenceNum); ASSERT_NE(nullptr, event); |