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

Commit 658c7475 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Check display id of the last hover window before it is cleared" am:...

Merge "Check display id of the last hover window before it is cleared" am: 78b66d31 am: 91609c37

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2273427



Change-Id: I009197337b9aa2cf687dbd64a4aab2b296fb1645
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 7065b189 91609c37
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -4731,11 +4731,14 @@ void InputDispatcher::setInputWindowsLocked(
    updateWindowHandlesForDisplayLocked(windowInfoHandles, displayId);

    const std::vector<sp<WindowInfoHandle>>& windowHandles = getWindowHandlesLocked(displayId);
    if (mLastHoverWindowHandle &&
    if (mLastHoverWindowHandle) {
        const WindowInfo* lastHoverWindowInfo = mLastHoverWindowHandle->getInfo();
        if (lastHoverWindowInfo->displayId == displayId &&
            std::find(windowHandles.begin(), windowHandles.end(), mLastHoverWindowHandle) ==
                    windowHandles.end()) {
            mLastHoverWindowHandle = nullptr;
        }
    }

    std::optional<FocusResolver::FocusChanges> changes =
            mFocusResolver.setInputWindows(displayId, windowHandles);
+53 −0
Original line number Diff line number Diff line
@@ -2131,6 +2131,59 @@ TEST_F(InputDispatcherTest, HoverEnterMouseClickAndHoverExit) {
                         ADISPLAY_ID_DEFAULT, 0 /* expectedFlag */);
}

TEST_F(InputDispatcherTest, HoverEnterMoveRemoveWindowsInSecondDisplay) {
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();
    sp<FakeWindowHandle> windowDefaultDisplay =
            sp<FakeWindowHandle>::make(application, mDispatcher, "DefaultDisplay",
                                       ADISPLAY_ID_DEFAULT);
    windowDefaultDisplay->setFrame(Rect(0, 0, 600, 800));
    sp<FakeWindowHandle> windowSecondDisplay =
            sp<FakeWindowHandle>::make(application, mDispatcher, "SecondDisplay",
                                       SECOND_DISPLAY_ID);
    windowSecondDisplay->setFrame(Rect(0, 0, 600, 800));

    mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {windowDefaultDisplay}},
                                  {SECOND_DISPLAY_ID, {windowSecondDisplay}}});

    // Set cursor position in window in default display and check that hover enter and move
    // events are generated.
    ASSERT_EQ(InputEventInjectionResult::SUCCEEDED,
              injectMotionEvent(mDispatcher,
                                MotionEventBuilder(AMOTION_EVENT_ACTION_HOVER_MOVE,
                                                   AINPUT_SOURCE_MOUSE)
                                        .displayId(ADISPLAY_ID_DEFAULT)
                                        .pointer(PointerBuilder(0, AMOTION_EVENT_TOOL_TYPE_MOUSE)
                                                         .x(300)
                                                         .y(600))
                                        .build()));
    windowDefaultDisplay->consumeEvent(AINPUT_EVENT_TYPE_MOTION, AMOTION_EVENT_ACTION_HOVER_ENTER,
                                       ADISPLAY_ID_DEFAULT, 0 /* expectedFlag */);
    windowDefaultDisplay->consumeEvent(AINPUT_EVENT_TYPE_MOTION, AMOTION_EVENT_ACTION_HOVER_MOVE,
                                       ADISPLAY_ID_DEFAULT, 0 /* expectedFlag */);

    // Remove all windows in secondary display and check that no event happens on window in
    // primary display.
    mDispatcher->setInputWindows({{SECOND_DISPLAY_ID, {}}});
    windowDefaultDisplay->assertNoEvents();

    // Move cursor position in window in default display and check that only hover move
    // event is generated and not hover enter event.
    mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {windowDefaultDisplay}},
                                  {SECOND_DISPLAY_ID, {windowSecondDisplay}}});
    ASSERT_EQ(InputEventInjectionResult::SUCCEEDED,
              injectMotionEvent(mDispatcher,
                                MotionEventBuilder(AMOTION_EVENT_ACTION_HOVER_MOVE,
                                                   AINPUT_SOURCE_MOUSE)
                                        .displayId(ADISPLAY_ID_DEFAULT)
                                        .pointer(PointerBuilder(0, AMOTION_EVENT_TOOL_TYPE_MOUSE)
                                                         .x(400)
                                                         .y(700))
                                        .build()));
    windowDefaultDisplay->consumeEvent(AINPUT_EVENT_TYPE_MOTION, AMOTION_EVENT_ACTION_HOVER_MOVE,
                                       ADISPLAY_ID_DEFAULT, 0 /* expectedFlag */);
    windowDefaultDisplay->assertNoEvents();
}

TEST_F(InputDispatcherTest, DispatchMouseEventsUnderCursor) {
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();