/* * Copyright (C) 2015 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. */ #ifndef ANDROID_INPUT_MOCKS_H_ #define ANDROID_INPUT_MOCKS_H_ #include <map> #include <set> #include <string> #include <linux/input.h> #include "InputHub.h" namespace android { class MockInputDeviceNode : public InputDeviceNode { public: MockInputDeviceNode() = default; virtual ~MockInputDeviceNode() = default; virtual const std::string& getPath() const override { return mPath; } virtual const std::string& getName() const override { return mName; } virtual const std::string& getLocation() const override { return mLocation; } virtual const std::string& getUniqueId() const override { return mUniqueId; } void setPath(const std::string& path) { mPath = path; } void setName(const std::string& name) { mName = name; } void setLocation(const std::string& location) { mLocation = location; } void setUniqueId(const std::string& uniqueId) { mUniqueId = uniqueId; } virtual uint16_t getBusType() const override { return mBusType; } virtual uint16_t getVendorId() const override { return mVendorId; } virtual uint16_t getProductId() const override { return mProductId; } virtual uint16_t getVersion() const override { return mVersion; } void setBusType(uint16_t busType) { mBusType = busType; } void setVendorId(uint16_t vendorId) { mVendorId = vendorId; } void setProductId(uint16_t productId) { mProductId = productId; } void setVersion(uint16_t version) { mVersion = version; } virtual bool hasKey(int32_t key) const override { return mKeys.count(key); } virtual bool hasKeyInRange(int32_t startKey, int32_t endKey) const override; virtual bool hasRelativeAxis(int axis) const override { return mRelAxes.count(axis); } virtual bool hasAbsoluteAxis(int32_t axis) const override { return mAbsAxes.count(axis); } virtual bool hasSwitch(int32_t sw) const override { return mSwitches.count(sw); } virtual bool hasForceFeedback(int32_t ff) const override { return mForceFeedbacks.count(ff); } virtual bool hasInputProperty(int32_t property) const override { return mInputProperties.count(property); } // base case void addKeys() {} // inductive case template<typename I, typename... Is> void addKeys(I key, Is... keys) { // Add the first key mKeys.insert(key); // Recursively add the remaining keys addKeys(keys...); } void addRelAxis(int32_t axis) { mRelAxes.insert(axis); } void addAbsAxis(int32_t axis, AbsoluteAxisInfo* info) { mAbsAxes[axis] = info; } void addSwitch(int32_t sw) { mSwitches.insert(sw); } void addForceFeedback(int32_t ff) { mForceFeedbacks.insert(ff); } void addInputProperty(int32_t property) { mInputProperties.insert(property); } virtual int32_t getKeyState(int32_t key) const override { return 0; } virtual int32_t getSwitchState(int32_t sw) const override { return 0; } virtual const AbsoluteAxisInfo* getAbsoluteAxisInfo(int32_t axis) const override { auto iter = mAbsAxes.find(axis); if (iter != mAbsAxes.end()) { return iter->second; } return nullptr; } virtual status_t getAbsoluteAxisValue(int32_t axis, int32_t* outValue) const override { // TODO return 0; } virtual void vibrate(nsecs_t duration) override {} virtual void cancelVibrate() override {} virtual void disableDriverKeyRepeat() override { mKeyRepeatDisabled = true; } bool isDriverKeyRepeatEnabled() { return mKeyRepeatDisabled; } private: std::string mPath = "/test"; std::string mName = "Test Device"; std::string mLocation = "test/0"; std::string mUniqueId = "test-id"; uint16_t mBusType = 0; uint16_t mVendorId = 0; uint16_t mProductId = 0; uint16_t mVersion = 0; std::set<int32_t> mKeys; std::set<int32_t> mRelAxes; std::map<int32_t, AbsoluteAxisInfo*> mAbsAxes; std::set<int32_t> mSwitches; std::set<int32_t> mForceFeedbacks; std::set<int32_t> mInputProperties; bool mKeyRepeatDisabled = false; }; namespace MockNexus7v2 { MockInputDeviceNode* getElanTouchscreen(); MockInputDeviceNode* getLidInput(); MockInputDeviceNode* getButtonJack(); MockInputDeviceNode* getHeadsetJack(); MockInputDeviceNode* getH2wButton(); MockInputDeviceNode* getGpioKeys(); } // namespace MockNexus7v2 namespace MockNexusPlayer { MockInputDeviceNode* getGpioKeys(); MockInputDeviceNode* getMidPowerBtn(); MockInputDeviceNode* getNexusRemote(); MockInputDeviceNode* getAsusGamepad(); } // namespace MockNexusPlayer } // namespace android #endif // ANDROID_INPUT_MOCKS_H_