Skip to content

Commit a7949ce

Browse files
Arpit SinghAndroid (Google) Code Review
authored andcommitted
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
2 parents 233e338 + fc66a3a commit a7949ce

4 files changed

Lines changed: 370 additions & 151 deletions

File tree

services/inputflinger/PointerChoreographer.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -602,15 +602,21 @@ void PointerChoreographer::notifyPointerCaptureChanged(
602602
}
603603

604604
void PointerChoreographer::setDisplayTopology(const DisplayTopologyGraph& displayTopologyGraph) {
605-
std::scoped_lock _l(getLock());
606-
mTopology = displayTopologyGraph;
605+
PointerDisplayChange pointerDisplayChange;
606+
{ // acquire lock
607+
std::scoped_lock _l(getLock());
608+
mTopology = displayTopologyGraph;
609+
610+
// make primary display default mouse display, if it was not set or
611+
// the existing display was removed
612+
if (mDefaultMouseDisplayId == ui::LogicalDisplayId::INVALID ||
613+
mTopology.graph.find(mDefaultMouseDisplayId) == mTopology.graph.end()) {
614+
mDefaultMouseDisplayId = mTopology.primaryDisplayId;
615+
pointerDisplayChange = updatePointerControllersLocked();
616+
}
617+
} // release lock
607618

608-
// make primary display default mouse display, if it was not set
609-
// or the existing display was removed
610-
if (mDefaultMouseDisplayId == ui::LogicalDisplayId::INVALID ||
611-
mTopology.graph.find(mDefaultMouseDisplayId) != mTopology.graph.end()) {
612-
mDefaultMouseDisplayId = mTopology.primaryDisplayId;
613-
}
619+
notifyPointerDisplayChange(pointerDisplayChange, mPolicy);
614620
}
615621

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

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

790800
{ // acquire lock

services/inputflinger/dispatcher/InputDispatcher.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7553,9 +7553,10 @@ void InputDispatcher::DispatcherTouchState::forTouchAndCursorStatesOnDisplay(
75537553
return;
75547554
}
75557555

7556-
// TODO(b/383092013): This is currently not accounting for the "topology group" concept.
7557-
// Proper implementation requires looking tghrough all the displays in the topology group.
7558-
const auto cursorStateIt = mCursorStateByDisplay.find(displayId);
7556+
// DisplayId for the Cursor state may not be same as supplied displayId if display is part of
7557+
// topology. Instead we should to check from the topology's primary display.
7558+
const auto cursorStateIt =
7559+
mCursorStateByDisplay.find(mWindowInfos.getPrimaryDisplayId(displayId));
75597560
if (cursorStateIt != mCursorStateByDisplay.end()) {
75607561
f(cursorStateIt->second);
75617562
}

services/inputflinger/tests/InputDispatcher_test.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15403,4 +15403,47 @@ TEST_F(InputDispatcherConnectedDisplayTest, MultiDisplayMouseDragAndDropFromNonP
1540315403
mWindowOnSecondDisplay->assertNoEvents();
1540415404
}
1540515405

15406+
using InputDispatcherConnectedDisplayPointerInWindowTest = InputDispatcherConnectedDisplayTest;
15407+
15408+
TEST_F(InputDispatcherConnectedDisplayPointerInWindowTest, MouseOnWindowOnPrimaryDisplay) {
15409+
SCOPED_FLAG_OVERRIDE(connected_displays_cursor, true);
15410+
15411+
mDispatcher->notifyMotion(
15412+
MotionArgsBuilder(ACTION_HOVER_ENTER, AINPUT_SOURCE_MOUSE)
15413+
.pointer(PointerBuilder(/*id=*/0, ToolType::MOUSE).x(50).y(50))
15414+
.build());
15415+
15416+
mWindow->consumeMotionEvent(WithMotionAction(ACTION_HOVER_ENTER));
15417+
mSpyWindow->consumeMotionEvent(WithMotionAction(ACTION_HOVER_ENTER));
15418+
mWindowOnSecondDisplay->assertNoEvents();
15419+
15420+
ASSERT_TRUE(mDispatcher->isPointerInWindow(mWindow->getToken(), DISPLAY_ID, DEVICE_ID,
15421+
/*pointerId=*/0));
15422+
ASSERT_TRUE(mDispatcher->isPointerInWindow(mSpyWindow->getToken(), DISPLAY_ID, DEVICE_ID,
15423+
/*pointerId=*/0));
15424+
ASSERT_FALSE(mDispatcher->isPointerInWindow(mWindowOnSecondDisplay->getToken(),
15425+
SECOND_DISPLAY_ID, DEVICE_ID, /*pointerId=*/0));
15426+
}
15427+
15428+
TEST_F(InputDispatcherConnectedDisplayPointerInWindowTest, MouseOnWindowOnNonPrimaryDisplay) {
15429+
SCOPED_FLAG_OVERRIDE(connected_displays_cursor, true);
15430+
15431+
mDispatcher->notifyMotion(
15432+
MotionArgsBuilder(ACTION_HOVER_ENTER, AINPUT_SOURCE_MOUSE)
15433+
.displayId(SECOND_DISPLAY_ID)
15434+
.pointer(PointerBuilder(/*id=*/0, ToolType::MOUSE).x(50).y(50))
15435+
.build());
15436+
15437+
mWindow->assertNoEvents();
15438+
mSpyWindow->assertNoEvents();
15439+
mWindowOnSecondDisplay->consumeMotionEvent(WithMotionAction(ACTION_HOVER_ENTER));
15440+
15441+
ASSERT_FALSE(mDispatcher->isPointerInWindow(mWindow->getToken(), DISPLAY_ID, DEVICE_ID,
15442+
/*pointerId=*/0));
15443+
ASSERT_FALSE(mDispatcher->isPointerInWindow(mSpyWindow->getToken(), DISPLAY_ID, DEVICE_ID,
15444+
/*pointerId=*/0));
15445+
ASSERT_TRUE(mDispatcher->isPointerInWindow(mWindowOnSecondDisplay->getToken(),
15446+
SECOND_DISPLAY_ID, DEVICE_ID, /*pointerId=*/0));
15447+
}
15448+
1540615449
} // namespace android::inputdispatcher

0 commit comments

Comments
 (0)