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

Commit b57f170f authored by Harry Cutts's avatar Harry Cutts
Browse files

inputflinger_tests: Put `FakePointerController` in its own file

I would like to be able to put automated tests for the new
`TouchpadEventMapper` in their own file, rather than
InputReader_tests.cpp. To do this I'll need some of the test utilities
in their own files, too.

Aside from extracting the `FakePointerController` definition into its
own file and putting method bodies into a .cpp file, I've also moved
private members into one place in the header file, and initialized them
there to allow the default constructor to be used.

Bug: 251196347
Test: atest inputflinger_tests
Change-Id: I8f9704c543a07eae5b7135990139ac37eda82ae5
parent a5b71292
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ cc_test {
        "BlockingQueue_test.cpp",
        "EventHub_test.cpp",
        "FakeEventHub.cpp",
        "FakePointerController.cpp",
        "FocusResolver_test.cpp",
        "InputProcessor_test.cpp",
        "InputProcessorConverter_test.cpp",
+93 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "FakePointerController.h"

namespace android {

void FakePointerController::setBounds(float minX, float minY, float maxX, float maxY) {
    mHaveBounds = true;
    mMinX = minX;
    mMinY = minY;
    mMaxX = maxX;
    mMaxY = maxY;
}

const std::map<int32_t, std::vector<int32_t>>& FakePointerController::getSpots() {
    return mSpotsByDisplay;
}

void FakePointerController::setPosition(float x, float y) {
    mX = x;
    mY = y;
}

void FakePointerController::setButtonState(int32_t buttonState) {
    mButtonState = buttonState;
}

int32_t FakePointerController::getButtonState() const {
    return mButtonState;
}

void FakePointerController::getPosition(float* outX, float* outY) const {
    *outX = mX;
    *outY = mY;
}

int32_t FakePointerController::getDisplayId() const {
    return mDisplayId;
}

void FakePointerController::setDisplayViewport(const DisplayViewport& viewport) {
    mDisplayId = viewport.displayId;
}

bool FakePointerController::getBounds(float* outMinX, float* outMinY, float* outMaxX,
                                      float* outMaxY) const {
    *outMinX = mMinX;
    *outMinY = mMinY;
    *outMaxX = mMaxX;
    *outMaxY = mMaxY;
    return mHaveBounds;
}

void FakePointerController::move(float deltaX, float deltaY) {
    mX += deltaX;
    if (mX < mMinX) mX = mMinX;
    if (mX > mMaxX) mX = mMaxX;
    mY += deltaY;
    if (mY < mMinY) mY = mMinY;
    if (mY > mMaxY) mY = mMaxY;
}

void FakePointerController::setSpots(const PointerCoords*, const uint32_t*, BitSet32 spotIdBits,
                                     int32_t displayId) {
    std::vector<int32_t> newSpots;
    // Add spots for fingers that are down.
    for (BitSet32 idBits(spotIdBits); !idBits.isEmpty();) {
        uint32_t id = idBits.clearFirstMarkedBit();
        newSpots.push_back(id);
    }

    mSpotsByDisplay[displayId] = newSpots;
}

void FakePointerController::clearSpots() {
    mSpotsByDisplay.clear();
}

} // namespace android
+60 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <PointerControllerInterface.h>
#include <gui/constants.h>
#include <input/DisplayViewport.h>
#include <input/Input.h>
#include <utils/BitSet.h>

namespace android {

class FakePointerController : public PointerControllerInterface {
public:
    virtual ~FakePointerController() {}

    void setBounds(float minX, float minY, float maxX, float maxY);
    const std::map<int32_t, std::vector<int32_t>>& getSpots();

    void setPosition(float x, float y) override;
    void setButtonState(int32_t buttonState) override;
    int32_t getButtonState() const override;
    void getPosition(float* outX, float* outY) const override;
    int32_t getDisplayId() const override;
    void setDisplayViewport(const DisplayViewport& viewport) override;

private:
    bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const override;
    void move(float deltaX, float deltaY) override;
    void fade(Transition) override {}
    void unfade(Transition) override {}
    void setPresentation(Presentation) override {}
    void setSpots(const PointerCoords*, const uint32_t*, BitSet32 spotIdBits,
                  int32_t displayId) override;
    void clearSpots() override;

    bool mHaveBounds{false};
    float mMinX{0}, mMinY{0}, mMaxX{0}, mMaxY{0};
    float mX{0}, mY{0};
    int32_t mButtonState{0};
    int32_t mDisplayId{ADISPLAY_ID_DEFAULT};

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

} // namespace android
+1 −91
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@

#include <thread>
#include "FakeEventHub.h"
#include "FakePointerController.h"
#include "TestConstants.h"
#include "android/hardware/input/InputDeviceCountryCode.h"
#include "input/DisplayViewport.h"
@@ -148,97 +149,6 @@ static void assertAxisNotPresent(MultiTouchInputMapper& mapper, int axis) {
    }
}

// --- FakePointerController ---

class FakePointerController : public PointerControllerInterface {
    bool mHaveBounds;
    float mMinX, mMinY, mMaxX, mMaxY;
    float mX, mY;
    int32_t mButtonState;
    int32_t mDisplayId;

public:
    FakePointerController() :
        mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
        mButtonState(0), mDisplayId(ADISPLAY_ID_DEFAULT) {
    }

    virtual ~FakePointerController() {}

    void setBounds(float minX, float minY, float maxX, float maxY) {
        mHaveBounds = true;
        mMinX = minX;
        mMinY = minY;
        mMaxX = maxX;
        mMaxY = maxY;
    }

    void setPosition(float x, float y) override {
        mX = x;
        mY = y;
    }

    void setButtonState(int32_t buttonState) override { mButtonState = buttonState; }

    int32_t getButtonState() const override { return mButtonState; }

    void getPosition(float* outX, float* outY) const override {
        *outX = mX;
        *outY = mY;
    }

    int32_t getDisplayId() const override { return mDisplayId; }

    void setDisplayViewport(const DisplayViewport& viewport) override {
        mDisplayId = viewport.displayId;
    }

    const std::map<int32_t, std::vector<int32_t>>& getSpots() {
        return mSpotsByDisplay;
    }

private:
    bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const override {
        *outMinX = mMinX;
        *outMinY = mMinY;
        *outMaxX = mMaxX;
        *outMaxY = mMaxY;
        return mHaveBounds;
    }

    void move(float deltaX, float deltaY) override {
        mX += deltaX;
        if (mX < mMinX) mX = mMinX;
        if (mX > mMaxX) mX = mMaxX;
        mY += deltaY;
        if (mY < mMinY) mY = mMinY;
        if (mY > mMaxY) mY = mMaxY;
    }

    void fade(Transition) override {}

    void unfade(Transition) override {}

    void setPresentation(Presentation) override {}

    void setSpots(const PointerCoords*, const uint32_t*, BitSet32 spotIdBits,
                  int32_t displayId) override {
        std::vector<int32_t> newSpots;
        // Add spots for fingers that are down.
        for (BitSet32 idBits(spotIdBits); !idBits.isEmpty(); ) {
            uint32_t id = idBits.clearFirstMarkedBit();
            newSpots.push_back(id);
        }

        mSpotsByDisplay[displayId] = newSpots;
    }

    void clearSpots() override { mSpotsByDisplay.clear(); }

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


// --- FakeInputReaderPolicy ---

class FakeInputReaderPolicy : public InputReaderPolicyInterface {