blob: bac681df8538b3c017b966ad0ad13abbd5d8534e [file] [log] [blame]
Jeff Brown5912f952013-07-01 19:10:31 -07001//
2// Copyright 2010 The Android Open Source Project
3//
4// Provides a shared memory transport for input events.
5//
6#define LOG_TAG "InputTransport"
Zimd8402b62023-06-02 11:56:26 +01007#define ATRACE_TAG ATRACE_TAG_INPUT
Jeff Brown5912f952013-07-01 19:10:31 -07008
Jeff Brown5912f952013-07-01 19:10:31 -07009#include <errno.h>
10#include <fcntl.h>
Michael Wrightd0a4a622014-06-09 19:03:32 -070011#include <inttypes.h>
Jeff Brown5912f952013-07-01 19:10:31 -070012#include <math.h>
Egor Paskoa0d32af2023-12-14 17:45:41 +010013#include <poll.h>
Jeff Brown5912f952013-07-01 19:10:31 -070014#include <sys/socket.h>
Mark Salyzyna5e161b2016-09-29 08:08:05 -070015#include <sys/types.h>
Jeff Brown5912f952013-07-01 19:10:31 -070016#include <unistd.h>
17
Siarhei Vishniakou5c02a712023-05-15 15:45:02 -070018#include <android-base/logging.h>
Prabir Pradhanb2bd83c2023-02-23 02:34:40 +000019#include <android-base/properties.h>
Michael Wright3dd60e22019-03-27 22:06:44 +000020#include <android-base/stringprintf.h>
21#include <binder/Parcel.h>
Jeff Brown5912f952013-07-01 19:10:31 -070022#include <cutils/properties.h>
Dominik Laskowski75788452021-02-09 18:51:25 -080023#include <ftl/enum.h>
Mark Salyzyn7823e122016-09-29 08:08:05 -070024#include <log/log.h>
Michael Wright3dd60e22019-03-27 22:06:44 +000025#include <utils/Trace.h>
Mark Salyzyn7823e122016-09-29 08:08:05 -070026
Siarhei Vishniakou96818962023-08-23 10:19:02 -070027#include <com_android_input_flags.h>
Jeff Brown5912f952013-07-01 19:10:31 -070028#include <input/InputTransport.h>
Siarhei Vishniakou6c1e6222024-03-07 13:39:24 -080029#include <input/PrintTools.h>
Prabir Pradhana37bad12023-08-18 15:55:32 +000030#include <input/TraceTools.h>
Jeff Brown5912f952013-07-01 19:10:31 -070031
Siarhei Vishniakou96818962023-08-23 10:19:02 -070032namespace input_flags = com::android::input::flags;
33
Siarhei Vishniakou9dbf6372024-03-06 16:08:01 -080034namespace android {
35
Prabir Pradhan60dd97a2023-02-23 02:23:02 +000036namespace {
37
38/**
39 * Log debug messages about channel messages (send message, receive message).
40 * Enable this via "adb shell setprop log.tag.InputTransportMessages DEBUG"
41 * (requires restart)
42 */
43const bool DEBUG_CHANNEL_MESSAGES =
44 __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "Messages", ANDROID_LOG_INFO);
45
46/**
47 * Log debug messages whenever InputChannel objects are created/destroyed.
48 * Enable this via "adb shell setprop log.tag.InputTransportLifecycle DEBUG"
49 * (requires restart)
50 */
51const bool DEBUG_CHANNEL_LIFECYCLE =
52 __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "Lifecycle", ANDROID_LOG_INFO);
53
Prabir Pradhanb2bd83c2023-02-23 02:34:40 +000054const bool IS_DEBUGGABLE_BUILD =
55#if defined(__ANDROID__)
56 android::base::GetBoolProperty("ro.debuggable", false);
57#else
58 true;
59#endif
60
Prabir Pradhan60dd97a2023-02-23 02:23:02 +000061/**
62 * Log debug messages relating to the producer end of the transport channel.
Prabir Pradhanb2bd83c2023-02-23 02:34:40 +000063 * Enable this via "adb shell setprop log.tag.InputTransportPublisher DEBUG".
64 * This requires a restart on non-debuggable (e.g. user) builds, but should take effect immediately
65 * on debuggable builds (e.g. userdebug).
Prabir Pradhan60dd97a2023-02-23 02:23:02 +000066 */
Prabir Pradhanb2bd83c2023-02-23 02:34:40 +000067bool debugTransportPublisher() {
68 if (!IS_DEBUGGABLE_BUILD) {
69 static const bool DEBUG_TRANSPORT_PUBLISHER =
70 __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "Publisher", ANDROID_LOG_INFO);
71 return DEBUG_TRANSPORT_PUBLISHER;
72 }
73 return __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "Publisher", ANDROID_LOG_INFO);
74}
Prabir Pradhan60dd97a2023-02-23 02:23:02 +000075
Siarhei Vishniakou8d660132024-01-11 16:48:44 -080076android::base::unique_fd dupChannelFd(int fd) {
77 android::base::unique_fd newFd(::dup(fd));
78 if (!newFd.ok()) {
79 ALOGE("Could not duplicate fd %i : %s", fd, strerror(errno));
80 const bool hitFdLimit = errno == EMFILE || errno == ENFILE;
81 // If this process is out of file descriptors, then throwing that might end up exploding
82 // on the other side of a binder call, which isn't really helpful.
83 // Better to just crash here and hope that the FD leak is slow.
84 // Other failures could be client errors, so we still propagate those back to the caller.
85 LOG_ALWAYS_FATAL_IF(hitFdLimit, "Too many open files, could not duplicate input channel");
86 return {};
87 }
88 return newFd;
89}
90
Jeff Brown5912f952013-07-01 19:10:31 -070091// Socket buffer size. The default is typically about 128KB, which is much larger than
92// we really need. So we make it smaller. It just needs to be big enough to hold
93// a few dozen large multi-finger motion events in the case where an application gets
94// behind processing touches.
Siarhei Vishniakou0438ca82024-03-12 14:27:25 -070095constexpr size_t SOCKET_BUFFER_SIZE = 32 * 1024;
Siarhei Vishniakoub5433e92019-02-21 09:27:39 -060096
Siarhei Vishniakou92c8fd52023-01-29 14:57:43 -080097/**
98 * Crash if the events that are getting sent to the InputPublisher are inconsistent.
99 * Enable this via "adb shell setprop log.tag.InputTransportVerifyEvents DEBUG"
100 */
Siarhei Vishniakou6c1e6222024-03-07 13:39:24 -0800101bool verifyEvents() {
Siarhei Vishniakou96818962023-08-23 10:19:02 -0700102 return input_flags::enable_outbound_event_verification() ||
103 __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG "VerifyEvents", ANDROID_LOG_INFO);
Siarhei Vishniakou92c8fd52023-01-29 14:57:43 -0800104}
105
Siarhei Vishniakou6c1e6222024-03-07 13:39:24 -0800106} // namespace
107
108using android::base::Result;
109using android::base::StringPrintf;
110
Jeff Brown5912f952013-07-01 19:10:31 -0700111// --- InputMessage ---
112
113bool InputMessage::isValid(size_t actualSize) const {
Siarhei Vishniakoudbdb6732021-04-26 19:40:26 +0000114 if (size() != actualSize) {
115 ALOGE("Received message of incorrect size %zu (expected %zu)", actualSize, size());
116 return false;
117 }
118
119 switch (header.type) {
120 case Type::KEY:
121 return true;
122 case Type::MOTION: {
123 const bool valid =
124 body.motion.pointerCount > 0 && body.motion.pointerCount <= MAX_POINTERS;
125 if (!valid) {
126 ALOGE("Received invalid MOTION: pointerCount = %" PRIu32, body.motion.pointerCount);
127 }
128 return valid;
129 }
130 case Type::FINISHED:
131 case Type::FOCUS:
132 case Type::CAPTURE:
133 case Type::DRAG:
Antonio Kantek7cdf8ef2021-07-13 18:04:53 -0700134 case Type::TOUCH_MODE:
Siarhei Vishniakoudbdb6732021-04-26 19:40:26 +0000135 return true;
136 case Type::TIMELINE: {
137 const nsecs_t gpuCompletedTime =
138 body.timeline.graphicsTimeline[GraphicsTimeline::GPU_COMPLETED_TIME];
139 const nsecs_t presentTime =
140 body.timeline.graphicsTimeline[GraphicsTimeline::PRESENT_TIME];
141 const bool valid = presentTime > gpuCompletedTime;
142 if (!valid) {
143 ALOGE("Received invalid TIMELINE: gpuCompletedTime = %" PRId64
144 " presentTime = %" PRId64,
145 gpuCompletedTime, presentTime);
146 }
147 return valid;
Jeff Brown5912f952013-07-01 19:10:31 -0700148 }
149 }
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000150 ALOGE("Invalid message type: %s", ftl::enum_string(header.type).c_str());
Jeff Brown5912f952013-07-01 19:10:31 -0700151 return false;
152}
153
154size_t InputMessage::size() const {
155 switch (header.type) {
Siarhei Vishniakou52402772019-10-22 09:32:30 -0700156 case Type::KEY:
157 return sizeof(Header) + body.key.size();
158 case Type::MOTION:
159 return sizeof(Header) + body.motion.size();
160 case Type::FINISHED:
161 return sizeof(Header) + body.finished.size();
Siarhei Vishniakou7feb2ea2019-11-25 15:11:23 -0800162 case Type::FOCUS:
163 return sizeof(Header) + body.focus.size();
Prabir Pradhan3f37b7b2020-11-10 16:50:18 -0800164 case Type::CAPTURE:
165 return sizeof(Header) + body.capture.size();
arthurhung7632c332020-12-30 16:58:01 +0800166 case Type::DRAG:
167 return sizeof(Header) + body.drag.size();
Siarhei Vishniakouf94ae022021-02-04 01:23:17 +0000168 case Type::TIMELINE:
169 return sizeof(Header) + body.timeline.size();
Antonio Kantek7cdf8ef2021-07-13 18:04:53 -0700170 case Type::TOUCH_MODE:
171 return sizeof(Header) + body.touchMode.size();
Jeff Brown5912f952013-07-01 19:10:31 -0700172 }
173 return sizeof(Header);
174}
175
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800176/**
177 * There could be non-zero bytes in-between InputMessage fields. Force-initialize the entire
178 * memory to zero, then only copy the valid bytes on a per-field basis.
179 */
180void InputMessage::getSanitizedCopy(InputMessage* msg) const {
181 memset(msg, 0, sizeof(*msg));
182
183 // Write the header
184 msg->header.type = header.type;
Siarhei Vishniakoua64c1592020-06-22 12:02:29 -0500185 msg->header.seq = header.seq;
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800186
187 // Write the body
188 switch(header.type) {
Siarhei Vishniakou52402772019-10-22 09:32:30 -0700189 case InputMessage::Type::KEY: {
Garfield Tan1c7bc862020-01-28 13:24:04 -0800190 // int32_t eventId
191 msg->body.key.eventId = body.key.eventId;
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800192 // nsecs_t eventTime
193 msg->body.key.eventTime = body.key.eventTime;
194 // int32_t deviceId
195 msg->body.key.deviceId = body.key.deviceId;
196 // int32_t source
197 msg->body.key.source = body.key.source;
198 // int32_t displayId
199 msg->body.key.displayId = body.key.displayId;
Siarhei Vishniakou9c858ac2020-01-23 14:20:11 -0600200 // std::array<uint8_t, 32> hmac
201 msg->body.key.hmac = body.key.hmac;
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800202 // int32_t action
203 msg->body.key.action = body.key.action;
204 // int32_t flags
205 msg->body.key.flags = body.key.flags;
206 // int32_t keyCode
207 msg->body.key.keyCode = body.key.keyCode;
208 // int32_t scanCode
209 msg->body.key.scanCode = body.key.scanCode;
210 // int32_t metaState
211 msg->body.key.metaState = body.key.metaState;
212 // int32_t repeatCount
213 msg->body.key.repeatCount = body.key.repeatCount;
214 // nsecs_t downTime
215 msg->body.key.downTime = body.key.downTime;
216 break;
217 }
Siarhei Vishniakou52402772019-10-22 09:32:30 -0700218 case InputMessage::Type::MOTION: {
Garfield Tan1c7bc862020-01-28 13:24:04 -0800219 // int32_t eventId
220 msg->body.motion.eventId = body.motion.eventId;
Prabir Pradhanb9b18502021-08-26 12:30:32 -0700221 // uint32_t pointerCount
222 msg->body.motion.pointerCount = body.motion.pointerCount;
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800223 // nsecs_t eventTime
224 msg->body.motion.eventTime = body.motion.eventTime;
225 // int32_t deviceId
226 msg->body.motion.deviceId = body.motion.deviceId;
227 // int32_t source
228 msg->body.motion.source = body.motion.source;
229 // int32_t displayId
230 msg->body.motion.displayId = body.motion.displayId;
Siarhei Vishniakou9c858ac2020-01-23 14:20:11 -0600231 // std::array<uint8_t, 32> hmac
232 msg->body.motion.hmac = body.motion.hmac;
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800233 // int32_t action
234 msg->body.motion.action = body.motion.action;
235 // int32_t actionButton
236 msg->body.motion.actionButton = body.motion.actionButton;
237 // int32_t flags
238 msg->body.motion.flags = body.motion.flags;
239 // int32_t metaState
240 msg->body.motion.metaState = body.motion.metaState;
241 // int32_t buttonState
242 msg->body.motion.buttonState = body.motion.buttonState;
Siarhei Vishniakou16a2e302019-01-14 19:21:45 -0800243 // MotionClassification classification
244 msg->body.motion.classification = body.motion.classification;
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800245 // int32_t edgeFlags
246 msg->body.motion.edgeFlags = body.motion.edgeFlags;
247 // nsecs_t downTime
248 msg->body.motion.downTime = body.motion.downTime;
chaviw9eaa22c2020-07-01 16:21:27 -0700249
250 msg->body.motion.dsdx = body.motion.dsdx;
251 msg->body.motion.dtdx = body.motion.dtdx;
252 msg->body.motion.dtdy = body.motion.dtdy;
253 msg->body.motion.dsdy = body.motion.dsdy;
254 msg->body.motion.tx = body.motion.tx;
255 msg->body.motion.ty = body.motion.ty;
256
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800257 // float xPrecision
258 msg->body.motion.xPrecision = body.motion.xPrecision;
259 // float yPrecision
260 msg->body.motion.yPrecision = body.motion.yPrecision;
Garfield Tan00f511d2019-06-12 16:55:40 -0700261 // float xCursorPosition
262 msg->body.motion.xCursorPosition = body.motion.xCursorPosition;
263 // float yCursorPosition
264 msg->body.motion.yCursorPosition = body.motion.yCursorPosition;
Prabir Pradhanb9b18502021-08-26 12:30:32 -0700265
266 msg->body.motion.dsdxRaw = body.motion.dsdxRaw;
267 msg->body.motion.dtdxRaw = body.motion.dtdxRaw;
268 msg->body.motion.dtdyRaw = body.motion.dtdyRaw;
269 msg->body.motion.dsdyRaw = body.motion.dsdyRaw;
270 msg->body.motion.txRaw = body.motion.txRaw;
271 msg->body.motion.tyRaw = body.motion.tyRaw;
272
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800273 //struct Pointer pointers[MAX_POINTERS]
274 for (size_t i = 0; i < body.motion.pointerCount; i++) {
275 // PointerProperties properties
276 msg->body.motion.pointers[i].properties.id = body.motion.pointers[i].properties.id;
277 msg->body.motion.pointers[i].properties.toolType =
278 body.motion.pointers[i].properties.toolType,
279 // PointerCoords coords
280 msg->body.motion.pointers[i].coords.bits = body.motion.pointers[i].coords.bits;
281 const uint32_t count = BitSet64::count(body.motion.pointers[i].coords.bits);
282 memcpy(&msg->body.motion.pointers[i].coords.values[0],
283 &body.motion.pointers[i].coords.values[0],
284 count * (sizeof(body.motion.pointers[i].coords.values[0])));
Philip Quinnafb31282022-12-20 18:17:55 -0800285 msg->body.motion.pointers[i].coords.isResampled =
286 body.motion.pointers[i].coords.isResampled;
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800287 }
288 break;
289 }
Siarhei Vishniakou52402772019-10-22 09:32:30 -0700290 case InputMessage::Type::FINISHED: {
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800291 msg->body.finished.handled = body.finished.handled;
Siarhei Vishniakou3531ae72021-02-02 12:12:27 -1000292 msg->body.finished.consumeTime = body.finished.consumeTime;
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800293 break;
294 }
Siarhei Vishniakou7feb2ea2019-11-25 15:11:23 -0800295 case InputMessage::Type::FOCUS: {
Garfield Tan1c7bc862020-01-28 13:24:04 -0800296 msg->body.focus.eventId = body.focus.eventId;
Siarhei Vishniakou7feb2ea2019-11-25 15:11:23 -0800297 msg->body.focus.hasFocus = body.focus.hasFocus;
Siarhei Vishniakou7feb2ea2019-11-25 15:11:23 -0800298 break;
299 }
Prabir Pradhan3f37b7b2020-11-10 16:50:18 -0800300 case InputMessage::Type::CAPTURE: {
301 msg->body.capture.eventId = body.capture.eventId;
302 msg->body.capture.pointerCaptureEnabled = body.capture.pointerCaptureEnabled;
303 break;
304 }
arthurhung7632c332020-12-30 16:58:01 +0800305 case InputMessage::Type::DRAG: {
306 msg->body.drag.eventId = body.drag.eventId;
307 msg->body.drag.x = body.drag.x;
308 msg->body.drag.y = body.drag.y;
309 msg->body.drag.isExiting = body.drag.isExiting;
310 break;
311 }
Siarhei Vishniakouf94ae022021-02-04 01:23:17 +0000312 case InputMessage::Type::TIMELINE: {
313 msg->body.timeline.eventId = body.timeline.eventId;
314 msg->body.timeline.graphicsTimeline = body.timeline.graphicsTimeline;
315 break;
316 }
Antonio Kantek7cdf8ef2021-07-13 18:04:53 -0700317 case InputMessage::Type::TOUCH_MODE: {
318 msg->body.touchMode.eventId = body.touchMode.eventId;
319 msg->body.touchMode.isInTouchMode = body.touchMode.isInTouchMode;
320 }
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800321 }
322}
Jeff Brown5912f952013-07-01 19:10:31 -0700323
324// --- InputChannel ---
325
Siarhei Vishniakoud2588272020-07-10 11:15:40 -0500326std::unique_ptr<InputChannel> InputChannel::create(const std::string& name,
Siarhei Vishniakouce5ab082020-07-09 17:03:21 -0500327 android::base::unique_fd fd, sp<IBinder> token) {
Josh Gao2ccbe3a2019-08-09 14:35:36 -0700328 const int result = fcntl(fd, F_SETFL, O_NONBLOCK);
329 if (result != 0) {
330 LOG_ALWAYS_FATAL("channel '%s' ~ Could not make socket non-blocking: %s", name.c_str(),
331 strerror(errno));
332 return nullptr;
333 }
Siarhei Vishniakouce5ab082020-07-09 17:03:21 -0500334 // using 'new' to access a non-public constructor
Siarhei Vishniakoud2588272020-07-10 11:15:40 -0500335 return std::unique_ptr<InputChannel>(new InputChannel(name, std::move(fd), token));
Josh Gao2ccbe3a2019-08-09 14:35:36 -0700336}
337
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800338std::unique_ptr<InputChannel> InputChannel::create(
339 android::os::InputChannelCore&& parceledChannel) {
340 return InputChannel::create(parceledChannel.name, parceledChannel.fd.release(),
341 parceledChannel.token);
342}
343
344InputChannel::InputChannel(const std::string name, android::base::unique_fd fd, sp<IBinder> token) {
345 this->name = std::move(name);
346 this->fd.reset(std::move(fd));
347 this->token = std::move(token);
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000348 ALOGD_IF(DEBUG_CHANNEL_LIFECYCLE, "Input channel constructed: name='%s', fd=%d",
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800349 getName().c_str(), getFd());
Jeff Brown5912f952013-07-01 19:10:31 -0700350}
351
352InputChannel::~InputChannel() {
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000353 ALOGD_IF(DEBUG_CHANNEL_LIFECYCLE, "Input channel destroyed: name='%s', fd=%d",
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800354 getName().c_str(), getFd());
Robert Carr3720ed02018-08-08 16:08:27 -0700355}
356
Siarhei Vishniakouf93fcf42017-11-22 16:00:14 -0800357status_t InputChannel::openInputChannelPair(const std::string& name,
Siarhei Vishniakoud2588272020-07-10 11:15:40 -0500358 std::unique_ptr<InputChannel>& outServerChannel,
359 std::unique_ptr<InputChannel>& outClientChannel) {
Jeff Brown5912f952013-07-01 19:10:31 -0700360 int sockets[2];
361 if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) {
362 status_t result = -errno;
Siarhei Vishniakou09b02ac2021-04-14 22:24:04 +0000363 ALOGE("channel '%s' ~ Could not create socket pair. errno=%s(%d)", name.c_str(),
364 strerror(errno), errno);
Siarhei Vishniakouce5ab082020-07-09 17:03:21 -0500365 outServerChannel.reset();
366 outClientChannel.reset();
Jeff Brown5912f952013-07-01 19:10:31 -0700367 return result;
368 }
369
370 int bufferSize = SOCKET_BUFFER_SIZE;
371 setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
372 setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
373 setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
374 setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
375
Siarhei Vishniakou4c155eb2023-06-30 11:47:12 -0700376 sp<IBinder> token = sp<BBinder>::make();
Siarhei Vishniakou26d3cfb2019-10-15 17:02:32 -0700377
Josh Gao2ccbe3a2019-08-09 14:35:36 -0700378 std::string serverChannelName = name + " (server)";
379 android::base::unique_fd serverFd(sockets[0]);
Siarhei Vishniakou26d3cfb2019-10-15 17:02:32 -0700380 outServerChannel = InputChannel::create(serverChannelName, std::move(serverFd), token);
Jeff Brown5912f952013-07-01 19:10:31 -0700381
Josh Gao2ccbe3a2019-08-09 14:35:36 -0700382 std::string clientChannelName = name + " (client)";
383 android::base::unique_fd clientFd(sockets[1]);
Siarhei Vishniakou26d3cfb2019-10-15 17:02:32 -0700384 outClientChannel = InputChannel::create(clientChannelName, std::move(clientFd), token);
Jeff Brown5912f952013-07-01 19:10:31 -0700385 return OK;
386}
387
388status_t InputChannel::sendMessage(const InputMessage* msg) {
Prabir Pradhan2dac8b82023-09-06 01:11:51 +0000389 ATRACE_NAME_IF(ATRACE_ENABLED(),
Harry Cuttsc57cd3c2024-04-24 13:52:55 +0000390 StringPrintf("sendMessage(inputChannel=%s, seq=0x%" PRIx32 ", type=%s)",
391 name.c_str(), msg->header.seq,
392 ftl::enum_string(msg->header.type).c_str()));
Siarhei Vishniakou1f7c0e42018-11-16 22:18:53 -0800393 const size_t msgLength = msg->size();
394 InputMessage cleanMsg;
395 msg->getSanitizedCopy(&cleanMsg);
Jeff Brown5912f952013-07-01 19:10:31 -0700396 ssize_t nWrite;
397 do {
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800398 nWrite = ::send(getFd(), &cleanMsg, msgLength, MSG_DONTWAIT | MSG_NOSIGNAL);
Jeff Brown5912f952013-07-01 19:10:31 -0700399 } while (nWrite == -1 && errno == EINTR);
400
401 if (nWrite < 0) {
402 int error = errno;
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000403 ALOGD_IF(DEBUG_CHANNEL_MESSAGES, "channel '%s' ~ error sending message of type %s, %s",
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800404 name.c_str(), ftl::enum_string(msg->header.type).c_str(), strerror(error));
Jeff Brown5912f952013-07-01 19:10:31 -0700405 if (error == EAGAIN || error == EWOULDBLOCK) {
406 return WOULD_BLOCK;
407 }
408 if (error == EPIPE || error == ENOTCONN || error == ECONNREFUSED || error == ECONNRESET) {
409 return DEAD_OBJECT;
410 }
411 return -error;
412 }
413
414 if (size_t(nWrite) != msgLength) {
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000415 ALOGD_IF(DEBUG_CHANNEL_MESSAGES,
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800416 "channel '%s' ~ error sending message type %s, send was incomplete", name.c_str(),
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000417 ftl::enum_string(msg->header.type).c_str());
Jeff Brown5912f952013-07-01 19:10:31 -0700418 return DEAD_OBJECT;
419 }
420
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800421 ALOGD_IF(DEBUG_CHANNEL_MESSAGES, "channel '%s' ~ sent message of type %s", name.c_str(),
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000422 ftl::enum_string(msg->header.type).c_str());
Zimd8402b62023-06-02 11:56:26 +0100423
Jeff Brown5912f952013-07-01 19:10:31 -0700424 return OK;
425}
426
Paul Ramirez10bae112024-06-18 21:33:33 +0000427android::base::Result<InputMessage> InputChannel::receiveMessage() {
Jeff Brown5912f952013-07-01 19:10:31 -0700428 ssize_t nRead;
Paul Ramirez10bae112024-06-18 21:33:33 +0000429 InputMessage msg;
Jeff Brown5912f952013-07-01 19:10:31 -0700430 do {
Paul Ramirez10bae112024-06-18 21:33:33 +0000431 nRead = ::recv(getFd(), &msg, sizeof(InputMessage), MSG_DONTWAIT);
Jeff Brown5912f952013-07-01 19:10:31 -0700432 } while (nRead == -1 && errno == EINTR);
433
434 if (nRead < 0) {
435 int error = errno;
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000436 ALOGD_IF(DEBUG_CHANNEL_MESSAGES, "channel '%s' ~ receive message failed, errno=%d",
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800437 name.c_str(), errno);
Jeff Brown5912f952013-07-01 19:10:31 -0700438 if (error == EAGAIN || error == EWOULDBLOCK) {
Paul Ramirez10bae112024-06-18 21:33:33 +0000439 return android::base::Error(WOULD_BLOCK);
Jeff Brown5912f952013-07-01 19:10:31 -0700440 }
441 if (error == EPIPE || error == ENOTCONN || error == ECONNREFUSED) {
Paul Ramirez10bae112024-06-18 21:33:33 +0000442 return android::base::Error(DEAD_OBJECT);
Jeff Brown5912f952013-07-01 19:10:31 -0700443 }
Paul Ramirez10bae112024-06-18 21:33:33 +0000444 return android::base::Error(-error);
Jeff Brown5912f952013-07-01 19:10:31 -0700445 }
446
447 if (nRead == 0) { // check for EOF
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000448 ALOGD_IF(DEBUG_CHANNEL_MESSAGES,
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800449 "channel '%s' ~ receive message failed because peer was closed", name.c_str());
Paul Ramirez10bae112024-06-18 21:33:33 +0000450 return android::base::Error(DEAD_OBJECT);
Jeff Brown5912f952013-07-01 19:10:31 -0700451 }
452
Paul Ramirez10bae112024-06-18 21:33:33 +0000453 if (!msg.isValid(nRead)) {
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800454 ALOGE("channel '%s' ~ received invalid message of size %zd", name.c_str(), nRead);
Paul Ramirez10bae112024-06-18 21:33:33 +0000455 return android::base::Error(BAD_VALUE);
Jeff Brown5912f952013-07-01 19:10:31 -0700456 }
457
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800458 ALOGD_IF(DEBUG_CHANNEL_MESSAGES, "channel '%s' ~ received message of type %s", name.c_str(),
Paul Ramirez10bae112024-06-18 21:33:33 +0000459 ftl::enum_string(msg.header.type).c_str());
Zimd8402b62023-06-02 11:56:26 +0100460 if (ATRACE_ENABLED()) {
Prabir Pradhana37bad12023-08-18 15:55:32 +0000461 // Add an additional trace point to include data about the received message.
Harry Cuttsc57cd3c2024-04-24 13:52:55 +0000462 std::string message =
463 StringPrintf("receiveMessage(inputChannel=%s, seq=0x%" PRIx32 ", type=%s)",
Paul Ramirez10bae112024-06-18 21:33:33 +0000464 name.c_str(), msg.header.seq,
465 ftl::enum_string(msg.header.type).c_str());
Zimd8402b62023-06-02 11:56:26 +0100466 ATRACE_NAME(message.c_str());
467 }
Paul Ramirez10bae112024-06-18 21:33:33 +0000468 return msg;
Jeff Brown5912f952013-07-01 19:10:31 -0700469}
470
Egor Paskoa0d32af2023-12-14 17:45:41 +0100471bool InputChannel::probablyHasInput() const {
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800472 struct pollfd pfds = {.fd = fd.get(), .events = POLLIN};
Egor Paskoa0d32af2023-12-14 17:45:41 +0100473 if (::poll(&pfds, /*nfds=*/1, /*timeout=*/0) <= 0) {
Egor Pasko5a67a562024-01-16 16:46:45 +0100474 // This can be a false negative because EINTR and ENOMEM are not handled. The latter should
475 // be extremely rare. The EINTR is also unlikely because it happens only when the signal
476 // arrives while the syscall is executed, and the syscall is quick. Hitting EINTR too often
Egor Paskoa0d32af2023-12-14 17:45:41 +0100477 // would be a sign of having too many signals, which is a bigger performance problem. A
Egor Pasko5a67a562024-01-16 16:46:45 +0100478 // common tradition is to repeat the syscall on each EINTR, but it is not necessary here.
Egor Paskoa0d32af2023-12-14 17:45:41 +0100479 // In other words, the missing one liner is replaced by a multiline explanation.
480 return false;
481 }
482 // From poll(2): The bits returned in |revents| can include any of those specified in |events|,
483 // or one of the values POLLERR, POLLHUP, or POLLNVAL.
484 return (pfds.revents & POLLIN) != 0;
485}
486
Egor Pasko5a67a562024-01-16 16:46:45 +0100487void InputChannel::waitForMessage(std::chrono::milliseconds timeout) const {
488 if (timeout < 0ms) {
489 LOG(FATAL) << "Timeout cannot be negative, received " << timeout.count();
490 }
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800491 struct pollfd pfds = {.fd = fd.get(), .events = POLLIN};
Egor Pasko5a67a562024-01-16 16:46:45 +0100492 int ret;
493 std::chrono::time_point<std::chrono::steady_clock> stopTime =
494 std::chrono::steady_clock::now() + timeout;
495 std::chrono::milliseconds remaining = timeout;
496 do {
497 ret = ::poll(&pfds, /*nfds=*/1, /*timeout=*/remaining.count());
498 remaining = std::chrono::duration_cast<std::chrono::milliseconds>(
499 stopTime - std::chrono::steady_clock::now());
500 } while (ret == -1 && errno == EINTR && remaining > 0ms);
501}
502
Siarhei Vishniakoud2588272020-07-10 11:15:40 -0500503std::unique_ptr<InputChannel> InputChannel::dup() const {
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800504 base::unique_fd newFd(dupChannelFd(fd.get()));
Chris Ye0783e992020-06-02 21:34:49 -0700505 return InputChannel::create(getName(), std::move(newFd), getConnectionToken());
Jeff Brown5912f952013-07-01 19:10:31 -0700506}
507
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800508void InputChannel::copyTo(android::os::InputChannelCore& outChannel) const {
509 outChannel.name = getName();
510 outChannel.fd.reset(dupChannelFd(fd.get()));
511 outChannel.token = getConnectionToken();
Robert Carr3720ed02018-08-08 16:08:27 -0700512}
513
Siarhei Vishniakou7b9f4f52024-02-02 13:07:16 -0800514void InputChannel::moveChannel(std::unique_ptr<InputChannel> from,
515 android::os::InputChannelCore& outChannel) {
516 outChannel.name = from->getName();
517 outChannel.fd = android::os::ParcelFileDescriptor(std::move(from->fd));
518 outChannel.token = from->getConnectionToken();
519}
520
Siarhei Vishniakou26d3cfb2019-10-15 17:02:32 -0700521sp<IBinder> InputChannel::getConnectionToken() const {
Siarhei Vishniakou8d660132024-01-11 16:48:44 -0800522 return token;
Garfield Tan15601662020-09-22 15:32:38 -0700523}
524
Jeff Brown5912f952013-07-01 19:10:31 -0700525// --- InputPublisher ---
526
Siarhei Vishniakou92c8fd52023-01-29 14:57:43 -0800527InputPublisher::InputPublisher(const std::shared_ptr<InputChannel>& channel)
Siarhei Vishniakou7b9f4f52024-02-02 13:07:16 -0800528 : mChannel(channel), mInputVerifier(mChannel->getName()) {}
Jeff Brown5912f952013-07-01 19:10:31 -0700529
530InputPublisher::~InputPublisher() {
531}
532
Garfield Tan1c7bc862020-01-28 13:24:04 -0800533status_t InputPublisher::publishKeyEvent(uint32_t seq, int32_t eventId, int32_t deviceId,
Linnan Li13bf76a2024-05-05 19:18:02 +0800534 int32_t source, ui::LogicalDisplayId displayId,
Garfield Tan1c7bc862020-01-28 13:24:04 -0800535 std::array<uint8_t, 32> hmac, int32_t action,
536 int32_t flags, int32_t keyCode, int32_t scanCode,
537 int32_t metaState, int32_t repeatCount, nsecs_t downTime,
538 nsecs_t eventTime) {
Prabir Pradhan2dac8b82023-09-06 01:11:51 +0000539 ATRACE_NAME_IF(ATRACE_ENABLED(),
540 StringPrintf("publishKeyEvent(inputChannel=%s, action=%s, keyCode=%s)",
541 mChannel->getName().c_str(), KeyEvent::actionToString(action),
542 KeyEvent::getLabel(keyCode)));
Prabir Pradhanb2bd83c2023-02-23 02:34:40 +0000543 ALOGD_IF(debugTransportPublisher(),
Prabir Pradhan96282b02023-02-24 22:36:17 +0000544 "channel '%s' publisher ~ %s: seq=%u, id=%d, deviceId=%d, source=%s, "
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000545 "action=%s, flags=0x%x, keyCode=%s, scanCode=%d, metaState=0x%x, repeatCount=%d,"
546 "downTime=%" PRId64 ", eventTime=%" PRId64,
Prabir Pradhan96282b02023-02-24 22:36:17 +0000547 mChannel->getName().c_str(), __func__, seq, eventId, deviceId,
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000548 inputEventSourceToString(source).c_str(), KeyEvent::actionToString(action), flags,
549 KeyEvent::getLabel(keyCode), scanCode, metaState, repeatCount, downTime, eventTime);
Jeff Brown5912f952013-07-01 19:10:31 -0700550
551 if (!seq) {
552 ALOGE("Attempted to publish a key event with sequence number 0.");
553 return BAD_VALUE;
554 }
555
556 InputMessage msg;
Siarhei Vishniakou52402772019-10-22 09:32:30 -0700557 msg.header.type = InputMessage::Type::KEY;
Siarhei Vishniakoua64c1592020-06-22 12:02:29 -0500558 msg.header.seq = seq;
Garfield Tan1c7bc862020-01-28 13:24:04 -0800559 msg.body.key.eventId = eventId;
Jeff Brown5912f952013-07-01 19:10:31 -0700560 msg.body.key.deviceId = deviceId;
561 msg.body.key.source = source;
Linnan Li13bf76a2024-05-05 19:18:02 +0800562 msg.body.key.displayId = displayId.val();
Edgar Arriagac6ae4bb2020-04-16 18:46:48 -0700563 msg.body.key.hmac = std::move(hmac);
Jeff Brown5912f952013-07-01 19:10:31 -0700564 msg.body.key.action = action;
565 msg.body.key.flags = flags;
566 msg.body.key.keyCode = keyCode;
567 msg.body.key.scanCode = scanCode;
568 msg.body.key.metaState = metaState;
569 msg.body.key.repeatCount = repeatCount;
570 msg.body.key.downTime = downTime;
571 msg.body.key.eventTime = eventTime;
572 return mChannel->sendMessage(&msg);
573}
574
575status_t InputPublisher::publishMotionEvent(
Linnan Li13bf76a2024-05-05 19:18:02 +0800576 uint32_t seq, int32_t eventId, int32_t deviceId, int32_t source,
577 ui::LogicalDisplayId displayId, std::array<uint8_t, 32> hmac, int32_t action,
578 int32_t actionButton, int32_t flags, int32_t edgeFlags, int32_t metaState,
579 int32_t buttonState, MotionClassification classification, const ui::Transform& transform,
580 float xPrecision, float yPrecision, float xCursorPosition, float yCursorPosition,
Prabir Pradhanb9b18502021-08-26 12:30:32 -0700581 const ui::Transform& rawTransform, nsecs_t downTime, nsecs_t eventTime,
Evan Rosky09576692021-07-01 12:22:09 -0700582 uint32_t pointerCount, const PointerProperties* pointerProperties,
583 const PointerCoords* pointerCoords) {
Prabir Pradhan2dac8b82023-09-06 01:11:51 +0000584 ATRACE_NAME_IF(ATRACE_ENABLED(),
585 StringPrintf("publishMotionEvent(inputChannel=%s, action=%s)",
586 mChannel->getName().c_str(),
587 MotionEvent::actionToString(action).c_str()));
Siarhei Vishniakou92c8fd52023-01-29 14:57:43 -0800588 if (verifyEvents()) {
Siarhei Vishniakou5c02a712023-05-15 15:45:02 -0700589 Result<void> result =
Siarhei Vishniakou2d151ac2023-09-19 13:30:24 -0700590 mInputVerifier.processMovement(deviceId, source, action, pointerCount,
591 pointerProperties, pointerCoords, flags);
Siarhei Vishniakou5c02a712023-05-15 15:45:02 -0700592 if (!result.ok()) {
593 LOG(FATAL) << "Bad stream: " << result.error();
594 }
Siarhei Vishniakou92c8fd52023-01-29 14:57:43 -0800595 }
Prabir Pradhanb2bd83c2023-02-23 02:34:40 +0000596 if (debugTransportPublisher()) {
chaviw9eaa22c2020-07-01 16:21:27 -0700597 std::string transformString;
chaviw85b44202020-07-24 11:46:21 -0700598 transform.dump(transformString, "transform", " ");
Prabir Pradhan96282b02023-02-24 22:36:17 +0000599 ALOGD("channel '%s' publisher ~ %s: seq=%u, id=%d, deviceId=%d, source=%s, "
Linnan Li13bf76a2024-05-05 19:18:02 +0800600 "displayId=%s, "
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000601 "action=%s, actionButton=0x%08x, flags=0x%x, edgeFlags=0x%x, "
chaviw9eaa22c2020-07-01 16:21:27 -0700602 "metaState=0x%x, buttonState=0x%x, classification=%s,"
Siarhei Vishniakou3b37f9a2019-11-23 13:42:41 -0800603 "xPrecision=%f, yPrecision=%f, downTime=%" PRId64 ", eventTime=%" PRId64 ", "
Siarhei Vishniakouf77f60a2023-10-23 17:26:05 -0700604 "pointerCount=%" PRIu32 "\n%s",
Prabir Pradhan96282b02023-02-24 22:36:17 +0000605 mChannel->getName().c_str(), __func__, seq, eventId, deviceId,
Linnan Li13bf76a2024-05-05 19:18:02 +0800606 inputEventSourceToString(source).c_str(), displayId.toString().c_str(),
Prabir Pradhan60dd97a2023-02-23 02:23:02 +0000607 MotionEvent::actionToString(action).c_str(), actionButton, flags, edgeFlags,
608 metaState, buttonState, motionClassificationToString(classification), xPrecision,
609 yPrecision, downTime, eventTime, pointerCount, transformString.c_str());
Siarhei Vishniakou3b37f9a2019-11-23 13:42:41 -0800610 }
Jeff Brown5912f952013-07-01 19:10:31 -0700611
612 if (!seq) {
613 ALOGE("Attempted to publish a motion event with sequence number 0.");
614 return BAD_VALUE;
615 }
616
617 if (pointerCount > MAX_POINTERS || pointerCount < 1) {
Michael Wright63ff3a82014-06-10 13:03:17 -0700618 ALOGE("channel '%s' publisher ~ Invalid number of pointers provided: %" PRIu32 ".",
Siarhei Vishniakouf93fcf42017-11-22 16:00:14 -0800619 mChannel->getName().c_str(), pointerCount);
Jeff Brown5912f952013-07-01 19:10:31 -0700620 return BAD_VALUE;
621 }
622
623 InputMessage msg;
Siarhei Vishniakou52402772019-10-22 09:32:30 -0700624 msg.header.type = InputMessage::Type::MOTION;
Siarhei Vishniakoua64c1592020-06-22 12:02:29 -0500625 msg.header.seq = seq;
Garfield Tan1c7bc862020-01-28 13:24:04 -0800626 msg.body.motion.eventId = eventId;
Jeff Brown5912f952013-07-01 19:10:31 -0700627 msg.body.motion.deviceId = deviceId;
628 msg.body.motion.source = source;
Linnan Li13bf76a2024-05-05 19:18:02 +0800629 msg.body.motion.displayId = displayId.val();
Edgar Arriagac6ae4bb2020-04-16 18:46:48 -0700630 msg.body.motion.hmac = std::move(hmac);
Jeff Brown5912f952013-07-01 19:10:31 -0700631 msg.body.motion.action = action;
Michael Wright7b159c92015-05-14 14:48:03 +0100632 msg.body.motion.actionButton = actionButton;
Jeff Brown5912f952013-07-01 19:10:31 -0700633 msg.body.motion.flags = flags;
634 msg.body.motion.edgeFlags = edgeFlags;
635 msg.body.motion.metaState = metaState;
636 msg.body.motion.buttonState = buttonState;
Siarhei Vishniakou16a2e302019-01-14 19:21:45 -0800637 msg.body.motion.classification = classification;
chaviw9eaa22c2020-07-01 16:21:27 -0700638 msg.body.motion.dsdx = transform.dsdx();
639 msg.body.motion.dtdx = transform.dtdx();
640 msg.body.motion.dtdy = transform.dtdy();
641 msg.body.motion.dsdy = transform.dsdy();
642 msg.body.motion.tx = transform.tx();
643 msg.body.motion.ty = transform.ty();
Jeff Brown5912f952013-07-01 19:10:31 -0700644 msg.body.motion.xPrecision = xPrecision;
645 msg.body.motion.yPrecision = yPrecision;
Garfield Tan00f511d2019-06-12 16:55:40 -0700646 msg.body.motion.xCursorPosition = xCursorPosition;
647 msg.body.motion.yCursorPosition = yCursorPosition;
Prabir Pradhanb9b18502021-08-26 12:30:32 -0700648 msg.body.motion.dsdxRaw = rawTransform.dsdx();
649 msg.body.motion.dtdxRaw = rawTransform.dtdx();
650 msg.body.motion.dtdyRaw = rawTransform.dtdy();
651 msg.body.motion.dsdyRaw = rawTransform.dsdy();
652 msg.body.motion.txRaw = rawTransform.tx();
653 msg.body.motion.tyRaw = rawTransform.ty();
Jeff Brown5912f952013-07-01 19:10:31 -0700654 msg.body.motion.downTime = downTime;
655 msg.body.motion.eventTime = eventTime;
656 msg.body.motion.pointerCount = pointerCount;
Narayan Kamathbc6001b2014-05-02 17:53:33 +0100657 for (uint32_t i = 0; i < pointerCount; i++) {
Siarhei Vishniakou73e6d372023-07-06 18:07:21 -0700658 msg.body.motion.pointers[i].properties = pointerProperties[i];
659 msg.body.motion.pointers[i].coords = pointerCoords[i];
Jeff Brown5912f952013-07-01 19:10:31 -0700660 }
Atif Niyaz3d3fa522019-07-25 11:12:39 -0700661
Jeff Brown5912f952013-07-01 19:10:31 -0700662 return mChannel->sendMessage(&msg);
663}
664
Antonio Kantek3cfec7b2021-11-05 18:26:17 -0700665status_t InputPublisher::publishFocusEvent(uint32_t seq, int32_t eventId, bool hasFocus) {
Prabir Pradhan2dac8b82023-09-06 01:11:51 +0000666 ATRACE_NAME_IF(ATRACE_ENABLED(),
667 StringPrintf("publishFocusEvent(inputChannel=%s, hasFocus=%s)",
668 mChannel->getName().c_str(), toString(hasFocus)));
Prabir Pradhan96282b02023-02-24 22:36:17 +0000669 ALOGD_IF(debugTransportPublisher(), "channel '%s' publisher ~ %s: seq=%u, id=%d, hasFocus=%s",
670 mChannel->getName().c_str(), __func__, seq, eventId, toString(hasFocus));
Siarhei Vishniakou7feb2ea2019-11-25 15:11:23 -0800671
672 InputMessage msg;
673 msg.header.type = InputMessage::Type::FOCUS;
Siarhei Vishniakoua64c1592020-06-22 12:02:29 -0500674 msg.header.seq = seq;
Garfield Tan1c7bc862020-01-28 13:24:04 -0800675 msg.body.focus.eventId = eventId;
Siarhei Vishniakou38b7f7f2021-03-05 01:57:08 +0000676 msg.body.focus.hasFocus = hasFocus;
Siarhei Vishniakou7feb2ea2019-11-25 15:11:23 -0800677 return mChannel->sendMessage(&msg);
678}
679
Prabir Pradhan3f37b7b2020-11-10 16:50:18 -0800680status_t InputPublisher::publishCaptureEvent(uint32_t seq, int32_t eventId,
681 bool pointerCaptureEnabled) {
Prabir Pradhan2dac8b82023-09-06 01:11:51 +0000682 ATRACE_NAME_IF(ATRACE_ENABLED(),
683 StringPrintf("publishCaptureEvent(inputChannel=%s, pointerCaptureEnabled=%s)",
684 mChannel->getName().c_str(), toString(pointerCaptureEnabled)));
Prabir Pradhanb2bd83c2023-02-23 02:34:40 +0000685 ALOGD_IF(debugTransportPublisher(),
Prabir Pradhan96282b02023-02-24 22:36:17 +0000686 "channel '%s' publisher ~ %s: seq=%u, id=%d, pointerCaptureEnabled=%s",
687 mChannel->getName().c_str(), __func__, seq, eventId, toString(pointerCaptureEnabled));
Prabir Pradhan3f37b7b2020-11-10 16:50:18 -0800688
689 InputMessage msg;
690 msg.header.type = InputMessage::Type::CAPTURE;
691 msg.header.seq = seq;
692 msg.body.capture.eventId = eventId;
Siarhei Vishniakou38b7f7f2021-03-05 01:57:08 +0000693 msg.body.capture.pointerCaptureEnabled = pointerCaptureEnabled;
Prabir Pradhan3f37b7b2020-11-10 16:50:18 -0800694 return mChannel->sendMessage(&msg);
695}
696
arthurhung7632c332020-12-30 16:58:01 +0800697status_t InputPublisher::publishDragEvent(uint32_t seq, int32_t eventId, float x, float y,
698 bool isExiting) {
Prabir Pradhan2dac8b82023-09-06 01:11:51 +0000699 ATRACE_NAME_IF(ATRACE_ENABLED(),
700 StringPrintf("publishDragEvent(inputChannel=%s, x=%f, y=%f, isExiting=%s)",
701 mChannel->getName().c_str(), x, y, toString(isExiting)));
Prabir Pradhanb2bd83c2023-02-23 02:34:40 +0000702 ALOGD_IF(debugTransportPublisher(),
Prabir Pradhan96282b02023-02-24 22:36:17 +0000703 "channel '%s' publisher ~ %s: seq=%u, id=%d, x=%f, y=%f, isExiting=%s",
704 mChannel->getName().c_str(), __func__, seq, eventId, x, y, toString(isExiting));
arthurhung7632c332020-12-30 16:58:01 +0800705
706 InputMessage msg;
707 msg.header.type = InputMessage::Type::DRAG;
708 msg.header.seq = seq;
709 msg.body.drag.eventId = eventId;
710 msg.body.drag.isExiting = isExiting;
711 msg.body.drag.x = x;
712 msg.body.drag.y = y;
713 return mChannel->sendMessage(&msg);
714}
715
Antonio Kantek7cdf8ef2021-07-13 18:04:53 -0700716status_t InputPublisher::publishTouchModeEvent(uint32_t seq, int32_t eventId, bool isInTouchMode) {
Prabir Pradhan2dac8b82023-09-06 01:11:51 +0000717 ATRACE_NAME_IF(ATRACE_ENABLED(),
718 StringPrintf("publishTouchModeEvent(inputChannel=%s, isInTouchMode=%s)",
719 mChannel->getName().c_str(), toString(isInTouchMode)));
Prabir Pradhan96282b02023-02-24 22:36:17 +0000720 ALOGD_IF(debugTransportPublisher(),
721 "channel '%s' publisher ~ %s: seq=%u, id=%d, isInTouchMode=%s",
722 mChannel->getName().c_str(), __func__, seq, eventId, toString(isInTouchMode));
Antonio Kantek7cdf8ef2021-07-13 18:04:53 -0700723
724 InputMessage msg;
725 msg.header.type = InputMessage::Type::TOUCH_MODE;
726 msg.header.seq = seq;
727 msg.body.touchMode.eventId = eventId;
728 msg.body.touchMode.isInTouchMode = isInTouchMode;
729 return mChannel->sendMessage(&msg);
730}
731
Siarhei Vishniakouf94ae022021-02-04 01:23:17 +0000732android::base::Result<InputPublisher::ConsumerResponse> InputPublisher::receiveConsumerResponse() {
Paul Ramirez10bae112024-06-18 21:33:33 +0000733 android::base::Result<InputMessage> result = mChannel->receiveMessage();
734 if (!result.ok()) {
735 if (debugTransportPublisher() && result.error().code() != WOULD_BLOCK) {
Siarhei Vishniakou69112652023-08-24 08:34:18 -0700736 LOG(INFO) << "channel '" << mChannel->getName() << "' publisher ~ " << __func__ << ": "
Paul Ramirez10bae112024-06-18 21:33:33 +0000737 << result.error().message();
Siarhei Vishniakou69112652023-08-24 08:34:18 -0700738 }
Paul Ramirez10bae112024-06-18 21:33:33 +0000739 return result.error();
Jeff Brown5912f952013-07-01 19:10:31 -0700740 }
Paul Ramirez10bae112024-06-18 21:33:33 +0000741
742 const InputMessage& msg = *result;
Siarhei Vishniakouf94ae022021-02-04 01:23:17 +0000743 if (msg.header.type == InputMessage::Type::FINISHED) {
Prabir Pradhan96282b02023-02-24 22:36:17 +0000744 ALOGD_IF(debugTransportPublisher(),
745 "channel '%s' publisher ~ %s: finished: seq=%u, handled=%s",
746 mChannel->getName().c_str(), __func__, msg.header.seq,
747 toString(msg.body.finished.handled));
Siarhei Vishniakouf94ae022021-02-04 01:23:17 +0000748 return Finished{
749 .seq = msg.header.seq,
750 .handled = msg.body.finished.handled,
751 .consumeTime = msg.body.finished.consumeTime,
752 };
Jeff Brown5912f952013-07-01 19:10:31 -0700753 }
Siarhei Vishniakouf94ae022021-02-04 01:23:17 +0000754
755 if (msg.header.type == InputMessage::Type::TIMELINE) {
Prabir Pradhan96282b02023-02-24 22:36:17 +0000756 ALOGD_IF(debugTransportPublisher(), "channel '%s' publisher ~ %s: timeline: id=%d",
757 mChannel->getName().c_str(), __func__, msg.body.timeline.eventId);
Siarhei Vishniakouf94ae022021-02-04 01:23:17 +0000758 return Timeline{
759 .inputEventId = msg.body.timeline.eventId,
760 .graphicsTimeline = msg.body.timeline.graphicsTimeline,
761 };
762 }
763
764 ALOGE("channel '%s' publisher ~ Received unexpected %s message from consumer",
Dominik Laskowski75788452021-02-09 18:51:25 -0800765 mChannel->getName().c_str(), ftl::enum_string(msg.header.type).c_str());
Siarhei Vishniakouf94ae022021-02-04 01:23:17 +0000766 return android::base::Error(UNKNOWN_ERROR);
Jeff Brown5912f952013-07-01 19:10:31 -0700767}
768
Jeff Brown5912f952013-07-01 19:10:31 -0700769} // namespace android