15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/* 25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2010 The Android Open Source Project 35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License. 65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at 75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software 115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and 145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License. 155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#ifndef _LIBINPUT_INPUT_TRANSPORT_H 185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define _LIBINPUT_INPUT_TRANSPORT_H 195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/** 215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Native input transport. 225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The InputChannel provides a mechanism for exchanging InputMessage structures across processes. 245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The InputPublisher and InputConsumer each handle one end-point of an input channel. 265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The InputPublisher is used by the input dispatcher to send events to the application. 275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The InputConsumer is used by the application to receive events from the input dispatcher. 285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/Input.h> 315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Errors.h> 325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Timers.h> 335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/RefBase.h> 345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/String8.h> 355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Vector.h> 365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/BitSet.h> 375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android { 395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/* 415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Intermediate representation used to send input events and related signals. 4283e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin * 4383e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin * Note that this structure is used for IPCs so its layout must be identical 4483e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin * on 64 and 32 bit processes. This is tested in StructLayout_test.cpp. 455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct InputMessage { 475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown enum { 485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown TYPE_KEY = 1, 495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown TYPE_MOTION = 2, 505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown TYPE_FINISHED = 3, 515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown }; 525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct Header { 545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t type; 5583e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin // We don't need this field in order to align the body below but we 5683e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin // leave it here because InputMessage::size() and other functions 5783e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin // compute the size of this structure as sizeof(Header) + sizeof(Body). 5883e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin uint32_t padding; 595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } header; 605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 6183e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin // Body *must* be 8 byte aligned. 625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown union Body { 635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct Key { 645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t seq; 6583e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin nsecs_t eventTime __attribute__((aligned(8))); 665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t deviceId; 675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t source; 685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t action; 695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t flags; 705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t keyCode; 715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t scanCode; 725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t metaState; 735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t repeatCount; 7483e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin nsecs_t downTime __attribute__((aligned(8))); 755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown inline size_t size() const { 775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return sizeof(Key); 785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } key; 805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct Motion { 825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t seq; 8383e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin nsecs_t eventTime __attribute__((aligned(8))); 845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t deviceId; 855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t source; 865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t action; 877b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright int32_t actionButton; 885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t flags; 895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t metaState; 905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t buttonState; 915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t edgeFlags; 9283e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin nsecs_t downTime __attribute__((aligned(8))); 935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown float xOffset; 945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown float yOffset; 955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown float xPrecision; 965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown float yPrecision; 97ed5fd384b7401fbb6143eb7107cbfe9af46116beNarayan Kamath uint32_t pointerCount; 9883e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin // Note that PointerCoords requires 8 byte alignment. 99b03f103fd40d9028731a81e87a817a3e3bd07fa4Michael Wright struct Pointer { 1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown PointerProperties properties; 1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown PointerCoords coords; 1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } pointers[MAX_POINTERS]; 1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t getActionId() const { 1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) 1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; 1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return pointers[index].properties.id; 1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown inline size_t size() const { 1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return sizeof(Motion) - sizeof(Pointer) * MAX_POINTERS 1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown + sizeof(Pointer) * pointerCount; 1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } motion; 1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct Finished { 1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t seq; 1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown bool handled; 1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown inline size_t size() const { 1215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return sizeof(Finished); 1225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 1235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } finished; 12483e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yin } __attribute__((aligned(8))) body; 1255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown bool isValid(size_t actualSize) const; 1275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown size_t size() const; 1285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 1295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/* 1315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * An input channel consists of a local unix domain socket used to send and receive 1325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * input messages across processes. Each channel has a descriptive name for debugging purposes. 1335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 1345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Each endpoint has its own InputChannel object that specifies its file descriptor. 1355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 1365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The input channel is closed when all references to it are released. 1375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 1385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass InputChannel : public RefBase { 1395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected: 1405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown virtual ~InputChannel(); 1415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic: 1435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputChannel(const String8& name, int fd); 1445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Creates a pair of input channels. 1465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 1475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns OK on success. 1485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 1495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static status_t openInputChannelPair(const String8& name, 1505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel); 1515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown inline String8 getName() const { return mName; } 1535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown inline int getFd() const { return mFd; } 1545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Sends a message to the other endpoint. 1565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 1575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * If the channel is full then the message is guaranteed not to have been sent at all. 1585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Try again after the consumer has sent a finished signal indicating that it has 1595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * consumed some of the pending messages from the channel. 1605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 1615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns OK on success. 1625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns WOULD_BLOCK if the channel is full. 1635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns DEAD_OBJECT if the channel's peer has been closed. 1645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Other errors probably indicate that the channel is broken. 1655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 1665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t sendMessage(const InputMessage* msg); 1675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Receives a message sent by the other endpoint. 1695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 1705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * If there is no message present, try again after poll() indicates that the fd 1715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * is readable. 1725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 1735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns OK on success. 1745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns WOULD_BLOCK if there is no message present. 1755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns DEAD_OBJECT if the channel's peer has been closed. 1765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Other errors probably indicate that the channel is broken. 1775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 1785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t receiveMessage(InputMessage* msg); 1795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Returns a new object that has a duplicate of this channel's fd. */ 1815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sp<InputChannel> dup() const; 1825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate: 1845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown String8 mName; 1855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int mFd; 1865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 1875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/* 1895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Publishes input events to an input channel. 1905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 1915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass InputPublisher { 1925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic: 1935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Creates a publisher associated with an input channel. */ 1945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown explicit InputPublisher(const sp<InputChannel>& channel); 1955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Destroys the publisher and releases its input channel. */ 1975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ~InputPublisher(); 1985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Gets the underlying input channel. */ 2005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown inline sp<InputChannel> getChannel() { return mChannel; } 2015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 2025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Publishes a key event to the input channel. 2035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns OK on success. 2055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns WOULD_BLOCK if the channel is full. 2065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns DEAD_OBJECT if the channel's peer has been closed. 2075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns BAD_VALUE if seq is 0. 2085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Other errors probably indicate that the channel is broken. 2095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 2105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t publishKeyEvent( 2115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t seq, 2125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t deviceId, 2135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t source, 2145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t action, 2155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t flags, 2165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t keyCode, 2175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t scanCode, 2185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t metaState, 2195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t repeatCount, 2205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown nsecs_t downTime, 2215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown nsecs_t eventTime); 2225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 2235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Publishes a motion event to the input channel. 2245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns OK on success. 2265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns WOULD_BLOCK if the channel is full. 2275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns DEAD_OBJECT if the channel's peer has been closed. 2285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns BAD_VALUE if seq is 0 or if pointerCount is less than 1 or greater than MAX_POINTERS. 2295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Other errors probably indicate that the channel is broken. 2305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 2315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t publishMotionEvent( 2325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t seq, 2335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t deviceId, 2345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t source, 2355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t action, 2367b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright int32_t actionButton, 2375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t flags, 2385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t edgeFlags, 2395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t metaState, 2405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t buttonState, 2415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown float xOffset, 2425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown float yOffset, 2435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown float xPrecision, 2445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown float yPrecision, 2455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown nsecs_t downTime, 2465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown nsecs_t eventTime, 247ed5fd384b7401fbb6143eb7107cbfe9af46116beNarayan Kamath uint32_t pointerCount, 2485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown const PointerProperties* pointerProperties, 2495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown const PointerCoords* pointerCoords); 2505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 2515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Receives the finished signal from the consumer in reply to the original dispatch signal. 2525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * If a signal was received, returns the message sequence number, 2535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * and whether the consumer handled the message. 2545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The returned sequence number is never 0 unless the operation failed. 2565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns OK on success. 2585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns WOULD_BLOCK if there is no signal present. 2595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns DEAD_OBJECT if the channel's peer has been closed. 2605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Other errors probably indicate that the channel is broken. 2615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 2625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t receiveFinishedSignal(uint32_t* outSeq, bool* outHandled); 2635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 2645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate: 2655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sp<InputChannel> mChannel; 2665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 2675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 2685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/* 2695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Consumes input events from an input channel. 2705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 2715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass InputConsumer { 2725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic: 2735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Creates a consumer associated with an input channel. */ 2745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown explicit InputConsumer(const sp<InputChannel>& channel); 2755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 2765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Destroys the consumer and releases its input channel. */ 2775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ~InputConsumer(); 2785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 2795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Gets the underlying input channel. */ 2805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown inline sp<InputChannel> getChannel() { return mChannel; } 2815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 2825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Consumes an input event from the input channel and copies its contents into 2835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * an InputEvent object created using the specified factory. 2845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Tries to combine a series of move events into larger batches whenever possible. 2865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * If consumeBatches is false, then defers consuming pending batched events if it 2885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * is possible for additional samples to be added to them later. Call hasPendingBatch() 2895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * to determine whether a pending batch is available to be consumed. 2905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * If consumeBatches is true, then events are still batched but they are consumed 2925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * immediately as soon as the input channel is exhausted. 2935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The frameTime parameter specifies the time when the current display frame started 2955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * rendering in the CLOCK_MONOTONIC time base, or -1 if unknown. 2965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The returned sequence number is never 0 unless the operation failed. 2985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 2995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns OK on success. 3005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns WOULD_BLOCK if there is no event present. 3015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns DEAD_OBJECT if the channel's peer has been closed. 3025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns NO_MEMORY if the event could not be created. 3035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Other errors probably indicate that the channel is broken. 3045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 3055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t consume(InputEventFactoryInterface* factory, bool consumeBatches, 3065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent); 3075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Sends a finished signal to the publisher to inform it that the message 3095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * with the specified sequence number has finished being process and whether 3105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * the message was handled by the consumer. 3115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 3125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns OK on success. 3135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns BAD_VALUE if seq is 0. 3145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Other errors probably indicate that the channel is broken. 3155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 3165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t sendFinishedSignal(uint32_t seq, bool handled); 3175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Returns true if there is a deferred event waiting. 3195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 3205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Should be called after calling consume() to determine whether the consumer 3215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * has a deferred event to be processed. Deferred events are somewhat special in 3225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * that they have already been removed from the input channel. If the input channel 3235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * becomes empty, the client may need to do extra work to ensure that it processes 3245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * the deferred event despite the fact that the input channel's file descriptor 3255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * is not readable. 3265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 3275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * One option is simply to call consume() in a loop until it returns WOULD_BLOCK. 3285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * This guarantees that all deferred events will be processed. 3295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 3305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Alternately, the caller can call hasDeferredEvent() to determine whether there is 3315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * a deferred event waiting and then ensure that its event loop wakes up at least 3325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * one more time to consume the deferred event. 3335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 3345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown bool hasDeferredEvent() const; 3355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown /* Returns true if there is a pending batch. 3375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 3385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Should be called after calling consume() with consumeBatches == false to determine 3395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * whether consume() should be called again later on with consumeBatches == true. 3405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 3415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown bool hasPendingBatch() const; 3425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate: 3445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // True if touch resampling is enabled. 3455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown const bool mResampleTouch; 3465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // The input channel. 3485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sp<InputChannel> mChannel; 3495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // The current input message. 3515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputMessage mMsg; 3525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // True if mMsg contains a valid input message that was deferred from the previous 3545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // call to consume and that still needs to be handled. 3555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown bool mMsgDeferred; 3565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Batched motion events per device and source. 3585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct Batch { 3595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Vector<InputMessage> samples; 3605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown }; 3615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Vector<Batch> mBatches; 3625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Touch state per device and source, only for sources of class pointer. 3645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct History { 3655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown nsecs_t eventTime; 3665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown BitSet32 idBits; 3675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t idToIndex[MAX_POINTER_ID + 1]; 3685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown PointerCoords pointers[MAX_POINTERS]; 3695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown void initializeFrom(const InputMessage* msg) { 3715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown eventTime = msg->body.motion.eventTime; 3725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown idBits.clear(); 373ed5fd384b7401fbb6143eb7107cbfe9af46116beNarayan Kamath for (uint32_t i = 0; i < msg->body.motion.pointerCount; i++) { 3745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t id = msg->body.motion.pointers[i].properties.id; 3755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown idBits.markBit(id); 3765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown idToIndex[id] = i; 3775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown pointers[i].copyFrom(msg->body.motion.pointers[i].coords); 3785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 3795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 3805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown const PointerCoords& getPointerById(uint32_t id) const { 3825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return pointers[idToIndex[id]]; 3835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 3845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown }; 3855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct TouchState { 3865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t deviceId; 3875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t source; 3885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown size_t historyCurrent; 3895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown size_t historySize; 3905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown History history[2]; 3915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown History lastResample; 3925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 3935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown void initialize(int32_t deviceId, int32_t source) { 3945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown this->deviceId = deviceId; 3955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown this->source = source; 3965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown historyCurrent = 0; 3975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown historySize = 0; 3985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown lastResample.eventTime = 0; 3995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown lastResample.idBits.clear(); 4005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 4015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown void addHistory(const InputMessage* msg) { 4035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown historyCurrent ^= 1; 4045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown if (historySize < 2) { 4055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown historySize += 1; 4065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 4075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown history[historyCurrent].initializeFrom(msg); 4085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 4095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown const History* getHistory(size_t index) const { 4115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return &history[(historyCurrent + index) & 1]; 4125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 4135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown }; 4145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Vector<TouchState> mTouchStates; 4155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Chain of batched sequence numbers. When multiple input messages are combined into 4175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // a batch, we append a record here that associates the last sequence number in the 4185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // batch with the previous one. When the finished signal is sent, we traverse the 4195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // chain to individually finish all input messages that were part of the batch. 4205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct SeqChain { 4215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t seq; // sequence number of batched input message 4225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t chain; // sequence number of previous batched input message 4235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown }; 4245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Vector<SeqChain> mSeqChains; 4255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t consumeBatch(InputEventFactoryInterface* factory, 4275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent); 4285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t consumeSamples(InputEventFactoryInterface* factory, 4295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Batch& batch, size_t count, uint32_t* outSeq, InputEvent** outEvent); 4305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown void updateTouchState(InputMessage* msg); 4325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown void rewriteMessage(const TouchState& state, InputMessage* msg); 4335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown void resampleTouchState(nsecs_t frameTime, MotionEvent* event, 4345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown const InputMessage *next); 4355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ssize_t findBatch(int32_t deviceId, int32_t source) const; 4375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ssize_t findTouchState(int32_t deviceId, int32_t source) const; 4385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t sendUnchainedFinishedSignal(uint32_t seq, bool handled); 4405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static void initializeKeyEvent(KeyEvent* event, const InputMessage* msg); 4425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static void initializeMotionEvent(MotionEvent* event, const InputMessage* msg); 4435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static void addSample(MotionEvent* event, const InputMessage* msg); 4445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static bool canAddSample(const Batch& batch, const InputMessage* msg); 4455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static ssize_t findSampleNoLaterThan(const Batch& batch, nsecs_t time); 4465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static bool shouldResampleTool(int32_t toolType); 4475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static bool isTouchResamplingEnabled(); 4495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 4505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android 4525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 4535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // _LIBINPUT_INPUT_TRANSPORT_H 454