Loading services/inputflinger/InputReader.cpp +28 −18 Original line number Diff line number Diff line Loading @@ -2641,6 +2641,11 @@ void CursorInputMapper::configure(nsecs_t when, mOrientation = internalViewport->orientation; } } // Update the PointerController if viewports changed. if (mParameters.hasAssociatedDisplay) { getPolicy()->obtainPointerController(getDeviceId()); } bumpGeneration(); } } Loading Loading @@ -2786,7 +2791,7 @@ void CursorInputMapper::sync(nsecs_t when) { pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY); displayId = ADISPLAY_ID_DEFAULT; displayId = mPointerController->getDisplayId(); } else { pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY); Loading Loading @@ -3612,10 +3617,10 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) { mOrientedRanges.clear(); } // Create pointer controller if needed. // Create or update pointer controller if needed. if (mDeviceMode == DEVICE_MODE_POINTER || (mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) { if (mPointerController == nullptr) { if (mPointerController == nullptr || viewportChanged) { mPointerController = getPolicy()->obtainPointerController(getDeviceId()); } } else { Loading Loading @@ -5404,8 +5409,9 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, x); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y); const int32_t displayId = mPointerController->getDisplayId(); NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE, /* deviceTimestamp */ 0, 1, &pointerProperties, &pointerCoords, Loading Loading @@ -6312,6 +6318,7 @@ void TouchInputMapper::abortPointerMouse(nsecs_t when, uint32_t policyFlags) { void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, bool down, bool hovering) { int32_t metaState = getContext()->getGlobalMetaState(); int32_t displayId = mViewport.displayId; if (mPointerController != nullptr) { if (down || hovering) { Loading @@ -6322,6 +6329,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, } else if (!down && !hovering && (mPointerSimple.down || mPointerSimple.hovering)) { mPointerController->fade(PointerControllerInterface::TRANSITION_GRADUAL); } displayId = mPointerController->getDisplayId(); } if (mPointerSimple.down && !down) { Loading @@ -6329,7 +6337,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send up. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_UP, 0, 0, metaState, mLastRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords, Loading @@ -6343,7 +6351,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send hover exit. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_HOVER_EXIT, 0, 0, metaState, mLastRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords, Loading @@ -6359,7 +6367,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send down. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_DOWN, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords, Loading @@ -6370,7 +6378,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send move. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords, Loading @@ -6385,7 +6393,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send hover enter. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_HOVER_ENTER, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, Loading @@ -6397,7 +6405,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send hover move. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, Loading @@ -6420,7 +6428,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, hscroll); NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_SCROLL, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.currentProperties, &pointerCoords, Loading Loading @@ -6482,11 +6490,13 @@ void TouchInputMapper::dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32 ALOG_ASSERT(false); } } const int32_t displayId = mPointerController != nullptr ? mPointerController->getDisplayId() : mViewport.displayId; const int32_t deviceId = getDeviceId(); std::vector<TouchVideoFrame> frames = mDevice->getEventHub()->getVideoFrames(deviceId); NotifyMotionArgs args(mContext->getNextSequenceNum(), when, deviceId, source, mViewport.displayId, policyFlags, source, displayId, policyFlags, action, actionButton, flags, metaState, buttonState, edgeFlags, deviceTimestamp, pointerCount, pointerProperties, pointerCoords, xPrecision, yPrecision, downTime, std::move(frames)); Loading services/inputflinger/include/PointerControllerInterface.h +3 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,9 @@ public: /* Removes all spots. */ virtual void clearSpots() = 0; /* Gets the id of the display where the pointer should be shown. */ virtual int32_t getDisplayId() const = 0; }; } // namespace android Loading services/inputflinger/tests/InputReader_test.cpp +60 −1 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ class FakePointerController : public PointerControllerInterface { float mMinX, mMinY, mMaxX, mMaxY; float mX, mY; int32_t mButtonState; int32_t mDisplayId; protected: virtual ~FakePointerController() { } Loading @@ -64,7 +65,7 @@ protected: public: FakePointerController() : mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0), mButtonState(0) { mButtonState(0), mDisplayId(ADISPLAY_ID_DEFAULT) { } void setBounds(float minX, float minY, float maxX, float maxY) { Loading @@ -75,6 +76,10 @@ public: mMaxY = maxY; } void setDisplayId(int32_t displayId) { mDisplayId = displayId; } virtual void setPosition(float x, float y) { mX = x; mY = y; Loading @@ -93,6 +98,10 @@ public: *outY = mY; } virtual int32_t getDisplayId() const { return mDisplayId; } private: virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const { *outMinX = mMinX; Loading Loading @@ -3169,6 +3178,30 @@ TEST_F(CursorInputMapperTest, Process_PointerCapture) { ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f)); } TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) { CursorInputMapper* mapper = new CursorInputMapper(mDevice); addMapperAndConfigure(mapper); // Setup PointerController for second display. constexpr int32_t SECOND_DISPLAY_ID = 1; mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); mFakePointerController->setPosition(100, 200); mFakePointerController->setButtonState(0); mFakePointerController->setDisplayId(SECOND_DISPLAY_ID); NotifyMotionArgs args; process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10); process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20); process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0); ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source); ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action); ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f)); ASSERT_EQ(SECOND_DISPLAY_ID, args.displayId); } // --- TouchInputMapperTest --- Loading Loading @@ -6318,4 +6351,30 @@ TEST_F(MultiTouchInputMapperTest, Viewports_Fallback) { ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId); } TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) { // Setup PointerController for second display. sp<FakePointerController> fakePointerController = new FakePointerController(); fakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); fakePointerController->setPosition(100, 200); fakePointerController->setButtonState(0); fakePointerController->setDisplayId(SECONDARY_DISPLAY_ID); mFakePolicy->setPointerController(mDevice->getId(), fakePointerController); MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); prepareDisplay(DISPLAY_ORIENTATION_0); prepareAxes(POSITION); addMapperAndConfigure(mapper); // Check source is mouse that would obtain the PointerController. ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources()); NotifyMotionArgs motionArgs; processPosition(mapper, 100, 100); processSync(mapper); ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId); } } // namespace android Loading
services/inputflinger/InputReader.cpp +28 −18 Original line number Diff line number Diff line Loading @@ -2641,6 +2641,11 @@ void CursorInputMapper::configure(nsecs_t when, mOrientation = internalViewport->orientation; } } // Update the PointerController if viewports changed. if (mParameters.hasAssociatedDisplay) { getPolicy()->obtainPointerController(getDeviceId()); } bumpGeneration(); } } Loading Loading @@ -2786,7 +2791,7 @@ void CursorInputMapper::sync(nsecs_t when) { pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY); displayId = ADISPLAY_ID_DEFAULT; displayId = mPointerController->getDisplayId(); } else { pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY); Loading Loading @@ -3612,10 +3617,10 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) { mOrientedRanges.clear(); } // Create pointer controller if needed. // Create or update pointer controller if needed. if (mDeviceMode == DEVICE_MODE_POINTER || (mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) { if (mPointerController == nullptr) { if (mPointerController == nullptr || viewportChanged) { mPointerController = getPolicy()->obtainPointerController(getDeviceId()); } } else { Loading Loading @@ -5404,8 +5409,9 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, x); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y); const int32_t displayId = mPointerController->getDisplayId(); NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE, /* deviceTimestamp */ 0, 1, &pointerProperties, &pointerCoords, Loading Loading @@ -6312,6 +6318,7 @@ void TouchInputMapper::abortPointerMouse(nsecs_t when, uint32_t policyFlags) { void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, bool down, bool hovering) { int32_t metaState = getContext()->getGlobalMetaState(); int32_t displayId = mViewport.displayId; if (mPointerController != nullptr) { if (down || hovering) { Loading @@ -6322,6 +6329,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, } else if (!down && !hovering && (mPointerSimple.down || mPointerSimple.hovering)) { mPointerController->fade(PointerControllerInterface::TRANSITION_GRADUAL); } displayId = mPointerController->getDisplayId(); } if (mPointerSimple.down && !down) { Loading @@ -6329,7 +6337,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send up. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_UP, 0, 0, metaState, mLastRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords, Loading @@ -6343,7 +6351,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send hover exit. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_HOVER_EXIT, 0, 0, metaState, mLastRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords, Loading @@ -6359,7 +6367,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send down. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_DOWN, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords, Loading @@ -6370,7 +6378,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send move. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords, Loading @@ -6385,7 +6393,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send hover enter. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_HOVER_ENTER, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, Loading @@ -6397,7 +6405,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, // Send hover move. NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, Loading @@ -6420,7 +6428,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, hscroll); NotifyMotionArgs args(mContext->getNextSequenceNum(), when, getDeviceId(), mSource, mViewport.displayId, policyFlags, mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_SCROLL, 0, 0, metaState, mCurrentRawState.buttonState, 0, /* deviceTimestamp */ 0, 1, &mPointerSimple.currentProperties, &pointerCoords, Loading Loading @@ -6482,11 +6490,13 @@ void TouchInputMapper::dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32 ALOG_ASSERT(false); } } const int32_t displayId = mPointerController != nullptr ? mPointerController->getDisplayId() : mViewport.displayId; const int32_t deviceId = getDeviceId(); std::vector<TouchVideoFrame> frames = mDevice->getEventHub()->getVideoFrames(deviceId); NotifyMotionArgs args(mContext->getNextSequenceNum(), when, deviceId, source, mViewport.displayId, policyFlags, source, displayId, policyFlags, action, actionButton, flags, metaState, buttonState, edgeFlags, deviceTimestamp, pointerCount, pointerProperties, pointerCoords, xPrecision, yPrecision, downTime, std::move(frames)); Loading
services/inputflinger/include/PointerControllerInterface.h +3 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,9 @@ public: /* Removes all spots. */ virtual void clearSpots() = 0; /* Gets the id of the display where the pointer should be shown. */ virtual int32_t getDisplayId() const = 0; }; } // namespace android Loading
services/inputflinger/tests/InputReader_test.cpp +60 −1 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ class FakePointerController : public PointerControllerInterface { float mMinX, mMinY, mMaxX, mMaxY; float mX, mY; int32_t mButtonState; int32_t mDisplayId; protected: virtual ~FakePointerController() { } Loading @@ -64,7 +65,7 @@ protected: public: FakePointerController() : mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0), mButtonState(0) { mButtonState(0), mDisplayId(ADISPLAY_ID_DEFAULT) { } void setBounds(float minX, float minY, float maxX, float maxY) { Loading @@ -75,6 +76,10 @@ public: mMaxY = maxY; } void setDisplayId(int32_t displayId) { mDisplayId = displayId; } virtual void setPosition(float x, float y) { mX = x; mY = y; Loading @@ -93,6 +98,10 @@ public: *outY = mY; } virtual int32_t getDisplayId() const { return mDisplayId; } private: virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const { *outMinX = mMinX; Loading Loading @@ -3169,6 +3178,30 @@ TEST_F(CursorInputMapperTest, Process_PointerCapture) { ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f)); } TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) { CursorInputMapper* mapper = new CursorInputMapper(mDevice); addMapperAndConfigure(mapper); // Setup PointerController for second display. constexpr int32_t SECOND_DISPLAY_ID = 1; mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); mFakePointerController->setPosition(100, 200); mFakePointerController->setButtonState(0); mFakePointerController->setDisplayId(SECOND_DISPLAY_ID); NotifyMotionArgs args; process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10); process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20); process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0); ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source); ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action); ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f)); ASSERT_EQ(SECOND_DISPLAY_ID, args.displayId); } // --- TouchInputMapperTest --- Loading Loading @@ -6318,4 +6351,30 @@ TEST_F(MultiTouchInputMapperTest, Viewports_Fallback) { ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId); } TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) { // Setup PointerController for second display. sp<FakePointerController> fakePointerController = new FakePointerController(); fakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); fakePointerController->setPosition(100, 200); fakePointerController->setButtonState(0); fakePointerController->setDisplayId(SECONDARY_DISPLAY_ID); mFakePolicy->setPointerController(mDevice->getId(), fakePointerController); MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); prepareDisplay(DISPLAY_ORIENTATION_0); prepareAxes(POSITION); addMapperAndConfigure(mapper); // Check source is mouse that would obtain the PointerController. ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources()); NotifyMotionArgs motionArgs; processPosition(mapper, 100, 100); processSync(mapper); ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId); } } // namespace android