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

Commit 9932645d authored by Byoungho Jung's avatar Byoungho Jung Committed by Prabir Pradhan
Browse files

Add setPointerIcon for PointerChoreographer

To set pointer icon for mouse or stylus, we are going to use
setPointerIcon with more parameters which will be useful for
multi-device experience and security.

Test: atest inputflinger_tests
Bug: 293587049
Change-Id: Ie0250928ed28c6dc238faa8dcae8ad154ed053fe
parent 4cd9cb2c
Loading
Loading
Loading
Loading
+51 −0
Original line number Original line Diff line number Diff line
@@ -445,6 +445,57 @@ void PointerChoreographer::setStylusPointerIconEnabled(bool enabled) {
    updatePointerControllersLocked();
    updatePointerControllersLocked();
}
}


bool PointerChoreographer::setPointerIcon(
        std::variant<std::unique_ptr<SpriteIcon>, PointerIconStyle> icon, int32_t displayId,
        DeviceId deviceId) {
    std::scoped_lock _l(mLock);
    if (deviceId < 0) {
        ALOGW("Invalid device id %d. Cannot set pointer icon.", deviceId);
        return false;
    }
    const InputDeviceInfo* info = findInputDeviceLocked(deviceId);
    if (!info) {
        ALOGW("No input device info found for id %d. Cannot set pointer icon.", deviceId);
        return false;
    }
    const uint32_t sources = info->getSources();
    const auto stylusPointerIt = mStylusPointersByDevice.find(deviceId);

    if (isFromSource(sources, AINPUT_SOURCE_STYLUS) &&
        stylusPointerIt != mStylusPointersByDevice.end()) {
        if (std::holds_alternative<std::unique_ptr<SpriteIcon>>(icon)) {
            if (std::get<std::unique_ptr<SpriteIcon>>(icon) == nullptr) {
                LOG(FATAL) << "SpriteIcon should not be null";
            }
            stylusPointerIt->second->setCustomPointerIcon(
                    *std::get<std::unique_ptr<SpriteIcon>>(icon));
        } else {
            stylusPointerIt->second->updatePointerIcon(std::get<PointerIconStyle>(icon));
        }
    } else if (isFromSource(sources, AINPUT_SOURCE_MOUSE)) {
        if (const auto mousePointerIt = mMousePointersByDisplay.find(displayId);
            mousePointerIt != mMousePointersByDisplay.end()) {
            if (std::holds_alternative<std::unique_ptr<SpriteIcon>>(icon)) {
                if (std::get<std::unique_ptr<SpriteIcon>>(icon) == nullptr) {
                    LOG(FATAL) << "SpriteIcon should not be null";
                }
                mousePointerIt->second->setCustomPointerIcon(
                        *std::get<std::unique_ptr<SpriteIcon>>(icon));
            } else {
                mousePointerIt->second->updatePointerIcon(std::get<PointerIconStyle>(icon));
            }
        } else {
            ALOGW("No mouse pointer controller found for display %d, device %d.", displayId,
                  deviceId);
            return false;
        }
    } else {
        ALOGW("Cannot set pointer icon for display %d, device %d.", displayId, deviceId);
        return false;
    }
    return true;
}

PointerChoreographer::ControllerConstructor PointerChoreographer::getMouseControllerConstructor(
PointerChoreographer::ControllerConstructor PointerChoreographer::getMouseControllerConstructor(
        int32_t displayId) {
        int32_t displayId) {
    std::function<std::shared_ptr<PointerControllerInterface>()> ctor =
    std::function<std::shared_ptr<PointerControllerInterface>()> ctor =
+7 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,8 @@


namespace android {
namespace android {


struct SpriteIcon;

/**
/**
 * A helper class that wraps a factory method that acts as a constructor for the type returned
 * A helper class that wraps a factory method that acts as a constructor for the type returned
 * by the factory method.
 * by the factory method.
@@ -58,6 +60,9 @@ public:
    virtual FloatPoint getMouseCursorPosition(int32_t displayId) = 0;
    virtual FloatPoint getMouseCursorPosition(int32_t displayId) = 0;
    virtual void setShowTouchesEnabled(bool enabled) = 0;
    virtual void setShowTouchesEnabled(bool enabled) = 0;
    virtual void setStylusPointerIconEnabled(bool enabled) = 0;
    virtual void setStylusPointerIconEnabled(bool enabled) = 0;
    virtual bool setPointerIcon(std::variant<std::unique_ptr<SpriteIcon>, PointerIconStyle> icon,
                                int32_t displayId, DeviceId deviceId) = 0;

    /**
    /**
     * This method may be called on any thread (usually by the input manager on a binder thread).
     * This method may be called on any thread (usually by the input manager on a binder thread).
     */
     */
@@ -77,6 +82,8 @@ public:
    FloatPoint getMouseCursorPosition(int32_t displayId) override;
    FloatPoint getMouseCursorPosition(int32_t displayId) override;
    void setShowTouchesEnabled(bool enabled) override;
    void setShowTouchesEnabled(bool enabled) override;
    void setStylusPointerIconEnabled(bool enabled) override;
    void setStylusPointerIconEnabled(bool enabled) override;
    bool setPointerIcon(std::variant<std::unique_ptr<SpriteIcon>, PointerIconStyle> icon,
                        int32_t displayId, DeviceId deviceId) override;


    void notifyInputDevicesChanged(const NotifyInputDevicesChangedArgs& args) override;
    void notifyInputDevicesChanged(const NotifyInputDevicesChangedArgs& args) override;
    void notifyConfigurationChanged(const NotifyConfigurationChangedArgs& args) override;
    void notifyConfigurationChanged(const NotifyConfigurationChangedArgs& args) override;
+8 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@


namespace android {
namespace android {


struct SpriteIcon;

struct FloatPoint {
struct FloatPoint {
    float x;
    float x;
    float y;
    float y;
@@ -135,6 +137,12 @@ public:


    /* Sets the associated display of this pointer. Pointer should show on that display. */
    /* Sets the associated display of this pointer. Pointer should show on that display. */
    virtual void setDisplayViewport(const DisplayViewport& displayViewport) = 0;
    virtual void setDisplayViewport(const DisplayViewport& displayViewport) = 0;

    /* Sets the pointer icon type for mice or styluses. */
    virtual void updatePointerIcon(PointerIconStyle iconId) = 0;

    /* Sets the custom pointer icon for mice or styluses. */
    virtual void setCustomPointerIcon(const SpriteIcon& icon) = 0;
};
};


} // namespace android
} // namespace android
+30 −0
Original line number Original line Diff line number Diff line
@@ -54,6 +54,16 @@ void FakePointerController::setDisplayViewport(const DisplayViewport& viewport)
              viewport.logicalBottom - 1);
              viewport.logicalBottom - 1);
}
}


