1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2020 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 #include "UinputDevice.h"
18*38e8c45fSAndroid Build Coastguard Worker
19*38e8c45fSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <cutils/memory.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <fcntl.h>
22*38e8c45fSAndroid Build Coastguard Worker
23*38e8c45fSAndroid Build Coastguard Worker namespace android {
24*38e8c45fSAndroid Build Coastguard Worker
25*38e8c45fSAndroid Build Coastguard Worker // --- UinputDevice ---
26*38e8c45fSAndroid Build Coastguard Worker
UinputDevice(const char * name,int16_t productId)27*38e8c45fSAndroid Build Coastguard Worker UinputDevice::UinputDevice(const char* name, int16_t productId)
28*38e8c45fSAndroid Build Coastguard Worker : mName(name), mProductId(productId) {}
29*38e8c45fSAndroid Build Coastguard Worker
~UinputDevice()30*38e8c45fSAndroid Build Coastguard Worker UinputDevice::~UinputDevice() {
31*38e8c45fSAndroid Build Coastguard Worker if (ioctl(mDeviceFd, UI_DEV_DESTROY)) {
32*38e8c45fSAndroid Build Coastguard Worker ALOGE("Error while destroying uinput device: %s", strerror(errno));
33*38e8c45fSAndroid Build Coastguard Worker }
34*38e8c45fSAndroid Build Coastguard Worker mDeviceFd.reset();
35*38e8c45fSAndroid Build Coastguard Worker }
36*38e8c45fSAndroid Build Coastguard Worker
init()37*38e8c45fSAndroid Build Coastguard Worker void UinputDevice::init() {
38*38e8c45fSAndroid Build Coastguard Worker mDeviceFd = android::base::unique_fd(open("/dev/uinput", O_WRONLY | O_NONBLOCK | O_CLOEXEC));
39*38e8c45fSAndroid Build Coastguard Worker if (mDeviceFd < 0) {
40*38e8c45fSAndroid Build Coastguard Worker FAIL() << "Can't open /dev/uinput :" << strerror(errno);
41*38e8c45fSAndroid Build Coastguard Worker }
42*38e8c45fSAndroid Build Coastguard Worker
43*38e8c45fSAndroid Build Coastguard Worker struct uinput_user_dev device = {};
44*38e8c45fSAndroid Build Coastguard Worker strlcpy(device.name, mName, UINPUT_MAX_NAME_SIZE);
45*38e8c45fSAndroid Build Coastguard Worker device.id.bustype = BUS_USB;
46*38e8c45fSAndroid Build Coastguard Worker device.id.vendor = 0x01;
47*38e8c45fSAndroid Build Coastguard Worker device.id.product = mProductId;
48*38e8c45fSAndroid Build Coastguard Worker device.id.version = 1;
49*38e8c45fSAndroid Build Coastguard Worker
50*38e8c45fSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(configureDevice(mDeviceFd, &device));
51*38e8c45fSAndroid Build Coastguard Worker
52*38e8c45fSAndroid Build Coastguard Worker if (write(mDeviceFd, &device, sizeof(device)) < 0) {
53*38e8c45fSAndroid Build Coastguard Worker FAIL() << "Could not write uinput_user_dev struct into uinput file descriptor: "
54*38e8c45fSAndroid Build Coastguard Worker << strerror(errno);
55*38e8c45fSAndroid Build Coastguard Worker }
56*38e8c45fSAndroid Build Coastguard Worker
57*38e8c45fSAndroid Build Coastguard Worker if (ioctl(mDeviceFd, UI_DEV_CREATE)) {
58*38e8c45fSAndroid Build Coastguard Worker FAIL() << "Error in ioctl : UI_DEV_CREATE: " << strerror(errno);
59*38e8c45fSAndroid Build Coastguard Worker }
60*38e8c45fSAndroid Build Coastguard Worker }
61*38e8c45fSAndroid Build Coastguard Worker
injectEvent(uint16_t type,uint16_t code,int32_t value)62*38e8c45fSAndroid Build Coastguard Worker void UinputDevice::injectEvent(uint16_t type, uint16_t code, int32_t value) {
63*38e8c45fSAndroid Build Coastguard Worker // uinput ignores the timestamp
64*38e8c45fSAndroid Build Coastguard Worker struct input_event event = {};
65*38e8c45fSAndroid Build Coastguard Worker event.type = type;
66*38e8c45fSAndroid Build Coastguard Worker event.code = code;
67*38e8c45fSAndroid Build Coastguard Worker event.value = value;
68*38e8c45fSAndroid Build Coastguard Worker
69*38e8c45fSAndroid Build Coastguard Worker if (write(mDeviceFd, &event, sizeof(input_event)) < 0) {
70*38e8c45fSAndroid Build Coastguard Worker std::string msg = base::StringPrintf("Could not write event %" PRIu16 " %" PRIu16
71*38e8c45fSAndroid Build Coastguard Worker " with value %" PRId32 " : %s",
72*38e8c45fSAndroid Build Coastguard Worker type, code, value, strerror(errno));
73*38e8c45fSAndroid Build Coastguard Worker ALOGE("%s", msg.c_str());
74*38e8c45fSAndroid Build Coastguard Worker FAIL() << msg.c_str();
75*38e8c45fSAndroid Build Coastguard Worker }
76*38e8c45fSAndroid Build Coastguard Worker }
77*38e8c45fSAndroid Build Coastguard Worker
78*38e8c45fSAndroid Build Coastguard Worker // --- UinputKeyboard ---
79*38e8c45fSAndroid Build Coastguard Worker
UinputKeyboard(const char * name,int16_t productId,std::initializer_list<int> keys)80*38e8c45fSAndroid Build Coastguard Worker UinputKeyboard::UinputKeyboard(const char* name, int16_t productId, std::initializer_list<int> keys)
81*38e8c45fSAndroid Build Coastguard Worker : UinputDevice(name, productId), mKeys(keys.begin(), keys.end()) {}
82*38e8c45fSAndroid Build Coastguard Worker
configureDevice(int fd,uinput_user_dev * device)83*38e8c45fSAndroid Build Coastguard Worker void UinputKeyboard::configureDevice(int fd, uinput_user_dev* device) {
84*38e8c45fSAndroid Build Coastguard Worker // enable key press/release event
85*38e8c45fSAndroid Build Coastguard Worker if (ioctl(fd, UI_SET_EVBIT, EV_KEY)) {
86*38e8c45fSAndroid Build Coastguard Worker FAIL() << "Error in ioctl : UI_SET_EVBIT : EV_KEY: " << strerror(errno);
87*38e8c45fSAndroid Build Coastguard Worker }
88*38e8c45fSAndroid Build Coastguard Worker
89*38e8c45fSAndroid Build Coastguard Worker // enable set of KEY events
90*38e8c45fSAndroid Build Coastguard Worker std::for_each(mKeys.begin(), mKeys.end(), [fd](int key) {
91*38e8c45fSAndroid Build Coastguard Worker if (ioctl(fd, UI_SET_KEYBIT, key)) {
92*38e8c45fSAndroid Build Coastguard Worker FAIL() << "Error in ioctl : UI_SET_KEYBIT : " << key << " : " << strerror(errno);
93*38e8c45fSAndroid Build Coastguard Worker }
94*38e8c45fSAndroid Build Coastguard Worker });
95*38e8c45fSAndroid Build Coastguard Worker
96*38e8c45fSAndroid Build Coastguard Worker // enable synchronization event
97*38e8c45fSAndroid Build Coastguard Worker if (ioctl(fd, UI_SET_EVBIT, EV_SYN)) {
98*38e8c45fSAndroid Build Coastguard Worker FAIL() << "Error in ioctl : UI_SET_EVBIT : EV_SYN: " << strerror(errno);
99*38e8c45fSAndroid Build Coastguard Worker }
100*38e8c45fSAndroid Build Coastguard Worker }
101*38e8c45fSAndroid Build Coastguard Worker
pressKey(int key)102*38e8c45fSAndroid Build Coastguard Worker void UinputKeyboard::pressKey(int key) {
103*38e8c45fSAndroid Build Coastguard Worker if (mKeys.find(key) == mKeys.end()) {
104*38e8c45fSAndroid Build Coastguard Worker FAIL() << mName << ": Cannot inject key press: Key not found: " << key;
105*38e8c45fSAndroid Build Coastguard Worker }
106*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_KEY, key, 1);
107*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_SYN, SYN_REPORT, 0);
108*38e8c45fSAndroid Build Coastguard Worker }
109*38e8c45fSAndroid Build Coastguard Worker
releaseKey(int key)110*38e8c45fSAndroid Build Coastguard Worker void UinputKeyboard::releaseKey(int key) {
111*38e8c45fSAndroid Build Coastguard Worker if (mKeys.find(key) == mKeys.end()) {
112*38e8c45fSAndroid Build Coastguard Worker FAIL() << mName << ": Cannot inject key release: Key not found: " << key;
113*38e8c45fSAndroid Build Coastguard Worker }
114*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_KEY, key, 0);
115*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_SYN, SYN_REPORT, 0);
116*38e8c45fSAndroid Build Coastguard Worker }
117*38e8c45fSAndroid Build Coastguard Worker
pressAndReleaseKey(int key)118*38e8c45fSAndroid Build Coastguard Worker void UinputKeyboard::pressAndReleaseKey(int key) {
119*38e8c45fSAndroid Build Coastguard Worker pressKey(key);
120*38e8c45fSAndroid Build Coastguard Worker releaseKey(key);
121*38e8c45fSAndroid Build Coastguard Worker }
122*38e8c45fSAndroid Build Coastguard Worker
123*38e8c45fSAndroid Build Coastguard Worker // --- UinputHomeKey ---
124*38e8c45fSAndroid Build Coastguard Worker
UinputHomeKey()125*38e8c45fSAndroid Build Coastguard Worker UinputHomeKey::UinputHomeKey() : UinputKeyboard(DEVICE_NAME, PRODUCT_ID, {KEY_HOME}) {}
126*38e8c45fSAndroid Build Coastguard Worker
pressAndReleaseHomeKey()127*38e8c45fSAndroid Build Coastguard Worker void UinputHomeKey::pressAndReleaseHomeKey() {
128*38e8c45fSAndroid Build Coastguard Worker pressAndReleaseKey(KEY_HOME);
129*38e8c45fSAndroid Build Coastguard Worker }
130*38e8c45fSAndroid Build Coastguard Worker
131*38e8c45fSAndroid Build Coastguard Worker // --- UinputSteamController ---
132*38e8c45fSAndroid Build Coastguard Worker
UinputSteamController()133*38e8c45fSAndroid Build Coastguard Worker UinputSteamController::UinputSteamController()
134*38e8c45fSAndroid Build Coastguard Worker : UinputKeyboard(DEVICE_NAME, PRODUCT_ID, {BTN_GEAR_DOWN, BTN_GEAR_UP}) {}
135*38e8c45fSAndroid Build Coastguard Worker
136*38e8c45fSAndroid Build Coastguard Worker // --- UinputExternalStylus ---
137*38e8c45fSAndroid Build Coastguard Worker
UinputExternalStylus()138*38e8c45fSAndroid Build Coastguard Worker UinputExternalStylus::UinputExternalStylus()
139*38e8c45fSAndroid Build Coastguard Worker : UinputKeyboard(DEVICE_NAME, PRODUCT_ID, {BTN_STYLUS, BTN_STYLUS2, BTN_STYLUS3}) {}
140*38e8c45fSAndroid Build Coastguard Worker
141*38e8c45fSAndroid Build Coastguard Worker // --- UinputExternalStylusWithPressure ---
142*38e8c45fSAndroid Build Coastguard Worker
UinputExternalStylusWithPressure()143*38e8c45fSAndroid Build Coastguard Worker UinputExternalStylusWithPressure::UinputExternalStylusWithPressure()
144*38e8c45fSAndroid Build Coastguard Worker : UinputKeyboard(DEVICE_NAME, PRODUCT_ID, {BTN_STYLUS, BTN_STYLUS2, BTN_STYLUS3}) {}
145*38e8c45fSAndroid Build Coastguard Worker
configureDevice(int fd,uinput_user_dev * device)146*38e8c45fSAndroid Build Coastguard Worker void UinputExternalStylusWithPressure::configureDevice(int fd, uinput_user_dev* device) {
147*38e8c45fSAndroid Build Coastguard Worker UinputKeyboard::configureDevice(fd, device);
148*38e8c45fSAndroid Build Coastguard Worker
149*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_EVBIT, EV_ABS);
150*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_ABSBIT, ABS_PRESSURE);
151*38e8c45fSAndroid Build Coastguard Worker device->absmin[ABS_PRESSURE] = RAW_PRESSURE_MIN;
152*38e8c45fSAndroid Build Coastguard Worker device->absmax[ABS_PRESSURE] = RAW_PRESSURE_MAX;
153*38e8c45fSAndroid Build Coastguard Worker }
154*38e8c45fSAndroid Build Coastguard Worker
setPressure(int32_t pressure)155*38e8c45fSAndroid Build Coastguard Worker void UinputExternalStylusWithPressure::setPressure(int32_t pressure) {
156*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_PRESSURE, pressure);
157*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_SYN, SYN_REPORT, 0);
158*38e8c45fSAndroid Build Coastguard Worker }
159*38e8c45fSAndroid Build Coastguard Worker
160*38e8c45fSAndroid Build Coastguard Worker // --- UinputKeyboardWithHidUsage ---
161*38e8c45fSAndroid Build Coastguard Worker
UinputKeyboardWithHidUsage(std::initializer_list<int> keys)162*38e8c45fSAndroid Build Coastguard Worker UinputKeyboardWithHidUsage::UinputKeyboardWithHidUsage(std::initializer_list<int> keys)
163*38e8c45fSAndroid Build Coastguard Worker : UinputKeyboard(DEVICE_NAME, PRODUCT_ID, keys) {}
164*38e8c45fSAndroid Build Coastguard Worker
configureDevice(int fd,uinput_user_dev * device)165*38e8c45fSAndroid Build Coastguard Worker void UinputKeyboardWithHidUsage::configureDevice(int fd, uinput_user_dev* device) {
166*38e8c45fSAndroid Build Coastguard Worker UinputKeyboard::configureDevice(fd, device);
167*38e8c45fSAndroid Build Coastguard Worker
168*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_EVBIT, EV_MSC);
169*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_MSCBIT, MSC_SCAN);
170*38e8c45fSAndroid Build Coastguard Worker }
171*38e8c45fSAndroid Build Coastguard Worker
172*38e8c45fSAndroid Build Coastguard Worker // --- UinputTouchScreen ---
173*38e8c45fSAndroid Build Coastguard Worker
UinputTouchScreen(const Rect & size,const std::string & physicalPort)174*38e8c45fSAndroid Build Coastguard Worker UinputTouchScreen::UinputTouchScreen(const Rect& size, const std::string& physicalPort)
175*38e8c45fSAndroid Build Coastguard Worker : UinputKeyboard(DEVICE_NAME, PRODUCT_ID,
176*38e8c45fSAndroid Build Coastguard Worker {BTN_TOUCH, BTN_TOOL_PEN, BTN_STYLUS, BTN_STYLUS2, BTN_STYLUS3}),
177*38e8c45fSAndroid Build Coastguard Worker mSize(size),
178*38e8c45fSAndroid Build Coastguard Worker mPhysicalPort(physicalPort) {}
179*38e8c45fSAndroid Build Coastguard Worker
configureDevice(int fd,uinput_user_dev * device)180*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::configureDevice(int fd, uinput_user_dev* device) {
181*38e8c45fSAndroid Build Coastguard Worker UinputKeyboard::configureDevice(fd, device);
182*38e8c45fSAndroid Build Coastguard Worker
183*38e8c45fSAndroid Build Coastguard Worker // Setup the touch screen device
184*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_EVBIT, EV_REL);
185*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_EVBIT, EV_ABS);
186*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_ABSBIT, ABS_MT_SLOT);
187*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR);
188*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
189*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
190*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID);
191*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_ABSBIT, ABS_MT_TOOL_TYPE);
192*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_ABSBIT, ABS_MT_PRESSURE);
193*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_PROPBIT, INPUT_PROP_DIRECT);
194*38e8c45fSAndroid Build Coastguard Worker if (!mPhysicalPort.empty()) {
195*38e8c45fSAndroid Build Coastguard Worker ioctl(fd, UI_SET_PHYS, mPhysicalPort.c_str());
196*38e8c45fSAndroid Build Coastguard Worker }
197*38e8c45fSAndroid Build Coastguard Worker
198*38e8c45fSAndroid Build Coastguard Worker device->absmin[ABS_MT_SLOT] = RAW_SLOT_MIN;
199*38e8c45fSAndroid Build Coastguard Worker device->absmax[ABS_MT_SLOT] = RAW_SLOT_MAX;
200*38e8c45fSAndroid Build Coastguard Worker device->absmin[ABS_MT_TOUCH_MAJOR] = RAW_TOUCH_MIN;
201*38e8c45fSAndroid Build Coastguard Worker device->absmax[ABS_MT_TOUCH_MAJOR] = RAW_TOUCH_MAX;
202*38e8c45fSAndroid Build Coastguard Worker device->absmin[ABS_MT_POSITION_X] = mSize.left;
203*38e8c45fSAndroid Build Coastguard Worker device->absmax[ABS_MT_POSITION_X] = mSize.right - 1;
204*38e8c45fSAndroid Build Coastguard Worker device->absmin[ABS_MT_POSITION_Y] = mSize.top;
205*38e8c45fSAndroid Build Coastguard Worker device->absmax[ABS_MT_POSITION_Y] = mSize.bottom - 1;
206*38e8c45fSAndroid Build Coastguard Worker device->absmin[ABS_MT_TRACKING_ID] = RAW_ID_MIN;
207*38e8c45fSAndroid Build Coastguard Worker device->absmax[ABS_MT_TRACKING_ID] = RAW_ID_MAX;
208*38e8c45fSAndroid Build Coastguard Worker device->absmin[ABS_MT_TOOL_TYPE] = MT_TOOL_FINGER;
209*38e8c45fSAndroid Build Coastguard Worker device->absmax[ABS_MT_TOOL_TYPE] = MT_TOOL_MAX;
210*38e8c45fSAndroid Build Coastguard Worker device->absmin[ABS_MT_PRESSURE] = RAW_PRESSURE_MIN;
211*38e8c45fSAndroid Build Coastguard Worker device->absmax[ABS_MT_PRESSURE] = RAW_PRESSURE_MAX;
212*38e8c45fSAndroid Build Coastguard Worker }
213*38e8c45fSAndroid Build Coastguard Worker
sendSlot(int32_t slot)214*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendSlot(int32_t slot) {
215*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_SLOT, slot);
216*38e8c45fSAndroid Build Coastguard Worker }
217*38e8c45fSAndroid Build Coastguard Worker
sendTrackingId(int32_t trackingId)218*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendTrackingId(int32_t trackingId) {
219*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_TRACKING_ID, trackingId);
220*38e8c45fSAndroid Build Coastguard Worker }
221*38e8c45fSAndroid Build Coastguard Worker
sendDown(const Point & point)222*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendDown(const Point& point) {
223*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_KEY, BTN_TOUCH, 1);
224*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_PRESSURE, RAW_PRESSURE_MAX);
225*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_POSITION_X, point.x);
226*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_POSITION_Y, point.y);
227*38e8c45fSAndroid Build Coastguard Worker }
228*38e8c45fSAndroid Build Coastguard Worker
sendMove(const Point & point)229*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendMove(const Point& point) {
230*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_POSITION_X, point.x);
231*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_POSITION_Y, point.y);
232*38e8c45fSAndroid Build Coastguard Worker }
233*38e8c45fSAndroid Build Coastguard Worker
sendPressure(int32_t pressure)234*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendPressure(int32_t pressure) {
235*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_PRESSURE, pressure);
236*38e8c45fSAndroid Build Coastguard Worker }
237*38e8c45fSAndroid Build Coastguard Worker
sendPointerUp()238*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendPointerUp() {
239*38e8c45fSAndroid Build Coastguard Worker sendTrackingId(0xffffffff);
240*38e8c45fSAndroid Build Coastguard Worker }
241*38e8c45fSAndroid Build Coastguard Worker
sendUp()242*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendUp() {
243*38e8c45fSAndroid Build Coastguard Worker sendTrackingId(0xffffffff);
244*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_KEY, BTN_TOUCH, 0);
245*38e8c45fSAndroid Build Coastguard Worker }
246*38e8c45fSAndroid Build Coastguard Worker
sendToolType(int32_t toolType)247*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendToolType(int32_t toolType) {
248*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_ABS, ABS_MT_TOOL_TYPE, toolType);
249*38e8c45fSAndroid Build Coastguard Worker }
250*38e8c45fSAndroid Build Coastguard Worker
sendSync()251*38e8c45fSAndroid Build Coastguard Worker void UinputTouchScreen::sendSync() {
252*38e8c45fSAndroid Build Coastguard Worker injectEvent(EV_SYN, SYN_REPORT, 0);
253*38e8c45fSAndroid Build Coastguard Worker }
254*38e8c45fSAndroid Build Coastguard Worker
255*38e8c45fSAndroid Build Coastguard Worker // Get the center x, y base on the range definition.
getCenterPoint()256*38e8c45fSAndroid Build Coastguard Worker const Point UinputTouchScreen::getCenterPoint() {
257*38e8c45fSAndroid Build Coastguard Worker return Point(mSize.left + mSize.width() / 2, mSize.top + mSize.height() / 2);
258*38e8c45fSAndroid Build Coastguard Worker }
259*38e8c45fSAndroid Build Coastguard Worker
260*38e8c45fSAndroid Build Coastguard Worker } // namespace android
261