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

Commit b4a0f856 authored by arthurhung's avatar arthurhung Committed by Arthur Hung
Browse files

Fix "Allow/Deny" popup window no respond when use cursor

Currently all buffered layers will send input info to InputFlinger in
order to detect if a window is obsecured by another layer. This could
cause the cursor sprite are calculated into the input windows and
generate the unexpected FLAG_(PARTIALLY)_OCCLUDED.

To fix this, we exclude the cursor layer when fill input info to
InputFlinger.

Bug: 158717144
Test: atest InputSurfacesTest
Test: connect mouse, open camera and popup grant permission dialog
Change-Id: Ic57dfc7b68f8bf8fda5d7a77e107ca023b55b891
parent 6cd3197b
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -104,6 +104,15 @@ public:
        return std::make_unique<InputSurface>(surfaceControl, width, height);
    }

    static std::unique_ptr<InputSurface> makeCursorInputSurface(
            const sp<SurfaceComposerClient> &scc, int width, int height) {
        sp<SurfaceControl> surfaceControl =
                scc->createSurface(String8("Test Cursor Surface"), 0 /* bufHeight */,
                                   0 /* bufWidth */, PIXEL_FORMAT_RGBA_8888,
                                   ISurfaceComposerClient::eCursorWindow);
        return std::make_unique<InputSurface>(surfaceControl, width, height);
    }

    InputEvent* consumeEvent() {
        waitForEventAvailable();

@@ -134,12 +143,14 @@ public:
        EXPECT_EQ(AMOTION_EVENT_ACTION_DOWN, mev->getAction());
        EXPECT_EQ(x, mev->getX(0));
        EXPECT_EQ(y, mev->getY(0));
        EXPECT_EQ(0, mev->getFlags() & VERIFIED_MOTION_EVENT_FLAGS);

        ev = consumeEvent();
        ASSERT_NE(ev, nullptr);
        ASSERT_EQ(AINPUT_EVENT_TYPE_MOTION, ev->getType());
        mev = static_cast<MotionEvent*>(ev);
        EXPECT_EQ(AMOTION_EVENT_ACTION_UP, mev->getAction());
        EXPECT_EQ(0, mev->getFlags() & VERIFIED_MOTION_EVENT_FLAGS);
    }

    ~InputSurface() {
@@ -537,5 +548,18 @@ TEST_F(InputSurfacesTest, input_respects_outscreen) {
    injectTap(0, 0);
    surface->expectTap(1, 1);
}

TEST_F(InputSurfacesTest, input_ignores_cursor_layer) {
    std::unique_ptr<InputSurface> surface = makeSurface(100, 100);
    std::unique_ptr<InputSurface> cursorSurface =
            InputSurface::makeCursorInputSurface(mComposerClient, 10, 10);

    surface->showAt(10, 10);
    surface->assertFocusChange(true);
    cursorSurface->showAt(10, 10);

    injectTap(11, 11);
    surface->expectTap(1, 1);
}
}
}
+2 −2
Original line number Diff line number Diff line
@@ -148,10 +148,10 @@ private:
    virtual status_t updateActiveBuffer() = 0;
    virtual status_t updateFrameNumber(nsecs_t latchTime) = 0;

    // We generate InputWindowHandles for all buffered layers regardless of whether they
    // We generate InputWindowHandles for all non-cursor buffered layers regardless of whether they
    // have an InputChannel. This is to enable the InputDispatcher to do PID based occlusion
    // detection.
    bool needsInputInfo() const override { return true; }
    bool needsInputInfo() const override { return !mPotentialCursor; }

protected:
    struct BufferInfo {