13186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn/*
23186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * Copyright (C) 2015 The Android Open Source Project
33186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn *
43186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License");
53186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * you may not use this file except in compliance with the License.
63186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * You may obtain a copy of the License at
73186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn *
83186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn *      http://www.apache.org/licenses/LICENSE-2.0
93186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn *
103186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * Unless required by applicable law or agreed to in writing, software
113186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * distributed under the License is distributed on an "AS IS" BASIS,
123186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * See the License for the specific language governing permissions and
143186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn * limitations under the License.
153186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn */
163186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
173186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#ifndef ANDROID_INPUT_MOCKS_H_
183186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#define ANDROID_INPUT_MOCKS_H_
193186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
203186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#include <map>
213186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#include <set>
223186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#include <string>
233186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
243186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#include <linux/input.h>
253186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
263186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#include "InputHub.h"
273186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
283186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbournnamespace android {
293186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
303186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbournclass MockInputDeviceNode : public InputDeviceNode {
313186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbournpublic:
323186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    MockInputDeviceNode() = default;
333186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual ~MockInputDeviceNode() = default;
343186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
353186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual const std::string& getPath() const override { return mPath; }
363186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual const std::string& getName() const override { return mName; }
373186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual const std::string& getLocation() const override { return mLocation; }
383186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual const std::string& getUniqueId() const override { return mUniqueId; }
393186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
403186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void setPath(const std::string& path) { mPath = path; }
413186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void setName(const std::string& name) { mName = name; }
423186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void setLocation(const std::string& location) { mLocation = location; }
433186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void setUniqueId(const std::string& uniqueId) { mUniqueId = uniqueId; }
443186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
453186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual uint16_t getBusType() const override { return mBusType; }
463186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual uint16_t getVendorId() const override { return mVendorId; }
473186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual uint16_t getProductId() const override { return mProductId; }
483186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual uint16_t getVersion() const override { return mVersion; }
493186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
503186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void setBusType(uint16_t busType) { mBusType = busType; }
513186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void setVendorId(uint16_t vendorId) { mVendorId = vendorId; }
523186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void setProductId(uint16_t productId) { mProductId = productId; }
533186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void setVersion(uint16_t version) { mVersion = version; }
543186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
553186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual bool hasKey(int32_t key) const override { return mKeys.count(key); }
563186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual bool hasKeyInRange(int32_t startKey, int32_t endKey) const override;
573186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual bool hasRelativeAxis(int axis) const override { return mRelAxes.count(axis); }
583186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual bool hasAbsoluteAxis(int32_t axis) const override { return mAbsAxes.count(axis); }
593186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual bool hasSwitch(int32_t sw) const override { return mSwitches.count(sw); }
603186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual bool hasForceFeedback(int32_t ff) const override { return mForceFeedbacks.count(ff); }
613186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual bool hasInputProperty(int32_t property) const override {
623186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        return mInputProperties.count(property);
633186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    }
643186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
653186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    // base case
663186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void addKeys() {}
673186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    // inductive case
683186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    template<typename I, typename... Is>
693186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void addKeys(I key, Is... keys) {
703186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        // Add the first key
713186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        mKeys.insert(key);
723186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        // Recursively add the remaining keys
733186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        addKeys(keys...);
743186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    }
753186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
763186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void addRelAxis(int32_t axis) { mRelAxes.insert(axis); }
773186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void addAbsAxis(int32_t axis, AbsoluteAxisInfo* info) { mAbsAxes[axis] = info; }
783186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void addSwitch(int32_t sw) { mSwitches.insert(sw); }
793186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void addForceFeedback(int32_t ff) { mForceFeedbacks.insert(ff); }
803186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    void addInputProperty(int32_t property) { mInputProperties.insert(property); }
813186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
823186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual int32_t getKeyState(int32_t key) const override { return 0; }
833186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual int32_t getSwitchState(int32_t sw) const override { return 0; }
843186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual const AbsoluteAxisInfo* getAbsoluteAxisInfo(int32_t axis) const override {
853186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        auto iter = mAbsAxes.find(axis);
863186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        if (iter != mAbsAxes.end()) {
873186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn            return iter->second;
883186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        }
893186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        return nullptr;
903186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    }
913186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual status_t getAbsoluteAxisValue(int32_t axis, int32_t* outValue) const override {
923186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        // TODO
933186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn        return 0;
943186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    }
953186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
963186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual void vibrate(nsecs_t duration) override {}
973186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual void cancelVibrate() override {}
983186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
993186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    virtual void disableDriverKeyRepeat() override { mKeyRepeatDisabled = true; }
1003186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1013186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    bool isDriverKeyRepeatEnabled() { return mKeyRepeatDisabled; }
1023186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1033186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbournprivate:
1043186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::string mPath = "/test";
1053186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::string mName = "Test Device";
1063186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::string mLocation = "test/0";
1073186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::string mUniqueId = "test-id";
1083186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1093186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    uint16_t mBusType = 0;
1103186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    uint16_t mVendorId = 0;
1113186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    uint16_t mProductId = 0;
1123186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    uint16_t mVersion = 0;
1133186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1143186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::set<int32_t> mKeys;
1153186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::set<int32_t> mRelAxes;
1163186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::map<int32_t, AbsoluteAxisInfo*> mAbsAxes;
1173186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::set<int32_t> mSwitches;
1183186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::set<int32_t> mForceFeedbacks;
1193186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    std::set<int32_t> mInputProperties;
1203186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1213186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    bool mKeyRepeatDisabled = false;
1223186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn};
1233186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1243186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbournnamespace MockNexus7v2 {
1253186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getElanTouchscreen();
1263186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getLidInput();
1273186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getButtonJack();
1283186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getHeadsetJack();
1293186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getH2wButton();
1303186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getGpioKeys();
1313186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}  // namespace MockNexus7v2
1323186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1333186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbournnamespace MockNexusPlayer {
1343186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getGpioKeys();
1353186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getMidPowerBtn();
1363186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getNexusRemote();
1373186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournMockInputDeviceNode* getAsusGamepad();
1383186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}  // namespace MockNexusPlayer
1393186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1403186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}  // namespace android
1413186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1423186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#endif  // ANDROID_INPUT_MOCKS_H_
143