• 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 #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