xref: /aosp_15_r20/frameworks/native/libs/input/InputTransport.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker //
2*38e8c45fSAndroid Build Coastguard Worker // Copyright 2010 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker //
4*38e8c45fSAndroid Build Coastguard Worker // Provides a shared memory transport for input events.
5*38e8c45fSAndroid Build Coastguard Worker //
6*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "InputTransport"
7*38e8c45fSAndroid Build Coastguard Worker #define ATRACE_TAG ATRACE_TAG_INPUT
8*38e8c45fSAndroid Build Coastguard Worker 
9*38e8c45fSAndroid Build Coastguard Worker #include <errno.h>
10*38e8c45fSAndroid Build Coastguard Worker #include <fcntl.h>
11*38e8c45fSAndroid Build Coastguard Worker #include <inttypes.h>
12*38e8c45fSAndroid Build Coastguard Worker #include <math.h>
13*38e8c45fSAndroid Build Coastguard Worker #include <poll.h>
14*38e8c45fSAndroid Build Coastguard Worker #include <sys/socket.h>
15*38e8c45fSAndroid Build Coastguard Worker #include <sys/types.h>
16*38e8c45fSAndroid Build Coastguard Worker #include <unistd.h>
17*38e8c45fSAndroid Build Coastguard Worker 
18*38e8c45fSAndroid Build Coastguard Worker #include <android-base/logging.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <android-base/properties.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <cutils/properties.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <ftl/enum.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <log/log.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <utils/Trace.h>
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker #include <com_android_input_flags.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <input/InputTransport.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <input/PrintTools.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <input/TraceTools.h>
31*38e8c45fSAndroid Build Coastguard Worker 
32*38e8c45fSAndroid Build Coastguard Worker namespace input_flags = com::android::input::flags;
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker namespace android {
35*38e8c45fSAndroid Build Coastguard Worker 
36*38e8c45fSAndroid Build Coastguard Worker namespace {
37*38e8c45fSAndroid Build Coastguard Worker 
38*38e8c45fSAndroid Build Coastguard Worker /**
39*38e8c45fSAndroid Build Coastguard Worker  * Log debug messages about channel messages (send message, receive message).
40*38e8c45fSAndroid Build Coastguard Worker  * Enable this via "adb shell setprop log.tag.InputTransportMessages DEBUG"
41*38e8c45fSAndroid Build Coastguard Worker  * (requires restart)
42*38e8c45fSAndroid Build Coastguard Worker  */
43*38e8c45fSAndroid Build Coastguard Worker const bool DEBUG_CHANNEL_MESSAGES =
44*38e8c45fSAndroid Build Coastguard Worker         __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "Messages", ANDROID_LOG_INFO);
45*38e8c45fSAndroid Build Coastguard Worker 
46*38e8c45fSAndroid Build Coastguard Worker /**
47*38e8c45fSAndroid Build Coastguard Worker  * Log debug messages whenever InputChannel objects are created/destroyed.
48*38e8c45fSAndroid Build Coastguard Worker  * Enable this via "adb shell setprop log.tag.InputTransportLifecycle DEBUG"
49*38e8c45fSAndroid Build Coastguard Worker  * (requires restart)
50*38e8c45fSAndroid Build Coastguard Worker  */
51*38e8c45fSAndroid Build Coastguard Worker const bool DEBUG_CHANNEL_LIFECYCLE =
52*38e8c45fSAndroid Build Coastguard Worker         __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "Lifecycle", ANDROID_LOG_INFO);
53*38e8c45fSAndroid Build Coastguard Worker 
54*38e8c45fSAndroid Build Coastguard Worker const bool IS_DEBUGGABLE_BUILD =
55*38e8c45fSAndroid Build Coastguard Worker #if defined(__ANDROID__)
56*38e8c45fSAndroid Build Coastguard Worker         android::base::GetBoolProperty("ro.debuggable", false);
57*38e8c45fSAndroid Build Coastguard Worker #else
58*38e8c45fSAndroid Build Coastguard Worker         true;
59*38e8c45fSAndroid Build Coastguard Worker #endif
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker /**
62*38e8c45fSAndroid Build Coastguard Worker  * Log debug messages relating to the producer end of the transport channel.
63*38e8c45fSAndroid Build Coastguard Worker  * Enable this via "adb shell setprop log.tag.InputTransportPublisher DEBUG".
64*38e8c45fSAndroid Build Coastguard Worker  * This requires a restart on non-debuggable (e.g. user) builds, but should take effect immediately
65*38e8c45fSAndroid Build Coastguard Worker  * on debuggable builds (e.g. userdebug).
66*38e8c45fSAndroid Build Coastguard Worker  */
debugTransportPublisher()67*38e8c45fSAndroid Build Coastguard Worker bool debugTransportPublisher() {
68*38e8c45fSAndroid Build Coastguard Worker     if (!IS_DEBUGGABLE_BUILD) {
69*38e8c45fSAndroid Build Coastguard Worker         static const bool DEBUG_TRANSPORT_PUBLISHER =
70*38e8c45fSAndroid Build Coastguard Worker                 __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "Publisher", ANDROID_LOG_INFO);
71*38e8c45fSAndroid Build Coastguard Worker         return DEBUG_TRANSPORT_PUBLISHER;
72*38e8c45fSAndroid Build Coastguard Worker     }
73*38e8c45fSAndroid Build Coastguard Worker     return __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "Publisher", ANDROID_LOG_INFO);
74*38e8c45fSAndroid Build Coastguard Worker }
75*38e8c45fSAndroid Build Coastguard Worker 
dupChannelFd(int fd)76*38e8c45fSAndroid Build Coastguard Worker android::base::unique_fd dupChannelFd(int fd) {
77*38e8c45fSAndroid Build Coastguard Worker     android::base::unique_fd newFd(::dup(fd));
78*38e8c45fSAndroid Build Coastguard Worker     if (!newFd.ok()) {
79*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Could not duplicate fd %i : %s", fd, strerror(errno));
80*38e8c45fSAndroid Build Coastguard Worker         const bool hitFdLimit = errno == EMFILE || errno == ENFILE;
81*38e8c45fSAndroid Build Coastguard Worker         // If this process is out of file descriptors, then throwing that might end up exploding
82*38e8c45fSAndroid Build Coastguard Worker         // on the other side of a binder call, which isn't really helpful.
83*38e8c45fSAndroid Build Coastguard Worker         // Better to just crash here and hope that the FD leak is slow.
84*38e8c45fSAndroid Build Coastguard Worker         // Other failures could be client errors, so we still propagate those back to the caller.
85*38e8c45fSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL_IF(hitFdLimit, "Too many open files, could not duplicate input channel");
86*38e8c45fSAndroid Build Coastguard Worker         return {};
87*38e8c45fSAndroid Build Coastguard Worker     }
88*38e8c45fSAndroid Build Coastguard Worker     return newFd;
89*38e8c45fSAndroid Build Coastguard Worker }
90*38e8c45fSAndroid Build Coastguard Worker 
91*38e8c45fSAndroid Build Coastguard Worker // Socket buffer size.  The default is typically about 128KB, which is much larger than
92*38e8c45fSAndroid Build Coastguard Worker // we really need.  So we make it smaller.  It just needs to be big enough to hold
93*38e8c45fSAndroid Build Coastguard Worker // a few dozen large multi-finger motion events in the case where an application gets
94*38e8c45fSAndroid Build Coastguard Worker // behind processing touches.
95*38e8c45fSAndroid Build Coastguard Worker constexpr size_t SOCKET_BUFFER_SIZE = 32 * 1024;
96*38e8c45fSAndroid Build Coastguard Worker 
97*38e8c45fSAndroid Build Coastguard Worker /**
98*38e8c45fSAndroid Build Coastguard Worker  * Crash if the events that are getting sent to the InputPublisher are inconsistent.
99*38e8c45fSAndroid Build Coastguard Worker  * Enable this via "adb shell setprop log.tag.InputTransportVerifyEvents DEBUG"
100*38e8c45fSAndroid Build Coastguard Worker  */
verifyEvents()101*38e8c45fSAndroid Build Coastguard Worker bool verifyEvents() {
102*38e8c45fSAndroid Build Coastguard Worker     return input_flags::enable_outbound_event_verification() ||
103*38e8c45fSAndroid Build Coastguard Worker             __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "VerifyEvents", ANDROID_LOG_INFO);
104*38e8c45fSAndroid Build Coastguard Worker }
105*38e8c45fSAndroid Build Coastguard Worker 
106*38e8c45fSAndroid Build Coastguard Worker } // namespace
107*38e8c45fSAndroid Build Coastguard Worker 
108*38e8c45fSAndroid Build Coastguard Worker using android::base::Result;
109*38e8c45fSAndroid Build Coastguard Worker using android::base::StringPrintf;
110*38e8c45fSAndroid Build Coastguard Worker 
111*38e8c45fSAndroid Build Coastguard Worker // --- InputMessage ---
112*38e8c45fSAndroid Build Coastguard Worker 
isValid(size_t actualSize) const113*38e8c45fSAndroid Build Coastguard Worker bool InputMessage::isValid(size_t actualSize) const {
114*38e8c45fSAndroid Build Coastguard Worker     if (size() != actualSize) {
115*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Received message of incorrect size %zu (expected %zu)", actualSize, size());
116*38e8c45fSAndroid Build Coastguard Worker         return false;
117*38e8c45fSAndroid Build Coastguard Worker     }
118*38e8c45fSAndroid Build Coastguard Worker 
119*38e8c45fSAndroid Build Coastguard Worker     switch (header.type) {
120*38e8c45fSAndroid Build Coastguard Worker         case Type::KEY:
121*38e8c45fSAndroid Build Coastguard Worker             return true;
122*38e8c45fSAndroid Build Coastguard Worker         case Type::MOTION: {
123*38e8c45fSAndroid Build Coastguard Worker             const bool valid =
124*38e8c45fSAndroid Build Coastguard Worker                     body.motion.pointerCount > 0 && body.motion.pointerCount <= MAX_POINTERS;
125*38e8c45fSAndroid Build Coastguard Worker             if (!valid) {
126*38e8c45fSAndroid Build Coastguard Worker                 ALOGE("Received invalid MOTION: pointerCount = %" PRIu32, body.motion.pointerCount);
127*38e8c45fSAndroid Build Coastguard Worker             }
128*38e8c45fSAndroid Build Coastguard Worker             return valid;
129*38e8c45fSAndroid Build Coastguard Worker         }
130*38e8c45fSAndroid Build Coastguard Worker         case Type::FINISHED:
131*38e8c45fSAndroid Build Coastguard Worker         case Type::FOCUS:
132*38e8c45fSAndroid Build Coastguard Worker         case Type::CAPTURE:
133*38e8c45fSAndroid Build Coastguard Worker         case Type::DRAG:
134*38e8c45fSAndroid Build Coastguard Worker         case Type::TOUCH_MODE:
135*38e8c45fSAndroid Build Coastguard Worker             return true;
136*38e8c45fSAndroid Build Coastguard Worker         case Type::TIMELINE: {
137*38e8c45fSAndroid Build Coastguard Worker             const nsecs_t gpuCompletedTime =
138*38e8c45fSAndroid Build Coastguard Worker                     body.timeline.graphicsTimeline[GraphicsTimeline::GPU_COMPLETED_TIME];
139*38e8c45fSAndroid Build Coastguard Worker             const nsecs_t presentTime =
140*38e8c45fSAndroid Build Coastguard Worker                     body.timeline.graphicsTimeline[GraphicsTimeline::PRESENT_TIME];
141*38e8c45fSAndroid Build Coastguard Worker             const bool valid = presentTime > gpuCompletedTime;
142*38e8c45fSAndroid Build Coastguard Worker             if (!valid) {
143*38e8c45fSAndroid Build Coastguard Worker                 ALOGE("Received invalid TIMELINE: gpuCompletedTime = %" PRId64
144*38e8c45fSAndroid Build Coastguard Worker                       " presentTime = %" PRId64,
145*38e8c45fSAndroid Build Coastguard Worker                       gpuCompletedTime, presentTime);
146*38e8c45fSAndroid Build Coastguard Worker             }
147*38e8c45fSAndroid Build Coastguard Worker             return valid;
148*38e8c45fSAndroid Build Coastguard Worker         }
149*38e8c45fSAndroid Build Coastguard Worker     }
150*38e8c45fSAndroid Build Coastguard Worker     ALOGE("Invalid message type: %s", ftl::enum_string(header.type).c_str());
151*38e8c45fSAndroid Build Coastguard Worker     return false;
152*38e8c45fSAndroid Build Coastguard Worker }
153*38e8c45fSAndroid Build Coastguard Worker 
size() const154*38e8c45fSAndroid Build Coastguard Worker size_t InputMessage::size() const {
155*38e8c45fSAndroid Build Coastguard Worker     switch (header.type) {
156*38e8c45fSAndroid Build Coastguard Worker         case Type::KEY:
157*38e8c45fSAndroid Build Coastguard Worker             return sizeof(Header) + body.key.size();
158*38e8c45fSAndroid Build Coastguard Worker         case Type::MOTION:
159*38e8c45fSAndroid Build Coastguard Worker             return sizeof(Header) + body.motion.size();
160*38e8c45fSAndroid Build Coastguard Worker         case Type::FINISHED:
161*38e8c45fSAndroid Build Coastguard Worker             return sizeof(Header) + body.finished.size();
162*38e8c45fSAndroid Build Coastguard Worker         case Type::FOCUS:
163*38e8c45fSAndroid Build Coastguard Worker             return sizeof(Header) + body.focus.size();
164*38e8c45fSAndroid Build Coastguard Worker         case Type::CAPTURE:
165*38e8c45fSAndroid Build Coastguard Worker             return sizeof(Header) + body.capture.size();
166*38e8c45fSAndroid Build Coastguard Worker         case Type::DRAG:
167*38e8c45fSAndroid Build Coastguard Worker             return sizeof(Header) + body.drag.size();
168*38e8c45fSAndroid Build Coastguard Worker         case Type::TIMELINE:
169*38e8c45fSAndroid Build Coastguard Worker             return sizeof(Header) + body.timeline.size();
170*38e8c45fSAndroid Build Coastguard Worker         case Type::TOUCH_MODE:
171*38e8c45fSAndroid Build Coastguard Worker             return sizeof(Header) + body.touchMode.size();
172*38e8c45fSAndroid Build Coastguard Worker     }
173*38e8c45fSAndroid Build Coastguard Worker     return sizeof(Header);
174*38e8c45fSAndroid Build Coastguard Worker }
175*38e8c45fSAndroid Build Coastguard Worker 
176*38e8c45fSAndroid Build Coastguard Worker /**
177*38e8c45fSAndroid Build Coastguard Worker  * There could be non-zero bytes in-between InputMessage fields. Force-initialize the entire
178*38e8c45fSAndroid Build Coastguard Worker  * memory to zero, then only copy the valid bytes on a per-field basis.
179*38e8c45fSAndroid Build Coastguard Worker  */
getSanitizedCopy(InputMessage * msg) const180*38e8c45fSAndroid Build Coastguard Worker void InputMessage::getSanitizedCopy(InputMessage* msg) const {
181*38e8c45fSAndroid Build Coastguard Worker     memset(msg, 0, sizeof(*msg));
182*38e8c45fSAndroid Build Coastguard Worker 
183*38e8c45fSAndroid Build Coastguard Worker     // Write the header
184*38e8c45fSAndroid Build Coastguard Worker     msg->header.type = header.type;
185*38e8c45fSAndroid Build Coastguard Worker     msg->header.seq = header.seq;
186*38e8c45fSAndroid Build Coastguard Worker 
187*38e8c45fSAndroid Build Coastguard Worker     // Write the body
188*38e8c45fSAndroid Build Coastguard Worker     switch(header.type) {
189*38e8c45fSAndroid Build Coastguard Worker         case InputMessage::Type::KEY: {
190*38e8c45fSAndroid Build Coastguard Worker             // int32_t eventId
191*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.eventId = body.key.eventId;
192*38e8c45fSAndroid Build Coastguard Worker             // nsecs_t eventTime
193*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.eventTime = body.key.eventTime;
194*38e8c45fSAndroid Build Coastguard Worker             // int32_t deviceId
195*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.deviceId = body.key.deviceId;
196*38e8c45fSAndroid Build Coastguard Worker             // int32_t source
197*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.source = body.key.source;
198*38e8c45fSAndroid Build Coastguard Worker             // int32_t displayId
199*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.displayId = body.key.displayId;
200*38e8c45fSAndroid Build Coastguard Worker             // std::array<uint8_t, 32> hmac
201*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.hmac = body.key.hmac;
202*38e8c45fSAndroid Build Coastguard Worker             // int32_t action
203*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.action = body.key.action;
204*38e8c45fSAndroid Build Coastguard Worker             // int32_t flags
205*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.flags = body.key.flags;
206*38e8c45fSAndroid Build Coastguard Worker             // int32_t keyCode
207*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.keyCode = body.key.keyCode;
208*38e8c45fSAndroid Build Coastguard Worker             // int32_t scanCode
209*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.scanCode = body.key.scanCode;
210*38e8c45fSAndroid Build Coastguard Worker             // int32_t metaState
211*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.metaState = body.key.metaState;
212*38e8c45fSAndroid Build Coastguard Worker             // int32_t repeatCount
213*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.repeatCount = body.key.repeatCount;
214*38e8c45fSAndroid Build Coastguard Worker             // nsecs_t downTime
215*38e8c45fSAndroid Build Coastguard Worker             msg->body.key.downTime = body.key.downTime;
216*38e8c45fSAndroid Build Coastguard Worker             break;
217*38e8c45fSAndroid Build Coastguard Worker         }
218*38e8c45fSAndroid Build Coastguard Worker         case InputMessage::Type::MOTION: {
219*38e8c45fSAndroid Build Coastguard Worker             // int32_t eventId
220*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.eventId = body.motion.eventId;
221*38e8c45fSAndroid Build Coastguard Worker             // uint32_t pointerCount
222*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.pointerCount = body.motion.pointerCount;
223*38e8c45fSAndroid Build Coastguard Worker             // nsecs_t eventTime
224*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.eventTime = body.motion.eventTime;
225*38e8c45fSAndroid Build Coastguard Worker             // int32_t deviceId
226*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.deviceId = body.motion.deviceId;
227*38e8c45fSAndroid Build Coastguard Worker             // int32_t source
228*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.source = body.motion.source;
229*38e8c45fSAndroid Build Coastguard Worker             // int32_t displayId
230*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.displayId = body.motion.displayId;
231*38e8c45fSAndroid Build Coastguard Worker             // std::array<uint8_t, 32> hmac
232*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.hmac = body.motion.hmac;
233*38e8c45fSAndroid Build Coastguard Worker             // int32_t action
234*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.action = body.motion.action;
235*38e8c45fSAndroid Build Coastguard Worker             // int32_t actionButton
236*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.actionButton = body.motion.actionButton;
237*38e8c45fSAndroid Build Coastguard Worker             // int32_t flags
238*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.flags = body.motion.flags;
239*38e8c45fSAndroid Build Coastguard Worker             // int32_t metaState
240*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.metaState = body.motion.metaState;
241*38e8c45fSAndroid Build Coastguard Worker             // int32_t buttonState
242*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.buttonState = body.motion.buttonState;
243*38e8c45fSAndroid Build Coastguard Worker             // MotionClassification classification
244*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.classification = body.motion.classification;
245*38e8c45fSAndroid Build Coastguard Worker             // int32_t edgeFlags
246*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.edgeFlags = body.motion.edgeFlags;
247*38e8c45fSAndroid Build Coastguard Worker             // nsecs_t downTime
248*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.downTime = body.motion.downTime;
249*38e8c45fSAndroid Build Coastguard Worker 
250*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.dsdx = body.motion.dsdx;
251*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.dtdx = body.motion.dtdx;
252*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.dtdy = body.motion.dtdy;
253*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.dsdy = body.motion.dsdy;
254*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.tx = body.motion.tx;
255*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.ty = body.motion.ty;
256*38e8c45fSAndroid Build Coastguard Worker 
257*38e8c45fSAndroid Build Coastguard Worker             // float xPrecision
258*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.xPrecision = body.motion.xPrecision;
259*38e8c45fSAndroid Build Coastguard Worker             // float yPrecision
260*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.yPrecision = body.motion.yPrecision;
261*38e8c45fSAndroid Build Coastguard Worker             // float xCursorPosition
262*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.xCursorPosition = body.motion.xCursorPosition;
263*38e8c45fSAndroid Build Coastguard Worker             // float yCursorPosition
264*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.yCursorPosition = body.motion.yCursorPosition;
265*38e8c45fSAndroid Build Coastguard Worker 
266*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.dsdxRaw = body.motion.dsdxRaw;
267*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.dtdxRaw = body.motion.dtdxRaw;
268*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.dtdyRaw = body.motion.dtdyRaw;
269*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.dsdyRaw = body.motion.dsdyRaw;
270*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.txRaw = body.motion.txRaw;
271*38e8c45fSAndroid Build Coastguard Worker             msg->body.motion.tyRaw = body.motion.tyRaw;
272*38e8c45fSAndroid Build Coastguard Worker 
273*38e8c45fSAndroid Build Coastguard Worker             //struct Pointer pointers[MAX_POINTERS]
274*38e8c45fSAndroid Build Coastguard Worker             for (size_t i = 0; i < body.motion.pointerCount; i++) {
275*38e8c45fSAndroid Build Coastguard Worker                 // PointerProperties properties
276*38e8c45fSAndroid Build Coastguard Worker                 msg->body.motion.pointers[i].properties.id = body.motion.pointers[i].properties.id;
277*38e8c45fSAndroid Build Coastguard Worker                 msg->body.motion.pointers[i].properties.toolType =
278*38e8c45fSAndroid Build Coastguard Worker                         body.motion.pointers[i].properties.toolType,
279*38e8c45fSAndroid Build Coastguard Worker                 // PointerCoords coords
280*38e8c45fSAndroid Build Coastguard Worker                 msg->body.motion.pointers[i].coords.bits = body.motion.pointers[i].coords.bits;
281*38e8c45fSAndroid Build Coastguard Worker                 const uint32_t count = BitSet64::count(body.motion.pointers[i].coords.bits);
282*38e8c45fSAndroid Build Coastguard Worker                 memcpy(&msg->body.motion.pointers[i].coords.values[0],
283*38e8c45fSAndroid Build Coastguard Worker                         &body.motion.pointers[i].coords.values[0],
284*38e8c45fSAndroid Build Coastguard Worker                         count * (sizeof(body.motion.pointers[i].coords.values[0])));
285*38e8c45fSAndroid Build Coastguard Worker                 msg->body.motion.pointers[i].coords.isResampled =
286*38e8c45fSAndroid Build Coastguard Worker                         body.motion.pointers[i].coords.isResampled;
287*38e8c45fSAndroid Build Coastguard Worker             }
288*38e8c45fSAndroid Build Coastguard Worker             break;
289*38e8c45fSAndroid Build Coastguard Worker         }
290*38e8c45fSAndroid Build Coastguard Worker         case InputMessage::Type::FINISHED: {
291*38e8c45fSAndroid Build Coastguard Worker             msg->body.finished.handled = body.finished.handled;
292*38e8c45fSAndroid Build Coastguard Worker             msg->body.finished.consumeTime = body.finished.consumeTime;
293*38e8c45fSAndroid Build Coastguard Worker             break;
294*38e8c45fSAndroid Build Coastguard Worker         }
295*38e8c45fSAndroid Build Coastguard Worker         case InputMessage::Type::FOCUS: {
296*38e8c45fSAndroid Build Coastguard Worker             msg->body.focus.eventId = body.focus.eventId;
297*38e8c45fSAndroid Build Coastguard Worker             msg->body.focus.hasFocus = body.focus.hasFocus;
298*38e8c45fSAndroid Build Coastguard Worker             break;
299*38e8c45fSAndroid Build Coastguard Worker         }
300*38e8c45fSAndroid Build Coastguard Worker         case InputMessage::Type::CAPTURE: {
301*38e8c45fSAndroid Build Coastguard Worker             msg->body.capture.eventId = body.capture.eventId;
302*38e8c45fSAndroid Build Coastguard Worker             msg->body.capture.pointerCaptureEnabled = body.capture.pointerCaptureEnabled;
303*38e8c45fSAndroid Build Coastguard Worker             break;
304*38e8c45fSAndroid Build Coastguard Worker         }
305*38e8c45fSAndroid Build Coastguard Worker         case InputMessage::Type::DRAG: {
306*38e8c45fSAndroid Build Coastguard Worker             msg->body.drag.eventId = body.drag.eventId;
307*38e8c45fSAndroid Build Coastguard Worker             msg->body.drag.x = body.drag.x;
308*38e8c45fSAndroid Build Coastguard Worker             msg->body.drag.y = body.drag.y;
309*38e8c45fSAndroid Build Coastguard Worker             msg->body.drag.isExiting = body.drag.isExiting;
310*38e8c45fSAndroid Build Coastguard Worker             break;
311*38e8c45fSAndroid Build Coastguard Worker         }
312*38e8c45fSAndroid Build Coastguard Worker         case InputMessage::Type::TIMELINE: {
313*38e8c45fSAndroid Build Coastguard Worker             msg->body.timeline.eventId = body.timeline.eventId;
314*38e8c45fSAndroid Build Coastguard Worker             msg->body.timeline.graphicsTimeline = body.timeline.graphicsTimeline;
315*38e8c45fSAndroid Build Coastguard Worker             break;
316*38e8c45fSAndroid Build Coastguard Worker         }
317*38e8c45fSAndroid Build Coastguard Worker         case InputMessage::Type::TOUCH_MODE: {
318*38e8c45fSAndroid Build Coastguard Worker             msg->body.touchMode.eventId = body.touchMode.eventId;
319*38e8c45fSAndroid Build Coastguard Worker             msg->body.touchMode.isInTouchMode = body.touchMode.isInTouchMode;
320*38e8c45fSAndroid Build Coastguard Worker         }
321*38e8c45fSAndroid Build Coastguard Worker     }
322*38e8c45fSAndroid Build Coastguard Worker }
323*38e8c45fSAndroid Build Coastguard Worker 
324*38e8c45fSAndroid Build Coastguard Worker // --- InputChannel ---
325*38e8c45fSAndroid Build Coastguard Worker 
create(const std::string & name,android::base::unique_fd fd,sp<IBinder> token)326*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<InputChannel> InputChannel::create(const std::string& name,
327*38e8c45fSAndroid Build Coastguard Worker                                                    android::base::unique_fd fd, sp<IBinder> token) {
328*38e8c45fSAndroid Build Coastguard Worker     const int result = fcntl(fd, F_SETFL, O_NONBLOCK);
329*38e8c45fSAndroid Build Coastguard Worker     if (result != 0) {
330*38e8c45fSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("channel '%s' ~ Could not make socket non-blocking: %s", name.c_str(),
331*38e8c45fSAndroid Build Coastguard Worker                          strerror(errno));
332*38e8c45fSAndroid Build Coastguard Worker         return nullptr;
333*38e8c45fSAndroid Build Coastguard Worker     }
334*38e8c45fSAndroid Build Coastguard Worker     // using 'new' to access a non-public constructor
335*38e8c45fSAndroid Build Coastguard Worker     return std::unique_ptr<InputChannel>(new InputChannel(name, std::move(fd), token));
336*38e8c45fSAndroid Build Coastguard Worker }
337*38e8c45fSAndroid Build Coastguard Worker 
create(android::os::InputChannelCore && parceledChannel)338*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<InputChannel> InputChannel::create(
339*38e8c45fSAndroid Build Coastguard Worker         android::os::InputChannelCore&& parceledChannel) {
340*38e8c45fSAndroid Build Coastguard Worker     return InputChannel::create(parceledChannel.name, parceledChannel.fd.release(),
341*38e8c45fSAndroid Build Coastguard Worker                                 parceledChannel.token);
342*38e8c45fSAndroid Build Coastguard Worker }
343*38e8c45fSAndroid Build Coastguard Worker 
InputChannel(const std::string name,android::base::unique_fd fd,sp<IBinder> token)344*38e8c45fSAndroid Build Coastguard Worker InputChannel::InputChannel(const std::string name, android::base::unique_fd fd, sp<IBinder> token) {
345*38e8c45fSAndroid Build Coastguard Worker     this->name = std::move(name);
346*38e8c45fSAndroid Build Coastguard Worker     this->fd.reset(std::move(fd));
347*38e8c45fSAndroid Build Coastguard Worker     this->token = std::move(token);
348*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(DEBUG_CHANNEL_LIFECYCLE, "Input channel constructed: name='%s', fd=%d",
349*38e8c45fSAndroid Build Coastguard Worker              getName().c_str(), getFd());
350*38e8c45fSAndroid Build Coastguard Worker }
351*38e8c45fSAndroid Build Coastguard Worker 
~InputChannel()352*38e8c45fSAndroid Build Coastguard Worker InputChannel::~InputChannel() {
353*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(DEBUG_CHANNEL_LIFECYCLE, "Input channel destroyed: name='%s', fd=%d",
354*38e8c45fSAndroid Build Coastguard Worker              getName().c_str(), getFd());
355*38e8c45fSAndroid Build Coastguard Worker }
356*38e8c45fSAndroid Build Coastguard Worker 
openInputChannelPair(const std::string & name,std::unique_ptr<InputChannel> & outServerChannel,std::unique_ptr<InputChannel> & outClientChannel)357*38e8c45fSAndroid Build Coastguard Worker status_t InputChannel::openInputChannelPair(const std::string& name,
358*38e8c45fSAndroid Build Coastguard Worker                                             std::unique_ptr<InputChannel>& outServerChannel,
359*38e8c45fSAndroid Build Coastguard Worker                                             std::unique_ptr<InputChannel>& outClientChannel) {
360*38e8c45fSAndroid Build Coastguard Worker     int sockets[2];
361*38e8c45fSAndroid Build Coastguard Worker     if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) {
362*38e8c45fSAndroid Build Coastguard Worker         status_t result = -errno;
363*38e8c45fSAndroid Build Coastguard Worker         ALOGE("channel '%s' ~ Could not create socket pair.  errno=%s(%d)", name.c_str(),
364*38e8c45fSAndroid Build Coastguard Worker               strerror(errno), errno);
365*38e8c45fSAndroid Build Coastguard Worker         outServerChannel.reset();
366*38e8c45fSAndroid Build Coastguard Worker         outClientChannel.reset();
367*38e8c45fSAndroid Build Coastguard Worker         return result;
368*38e8c45fSAndroid Build Coastguard Worker     }
369*38e8c45fSAndroid Build Coastguard Worker 
370*38e8c45fSAndroid Build Coastguard Worker     int bufferSize = SOCKET_BUFFER_SIZE;
371*38e8c45fSAndroid Build Coastguard Worker     setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
372*38e8c45fSAndroid Build Coastguard Worker     setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
373*38e8c45fSAndroid Build Coastguard Worker     setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
374*38e8c45fSAndroid Build Coastguard Worker     setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
375*38e8c45fSAndroid Build Coastguard Worker 
376*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> token = sp<BBinder>::make();
377*38e8c45fSAndroid Build Coastguard Worker 
378*38e8c45fSAndroid Build Coastguard Worker     android::base::unique_fd serverFd(sockets[0]);
379*38e8c45fSAndroid Build Coastguard Worker     outServerChannel = InputChannel::create(name, std::move(serverFd), token);
380*38e8c45fSAndroid Build Coastguard Worker 
381*38e8c45fSAndroid Build Coastguard Worker     android::base::unique_fd clientFd(sockets[1]);
382*38e8c45fSAndroid Build Coastguard Worker     outClientChannel = InputChannel::create(name, std::move(clientFd), token);
383*38e8c45fSAndroid Build Coastguard Worker     return OK;
384*38e8c45fSAndroid Build Coastguard Worker }
385*38e8c45fSAndroid Build Coastguard Worker 
sendMessage(const InputMessage * msg)386*38e8c45fSAndroid Build Coastguard Worker status_t InputChannel::sendMessage(const InputMessage* msg) {
387*38e8c45fSAndroid Build Coastguard Worker     ATRACE_NAME_IF(ATRACE_ENABLED(),
388*38e8c45fSAndroid Build Coastguard Worker                    StringPrintf("sendMessage(inputChannel=%s, seq=0x%" PRIx32 ", type=%s)",
389*38e8c45fSAndroid Build Coastguard Worker                                 name.c_str(), msg->header.seq,
390*38e8c45fSAndroid Build Coastguard Worker                                 ftl::enum_string(msg->header.type).c_str()));
391*38e8c45fSAndroid Build Coastguard Worker     const size_t msgLength = msg->size();
392*38e8c45fSAndroid Build Coastguard Worker     InputMessage cleanMsg;
393*38e8c45fSAndroid Build Coastguard Worker     msg->getSanitizedCopy(&cleanMsg);
394*38e8c45fSAndroid Build Coastguard Worker     ssize_t nWrite;
395*38e8c45fSAndroid Build Coastguard Worker     do {
396*38e8c45fSAndroid Build Coastguard Worker         nWrite = ::send(getFd(), &cleanMsg, msgLength, MSG_DONTWAIT | MSG_NOSIGNAL);
397*38e8c45fSAndroid Build Coastguard Worker     } while (nWrite == -1 && errno == EINTR);
398*38e8c45fSAndroid Build Coastguard Worker 
399*38e8c45fSAndroid Build Coastguard Worker     if (nWrite < 0) {
400*38e8c45fSAndroid Build Coastguard Worker         int error = errno;
401*38e8c45fSAndroid Build Coastguard Worker         ALOGD_IF(DEBUG_CHANNEL_MESSAGES, "channel '%s' ~ error sending message of type %s, %s",
402*38e8c45fSAndroid Build Coastguard Worker                  name.c_str(), ftl::enum_string(msg->header.type).c_str(), strerror(error));
403*38e8c45fSAndroid Build Coastguard Worker         if (error == EAGAIN || error == EWOULDBLOCK) {
404*38e8c45fSAndroid Build Coastguard Worker             return WOULD_BLOCK;
405*38e8c45fSAndroid Build Coastguard Worker         }
406*38e8c45fSAndroid Build Coastguard Worker         if (error == EPIPE || error == ENOTCONN || error == ECONNREFUSED || error == ECONNRESET) {
407*38e8c45fSAndroid Build Coastguard Worker             return DEAD_OBJECT;
408*38e8c45fSAndroid Build Coastguard Worker         }
409*38e8c45fSAndroid Build Coastguard Worker         return -error;
410*38e8c45fSAndroid Build Coastguard Worker     }
411*38e8c45fSAndroid Build Coastguard Worker 
412*38e8c45fSAndroid Build Coastguard Worker     if (size_t(nWrite) != msgLength) {
413*38e8c45fSAndroid Build Coastguard Worker         ALOGD_IF(DEBUG_CHANNEL_MESSAGES,
414*38e8c45fSAndroid Build Coastguard Worker                  "channel '%s' ~ error sending message type %s, send was incomplete", name.c_str(),
415*38e8c45fSAndroid Build Coastguard Worker                  ftl::enum_string(msg->header.type).c_str());
416*38e8c45fSAndroid Build Coastguard Worker         return DEAD_OBJECT;
417*38e8c45fSAndroid Build Coastguard Worker     }
418*38e8c45fSAndroid Build Coastguard Worker 
419*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(DEBUG_CHANNEL_MESSAGES, "channel '%s' ~ sent message of type %s", name.c_str(),
420*38e8c45fSAndroid Build Coastguard Worker              ftl::enum_string(msg->header.type).c_str());
421*38e8c45fSAndroid Build Coastguard Worker 
422*38e8c45fSAndroid Build Coastguard Worker     return OK;
423*38e8c45fSAndroid Build Coastguard Worker }
424*38e8c45fSAndroid Build Coastguard Worker 
receiveMessage()425*38e8c45fSAndroid Build Coastguard Worker android::base::Result<InputMessage> InputChannel::receiveMessage() {
426*38e8c45fSAndroid Build Coastguard Worker     ssize_t nRead;
427*38e8c45fSAndroid Build Coastguard Worker     InputMessage msg;
428*38e8c45fSAndroid Build Coastguard Worker     do {
429*38e8c45fSAndroid Build Coastguard Worker         nRead = ::recv(getFd(), &msg, sizeof(InputMessage), MSG_DONTWAIT);
430*38e8c45fSAndroid Build Coastguard Worker     } while (nRead == -1 && errno == EINTR);
431*38e8c45fSAndroid Build Coastguard Worker 
432*38e8c45fSAndroid Build Coastguard Worker     if (nRead < 0) {
433*38e8c45fSAndroid Build Coastguard Worker         int error = errno;
434*38e8c45fSAndroid Build Coastguard Worker         ALOGD_IF(DEBUG_CHANNEL_MESSAGES, "channel '%s' ~ receive message failed, errno=%d",
435*38e8c45fSAndroid Build Coastguard Worker                  name.c_str(), errno);
436*38e8c45fSAndroid Build Coastguard Worker         if (error == EAGAIN || error == EWOULDBLOCK) {
437*38e8c45fSAndroid Build Coastguard Worker             return android::base::Error(WOULD_BLOCK);
438*38e8c45fSAndroid Build Coastguard Worker         }
439*38e8c45fSAndroid Build Coastguard Worker         if (error == EPIPE || error == ENOTCONN || error == ECONNREFUSED) {
440*38e8c45fSAndroid Build Coastguard Worker             return android::base::Error(DEAD_OBJECT);
441*38e8c45fSAndroid Build Coastguard Worker         }
442*38e8c45fSAndroid Build Coastguard Worker         return android::base::Error(-error);
443*38e8c45fSAndroid Build Coastguard Worker     }
444*38e8c45fSAndroid Build Coastguard Worker 
445*38e8c45fSAndroid Build Coastguard Worker     if (nRead == 0) { // check for EOF
446*38e8c45fSAndroid Build Coastguard Worker         ALOGD_IF(DEBUG_CHANNEL_MESSAGES,
447*38e8c45fSAndroid Build Coastguard Worker                  "channel '%s' ~ receive message failed because peer was closed", name.c_str());
448*38e8c45fSAndroid Build Coastguard Worker         return android::base::Error(DEAD_OBJECT);
449*38e8c45fSAndroid Build Coastguard Worker     }
450*38e8c45fSAndroid Build Coastguard Worker 
451*38e8c45fSAndroid Build Coastguard Worker     if (!msg.isValid(nRead)) {
452*38e8c45fSAndroid Build Coastguard Worker         ALOGE("channel '%s' ~ received invalid message of size %zd", name.c_str(), nRead);
453*38e8c45fSAndroid Build Coastguard Worker         return android::base::Error(BAD_VALUE);
454*38e8c45fSAndroid Build Coastguard Worker     }
455*38e8c45fSAndroid Build Coastguard Worker 
456*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(DEBUG_CHANNEL_MESSAGES, "channel '%s' ~ received message of type %s", name.c_str(),
457*38e8c45fSAndroid Build Coastguard Worker              ftl::enum_string(msg.header.type).c_str());
458*38e8c45fSAndroid Build Coastguard Worker     if (ATRACE_ENABLED()) {
459*38e8c45fSAndroid Build Coastguard Worker         // Add an additional trace point to include data about the received message.
460*38e8c45fSAndroid Build Coastguard Worker         std::string message =
461*38e8c45fSAndroid Build Coastguard Worker                 StringPrintf("receiveMessage(inputChannel=%s, seq=0x%" PRIx32 ", type=%s)",
462*38e8c45fSAndroid Build Coastguard Worker                              name.c_str(), msg.header.seq,
463*38e8c45fSAndroid Build Coastguard Worker                              ftl::enum_string(msg.header.type).c_str());
464*38e8c45fSAndroid Build Coastguard Worker         ATRACE_NAME(message.c_str());
465*38e8c45fSAndroid Build Coastguard Worker     }
466*38e8c45fSAndroid Build Coastguard Worker     return msg;
467*38e8c45fSAndroid Build Coastguard Worker }
468*38e8c45fSAndroid Build Coastguard Worker 
probablyHasInput() const469*38e8c45fSAndroid Build Coastguard Worker bool InputChannel::probablyHasInput() const {
470*38e8c45fSAndroid Build Coastguard Worker     struct pollfd pfds = {.fd = fd.get(), .events = POLLIN};
471*38e8c45fSAndroid Build Coastguard Worker     if (::poll(&pfds, /*nfds=*/1, /*timeout=*/0) <= 0) {
472*38e8c45fSAndroid Build Coastguard Worker         // This can be a false negative because EINTR and ENOMEM are not handled. The latter should
473*38e8c45fSAndroid Build Coastguard Worker         // be extremely rare. The EINTR is also unlikely because it happens only when the signal
474*38e8c45fSAndroid Build Coastguard Worker         // arrives while the syscall is executed, and the syscall is quick. Hitting EINTR too often
475*38e8c45fSAndroid Build Coastguard Worker         // would be a sign of having too many signals, which is a bigger performance problem. A
476*38e8c45fSAndroid Build Coastguard Worker         // common tradition is to repeat the syscall on each EINTR, but it is not necessary here.
477*38e8c45fSAndroid Build Coastguard Worker         // In other words, the missing one liner is replaced by a multiline explanation.
478*38e8c45fSAndroid Build Coastguard Worker         return false;
479*38e8c45fSAndroid Build Coastguard Worker     }
480*38e8c45fSAndroid Build Coastguard Worker     // From poll(2): The bits returned in |revents| can include any of those specified in |events|,
481*38e8c45fSAndroid Build Coastguard Worker     // or one of the values POLLERR, POLLHUP, or POLLNVAL.
482*38e8c45fSAndroid Build Coastguard Worker     return (pfds.revents & POLLIN) != 0;
483*38e8c45fSAndroid Build Coastguard Worker }
484*38e8c45fSAndroid Build Coastguard Worker 
waitForMessage(std::chrono::milliseconds timeout) const485*38e8c45fSAndroid Build Coastguard Worker void InputChannel::waitForMessage(std::chrono::milliseconds timeout) const {
486*38e8c45fSAndroid Build Coastguard Worker     if (timeout < 0ms) {
487*38e8c45fSAndroid Build Coastguard Worker         LOG(FATAL) << "Timeout cannot be negative, received " << timeout.count();
488*38e8c45fSAndroid Build Coastguard Worker     }
489*38e8c45fSAndroid Build Coastguard Worker     struct pollfd pfds = {.fd = fd.get(), .events = POLLIN};
490*38e8c45fSAndroid Build Coastguard Worker     int ret;
491*38e8c45fSAndroid Build Coastguard Worker     std::chrono::time_point<std::chrono::steady_clock> stopTime =
492*38e8c45fSAndroid Build Coastguard Worker             std::chrono::steady_clock::now() + timeout;
493*38e8c45fSAndroid Build Coastguard Worker     std::chrono::milliseconds remaining = timeout;
494*38e8c45fSAndroid Build Coastguard Worker     do {
495*38e8c45fSAndroid Build Coastguard Worker         ret = ::poll(&pfds, /*nfds=*/1, /*timeout=*/remaining.count());
496*38e8c45fSAndroid Build Coastguard Worker         remaining = std::chrono::duration_cast<std::chrono::milliseconds>(
497*38e8c45fSAndroid Build Coastguard Worker                 stopTime - std::chrono::steady_clock::now());
498*38e8c45fSAndroid Build Coastguard Worker     } while (ret == -1 && errno == EINTR && remaining > 0ms);
499*38e8c45fSAndroid Build Coastguard Worker }
500*38e8c45fSAndroid Build Coastguard Worker 
dup() const501*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<InputChannel> InputChannel::dup() const {
502*38e8c45fSAndroid Build Coastguard Worker     base::unique_fd newFd(dupChannelFd(fd.get()));
503*38e8c45fSAndroid Build Coastguard Worker     return InputChannel::create(getName(), std::move(newFd), getConnectionToken());
504*38e8c45fSAndroid Build Coastguard Worker }
505*38e8c45fSAndroid Build Coastguard Worker 
copyTo(android::os::InputChannelCore & outChannel) const506*38e8c45fSAndroid Build Coastguard Worker void InputChannel::copyTo(android::os::InputChannelCore& outChannel) const {
507*38e8c45fSAndroid Build Coastguard Worker     outChannel.name = getName();
508*38e8c45fSAndroid Build Coastguard Worker     outChannel.fd.reset(dupChannelFd(fd.get()));
509*38e8c45fSAndroid Build Coastguard Worker     outChannel.token = getConnectionToken();
510*38e8c45fSAndroid Build Coastguard Worker }
511*38e8c45fSAndroid Build Coastguard Worker 
moveChannel(std::unique_ptr<InputChannel> from,android::os::InputChannelCore & outChannel)512*38e8c45fSAndroid Build Coastguard Worker void InputChannel::moveChannel(std::unique_ptr<InputChannel> from,
513*38e8c45fSAndroid Build Coastguard Worker                                android::os::InputChannelCore& outChannel) {
514*38e8c45fSAndroid Build Coastguard Worker     outChannel.name = from->getName();
515*38e8c45fSAndroid Build Coastguard Worker     outChannel.fd = android::os::ParcelFileDescriptor(std::move(from->fd));
516*38e8c45fSAndroid Build Coastguard Worker     outChannel.token = from->getConnectionToken();
517*38e8c45fSAndroid Build Coastguard Worker }
518*38e8c45fSAndroid Build Coastguard Worker 
getConnectionToken() const519*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> InputChannel::getConnectionToken() const {
520*38e8c45fSAndroid Build Coastguard Worker     return token;
521*38e8c45fSAndroid Build Coastguard Worker }
522*38e8c45fSAndroid Build Coastguard Worker 
523*38e8c45fSAndroid Build Coastguard Worker // --- InputPublisher ---
524*38e8c45fSAndroid Build Coastguard Worker 
InputPublisher(const std::shared_ptr<InputChannel> & channel)525*38e8c45fSAndroid Build Coastguard Worker InputPublisher::InputPublisher(const std::shared_ptr<InputChannel>& channel)
526*38e8c45fSAndroid Build Coastguard Worker       : mChannel(channel), mInputVerifier(mChannel->getName()) {}
527*38e8c45fSAndroid Build Coastguard Worker 
~InputPublisher()528*38e8c45fSAndroid Build Coastguard Worker InputPublisher::~InputPublisher() {
529*38e8c45fSAndroid Build Coastguard Worker }
530*38e8c45fSAndroid Build Coastguard Worker 
publishKeyEvent(uint32_t seq,int32_t eventId,int32_t deviceId,int32_t source,ui::LogicalDisplayId displayId,std::array<uint8_t,32> hmac,int32_t action,int32_t flags,int32_t keyCode,int32_t scanCode,int32_t metaState,int32_t repeatCount,nsecs_t downTime,nsecs_t eventTime)531*38e8c45fSAndroid Build Coastguard Worker status_t InputPublisher::publishKeyEvent(uint32_t seq, int32_t eventId, int32_t deviceId,
532*38e8c45fSAndroid Build Coastguard Worker                                          int32_t source, ui::LogicalDisplayId displayId,
533*38e8c45fSAndroid Build Coastguard Worker                                          std::array<uint8_t, 32> hmac, int32_t action,
534*38e8c45fSAndroid Build Coastguard Worker                                          int32_t flags, int32_t keyCode, int32_t scanCode,
535*38e8c45fSAndroid Build Coastguard Worker                                          int32_t metaState, int32_t repeatCount, nsecs_t downTime,
536*38e8c45fSAndroid Build Coastguard Worker                                          nsecs_t eventTime) {
537*38e8c45fSAndroid Build Coastguard Worker     ATRACE_NAME_IF(ATRACE_ENABLED(),
538*38e8c45fSAndroid Build Coastguard Worker                    StringPrintf("publishKeyEvent(inputChannel=%s, action=%s, keyCode=%s)",
539*38e8c45fSAndroid Build Coastguard Worker                                 mChannel->getName().c_str(), KeyEvent::actionToString(action),
540*38e8c45fSAndroid Build Coastguard Worker                                 KeyEvent::getLabel(keyCode)));
541*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(debugTransportPublisher(),
542*38e8c45fSAndroid Build Coastguard Worker              "channel '%s' publisher ~ %s: seq=%u, id=%d, deviceId=%d, source=%s, "
543*38e8c45fSAndroid Build Coastguard Worker              "action=%s, flags=0x%x, keyCode=%s, scanCode=%d, metaState=0x%x, repeatCount=%d,"
544*38e8c45fSAndroid Build Coastguard Worker              "downTime=%" PRId64 ", eventTime=%" PRId64,
545*38e8c45fSAndroid Build Coastguard Worker              mChannel->getName().c_str(), __func__, seq, eventId, deviceId,
546*38e8c45fSAndroid Build Coastguard Worker              inputEventSourceToString(source).c_str(), KeyEvent::actionToString(action), flags,
547*38e8c45fSAndroid Build Coastguard Worker              KeyEvent::getLabel(keyCode), scanCode, metaState, repeatCount, downTime, eventTime);
548*38e8c45fSAndroid Build Coastguard Worker 
549*38e8c45fSAndroid Build Coastguard Worker     if (!seq) {
550*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Attempted to publish a key event with sequence number 0.");
551*38e8c45fSAndroid Build Coastguard Worker         return BAD_VALUE;
552*38e8c45fSAndroid Build Coastguard Worker     }
553*38e8c45fSAndroid Build Coastguard Worker 
554*38e8c45fSAndroid Build Coastguard Worker     InputMessage msg;
555*38e8c45fSAndroid Build Coastguard Worker     msg.header.type = InputMessage::Type::KEY;
556*38e8c45fSAndroid Build Coastguard Worker     msg.header.seq = seq;
557*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.eventId = eventId;
558*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.deviceId = deviceId;
559*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.source = source;
560*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.displayId = displayId.val();
561*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.hmac = std::move(hmac);
562*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.action = action;
563*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.flags = flags;
564*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.keyCode = keyCode;
565*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.scanCode = scanCode;
566*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.metaState = metaState;
567*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.repeatCount = repeatCount;
568*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.downTime = downTime;
569*38e8c45fSAndroid Build Coastguard Worker     msg.body.key.eventTime = eventTime;
570*38e8c45fSAndroid Build Coastguard Worker     return mChannel->sendMessage(&msg);
571*38e8c45fSAndroid Build Coastguard Worker }
572*38e8c45fSAndroid Build Coastguard Worker 
publishMotionEvent(uint32_t seq,int32_t eventId,int32_t deviceId,int32_t source,ui::LogicalDisplayId displayId,std::array<uint8_t,32> hmac,int32_t action,int32_t actionButton,int32_t flags,int32_t edgeFlags,int32_t metaState,int32_t buttonState,MotionClassification classification,const ui::Transform & transform,float xPrecision,float yPrecision,float xCursorPosition,float yCursorPosition,const ui::Transform & rawTransform,nsecs_t downTime,nsecs_t eventTime,uint32_t pointerCount,const PointerProperties * pointerProperties,const PointerCoords * pointerCoords)573*38e8c45fSAndroid Build Coastguard Worker status_t InputPublisher::publishMotionEvent(
574*38e8c45fSAndroid Build Coastguard Worker         uint32_t seq, int32_t eventId, int32_t deviceId, int32_t source,
575*38e8c45fSAndroid Build Coastguard Worker         ui::LogicalDisplayId displayId, std::array<uint8_t, 32> hmac, int32_t action,
576*38e8c45fSAndroid Build Coastguard Worker         int32_t actionButton, int32_t flags, int32_t edgeFlags, int32_t metaState,
577*38e8c45fSAndroid Build Coastguard Worker         int32_t buttonState, MotionClassification classification, const ui::Transform& transform,
578*38e8c45fSAndroid Build Coastguard Worker         float xPrecision, float yPrecision, float xCursorPosition, float yCursorPosition,
579*38e8c45fSAndroid Build Coastguard Worker         const ui::Transform& rawTransform, nsecs_t downTime, nsecs_t eventTime,
580*38e8c45fSAndroid Build Coastguard Worker         uint32_t pointerCount, const PointerProperties* pointerProperties,
581*38e8c45fSAndroid Build Coastguard Worker         const PointerCoords* pointerCoords) {
582*38e8c45fSAndroid Build Coastguard Worker     ATRACE_NAME_IF(ATRACE_ENABLED(),
583*38e8c45fSAndroid Build Coastguard Worker                    StringPrintf("publishMotionEvent(inputChannel=%s, action=%s)",
584*38e8c45fSAndroid Build Coastguard Worker                                 mChannel->getName().c_str(),
585*38e8c45fSAndroid Build Coastguard Worker                                 MotionEvent::actionToString(action).c_str()));
586*38e8c45fSAndroid Build Coastguard Worker     if (debugTransportPublisher()) {
587*38e8c45fSAndroid Build Coastguard Worker         std::string transformString;
588*38e8c45fSAndroid Build Coastguard Worker         transform.dump(transformString, "transform", "        ");
589*38e8c45fSAndroid Build Coastguard Worker         ALOGD("channel '%s' publisher ~ %s: seq=%u, id=%d, deviceId=%d, source=%s, "
590*38e8c45fSAndroid Build Coastguard Worker               "displayId=%s, "
591*38e8c45fSAndroid Build Coastguard Worker               "action=%s, actionButton=0x%08x, flags=0x%x, edgeFlags=0x%x, "
592*38e8c45fSAndroid Build Coastguard Worker               "metaState=0x%x, buttonState=0x%x, classification=%s,"
593*38e8c45fSAndroid Build Coastguard Worker               "xPrecision=%f, yPrecision=%f, downTime=%" PRId64 ", eventTime=%" PRId64 ", "
594*38e8c45fSAndroid Build Coastguard Worker               "pointerCount=%" PRIu32 "\n%s",
595*38e8c45fSAndroid Build Coastguard Worker               mChannel->getName().c_str(), __func__, seq, eventId, deviceId,
596*38e8c45fSAndroid Build Coastguard Worker               inputEventSourceToString(source).c_str(), displayId.toString().c_str(),
597*38e8c45fSAndroid Build Coastguard Worker               MotionEvent::actionToString(action).c_str(), actionButton, flags, edgeFlags,
598*38e8c45fSAndroid Build Coastguard Worker               metaState, buttonState, motionClassificationToString(classification), xPrecision,
599*38e8c45fSAndroid Build Coastguard Worker               yPrecision, downTime, eventTime, pointerCount, transformString.c_str());
600*38e8c45fSAndroid Build Coastguard Worker     }
601*38e8c45fSAndroid Build Coastguard Worker 
602*38e8c45fSAndroid Build Coastguard Worker     if (!seq) {
603*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Attempted to publish a motion event with sequence number 0.");
604*38e8c45fSAndroid Build Coastguard Worker         return BAD_VALUE;
605*38e8c45fSAndroid Build Coastguard Worker     }
606*38e8c45fSAndroid Build Coastguard Worker 
607*38e8c45fSAndroid Build Coastguard Worker     if (pointerCount > MAX_POINTERS || pointerCount < 1) {
608*38e8c45fSAndroid Build Coastguard Worker         ALOGE("channel '%s' publisher ~ Invalid number of pointers provided: %" PRIu32 ".",
609*38e8c45fSAndroid Build Coastguard Worker                 mChannel->getName().c_str(), pointerCount);
610*38e8c45fSAndroid Build Coastguard Worker         return BAD_VALUE;
611*38e8c45fSAndroid Build Coastguard Worker     }
612*38e8c45fSAndroid Build Coastguard Worker 
613*38e8c45fSAndroid Build Coastguard Worker     InputMessage msg;
614*38e8c45fSAndroid Build Coastguard Worker     msg.header.type = InputMessage::Type::MOTION;
615*38e8c45fSAndroid Build Coastguard Worker     msg.header.seq = seq;
616*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.eventId = eventId;
617*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.deviceId = deviceId;
618*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.source = source;
619*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.displayId = displayId.val();
620*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.hmac = std::move(hmac);
621*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.action = action;
622*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.actionButton = actionButton;
623*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.flags = flags;
624*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.edgeFlags = edgeFlags;
625*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.metaState = metaState;
626*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.buttonState = buttonState;
627*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.classification = classification;
628*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.dsdx = transform.dsdx();
629*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.dtdx = transform.dtdx();
630*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.dtdy = transform.dtdy();
631*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.dsdy = transform.dsdy();
632*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.tx = transform.tx();
633*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.ty = transform.ty();
634*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.xPrecision = xPrecision;
635*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.yPrecision = yPrecision;
636*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.xCursorPosition = xCursorPosition;
637*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.yCursorPosition = yCursorPosition;
638*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.dsdxRaw = rawTransform.dsdx();
639*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.dtdxRaw = rawTransform.dtdx();
640*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.dtdyRaw = rawTransform.dtdy();
641*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.dsdyRaw = rawTransform.dsdy();
642*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.txRaw = rawTransform.tx();
643*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.tyRaw = rawTransform.ty();
644*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.downTime = downTime;
645*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.eventTime = eventTime;
646*38e8c45fSAndroid Build Coastguard Worker     msg.body.motion.pointerCount = pointerCount;
647*38e8c45fSAndroid Build Coastguard Worker     for (uint32_t i = 0; i < pointerCount; i++) {
648*38e8c45fSAndroid Build Coastguard Worker         msg.body.motion.pointers[i].properties = pointerProperties[i];
649*38e8c45fSAndroid Build Coastguard Worker         msg.body.motion.pointers[i].coords = pointerCoords[i];
650*38e8c45fSAndroid Build Coastguard Worker     }
651*38e8c45fSAndroid Build Coastguard Worker     const status_t status = mChannel->sendMessage(&msg);
652*38e8c45fSAndroid Build Coastguard Worker 
653*38e8c45fSAndroid Build Coastguard Worker     if (status == OK && verifyEvents()) {
654*38e8c45fSAndroid Build Coastguard Worker         Result<void> result =
655*38e8c45fSAndroid Build Coastguard Worker                 mInputVerifier.processMovement(deviceId, source, action, pointerCount,
656*38e8c45fSAndroid Build Coastguard Worker                                                pointerProperties, pointerCoords, flags);
657*38e8c45fSAndroid Build Coastguard Worker         if (!result.ok()) {
658*38e8c45fSAndroid Build Coastguard Worker             LOG(ERROR) << "Bad stream: " << result.error();
659*38e8c45fSAndroid Build Coastguard Worker             return BAD_VALUE;
660*38e8c45fSAndroid Build Coastguard Worker         }
661*38e8c45fSAndroid Build Coastguard Worker     }
662*38e8c45fSAndroid Build Coastguard Worker     return status;
663*38e8c45fSAndroid Build Coastguard Worker }
664*38e8c45fSAndroid Build Coastguard Worker 
publishFocusEvent(uint32_t seq,int32_t eventId,bool hasFocus)665*38e8c45fSAndroid Build Coastguard Worker status_t InputPublisher::publishFocusEvent(uint32_t seq, int32_t eventId, bool hasFocus) {
666*38e8c45fSAndroid Build Coastguard Worker     ATRACE_NAME_IF(ATRACE_ENABLED(),
667*38e8c45fSAndroid Build Coastguard Worker                    StringPrintf("publishFocusEvent(inputChannel=%s, hasFocus=%s)",
668*38e8c45fSAndroid Build Coastguard Worker                                 mChannel->getName().c_str(), toString(hasFocus)));
669*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(debugTransportPublisher(), "channel '%s' publisher ~ %s: seq=%u, id=%d, hasFocus=%s",
670*38e8c45fSAndroid Build Coastguard Worker              mChannel->getName().c_str(), __func__, seq, eventId, toString(hasFocus));
671*38e8c45fSAndroid Build Coastguard Worker 
672*38e8c45fSAndroid Build Coastguard Worker     InputMessage msg;
673*38e8c45fSAndroid Build Coastguard Worker     msg.header.type = InputMessage::Type::FOCUS;
674*38e8c45fSAndroid Build Coastguard Worker     msg.header.seq = seq;
675*38e8c45fSAndroid Build Coastguard Worker     msg.body.focus.eventId = eventId;
676*38e8c45fSAndroid Build Coastguard Worker     msg.body.focus.hasFocus = hasFocus;
677*38e8c45fSAndroid Build Coastguard Worker     return mChannel->sendMessage(&msg);
678*38e8c45fSAndroid Build Coastguard Worker }
679*38e8c45fSAndroid Build Coastguard Worker 
publishCaptureEvent(uint32_t seq,int32_t eventId,bool pointerCaptureEnabled)680*38e8c45fSAndroid Build Coastguard Worker status_t InputPublisher::publishCaptureEvent(uint32_t seq, int32_t eventId,
681*38e8c45fSAndroid Build Coastguard Worker                                              bool pointerCaptureEnabled) {
682*38e8c45fSAndroid Build Coastguard Worker     ATRACE_NAME_IF(ATRACE_ENABLED(),
683*38e8c45fSAndroid Build Coastguard Worker                    StringPrintf("publishCaptureEvent(inputChannel=%s, pointerCaptureEnabled=%s)",
684*38e8c45fSAndroid Build Coastguard Worker                                 mChannel->getName().c_str(), toString(pointerCaptureEnabled)));
685*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(debugTransportPublisher(),
686*38e8c45fSAndroid Build Coastguard Worker              "channel '%s' publisher ~ %s: seq=%u, id=%d, pointerCaptureEnabled=%s",
687*38e8c45fSAndroid Build Coastguard Worker              mChannel->getName().c_str(), __func__, seq, eventId, toString(pointerCaptureEnabled));
688*38e8c45fSAndroid Build Coastguard Worker 
689*38e8c45fSAndroid Build Coastguard Worker     InputMessage msg;
690*38e8c45fSAndroid Build Coastguard Worker     msg.header.type = InputMessage::Type::CAPTURE;
691*38e8c45fSAndroid Build Coastguard Worker     msg.header.seq = seq;
692*38e8c45fSAndroid Build Coastguard Worker     msg.body.capture.eventId = eventId;
693*38e8c45fSAndroid Build Coastguard Worker     msg.body.capture.pointerCaptureEnabled = pointerCaptureEnabled;
694*38e8c45fSAndroid Build Coastguard Worker     return mChannel->sendMessage(&msg);
695*38e8c45fSAndroid Build Coastguard Worker }
696*38e8c45fSAndroid Build Coastguard Worker 
publishDragEvent(uint32_t seq,int32_t eventId,float x,float y,bool isExiting)697*38e8c45fSAndroid Build Coastguard Worker status_t InputPublisher::publishDragEvent(uint32_t seq, int32_t eventId, float x, float y,
698*38e8c45fSAndroid Build Coastguard Worker                                           bool isExiting) {
699*38e8c45fSAndroid Build Coastguard Worker     ATRACE_NAME_IF(ATRACE_ENABLED(),
700*38e8c45fSAndroid Build Coastguard Worker                    StringPrintf("publishDragEvent(inputChannel=%s, x=%f, y=%f, isExiting=%s)",
701*38e8c45fSAndroid Build Coastguard Worker                                 mChannel->getName().c_str(), x, y, toString(isExiting)));
702*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(debugTransportPublisher(),
703*38e8c45fSAndroid Build Coastguard Worker              "channel '%s' publisher ~ %s: seq=%u, id=%d, x=%f, y=%f, isExiting=%s",
704*38e8c45fSAndroid Build Coastguard Worker              mChannel->getName().c_str(), __func__, seq, eventId, x, y, toString(isExiting));
705*38e8c45fSAndroid Build Coastguard Worker 
706*38e8c45fSAndroid Build Coastguard Worker     InputMessage msg;
707*38e8c45fSAndroid Build Coastguard Worker     msg.header.type = InputMessage::Type::DRAG;
708*38e8c45fSAndroid Build Coastguard Worker     msg.header.seq = seq;
709*38e8c45fSAndroid Build Coastguard Worker     msg.body.drag.eventId = eventId;
710*38e8c45fSAndroid Build Coastguard Worker     msg.body.drag.isExiting = isExiting;
711*38e8c45fSAndroid Build Coastguard Worker     msg.body.drag.x = x;
712*38e8c45fSAndroid Build Coastguard Worker     msg.body.drag.y = y;
713*38e8c45fSAndroid Build Coastguard Worker     return mChannel->sendMessage(&msg);
714*38e8c45fSAndroid Build Coastguard Worker }
715*38e8c45fSAndroid Build Coastguard Worker 
publishTouchModeEvent(uint32_t seq,int32_t eventId,bool isInTouchMode)716*38e8c45fSAndroid Build Coastguard Worker status_t InputPublisher::publishTouchModeEvent(uint32_t seq, int32_t eventId, bool isInTouchMode) {
717*38e8c45fSAndroid Build Coastguard Worker     ATRACE_NAME_IF(ATRACE_ENABLED(),
718*38e8c45fSAndroid Build Coastguard Worker                    StringPrintf("publishTouchModeEvent(inputChannel=%s, isInTouchMode=%s)",
719*38e8c45fSAndroid Build Coastguard Worker                                 mChannel->getName().c_str(), toString(isInTouchMode)));
720*38e8c45fSAndroid Build Coastguard Worker     ALOGD_IF(debugTransportPublisher(),
721*38e8c45fSAndroid Build Coastguard Worker              "channel '%s' publisher ~ %s: seq=%u, id=%d, isInTouchMode=%s",
722*38e8c45fSAndroid Build Coastguard Worker              mChannel->getName().c_str(), __func__, seq, eventId, toString(isInTouchMode));
723*38e8c45fSAndroid Build Coastguard Worker 
724*38e8c45fSAndroid Build Coastguard Worker     InputMessage msg;
725*38e8c45fSAndroid Build Coastguard Worker     msg.header.type = InputMessage::Type::TOUCH_MODE;
726*38e8c45fSAndroid Build Coastguard Worker     msg.header.seq = seq;
727*38e8c45fSAndroid Build Coastguard Worker     msg.body.touchMode.eventId = eventId;
728*38e8c45fSAndroid Build Coastguard Worker     msg.body.touchMode.isInTouchMode = isInTouchMode;
729*38e8c45fSAndroid Build Coastguard Worker     return mChannel->sendMessage(&msg);
730*38e8c45fSAndroid Build Coastguard Worker }
731*38e8c45fSAndroid Build Coastguard Worker 
receiveConsumerResponse()732*38e8c45fSAndroid Build Coastguard Worker android::base::Result<InputPublisher::ConsumerResponse> InputPublisher::receiveConsumerResponse() {
733*38e8c45fSAndroid Build Coastguard Worker     android::base::Result<InputMessage> result = mChannel->receiveMessage();
734*38e8c45fSAndroid Build Coastguard Worker     if (!result.ok()) {
735*38e8c45fSAndroid Build Coastguard Worker         if (debugTransportPublisher() && result.error().code() != WOULD_BLOCK) {
736*38e8c45fSAndroid Build Coastguard Worker             LOG(INFO) << "channel '" << mChannel->getName() << "' publisher ~ " << __func__ << ": "
737*38e8c45fSAndroid Build Coastguard Worker                       << result.error().message();
738*38e8c45fSAndroid Build Coastguard Worker         }
739*38e8c45fSAndroid Build Coastguard Worker         return result.error();
740*38e8c45fSAndroid Build Coastguard Worker     }
741*38e8c45fSAndroid Build Coastguard Worker 
742*38e8c45fSAndroid Build Coastguard Worker     const InputMessage& msg = *result;
743*38e8c45fSAndroid Build Coastguard Worker     if (msg.header.type == InputMessage::Type::FINISHED) {
744*38e8c45fSAndroid Build Coastguard Worker         ALOGD_IF(debugTransportPublisher(),
745*38e8c45fSAndroid Build Coastguard Worker                  "channel '%s' publisher ~ %s: finished: seq=%u, handled=%s",
746*38e8c45fSAndroid Build Coastguard Worker                  mChannel->getName().c_str(), __func__, msg.header.seq,
747*38e8c45fSAndroid Build Coastguard Worker                  toString(msg.body.finished.handled));
748*38e8c45fSAndroid Build Coastguard Worker         return Finished{
749*38e8c45fSAndroid Build Coastguard Worker                 .seq = msg.header.seq,
750*38e8c45fSAndroid Build Coastguard Worker                 .handled = msg.body.finished.handled,
751*38e8c45fSAndroid Build Coastguard Worker                 .consumeTime = msg.body.finished.consumeTime,
752*38e8c45fSAndroid Build Coastguard Worker         };
753*38e8c45fSAndroid Build Coastguard Worker     }
754*38e8c45fSAndroid Build Coastguard Worker 
755*38e8c45fSAndroid Build Coastguard Worker     if (msg.header.type == InputMessage::Type::TIMELINE) {
756*38e8c45fSAndroid Build Coastguard Worker         ALOGD_IF(debugTransportPublisher(), "channel '%s' publisher ~ %s: timeline: id=%d",
757*38e8c45fSAndroid Build Coastguard Worker                  mChannel->getName().c_str(), __func__, msg.body.timeline.eventId);
758*38e8c45fSAndroid Build Coastguard Worker         return Timeline{
759*38e8c45fSAndroid Build Coastguard Worker                 .inputEventId = msg.body.timeline.eventId,
760*38e8c45fSAndroid Build Coastguard Worker                 .graphicsTimeline = msg.body.timeline.graphicsTimeline,
761*38e8c45fSAndroid Build Coastguard Worker         };
762*38e8c45fSAndroid Build Coastguard Worker     }
763*38e8c45fSAndroid Build Coastguard Worker 
764*38e8c45fSAndroid Build Coastguard Worker     ALOGE("channel '%s' publisher ~ Received unexpected %s message from consumer",
765*38e8c45fSAndroid Build Coastguard Worker           mChannel->getName().c_str(), ftl::enum_string(msg.header.type).c_str());
766*38e8c45fSAndroid Build Coastguard Worker     return android::base::Error(UNKNOWN_ERROR);
767*38e8c45fSAndroid Build Coastguard Worker }
768*38e8c45fSAndroid Build Coastguard Worker 
769*38e8c45fSAndroid Build Coastguard Worker } // namespace android
770