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

Commit 66e121aa authored by Hiroki Sato's avatar Hiroki Sato
Browse files

Implement PointerController#getPositionInLogicalDisplay

Currently PointerController#getPosition returns the absolute position by
applying the inverse display transform to internal logical position.

When the user needs logical position, they first get position, and apply
the display transform.
This unnecessary double transform can be avoided by providing getter of
both absolute and logical position.
This change does it.

Bug: 431622043
Test: PointerChoreographerTest
Test: PointerControllerTest
Flag: EXEMPT refactor
Change-Id: I1ecc5a88ddfe2f365a26a47ad4379e66f780e386
parent 0ab05452
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -170,6 +170,11 @@ vec2 PointerController::getPosition() const {
    }
}

vec2 PointerController::getPositionInLogicalDisplay() const {
    const ui::LogicalDisplayId displayId = mCursorController.getDisplayId();
    return mCursorController.getPosition();
}

ui::LogicalDisplayId PointerController::getDisplayId() const {
    return mCursorController.getDisplayId();
}
+4 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ public:
    vec2 move(float deltaX, float deltaY) override;
    void setPosition(float x, float y) override;
    vec2 getPosition() const override;
    vec2 getPositionInLogicalDisplay() const override;
    ui::LogicalDisplayId getDisplayId() const override;
    void fade(Transition transition) override;
    void unfade(Transition transition) override;
@@ -175,6 +176,9 @@ public:
    vec2 getPosition() const override {
        LOG_ALWAYS_FATAL("Should not be called");
    }
    vec2 getPositionInLogicalDisplay() const override {
        LOG_ALWAYS_FATAL("Should not be called");
    }
    ui::LogicalDisplayId getDisplayId() const override {
        LOG_ALWAYS_FATAL("Should not be called");
    }
+51 −0
Original line number Diff line number Diff line
@@ -179,6 +179,8 @@ protected:
    ~PointerControllerTest();

    void ensureDisplayViewportIsSet(ui::LogicalDisplayId displayId = ui::LogicalDisplayId::DEFAULT);
    void addDisplay(ui::LogicalDisplayId displayId, int32_t width, int32_t height,
                    ui::Rotation rotation = ui::ROTATION_0);

    sp<MockSprite> mPointerSprite;
    sp<MockPointerControllerPolicyInterface> mPolicy;
@@ -223,6 +225,17 @@ void PointerControllerTest::ensureDisplayViewportIsSet(ui::LogicalDisplayId disp
    mPointerController->setDisplayViewport(viewport);
}

void PointerControllerTest::addDisplay(ui::LogicalDisplayId displayId, int32_t logicalWidth,
                                       int32_t logicalHeight, ui::Rotation rotation) {
    gui::DisplayInfo displayInfo;
    displayInfo.displayId = displayId;
    displayInfo.logicalWidth = logicalWidth;
    displayInfo.logicalHeight = logicalHeight;
    displayInfo.transform.set(ui::Transform::toRotationFlags(rotation), logicalHeight,
                              logicalWidth);
    mRegisteredListener->onWindowInfosChanged({{}, {displayInfo}, 0, 0});
}

void PointerControllerTest::loopThread() {
    Looper::setForThread(mLooper);

@@ -231,6 +244,44 @@ void PointerControllerTest::loopThread() {
    }
}

TEST_F(PointerControllerTest, getPosition) {
    addDisplay(ui::LogicalDisplayId::DEFAULT, 800, 600);
    ensureDisplayViewportIsSet();

    mPointerController->setPosition(100, 200);

    vec2 absolutePosition = mPointerController->getPosition();
    EXPECT_EQ(100, absolutePosition.x);
    EXPECT_EQ(200, absolutePosition.y);

    vec2 logicalPosition = mPointerController->getPositionInLogicalDisplay();
    EXPECT_EQ(100, logicalPosition.x);
    EXPECT_EQ(200, logicalPosition.y);
}

TEST_F(PointerControllerTest, getPosition_withDisplayRotation) {
    addDisplay(ui::LogicalDisplayId::DEFAULT, 800, 600, ui::ROTATION_90);
    DisplayViewport viewport;
    viewport.displayId = ui::LogicalDisplayId::DEFAULT;
    viewport.logicalRight = 800;
    viewport.logicalBottom = 600;
    viewport.physicalRight = 600;
    viewport.physicalBottom = 800;
    viewport.deviceWidth = 600;
    viewport.deviceHeight = 800;
    mPointerController->setDisplayViewport(viewport);

    mPointerController->setPosition(100, 200);

    vec2 absolutePosition = mPointerController->getPosition();
    EXPECT_EQ(100, absolutePosition.x);
    EXPECT_EQ(200, absolutePosition.y);

    vec2 logicalPosition = mPointerController->getPositionInLogicalDisplay();
    EXPECT_EQ(400, logicalPosition.x);
    EXPECT_EQ(100, logicalPosition.y);
}

TEST_F(PointerControllerTest, useDefaultCursorTypeByDefault) {
    ensureDisplayViewportIsSet();
    mPointerController->unfade(PointerController::Transition::IMMEDIATE);