diff options
author | Scott Lobdell <slobdell@google.com> | 2019-01-22 18:03:19 -0800 |
---|---|---|
committer | Scott Lobdell <slobdell@google.com> | 2019-01-22 18:03:19 -0800 |
commit | 9cbe1214920ac86be2843ab179f4b4a37c8ed0f7 (patch) | |
tree | 93cb1e4825e735c0e7788bba8c708b4a5b9c9fa2 /libs/gui/tests/EndToEndNativeInputTest.cpp | |
parent | 2006e5c5264470961f62e2726a2c6283318bb7b6 (diff) | |
parent | 18b5c52cff51fd7506a67c709984847a58e0e0cd (diff) |
Merge QP1A.190122.001
Change-Id: I5e5cc611a0970d405a1df01bfdd70ce3fdf6958d
Diffstat (limited to 'libs/gui/tests/EndToEndNativeInputTest.cpp')
-rw-r--r-- | libs/gui/tests/EndToEndNativeInputTest.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/libs/gui/tests/EndToEndNativeInputTest.cpp b/libs/gui/tests/EndToEndNativeInputTest.cpp index 6467bf9ab4..6dc1ec8132 100644 --- a/libs/gui/tests/EndToEndNativeInputTest.cpp +++ b/libs/gui/tests/EndToEndNativeInputTest.cpp @@ -137,6 +137,27 @@ public: EXPECT_EQ(AMOTION_EVENT_ACTION_UP, mev->getAction()); } + void expectMotionEvent(int motionEventType, int x, int y) { + InputEvent *ev = consumeEvent(); + ASSERT_NE(ev, nullptr); + ASSERT_EQ(ev->getType(), AINPUT_EVENT_TYPE_MOTION); + MotionEvent *mev = static_cast<MotionEvent *>(ev); + EXPECT_EQ(motionEventType, mev->getAction()); + EXPECT_EQ(x, mev->getX(0)); + EXPECT_EQ(y, mev->getY(0)); + } + + void expectNoMotionEvent(int motionEventType) { + InputEvent *ev = consumeEvent(); + if (ev == nullptr || ev->getType() != AINPUT_EVENT_TYPE_MOTION) { + // Didn't find an event or a motion event so assume action didn't occur. + return; + } + + MotionEvent *mev = static_cast<MotionEvent *>(ev); + EXPECT_NE(motionEventType, mev->getAction()); + } + ~InputSurface() { mInputFlinger->unregisterInputChannel(mServerChannel); } @@ -259,6 +280,15 @@ void injectTap(int x, int y) { } } +void injectMotionEvent(std::string event, int x, int y) { + char *buf1, *buf2; + asprintf(&buf1, "%d", x); + asprintf(&buf2, "%d", y); + if (fork() == 0) { + execlp("input", "input", "motionevent", event.c_str(), buf1, buf2, NULL); + } +} + TEST_F(InputSurfacesTest, can_receive_input) { std::unique_ptr<InputSurface> surface = makeSurface(100, 100); surface->showAt(100, 100); @@ -443,5 +473,33 @@ TEST_F(InputSurfacesTest, input_respects_container_layer_visiblity) { injectTap(11, 11); bgSurface->expectTap(1, 1); } + +TEST_F(InputSurfacesTest, transfer_touch_focus) { + std::unique_ptr<InputSurface> fromSurface = makeSurface(100, 100); + + fromSurface->showAt(10, 10); + injectMotionEvent("DOWN", 11, 11); + fromSurface->expectMotionEvent(AMOTION_EVENT_ACTION_DOWN, 1, 1); + + std::unique_ptr<InputSurface> toSurface = makeSurface(100, 100); + toSurface->showAt(10, 10); + + sp<IBinder> fromToken = fromSurface->mServerChannel->getToken(); + sp<IBinder> toToken = toSurface->mServerChannel->getToken(); + SurfaceComposerClient::Transaction t; + t.transferTouchFocus(fromToken, toToken).apply(true); + + injectMotionEvent("UP", 11, 11); + toSurface->expectMotionEvent(AMOTION_EVENT_ACTION_UP, 1, 1); + fromSurface->expectNoMotionEvent(AMOTION_EVENT_ACTION_UP); +} + +TEST_F(InputSurfacesTest, input_respects_outscreen) { + std::unique_ptr<InputSurface> surface = makeSurface(100, 100); + surface->showAt(-1, -1); + + injectTap(0, 0); + surface->expectTap(1, 1); +} } } |