1 /*
2  * Copyright (C) 2015 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 #ifndef ANDROID_INPUT_MAPPER_H_
18 #define ANDROID_INPUT_MAPPER_H_
19 
20 struct input_device_handle;
21 
22 namespace android {
23 
24 class InputDeviceNode;
25 class InputReport;
26 class InputReportDefinition;
27 struct InputEvent;
28 using InputDeviceHandle = struct input_device_handle;
29 
30 /**
31  * An InputMapper processes raw evdev input events and combines them into
32  * Android input HAL reports. A given InputMapper will focus on a particular
33  * type of input, like key presses or touch events. A single InputDevice may
34  * have multiple InputMappers, corresponding to the different types of inputs it
35  * supports.
36  */
37 class InputMapper {
38 public:
39     InputMapper() = default;
~InputMapper()40     virtual ~InputMapper() {}
41 
42     /**
43      * If the mapper supports input events from the InputDevice,
44      * configureInputReport will populate the InputReportDefinition and return
45      * true. If input is not supported, false is returned, and the InputDevice
46      * may free or re-use the InputReportDefinition.
47      */
configureInputReport(InputDeviceNode * devNode,InputReportDefinition * report)48     virtual bool configureInputReport(InputDeviceNode* devNode, InputReportDefinition* report) {
49         return false;
50     }
51 
52     /**
53      * If the mapper supports output events from the InputDevice,
54      * configureOutputReport will populate the InputReportDefinition and return
55      * true. If output is not supported, false is returned, and the InputDevice
56      * may free or re-use the InputReportDefinition.
57      */
configureOutputReport(InputDeviceNode * devNode,InputReportDefinition * report)58     virtual bool configureOutputReport(InputDeviceNode* devNode, InputReportDefinition* report) {
59         return false;
60     }
61 
62     // Set the InputDeviceHandle after registering the device with the host.
setDeviceHandle(InputDeviceHandle * handle)63     virtual void setDeviceHandle(InputDeviceHandle* handle) { mDeviceHandle = handle; }
64     // Process the InputEvent.
65     virtual void process(const InputEvent& event) = 0;
66 
67 protected:
setInputReportDefinition(InputReportDefinition * reportDef)68     virtual void setInputReportDefinition(InputReportDefinition* reportDef) final {
69         mInputReportDef = reportDef;
70     }
setOutputReportDefinition(InputReportDefinition * reportDef)71     virtual void setOutputReportDefinition(InputReportDefinition* reportDef) final {
72         mOutputReportDef = reportDef;
73     }
getInputReportDefinition()74     virtual InputReportDefinition* getInputReportDefinition() final { return mInputReportDef; }
getOutputReportDefinition()75     virtual InputReportDefinition* getOutputReportDefinition() final { return mOutputReportDef; }
getDeviceHandle()76     virtual InputDeviceHandle* getDeviceHandle() final { return mDeviceHandle; }
77     virtual InputReport* getInputReport() final;
78 
79 private:
80     InputReportDefinition* mInputReportDef = nullptr;
81     InputReportDefinition* mOutputReportDef = nullptr;
82     InputDeviceHandle* mDeviceHandle = nullptr;
83     InputReport* mReport = nullptr;
84 };
85 
86 }  // namespace android
87 
88 #endif  // ANDROID_INPUT_MAPPER_H_
89