xref: /aosp_15_r20/frameworks/native/include/input/VirtualInputDevice.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2023 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <input/Input.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <map>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker namespace android {
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker enum class DeviceType {
26*38e8c45fSAndroid Build Coastguard Worker     KEYBOARD,
27*38e8c45fSAndroid Build Coastguard Worker     MOUSE,
28*38e8c45fSAndroid Build Coastguard Worker     TOUCHSCREEN,
29*38e8c45fSAndroid Build Coastguard Worker     DPAD,
30*38e8c45fSAndroid Build Coastguard Worker     STYLUS,
31*38e8c45fSAndroid Build Coastguard Worker     ROTARY_ENCODER,
32*38e8c45fSAndroid Build Coastguard Worker };
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker android::base::unique_fd openUinput(const char* readableName, int32_t vendorId, int32_t productId,
35*38e8c45fSAndroid Build Coastguard Worker                                     const char* phys, DeviceType deviceType, int32_t screenHeight,
36*38e8c45fSAndroid Build Coastguard Worker                                     int32_t screenWidth);
37*38e8c45fSAndroid Build Coastguard Worker 
38*38e8c45fSAndroid Build Coastguard Worker enum class UinputAction {
39*38e8c45fSAndroid Build Coastguard Worker     RELEASE = 0,
40*38e8c45fSAndroid Build Coastguard Worker     PRESS = 1,
41*38e8c45fSAndroid Build Coastguard Worker     MOVE = 2,
42*38e8c45fSAndroid Build Coastguard Worker     CANCEL = 3,
43*38e8c45fSAndroid Build Coastguard Worker     ftl_last = CANCEL,
44*38e8c45fSAndroid Build Coastguard Worker };
45*38e8c45fSAndroid Build Coastguard Worker 
46*38e8c45fSAndroid Build Coastguard Worker class VirtualInputDevice {
47*38e8c45fSAndroid Build Coastguard Worker public:
48*38e8c45fSAndroid Build Coastguard Worker     VirtualInputDevice(android::base::unique_fd fd);
49*38e8c45fSAndroid Build Coastguard Worker     virtual ~VirtualInputDevice();
50*38e8c45fSAndroid Build Coastguard Worker 
51*38e8c45fSAndroid Build Coastguard Worker protected:
52*38e8c45fSAndroid Build Coastguard Worker     const android::base::unique_fd mFd;
53*38e8c45fSAndroid Build Coastguard Worker     bool writeInputEvent(uint16_t type, uint16_t code, int32_t value,
54*38e8c45fSAndroid Build Coastguard Worker                          std::chrono::nanoseconds eventTime);
55*38e8c45fSAndroid Build Coastguard Worker     bool writeEvKeyEvent(int32_t androidCode, int32_t androidAction,
56*38e8c45fSAndroid Build Coastguard Worker                          const std::map<int, int>& evKeyCodeMapping,
57*38e8c45fSAndroid Build Coastguard Worker                          const std::map<int, UinputAction>& actionMapping,
58*38e8c45fSAndroid Build Coastguard Worker                          std::chrono::nanoseconds eventTime);
59*38e8c45fSAndroid Build Coastguard Worker };
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker class VirtualKeyboard : public VirtualInputDevice {
62*38e8c45fSAndroid Build Coastguard Worker public:
63*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, int> KEY_CODE_MAPPING;
64*38e8c45fSAndroid Build Coastguard Worker     // Expose to share with VirtualDpad.
65*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, UinputAction> KEY_ACTION_MAPPING;
66*38e8c45fSAndroid Build Coastguard Worker     VirtualKeyboard(android::base::unique_fd fd);
67*38e8c45fSAndroid Build Coastguard Worker     virtual ~VirtualKeyboard() override;
68*38e8c45fSAndroid Build Coastguard Worker     bool writeKeyEvent(int32_t androidKeyCode, int32_t androidAction,
69*38e8c45fSAndroid Build Coastguard Worker                        std::chrono::nanoseconds eventTime);
70*38e8c45fSAndroid Build Coastguard Worker };
71*38e8c45fSAndroid Build Coastguard Worker 
72*38e8c45fSAndroid Build Coastguard Worker class VirtualDpad : public VirtualInputDevice {
73*38e8c45fSAndroid Build Coastguard Worker public:
74*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, int> DPAD_KEY_CODE_MAPPING;
75*38e8c45fSAndroid Build Coastguard Worker     VirtualDpad(android::base::unique_fd fd);
76*38e8c45fSAndroid Build Coastguard Worker     virtual ~VirtualDpad() override;
77*38e8c45fSAndroid Build Coastguard Worker     bool writeDpadKeyEvent(int32_t androidKeyCode, int32_t androidAction,
78*38e8c45fSAndroid Build Coastguard Worker                            std::chrono::nanoseconds eventTime);
79*38e8c45fSAndroid Build Coastguard Worker };
80*38e8c45fSAndroid Build Coastguard Worker 
81*38e8c45fSAndroid Build Coastguard Worker class VirtualMouse : public VirtualInputDevice {
82*38e8c45fSAndroid Build Coastguard Worker public:
83*38e8c45fSAndroid Build Coastguard Worker     // Expose to share with VirtualStylus.
84*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, UinputAction> BUTTON_ACTION_MAPPING;
85*38e8c45fSAndroid Build Coastguard Worker     VirtualMouse(android::base::unique_fd fd);
86*38e8c45fSAndroid Build Coastguard Worker     virtual ~VirtualMouse() override;
87*38e8c45fSAndroid Build Coastguard Worker     bool writeButtonEvent(int32_t androidButtonCode, int32_t androidAction,
88*38e8c45fSAndroid Build Coastguard Worker                           std::chrono::nanoseconds eventTime);
89*38e8c45fSAndroid Build Coastguard Worker     // TODO(b/259554911): changing float parameters to int32_t.
90*38e8c45fSAndroid Build Coastguard Worker     bool writeRelativeEvent(float relativeX, float relativeY, std::chrono::nanoseconds eventTime);
91*38e8c45fSAndroid Build Coastguard Worker     bool writeScrollEvent(float xAxisMovement, float yAxisMovement,
92*38e8c45fSAndroid Build Coastguard Worker                           std::chrono::nanoseconds eventTime);
93*38e8c45fSAndroid Build Coastguard Worker 
94*38e8c45fSAndroid Build Coastguard Worker private:
95*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, int> BUTTON_CODE_MAPPING;
96*38e8c45fSAndroid Build Coastguard Worker     int32_t mAccumulatedHighResScrollX;
97*38e8c45fSAndroid Build Coastguard Worker     int32_t mAccumulatedHighResScrollY;
98*38e8c45fSAndroid Build Coastguard Worker };
99*38e8c45fSAndroid Build Coastguard Worker 
100*38e8c45fSAndroid Build Coastguard Worker class VirtualTouchscreen : public VirtualInputDevice {
101*38e8c45fSAndroid Build Coastguard Worker public:
102*38e8c45fSAndroid Build Coastguard Worker     // Expose to share with VirtualStylus.
103*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, UinputAction> TOUCH_ACTION_MAPPING;
104*38e8c45fSAndroid Build Coastguard Worker     VirtualTouchscreen(android::base::unique_fd fd);
105*38e8c45fSAndroid Build Coastguard Worker     virtual ~VirtualTouchscreen() override;
106*38e8c45fSAndroid Build Coastguard Worker     // TODO(b/259554911): changing float parameters to int32_t.
107*38e8c45fSAndroid Build Coastguard Worker     bool writeTouchEvent(int32_t pointerId, int32_t toolType, int32_t action, float locationX,
108*38e8c45fSAndroid Build Coastguard Worker                          float locationY, float pressure, float majorAxisSize,
109*38e8c45fSAndroid Build Coastguard Worker                          std::chrono::nanoseconds eventTime);
110*38e8c45fSAndroid Build Coastguard Worker 
111*38e8c45fSAndroid Build Coastguard Worker private:
112*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, int> TOOL_TYPE_MAPPING;
113*38e8c45fSAndroid Build Coastguard Worker     /* The set of active touch pointers on this device.
114*38e8c45fSAndroid Build Coastguard Worker      * We only allow pointer id to go up to MAX_POINTERS because the maximum slots of virtual
115*38e8c45fSAndroid Build Coastguard Worker      * touchscreen is set up with MAX_POINTERS. Note that in other cases Android allows pointer id
116*38e8c45fSAndroid Build Coastguard Worker      * to go up to MAX_POINTERS_ID.
117*38e8c45fSAndroid Build Coastguard Worker      */
118*38e8c45fSAndroid Build Coastguard Worker     std::bitset<MAX_POINTERS> mActivePointers{};
119*38e8c45fSAndroid Build Coastguard Worker     bool isValidPointerId(int32_t pointerId, UinputAction uinputAction);
120*38e8c45fSAndroid Build Coastguard Worker     bool handleTouchDown(int32_t pointerId, std::chrono::nanoseconds eventTime);
121*38e8c45fSAndroid Build Coastguard Worker     bool handleTouchUp(int32_t pointerId, std::chrono::nanoseconds eventTime);
122*38e8c45fSAndroid Build Coastguard Worker };
123*38e8c45fSAndroid Build Coastguard Worker 
124*38e8c45fSAndroid Build Coastguard Worker class VirtualStylus : public VirtualInputDevice {
125*38e8c45fSAndroid Build Coastguard Worker public:
126*38e8c45fSAndroid Build Coastguard Worker     VirtualStylus(android::base::unique_fd fd);
127*38e8c45fSAndroid Build Coastguard Worker     ~VirtualStylus() override;
128*38e8c45fSAndroid Build Coastguard Worker     bool writeMotionEvent(int32_t toolType, int32_t action, int32_t locationX, int32_t locationY,
129*38e8c45fSAndroid Build Coastguard Worker                           int32_t pressure, int32_t tiltX, int32_t tiltY,
130*38e8c45fSAndroid Build Coastguard Worker                           std::chrono::nanoseconds eventTime);
131*38e8c45fSAndroid Build Coastguard Worker     bool writeButtonEvent(int32_t androidButtonCode, int32_t androidAction,
132*38e8c45fSAndroid Build Coastguard Worker                           std::chrono::nanoseconds eventTime);
133*38e8c45fSAndroid Build Coastguard Worker 
134*38e8c45fSAndroid Build Coastguard Worker private:
135*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, int> TOOL_TYPE_MAPPING;
136*38e8c45fSAndroid Build Coastguard Worker     static const std::map<int, int> BUTTON_CODE_MAPPING;
137*38e8c45fSAndroid Build Coastguard Worker     // True if the stylus is touching or hovering on the screen.
138*38e8c45fSAndroid Build Coastguard Worker     bool mIsStylusDown;
139*38e8c45fSAndroid Build Coastguard Worker     bool handleStylusDown(uint16_t tool, std::chrono::nanoseconds eventTime);
140*38e8c45fSAndroid Build Coastguard Worker     bool handleStylusUp(uint16_t tool, std::chrono::nanoseconds eventTime);
141*38e8c45fSAndroid Build Coastguard Worker };
142*38e8c45fSAndroid Build Coastguard Worker 
143*38e8c45fSAndroid Build Coastguard Worker class VirtualRotaryEncoder : public VirtualInputDevice {
144*38e8c45fSAndroid Build Coastguard Worker public:
145*38e8c45fSAndroid Build Coastguard Worker     VirtualRotaryEncoder(android::base::unique_fd fd);
146*38e8c45fSAndroid Build Coastguard Worker     virtual ~VirtualRotaryEncoder() override;
147*38e8c45fSAndroid Build Coastguard Worker     bool writeScrollEvent(float scrollAmount, std::chrono::nanoseconds eventTime);
148*38e8c45fSAndroid Build Coastguard Worker 
149*38e8c45fSAndroid Build Coastguard Worker private:
150*38e8c45fSAndroid Build Coastguard Worker     int32_t mAccumulatedHighResScrollAmount;
151*38e8c45fSAndroid Build Coastguard Worker };
152*38e8c45fSAndroid Build Coastguard Worker 
153*38e8c45fSAndroid Build Coastguard Worker } // namespace android
154