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 #pragma once
17
18 #include <map>
19 #include <memory>
20 #include <optional>
21
22 #include <EventHub.h>
23 #include <InputDevice.h>
24 #include <InputMapper.h>
25 #include <InputReader.h>
26 #include <ThreadSafeFuzzedDataProvider.h>
27
28 constexpr size_t kValidTypes[] = {EV_SW,
29 EV_SYN,
30 EV_ABS,
31 EV_KEY,
32 EV_MSC,
33 EV_REL,
34 android::EventHubInterface::DEVICE_ADDED,
35 android::EventHubInterface::DEVICE_REMOVED};
36
37 static const android::InputDeviceClass kInputDeviceClasses[] = {
38 android::InputDeviceClass::KEYBOARD,
39 android::InputDeviceClass::ALPHAKEY,
40 android::InputDeviceClass::TOUCH,
41 android::InputDeviceClass::CURSOR,
42 android::InputDeviceClass::TOUCH_MT,
43 android::InputDeviceClass::DPAD,
44 android::InputDeviceClass::GAMEPAD,
45 android::InputDeviceClass::SWITCH,
46 android::InputDeviceClass::JOYSTICK,
47 android::InputDeviceClass::VIBRATOR,
48 android::InputDeviceClass::MIC,
49 android::InputDeviceClass::EXTERNAL_STYLUS,
50 android::InputDeviceClass::ROTARY_ENCODER,
51 android::InputDeviceClass::SENSOR,
52 android::InputDeviceClass::BATTERY,
53 android::InputDeviceClass::LIGHT,
54 android::InputDeviceClass::TOUCHPAD,
55 android::InputDeviceClass::VIRTUAL,
56 android::InputDeviceClass::EXTERNAL,
57 };
58
59 constexpr size_t kValidCodes[] = {
60 SYN_REPORT,
61 ABS_MT_SLOT,
62 SYN_MT_REPORT,
63 ABS_MT_POSITION_X,
64 ABS_MT_POSITION_Y,
65 ABS_MT_TOUCH_MAJOR,
66 ABS_MT_TOUCH_MINOR,
67 ABS_MT_WIDTH_MAJOR,
68 ABS_MT_WIDTH_MINOR,
69 ABS_MT_ORIENTATION,
70 ABS_MT_TRACKING_ID,
71 ABS_MT_PRESSURE,
72 ABS_MT_DISTANCE,
73 ABS_MT_TOOL_TYPE,
74 MSC_SCAN,
75 REL_X,
76 REL_Y,
77 REL_WHEEL,
78 REL_HWHEEL,
79 BTN_LEFT,
80 BTN_RIGHT,
81 BTN_MIDDLE,
82 BTN_BACK,
83 BTN_SIDE,
84 BTN_FORWARD,
85 BTN_EXTRA,
86 BTN_TASK,
87 };
88
89 constexpr size_t kMaxSize = 256;
90
91 namespace android {
92
93 template<class Fdp>
getFuzzedToolType(Fdp & fdp)94 ToolType getFuzzedToolType(Fdp& fdp) {
95 const int32_t toolType = fdp.template ConsumeIntegralInRange<int32_t>(
96 static_cast<int32_t>(ToolType::ftl_first),
97 static_cast<int32_t>(ToolType::ftl_last));
98 return static_cast<ToolType>(toolType);
99 }
100
101 template <class Fdp>
getFuzzedRawEvent(Fdp & fdp)102 RawEvent getFuzzedRawEvent(Fdp& fdp) {
103 const int32_t type = fdp.ConsumeBool() ? fdp.PickValueInArray(kValidTypes)
104 : fdp.template ConsumeIntegral<int32_t>();
105 const int32_t code = fdp.ConsumeBool() ? fdp.PickValueInArray(kValidCodes)
106 : fdp.template ConsumeIntegral<int32_t>();
107 return RawEvent{
108 .when = fdp.template ConsumeIntegral<nsecs_t>(),
109 .readTime = fdp.template ConsumeIntegral<nsecs_t>(),
110 .deviceId = fdp.template ConsumeIntegral<int32_t>(),
111 .type = type,
112 .code = code,
113 .value = fdp.template ConsumeIntegral<int32_t>(),
114 };
115 }
116
117 class FuzzEventHub : public EventHubInterface {
118 InputDeviceIdentifier mIdentifier;
119 std::vector<TouchVideoFrame> mVideoFrames;
120 PropertyMap mFuzzConfig;
121 std::map<int32_t /* deviceId */, std::map<int /* axis */, RawAbsoluteAxisInfo>> mAxes;
122 std::shared_ptr<ThreadSafeFuzzedDataProvider> mFdp;
123
124 public:
FuzzEventHub(std::shared_ptr<ThreadSafeFuzzedDataProvider> fdp)125 FuzzEventHub(std::shared_ptr<ThreadSafeFuzzedDataProvider> fdp) : mFdp(std::move(fdp)) {}
~FuzzEventHub()126 ~FuzzEventHub() {}
addProperty(std::string key,std::string value)127 void addProperty(std::string key, std::string value) { mFuzzConfig.addProperty(key, value); }
128
getDeviceClasses(int32_t deviceId)129 ftl::Flags<InputDeviceClass> getDeviceClasses(int32_t deviceId) const override {
130 uint32_t flags = 0;
131 for (auto inputDeviceClass : kInputDeviceClasses) {
132 if (mFdp->ConsumeBool()) {
133 flags |= static_cast<uint32_t>(inputDeviceClass);
134 }
135 }
136 return ftl::Flags<InputDeviceClass>(flags);
137 }
getDeviceIdentifier(int32_t deviceId)138 InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const override {
139 return mIdentifier;
140 }
getDeviceControllerNumber(int32_t deviceId)141 int32_t getDeviceControllerNumber(int32_t deviceId) const override {
142 return mFdp->ConsumeIntegral<int32_t>();
143 }
getConfiguration(int32_t deviceId)144 std::optional<PropertyMap> getConfiguration(int32_t deviceId) const override {
145 return mFuzzConfig;
146 }
setAbsoluteAxisInfo(int32_t deviceId,int axis,const RawAbsoluteAxisInfo & axisInfo)147 void setAbsoluteAxisInfo(int32_t deviceId, int axis, const RawAbsoluteAxisInfo& axisInfo) {
148 mAxes[deviceId][axis] = axisInfo;
149 }
getAbsoluteAxisInfo(int32_t deviceId,int axis)150 std::optional<RawAbsoluteAxisInfo> getAbsoluteAxisInfo(int32_t deviceId,
151 int axis) const override {
152 if (auto deviceAxesIt = mAxes.find(deviceId); deviceAxesIt != mAxes.end()) {
153 const std::map<int, RawAbsoluteAxisInfo>& deviceAxes = deviceAxesIt->second;
154 if (auto axisInfoIt = deviceAxes.find(axis); axisInfoIt != deviceAxes.end()) {
155 return axisInfoIt->second;
156 }
157 }
158 if (mFdp->ConsumeBool()) {
159 return std::optional<RawAbsoluteAxisInfo>({
160 .minValue = mFdp->ConsumeIntegral<int32_t>(),
161 .maxValue = mFdp->ConsumeIntegral<int32_t>(),
162 .flat = mFdp->ConsumeIntegral<int32_t>(),
163 .fuzz = mFdp->ConsumeIntegral<int32_t>(),
164 .resolution = mFdp->ConsumeIntegral<int32_t>(),
165 });
166 } else {
167 return std::nullopt;
168 }
169 }
hasRelativeAxis(int32_t deviceId,int axis)170 bool hasRelativeAxis(int32_t deviceId, int axis) const override { return mFdp->ConsumeBool(); }
hasInputProperty(int32_t deviceId,int property)171 bool hasInputProperty(int32_t deviceId, int property) const override {
172 return mFdp->ConsumeBool();
173 }
hasMscEvent(int32_t deviceId,int mscEvent)174 bool hasMscEvent(int32_t deviceId, int mscEvent) const override { return mFdp->ConsumeBool(); }
mapKey(int32_t deviceId,int32_t scanCode,int32_t usageCode,int32_t metaState,int32_t * outKeycode,int32_t * outMetaState,uint32_t * outFlags)175 status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, int32_t metaState,
176 int32_t* outKeycode, int32_t* outMetaState, uint32_t* outFlags) const override {
177 return mFdp->ConsumeIntegral<status_t>();
178 }
mapAxis(int32_t deviceId,int32_t scanCode,AxisInfo * outAxisInfo)179 status_t mapAxis(int32_t deviceId, int32_t scanCode, AxisInfo* outAxisInfo) const override {
180 return mFdp->ConsumeIntegral<status_t>();
181 }
setExcludedDevices(const std::vector<std::string> & devices)182 void setExcludedDevices(const std::vector<std::string>& devices) override {}
getEvents(int timeoutMillis)183 std::vector<RawEvent> getEvents(int timeoutMillis) override {
184 std::vector<RawEvent> events;
185 const size_t count = mFdp->ConsumeIntegralInRange<size_t>(0, kMaxSize);
186 for (size_t i = 0; i < count; ++i) {
187 events.push_back(getFuzzedRawEvent(*mFdp));
188 }
189 return events;
190 }
getVideoFrames(int32_t deviceId)191 std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) override { return mVideoFrames; }
192
mapSensor(int32_t deviceId,int32_t absCode)193 base::Result<std::pair<InputDeviceSensorType, int32_t>> mapSensor(
194 int32_t deviceId, int32_t absCode) const override {
195 return base::ResultError("Fuzzer", UNKNOWN_ERROR);
196 };
197 // Raw batteries are sysfs power_supply nodes we found from the EventHub device sysfs node,
198 // containing the raw info of the sysfs node structure.
getRawBatteryIds(int32_t deviceId)199 std::vector<int32_t> getRawBatteryIds(int32_t deviceId) const override { return {}; }
getRawBatteryInfo(int32_t deviceId,int32_t BatteryId)200 std::optional<RawBatteryInfo> getRawBatteryInfo(int32_t deviceId,
201 int32_t BatteryId) const override {
202 return std::nullopt;
203 };
204
getRawLightIds(int32_t deviceId)205 std::vector<int32_t> getRawLightIds(int32_t deviceId) const override { return {}; };
getRawLightInfo(int32_t deviceId,int32_t lightId)206 std::optional<RawLightInfo> getRawLightInfo(int32_t deviceId, int32_t lightId) const override {
207 return std::nullopt;
208 };
getLightBrightness(int32_t deviceId,int32_t lightId)209 std::optional<int32_t> getLightBrightness(int32_t deviceId, int32_t lightId) const override {
210 return std::nullopt;
211 };
setLightBrightness(int32_t deviceId,int32_t lightId,int32_t brightness)212 void setLightBrightness(int32_t deviceId, int32_t lightId, int32_t brightness) override{};
getLightIntensities(int32_t deviceId,int32_t lightId)213 std::optional<std::unordered_map<LightColor, int32_t>> getLightIntensities(
214 int32_t deviceId, int32_t lightId) const override {
215 return std::nullopt;
216 };
setLightIntensities(int32_t deviceId,int32_t lightId,std::unordered_map<LightColor,int32_t> intensities)217 void setLightIntensities(int32_t deviceId, int32_t lightId,
218 std::unordered_map<LightColor, int32_t> intensities) override{};
219
getRawLayoutInfo(int32_t deviceId)220 std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const override {
221 return std::nullopt;
222 };
223
getScanCodeState(int32_t deviceId,int32_t scanCode)224 int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const override {
225 return mFdp->ConsumeIntegral<int32_t>();
226 }
getKeyCodeState(int32_t deviceId,int32_t keyCode)227 int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const override {
228 return mFdp->ConsumeIntegral<int32_t>();
229 }
getSwitchState(int32_t deviceId,int32_t sw)230 int32_t getSwitchState(int32_t deviceId, int32_t sw) const override {
231 return mFdp->ConsumeIntegral<int32_t>();
232 }
setKeyRemapping(int32_t deviceId,const std::map<int32_t,int32_t> & keyRemapping)233 void setKeyRemapping(int32_t deviceId,
234 const std::map<int32_t, int32_t>& keyRemapping) const override {}
getKeyCodeForKeyLocation(int32_t deviceId,int32_t locationKeyCode)235 int32_t getKeyCodeForKeyLocation(int32_t deviceId, int32_t locationKeyCode) const override {
236 return mFdp->ConsumeIntegral<int32_t>();
237 }
getAbsoluteAxisValue(int32_t deviceId,int32_t axis)238 std::optional<int32_t> getAbsoluteAxisValue(int32_t deviceId, int32_t axis) const override {
239 if (mFdp->ConsumeBool()) {
240 return mFdp->ConsumeIntegral<int32_t>();
241 } else {
242 return std::nullopt;
243 }
244 }
getMtSlotValues(int32_t deviceId,int32_t axis,size_t slotCount)245 base::Result<std::vector<int32_t>> getMtSlotValues(int32_t deviceId, int32_t axis,
246 size_t slotCount) const override {
247 if (mFdp->ConsumeBool()) {
248 std::vector<int32_t> outValues(slotCount + 1);
249 for (size_t i = 0; i < outValues.size(); i++) {
250 outValues.push_back(mFdp->ConsumeIntegral<int32_t>());
251 }
252 return std::move(outValues);
253 } else {
254 return base::ResultError("Fuzzer", UNKNOWN_ERROR);
255 }
256 }
markSupportedKeyCodes(int32_t deviceId,const std::vector<int32_t> & keyCodes,uint8_t * outFlags)257 bool markSupportedKeyCodes(int32_t deviceId, const std::vector<int32_t>& keyCodes,
258 uint8_t* outFlags) const override {
259 return mFdp->ConsumeBool();
260 }
hasScanCode(int32_t deviceId,int32_t scanCode)261 bool hasScanCode(int32_t deviceId, int32_t scanCode) const override {
262 return mFdp->ConsumeBool();
263 }
hasKeyCode(int32_t deviceId,int32_t keyCode)264 bool hasKeyCode(int32_t deviceId, int32_t keyCode) const override {
265 return mFdp->ConsumeBool();
266 }
hasLed(int32_t deviceId,int32_t led)267 bool hasLed(int32_t deviceId, int32_t led) const override { return mFdp->ConsumeBool(); }
setLedState(int32_t deviceId,int32_t led,bool on)268 void setLedState(int32_t deviceId, int32_t led, bool on) override {}
getVirtualKeyDefinitions(int32_t deviceId,std::vector<VirtualKeyDefinition> & outVirtualKeys)269 void getVirtualKeyDefinitions(
270 int32_t deviceId, std::vector<VirtualKeyDefinition>& outVirtualKeys) const override {}
getKeyCharacterMap(int32_t deviceId)271 const std::shared_ptr<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const override {
272 return nullptr;
273 }
setKeyboardLayoutOverlay(int32_t deviceId,std::shared_ptr<KeyCharacterMap> map)274 bool setKeyboardLayoutOverlay(int32_t deviceId, std::shared_ptr<KeyCharacterMap> map) override {
275 return mFdp->ConsumeBool();
276 }
vibrate(int32_t deviceId,const VibrationElement & effect)277 void vibrate(int32_t deviceId, const VibrationElement& effect) override {}
cancelVibrate(int32_t deviceId)278 void cancelVibrate(int32_t deviceId) override {}
279
getVibratorIds(int32_t deviceId)280 std::vector<int32_t> getVibratorIds(int32_t deviceId) const override { return {}; };
281
282 /* Query battery level. */
getBatteryCapacity(int32_t deviceId,int32_t batteryId)283 std::optional<int32_t> getBatteryCapacity(int32_t deviceId, int32_t batteryId) const override {
284 return std::nullopt;
285 };
286
287 /* Query battery status. */
getBatteryStatus(int32_t deviceId,int32_t batteryId)288 std::optional<int32_t> getBatteryStatus(int32_t deviceId, int32_t batteryId) const override {
289 return std::nullopt;
290 };
291
requestReopenDevices()292 void requestReopenDevices() override {}
wake()293 void wake() override {}
dump(std::string & dump)294 void dump(std::string& dump) const override {}
monitor()295 void monitor() const override {}
isDeviceEnabled(int32_t deviceId)296 bool isDeviceEnabled(int32_t deviceId) const override { return mFdp->ConsumeBool(); }
enableDevice(int32_t deviceId)297 status_t enableDevice(int32_t deviceId) override { return mFdp->ConsumeIntegral<status_t>(); }
disableDevice(int32_t deviceId)298 status_t disableDevice(int32_t deviceId) override { return mFdp->ConsumeIntegral<status_t>(); }
getSysfsRootPath(int32_t deviceId)299 std::filesystem::path getSysfsRootPath(int32_t deviceId) const override { return {}; }
sysfsNodeChanged(const std::string & sysfsNodePath)300 void sysfsNodeChanged(const std::string& sysfsNodePath) override {}
setKernelWakeEnabled(int32_t deviceId,bool enabled)301 bool setKernelWakeEnabled(int32_t deviceId, bool enabled) override {
302 return mFdp->ConsumeBool();
303 }
304 };
305
306 class FuzzInputReaderPolicy : public InputReaderPolicyInterface {
307 TouchAffineTransformation mTransform;
308 std::shared_ptr<ThreadSafeFuzzedDataProvider> mFdp;
309
310 protected:
~FuzzInputReaderPolicy()311 ~FuzzInputReaderPolicy() {}
312
313 public:
FuzzInputReaderPolicy(std::shared_ptr<ThreadSafeFuzzedDataProvider> mFdp)314 FuzzInputReaderPolicy(std::shared_ptr<ThreadSafeFuzzedDataProvider> mFdp) : mFdp(mFdp) {}
getReaderConfiguration(InputReaderConfiguration * outConfig)315 void getReaderConfiguration(InputReaderConfiguration* outConfig) override {}
notifyInputDevicesChanged(const std::vector<InputDeviceInfo> & inputDevices)316 void notifyInputDevicesChanged(const std::vector<InputDeviceInfo>& inputDevices) override {}
notifyTouchpadHardwareState(const SelfContainedHardwareState & schs,int32_t deviceId)317 void notifyTouchpadHardwareState(const SelfContainedHardwareState& schs,
318 int32_t deviceId) override {}
notifyTouchpadGestureInfo(GestureType type,int32_t deviceId)319 void notifyTouchpadGestureInfo(GestureType type, int32_t deviceId) override {}
notifyTouchpadThreeFingerTap()320 void notifyTouchpadThreeFingerTap() override {}
getKeyboardLayoutOverlay(const InputDeviceIdentifier & identifier,const std::optional<KeyboardLayoutInfo> layoutInfo)321 std::shared_ptr<KeyCharacterMap> getKeyboardLayoutOverlay(
322 const InputDeviceIdentifier& identifier,
323 const std::optional<KeyboardLayoutInfo> layoutInfo) override {
324 return nullptr;
325 }
getDeviceAlias(const InputDeviceIdentifier & identifier)326 std::string getDeviceAlias(const InputDeviceIdentifier& identifier) {
327 return mFdp->ConsumeRandomLengthString(32);
328 }
getTouchAffineTransformation(const std::string & inputDeviceDescriptor,ui::Rotation surfaceRotation)329 TouchAffineTransformation getTouchAffineTransformation(const std::string& inputDeviceDescriptor,
330 ui::Rotation surfaceRotation) override {
331 return mTransform;
332 }
setTouchAffineTransformation(const TouchAffineTransformation t)333 void setTouchAffineTransformation(const TouchAffineTransformation t) { mTransform = t; }
notifyStylusGestureStarted(int32_t,nsecs_t)334 void notifyStylusGestureStarted(int32_t, nsecs_t) {}
isInputMethodConnectionActive()335 bool isInputMethodConnectionActive() override { return mFdp->ConsumeBool(); }
getPointerViewportForAssociatedDisplay(ui::LogicalDisplayId associatedDisplayId)336 std::optional<DisplayViewport> getPointerViewportForAssociatedDisplay(
337 ui::LogicalDisplayId associatedDisplayId) override {
338 return {};
339 }
340 };
341
342 class FuzzInputListener : public virtual InputListenerInterface {
343 public:
notifyInputDevicesChanged(const NotifyInputDevicesChangedArgs & args)344 void notifyInputDevicesChanged(const NotifyInputDevicesChangedArgs& args) override {}
notifyKey(const NotifyKeyArgs & args)345 void notifyKey(const NotifyKeyArgs& args) override {}
notifyMotion(const NotifyMotionArgs & args)346 void notifyMotion(const NotifyMotionArgs& args) override {}
notifySwitch(const NotifySwitchArgs & args)347 void notifySwitch(const NotifySwitchArgs& args) override {}
notifySensor(const NotifySensorArgs & args)348 void notifySensor(const NotifySensorArgs& args) override{};
notifyVibratorState(const NotifyVibratorStateArgs & args)349 void notifyVibratorState(const NotifyVibratorStateArgs& args) override{};
notifyDeviceReset(const NotifyDeviceResetArgs & args)350 void notifyDeviceReset(const NotifyDeviceResetArgs& args) override {}
notifyPointerCaptureChanged(const NotifyPointerCaptureChangedArgs & args)351 void notifyPointerCaptureChanged(const NotifyPointerCaptureChangedArgs& args) override{};
352 };
353
354 class FuzzInputReaderContext : public InputReaderContext {
355 std::shared_ptr<EventHubInterface> mEventHub;
356 sp<InputReaderPolicyInterface> mPolicy;
357 std::shared_ptr<ThreadSafeFuzzedDataProvider> mFdp;
358
359 public:
FuzzInputReaderContext(std::shared_ptr<EventHubInterface> eventHub,std::shared_ptr<ThreadSafeFuzzedDataProvider> fdp)360 FuzzInputReaderContext(std::shared_ptr<EventHubInterface> eventHub,
361 std::shared_ptr<ThreadSafeFuzzedDataProvider> fdp)
362 : mEventHub(eventHub), mPolicy(sp<FuzzInputReaderPolicy>::make(fdp)), mFdp(fdp) {}
~FuzzInputReaderContext()363 ~FuzzInputReaderContext() {}
dump()364 std::string dump() { return "(dump from FuzzInputReaderContext)"; }
updateGlobalMetaState()365 void updateGlobalMetaState() override {}
getGlobalMetaState()366 int32_t getGlobalMetaState() { return mFdp->ConsumeIntegral<int32_t>(); }
disableVirtualKeysUntil(nsecs_t time)367 void disableVirtualKeysUntil(nsecs_t time) override {}
shouldDropVirtualKey(nsecs_t now,int32_t keyCode,int32_t scanCode)368 bool shouldDropVirtualKey(nsecs_t now, int32_t keyCode, int32_t scanCode) override {
369 return mFdp->ConsumeBool();
370 }
requestTimeoutAtTime(nsecs_t when)371 void requestTimeoutAtTime(nsecs_t when) override {}
bumpGeneration()372 int32_t bumpGeneration() override { return mFdp->ConsumeIntegral<int32_t>(); }
getExternalStylusDevices(std::vector<InputDeviceInfo> & outDevices)373 void getExternalStylusDevices(std::vector<InputDeviceInfo>& outDevices) override {}
dispatchExternalStylusState(const StylusState & outState)374 std::list<NotifyArgs> dispatchExternalStylusState(const StylusState& outState) override {
375 return {};
376 }
getPolicy()377 InputReaderPolicyInterface* getPolicy() override { return mPolicy.get(); }
getEventHub()378 EventHubInterface* getEventHub() override { return mEventHub.get(); }
getNextId()379 int32_t getNextId() const override { return mFdp->ConsumeIntegral<int32_t>(); }
380
updateLedMetaState(int32_t metaState)381 void updateLedMetaState(int32_t metaState) override{};
getLedMetaState()382 int32_t getLedMetaState() override { return mFdp->ConsumeIntegral<int32_t>(); };
notifyStylusGestureStarted(int32_t,nsecs_t)383 void notifyStylusGestureStarted(int32_t, nsecs_t) {}
384
setPreventingTouchpadTaps(bool prevent)385 void setPreventingTouchpadTaps(bool prevent) override {}
isPreventingTouchpadTaps()386 bool isPreventingTouchpadTaps() override { return mFdp->ConsumeBool(); };
387
setLastKeyDownTimestamp(nsecs_t when)388 void setLastKeyDownTimestamp(nsecs_t when) { mLastKeyDownTimestamp = when; };
getLastKeyDownTimestamp()389 nsecs_t getLastKeyDownTimestamp() { return mLastKeyDownTimestamp; };
getKeyboardClassifier()390 KeyboardClassifier& getKeyboardClassifier() override { return *mClassifier; }
391
392 private:
393 nsecs_t mLastKeyDownTimestamp;
394 std::unique_ptr<KeyboardClassifier> mClassifier = std::make_unique<KeyboardClassifier>();
395 };
396
397 template <class Fdp>
getFuzzedInputDevice(Fdp & fdp,FuzzInputReaderContext * context)398 InputDevice getFuzzedInputDevice(Fdp& fdp, FuzzInputReaderContext* context) {
399 InputDeviceIdentifier identifier;
400 identifier.name = fdp.ConsumeRandomLengthUtf8String(16);
401 identifier.location = fdp.ConsumeRandomLengthUtf8String(12);
402 int32_t deviceID = fdp.ConsumeIntegralInRange(0, 5);
403 int32_t deviceGeneration = fdp.ConsumeIntegralInRange(0, 5);
404 return InputDevice(context, deviceID, deviceGeneration, identifier);
405 }
406
407 template <class Fdp>
configureAndResetDevice(Fdp & fdp,InputDevice & device)408 void configureAndResetDevice(Fdp& fdp, InputDevice& device) {
409 nsecs_t arbitraryTime = fdp.template ConsumeIntegral<nsecs_t>();
410 std::list<NotifyArgs> out;
411 out += device.configure(arbitraryTime, /*readerConfig=*/{}, /*changes=*/{});
412 out += device.reset(arbitraryTime);
413 }
414
415 template <class Fdp, class T, typename... Args>
getMapperForDevice(Fdp & fdp,InputDevice & device,Args...args)416 T& getMapperForDevice(Fdp& fdp, InputDevice& device, Args... args) {
417 int32_t eventhubId = fdp.template ConsumeIntegral<int32_t>();
418 // ensure a device entry exists for this eventHubId
419 device.addEmptyEventHubDevice(eventhubId);
420 configureAndResetDevice(fdp, device);
421
422 return device.template constructAndAddMapper<T>(eventhubId, args...);
423 }
424
425 } // namespace android
426