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