void FakePointerController::updatePointerIcon(PointerIconStyle iconId) {
    ASSERT_FALSE(mIconStyle.has_value()) << "Pointer icon was set more than once";
    mIconStyle = iconId;
}

void FakePointerController::setCustomPointerIcon(const SpriteIcon& icon) {
    ASSERT_FALSE(mCustomIconStyle.has_value()) << "Custom pointer icon was set more than once";
    mCustomIconStyle = icon.style;
}

void FakePointerController::assertViewportSet(int32_t displayId) {
void FakePointerController::assertViewportSet(int32_t displayId) {
    ASSERT_TRUE(mDisplayId);
    ASSERT_TRUE(mDisplayId);
    ASSERT_EQ(displayId, mDisplayId);
    ASSERT_EQ(displayId, mDisplayId);
@@ -75,6 +85,26 @@ void FakePointerController::assertSpotCount(int32_t displayId, int32_t count) {
    ASSERT_EQ(static_cast<size_t>(count), it->second.size());
    ASSERT_EQ(static_cast<size_t>(count), it->second.size());
}
}


void FakePointerController::assertPointerIconSet(PointerIconStyle iconId) {
    ASSERT_TRUE(mIconStyle) << "Pointer icon style was not set";
    ASSERT_EQ(iconId, mIconStyle);
    mIconStyle.reset();
}

void FakePointerController::assertPointerIconNotSet() {
    ASSERT_EQ(std::nullopt, mIconStyle);
}

void FakePointerController::assertCustomPointerIconSet(PointerIconStyle iconId) {
    ASSERT_TRUE(mCustomIconStyle) << "Custom pointer icon was not set";
    ASSERT_EQ(iconId, mCustomIconStyle);
    mCustomIconStyle.reset();
}

void FakePointerController::assertCustomPointerIconNotSet() {
    ASSERT_EQ(std::nullopt, mCustomIconStyle);
}

bool FakePointerController::isPointerShown() {
bool FakePointerController::isPointerShown() {
    return mIsPointerShown;
    return mIsPointerShown;
}
}
+12 −0
Original line number Original line Diff line number Diff line
@@ -24,6 +24,10 @@


namespace android {
namespace android {


struct SpriteIcon {
    PointerIconStyle style;
};

class FakePointerController : public PointerControllerInterface {
class FakePointerController : public PointerControllerInterface {
public:
public:
    virtual ~FakePointerController() {}
    virtual ~FakePointerController() {}
@@ -35,11 +39,17 @@ public:
    FloatPoint getPosition() const override;
    FloatPoint getPosition() const override;
    int32_t getDisplayId() const override;
    int32_t getDisplayId() const override;
    void setDisplayViewport(const DisplayViewport& viewport) override;
    void setDisplayViewport(const DisplayViewport& viewport) override;
    void updatePointerIcon(PointerIconStyle iconId) override;
    void setCustomPointerIcon(const SpriteIcon& icon) override;


    void assertViewportSet(int32_t displayId);
    void assertViewportSet(int32_t displayId);
    void assertViewportNotSet();
    void assertViewportNotSet();
    void assertPosition(float x, float y);
    void assertPosition(float x, float y);
    void assertSpotCount(int32_t displayId, int32_t count);
    void assertSpotCount(int32_t displayId, int32_t count);
    void assertPointerIconSet(PointerIconStyle iconId);
    void assertPointerIconNotSet();
    void assertCustomPointerIconSet(PointerIconStyle iconId);
    void assertCustomPointerIconNotSet();
    bool isPointerShown();
    bool isPointerShown();


private:
private:
@@ -58,6 +68,8 @@ private:
    float mX{0}, mY{0};
    float mX{0}, mY{0};
    std::optional<int32_t> mDisplayId;
    std::optional<int32_t> mDisplayId;
    bool mIsPointerShown{false};
    bool mIsPointerShown{false};
    std::optional<PointerIconStyle> mIconStyle;
    std::optional<PointerIconStyle> mCustomIconStyle;


    std::map<int32_t, std::vector<int32_t>> mSpotsByDisplay;
    std::map<int32_t, std::vector<int32_t>> mSpotsByDisplay;
};
};
Loading