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

Commit a7949cee authored by Arpit Singh's avatar Arpit Singh Committed by Android (Google) Code Review
Browse files

Merge changes I15151718,I576107b0,Ieea0f252 into main

* changes:
  [CD Cursor] Fix cursorState lookup for non-primary displays
  [CD Cursor] Update pointer display in line with topology update
  Add method to setDefaultMouseDisplay in ChoreographerTest
parents 233e3382 fc66a3aa
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -602,15 +602,21 @@ void PointerChoreographer::notifyPointerCaptureChanged(
}

void PointerChoreographer::setDisplayTopology(const DisplayTopologyGraph& displayTopologyGraph) {
    PointerDisplayChange pointerDisplayChange;
    { // acquire lock
        std::scoped_lock _l(getLock());
        mTopology = displayTopologyGraph;

    // make primary display default mouse display, if it was not set
    // or the existing display was removed
        // make primary display default mouse display, if it was not set or
        // the existing display was removed
        if (mDefaultMouseDisplayId == ui::LogicalDisplayId::INVALID ||
        mTopology.graph.find(mDefaultMouseDisplayId) != mTopology.graph.end()) {
            mTopology.graph.find(mDefaultMouseDisplayId) == mTopology.graph.end()) {
            mDefaultMouseDisplayId = mTopology.primaryDisplayId;
            pointerDisplayChange = updatePointerControllersLocked();
        }
    } // release lock

    notifyPointerDisplayChange(pointerDisplayChange, mPolicy);
}

void PointerChoreographer::dump(std::string& dump) {
@@ -785,6 +791,10 @@ PointerChoreographer::calculatePointerDisplayChangeToNotify() {
}

void PointerChoreographer::setDefaultMouseDisplayId(ui::LogicalDisplayId displayId) {
    if (InputFlags::connectedDisplaysCursorEnabled()) {
        // In connected displays scenario, default mouse display will only be updated from topology.
        return;
    }
    PointerDisplayChange pointerDisplayChange;

    { // acquire lock
+4 −3
Original line number Diff line number Diff line
@@ -7553,9 +7553,10 @@ void InputDispatcher::DispatcherTouchState::forTouchAndCursorStatesOnDisplay(
        return;
    }

    // TODO(b/383092013): This is currently not accounting for the "topology group" concept.
    // Proper implementation requires looking tghrough all the displays in the topology group.
    const auto cursorStateIt = mCursorStateByDisplay.find(displayId);
    // DisplayId for the Cursor state may not be same as supplied displayId if display is part of
    // topology. Instead we should to check from the topology's primary display.
    const auto cursorStateIt =
            mCursorStateByDisplay.find(mWindowInfos.getPrimaryDisplayId(displayId));
    if (cursorStateIt != mCursorStateByDisplay.end()) {
        f(cursorStateIt->second);
    }
+43 −0
Original line number Diff line number Diff line
@@ -15403,4 +15403,47 @@ TEST_F(InputDispatcherConnectedDisplayTest, MultiDisplayMouseDragAndDropFromNonP
    mWindowOnSecondDisplay->assertNoEvents();
}
using InputDispatcherConnectedDisplayPointerInWindowTest = InputDispatcherConnectedDisplayTest;
TEST_F(InputDispatcherConnectedDisplayPointerInWindowTest, MouseOnWindowOnPrimaryDisplay) {
    SCOPED_FLAG_OVERRIDE(connected_displays_cursor, true);
    mDispatcher->notifyMotion(
            MotionArgsBuilder(ACTION_HOVER_ENTER, AINPUT_SOURCE_MOUSE)
                    .pointer(PointerBuilder(/*id=*/0, ToolType::MOUSE).x(50).y(50))
                    .build());
    mWindow->consumeMotionEvent(WithMotionAction(ACTION_HOVER_ENTER));
    mSpyWindow->consumeMotionEvent(WithMotionAction(ACTION_HOVER_ENTER));
    mWindowOnSecondDisplay->assertNoEvents();
    ASSERT_TRUE(mDispatcher->isPointerInWindow(mWindow->getToken(), DISPLAY_ID, DEVICE_ID,
                                               /*pointerId=*/0));
    ASSERT_TRUE(mDispatcher->isPointerInWindow(mSpyWindow->getToken(), DISPLAY_ID, DEVICE_ID,
                                               /*pointerId=*/0));
    ASSERT_FALSE(mDispatcher->isPointerInWindow(mWindowOnSecondDisplay->getToken(),
                                                SECOND_DISPLAY_ID, DEVICE_ID, /*pointerId=*/0));
}
TEST_F(InputDispatcherConnectedDisplayPointerInWindowTest, MouseOnWindowOnNonPrimaryDisplay) {
    SCOPED_FLAG_OVERRIDE(connected_displays_cursor, true);
    mDispatcher->notifyMotion(
            MotionArgsBuilder(ACTION_HOVER_ENTER, AINPUT_SOURCE_MOUSE)
                    .displayId(SECOND_DISPLAY_ID)
                    .pointer(PointerBuilder(/*id=*/0, ToolType::MOUSE).x(50).y(50))
                    .build());
    mWindow->assertNoEvents();
    mSpyWindow->assertNoEvents();
    mWindowOnSecondDisplay->consumeMotionEvent(WithMotionAction(ACTION_HOVER_ENTER));
    ASSERT_FALSE(mDispatcher->isPointerInWindow(mWindow->getToken(), DISPLAY_ID, DEVICE_ID,
                                                /*pointerId=*/0));
    ASSERT_FALSE(mDispatcher->isPointerInWindow(mSpyWindow->getToken(), DISPLAY_ID, DEVICE_ID,
                                                /*pointerId=*/0));
    ASSERT_TRUE(mDispatcher->isPointerInWindow(mWindowOnSecondDisplay->getToken(),
                                               SECOND_DISPLAY_ID, DEVICE_ID, /*pointerId=*/0));
}
} // namespace android::inputdispatcher
+305 −140

File changed.

Preview size limit exceeded, changes collapsed.