• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <condition_variable>
20 #include <mutex>
21 #include <optional>
22 #include <unordered_map>
23 #include <vector>
24 
25 #include <EventHub.h>
26 #include <InputDevice.h>
27 #include <ftl/flags.h>
28 #include <input/PropertyMap.h>
29 #include <input/VirtualKeyMap.h>
30 #include <utils/Errors.h>
31 #include <utils/KeyedVector.h>
32 
33 namespace android {
34 
35 class FakeEventHub : public EventHubInterface {
36     struct KeyInfo {
37         int32_t keyCode;
38         uint32_t flags;
39     };
40 
41     struct SensorInfo {
42         InputDeviceSensorType sensorType;
43         int32_t sensorDataIndex;
44     };
45 
46     struct Device {
47         InputDeviceIdentifier identifier;
48         ftl::Flags<InputDeviceClass> classes;
49         PropertyMap configuration;
50         KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
51         KeyedVector<int, bool> relativeAxes;
52         KeyedVector<int32_t, int32_t> keyCodeStates;
53         KeyedVector<int32_t, int32_t> scanCodeStates;
54         KeyedVector<int32_t, int32_t> switchStates;
55         KeyedVector<int32_t, int32_t> absoluteAxisValue;
56         KeyedVector<int32_t, KeyInfo> keysByScanCode;
57         KeyedVector<int32_t, KeyInfo> keysByUsageCode;
58         std::unordered_map<int32_t, int32_t> keyRemapping;
59         KeyedVector<int32_t, bool> leds;
60         // fake mapping which would normally come from keyCharacterMap
61         std::unordered_map<int32_t, int32_t> keyCodeMapping;
62         std::unordered_map<int32_t, SensorInfo> sensorsByAbsCode;
63         BitArray<MSC_MAX> mscBitmask;
64         std::vector<VirtualKeyDefinition> virtualKeys;
65         bool enabled;
66         std::optional<RawLayoutInfo> layoutInfo;
67         std::string sysfsRootPath;
68 
enableDevice69         status_t enable() {
70             enabled = true;
71             return OK;
72         }
73 
disableDevice74         status_t disable() {
75             enabled = false;
76             return OK;
77         }
78 
DeviceDevice79         explicit Device(ftl::Flags<InputDeviceClass> classes) : classes(classes), enabled(true) {}
80     };
81 
82     std::mutex mLock;
83     std::condition_variable mEventsCondition;
84 
85     KeyedVector<int32_t, Device*> mDevices;
86     std::vector<std::string> mExcludedDevices;
87     std::vector<RawEvent> mEvents GUARDED_BY(mLock);
88     std::unordered_map<int32_t /*deviceId*/, std::vector<TouchVideoFrame>> mVideoFrames;
89     std::vector<int32_t> mVibrators = {0, 1};
90     std::unordered_map<int32_t, RawLightInfo> mRawLightInfos;
91     // Simulates a device light brightness, from light id to light brightness.
92     std::unordered_map<int32_t /* lightId */, int32_t /* brightness*/> mLightBrightness;
93     // Simulates a device light intensities, from light id to light intensities map.
94     std::unordered_map<int32_t /* lightId */, std::unordered_map<LightColor, int32_t>>
95             mLightIntensities;
96 
97 public:
98     static constexpr int32_t DEFAULT_BATTERY = 1;
99     static constexpr int32_t BATTERY_STATUS = 4;
100     static constexpr int32_t BATTERY_CAPACITY = 66;
101     static const std::string BATTERY_DEVPATH;
102 
103     virtual ~FakeEventHub();
FakeEventHub()104     FakeEventHub() {}
105 
106     void addDevice(int32_t deviceId, const std::string& name, ftl::Flags<InputDeviceClass> classes,
107                    int bus = 0);
108     void removeDevice(int32_t deviceId);
109 
110     bool isDeviceEnabled(int32_t deviceId) const override;
111     status_t enableDevice(int32_t deviceId) override;
112     status_t disableDevice(int32_t deviceId) override;
113 
114     void finishDeviceScan();
115 
116     void addConfigurationProperty(int32_t deviceId, const char* key, const char* value);
117     void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration);
118 
119     void addAbsoluteAxis(int32_t deviceId, int axis, int32_t minValue, int32_t maxValue, int flat,
120                          int fuzz, int resolution = 0);
121     void addRelativeAxis(int32_t deviceId, int32_t axis);
122     void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value);
123 
124     void setRawLayoutInfo(int32_t deviceId, RawLayoutInfo info);
125 
126     void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state);
127     void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state);
128     void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state);
129 
130     void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, int32_t keyCode,
131                 uint32_t flags);
132     void addKeyCodeMapping(int32_t deviceId, int32_t fromKeyCode, int32_t toKeyCode);
133     void addKeyRemapping(int32_t deviceId, int32_t fromKeyCode, int32_t toKeyCode) const;
134     void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition);
135 
136     void addSensorAxis(int32_t deviceId, int32_t absCode, InputDeviceSensorType sensorType,
137                        int32_t sensorDataIndex);
138 
139     void setMscEvent(int32_t deviceId, int32_t mscEvent);
140 
141     void addLed(int32_t deviceId, int32_t led, bool initialState);
142     void addRawLightInfo(int32_t rawId, RawLightInfo&& info);
143     void fakeLightBrightness(int32_t rawId, int32_t brightness);
144     void fakeLightIntensities(int32_t rawId,
145                               const std::unordered_map<LightColor, int32_t> intensities);
146     bool getLedState(int32_t deviceId, int32_t led);
147 
148     std::vector<std::string>& getExcludedDevices();
149 
150     void setVideoFrames(
151             std::unordered_map<int32_t /*deviceId*/, std::vector<TouchVideoFrame>> videoFrames);
152 
153     void enqueueEvent(nsecs_t when, nsecs_t readTime, int32_t deviceId, int32_t type, int32_t code,
154                       int32_t value);
155     void assertQueueIsEmpty();
156     void setSysfsRootPath(int32_t deviceId, std::string sysfsRootPath) const;
157 
158 private:
159     Device* getDevice(int32_t deviceId) const;
160 
161     ftl::Flags<InputDeviceClass> getDeviceClasses(int32_t deviceId) const override;
162     InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const override;
163     int32_t getDeviceControllerNumber(int32_t) const override;
164     std::optional<PropertyMap> getConfiguration(int32_t deviceId) const override;
165     status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
166                                  RawAbsoluteAxisInfo* outAxisInfo) const override;
167     bool hasRelativeAxis(int32_t deviceId, int axis) const override;
168     bool hasInputProperty(int32_t, int) const override;
169     bool hasMscEvent(int32_t deviceId, int mscEvent) const override final;
170     status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, int32_t metaState,
171                     int32_t* outKeycode, int32_t* outMetaState, uint32_t* outFlags) const override;
172     const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const;
173 
174     status_t mapAxis(int32_t, int32_t, AxisInfo*) const override;
175     base::Result<std::pair<InputDeviceSensorType, int32_t>> mapSensor(
176             int32_t deviceId, int32_t absCode) const override;
177     void setExcludedDevices(const std::vector<std::string>& devices) override;
178     std::vector<RawEvent> getEvents(int) override;
179     std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) override;
180     int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const override;
181     std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const override;
182     int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const override;
183     int32_t getSwitchState(int32_t deviceId, int32_t sw) const override;
184     status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t* outValue) const override;
185     int32_t getKeyCodeForKeyLocation(int32_t deviceId, int32_t locationKeyCode) const override;
186 
187     // Return true if the device has non-empty key layout.
188     bool markSupportedKeyCodes(int32_t deviceId, const std::vector<int32_t>& keyCodes,
189                                uint8_t* outFlags) const override;
190     bool hasScanCode(int32_t deviceId, int32_t scanCode) const override;
191     bool hasKeyCode(int32_t deviceId, int32_t keyCode) const override;
192     bool hasLed(int32_t deviceId, int32_t led) const override;
193     void setLedState(int32_t deviceId, int32_t led, bool on) override;
194     void getVirtualKeyDefinitions(int32_t deviceId,
195                                   std::vector<VirtualKeyDefinition>& outVirtualKeys) const override;
196     const std::shared_ptr<KeyCharacterMap> getKeyCharacterMap(int32_t) const override;
197     bool setKeyboardLayoutOverlay(int32_t, std::shared_ptr<KeyCharacterMap>) override;
198 
vibrate(int32_t,const VibrationElement &)199     void vibrate(int32_t, const VibrationElement&) override {}
cancelVibrate(int32_t)200     void cancelVibrate(int32_t) override {}
201     std::vector<int32_t> getVibratorIds(int32_t deviceId) const override;
202 
203     std::optional<int32_t> getBatteryCapacity(int32_t, int32_t) const override;
204     std::optional<int32_t> getBatteryStatus(int32_t, int32_t) const override;
205     std::vector<int32_t> getRawBatteryIds(int32_t deviceId) const override;
206     std::optional<RawBatteryInfo> getRawBatteryInfo(int32_t deviceId,
207                                                     int32_t batteryId) const override;
208 
209     std::vector<int32_t> getRawLightIds(int32_t deviceId) const override;
210     std::optional<RawLightInfo> getRawLightInfo(int32_t deviceId, int32_t lightId) const override;
211     void setLightBrightness(int32_t deviceId, int32_t lightId, int32_t brightness) override;
212     void setLightIntensities(int32_t deviceId, int32_t lightId,
213                              std::unordered_map<LightColor, int32_t> intensities) override;
214     std::optional<int32_t> getLightBrightness(int32_t deviceId, int32_t lightId) const override;
215     std::optional<std::unordered_map<LightColor, int32_t>> getLightIntensities(
216             int32_t deviceId, int32_t lightId) const override;
217     void sysfsNodeChanged(const std::string& sysfsNodePath) override;
dump(std::string &)218     void dump(std::string&) const override {}
monitor()219     void monitor() const override {}
requestReopenDevices()220     void requestReopenDevices() override {}
wake()221     void wake() override {}
222 };
223 
224 } // namespace android
225