1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _ANDROIDFW_INPUT_TRANSPORT_H 18 #define _ANDROIDFW_INPUT_TRANSPORT_H 19 20 /** 21 * Native input transport. 22 * 23 * The InputChannel provides a mechanism for exchanging InputMessage structures across processes. 24 * 25 * The InputPublisher and InputConsumer each handle one end-point of an input channel. 26 * The InputPublisher is used by the input dispatcher to send events to the application. 27 * The InputConsumer is used by the application to receive events from the input dispatcher. 28 */ 29 30 #include <androidfw/Input.h> 31 #include <utils/Errors.h> 32 #include <utils/Timers.h> 33 #include <utils/RefBase.h> 34 #include <utils/String8.h> 35 #include <utils/Vector.h> 36 #include <utils/BitSet.h> 37 38 namespace android { 39 40 /* 41 * Intermediate representation used to send input events and related signals. 42 */ 43 struct InputMessage { 44 enum { 45 TYPE_KEY = 1, 46 TYPE_MOTION = 2, 47 TYPE_FINISHED = 3, 48 }; 49 50 struct Header { 51 uint32_t type; 52 uint32_t padding; // 8 byte alignment for the body that follows 53 } header; 54 55 union Body { 56 struct Key { 57 uint32_t seq; 58 nsecs_t eventTime; 59 int32_t deviceId; 60 int32_t source; 61 int32_t action; 62 int32_t flags; 63 int32_t keyCode; 64 int32_t scanCode; 65 int32_t metaState; 66 int32_t repeatCount; 67 nsecs_t downTime; 68 69 inline size_t size() const { 70 return sizeof(Key); 71 } 72 } key; 73 74 struct Motion { 75 uint32_t seq; 76 nsecs_t eventTime; 77 int32_t deviceId; 78 int32_t source; 79 int32_t action; 80 int32_t flags; 81 int32_t metaState; 82 int32_t buttonState; 83 int32_t edgeFlags; 84 nsecs_t downTime; 85 float xOffset; 86 float yOffset; 87 float xPrecision; 88 float yPrecision; 89 size_t pointerCount; 90 struct Pointer { 91 PointerProperties properties; 92 PointerCoords coords; 93 } pointers[MAX_POINTERS]; 94 95 int32_t getActionId() const { 96 uint32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) 97 >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; 98 return pointers[index].properties.id; 99 } 100 101 inline size_t size() const { 102 return sizeof(Motion) - sizeof(Pointer) * MAX_POINTERS 103 + sizeof(Pointer) * pointerCount; 104 } 105 } motion; 106 107 struct Finished { 108 uint32_t seq; 109 bool handled; 110 111 inline size_t size() const { 112 return sizeof(Finished); 113 } 114 } finished; 115 } body; 116 117 bool isValid(size_t actualSize) const; 118 size_t size() const; 119 }; 120 121 /* 122 * An input channel consists of a local unix domain socket used to send and receive 123 * input messages across processes. Each channel has a descriptive name for debugging purposes. 124 * 125 * Each endpoint has its own InputChannel object that specifies its file descriptor. 126 * 127 * The input channel is closed when all references to it are released. 128 */ 129 class InputChannel : public RefBase { 130 protected: 131 virtual ~InputChannel(); 132 133 public: 134 InputChannel(const String8& name, int fd); 135 136 /* Creates a pair of input channels. 137 * 138 * Returns OK on success. 139 */ 140 static status_t openInputChannelPair(const String8& name, 141 sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel); 142 143 inline String8 getName() const { return mName; } 144 inline int getFd() const { return mFd; } 145 146 /* Sends a message to the other endpoint. 147 * 148 * If the channel is full then the message is guaranteed not to have been sent at all. 149 * Try again after the consumer has sent a finished signal indicating that it has 150 * consumed some of the pending messages from the channel. 151 * 152 * Returns OK on success. 153 * Returns WOULD_BLOCK if the channel is full. 154 * Returns DEAD_OBJECT if the channel's peer has been closed. 155 * Other errors probably indicate that the channel is broken. 156 */ 157 status_t sendMessage(const InputMessage* msg); 158 159 /* Receives a message sent by the other endpoint. 160 * 161 * If there is no message present, try again after poll() indicates that the fd 162 * is readable. 163 * 164 * Returns OK on success. 165 * Returns WOULD_BLOCK if there is no message present. 166 * Returns DEAD_OBJECT if the channel's peer has been closed. 167 * Other errors probably indicate that the channel is broken. 168 */ 169 status_t receiveMessage(InputMessage* msg); 170 171 private: 172 String8 mName; 173 int mFd; 174 }; 175 176 /* 177 * Publishes input events to an input channel. 178 */ 179 class InputPublisher { 180 public: 181 /* Creates a publisher associated with an input channel. */ 182 explicit InputPublisher(const sp<InputChannel>& channel); 183 184 /* Destroys the publisher and releases its input channel. */ 185 ~InputPublisher(); 186 187 /* Gets the underlying input channel. */ 188 inline sp<InputChannel> getChannel() { return mChannel; } 189 190 /* Publishes a key event to the input channel. 191 * 192 * Returns OK on success. 193 * Returns WOULD_BLOCK if the channel is full. 194 * Returns DEAD_OBJECT if the channel's peer has been closed. 195 * Returns BAD_VALUE if seq is 0. 196 * Other errors probably indicate that the channel is broken. 197 */ 198 status_t publishKeyEvent( 199 uint32_t seq, 200 int32_t deviceId, 201 int32_t source, 202 int32_t action, 203 int32_t flags, 204 int32_t keyCode, 205 int32_t scanCode, 206 int32_t metaState, 207 int32_t repeatCount, 208 nsecs_t downTime, 209 nsecs_t eventTime); 210 211 /* Publishes a motion event to the input channel. 212 * 213 * Returns OK on success. 214 * Returns WOULD_BLOCK if the channel is full. 215 * Returns DEAD_OBJECT if the channel's peer has been closed. 216 * Returns BAD_VALUE if seq is 0 or if pointerCount is less than 1 or greater than MAX_POINTERS. 217 * Other errors probably indicate that the channel is broken. 218 */ 219 status_t publishMotionEvent( 220 uint32_t seq, 221 int32_t deviceId, 222 int32_t source, 223 int32_t action, 224 int32_t flags, 225 int32_t edgeFlags, 226 int32_t metaState, 227 int32_t buttonState, 228 float xOffset, 229 float yOffset, 230 float xPrecision, 231 float yPrecision, 232 nsecs_t downTime, 233 nsecs_t eventTime, 234 size_t pointerCount, 235 const PointerProperties* pointerProperties, 236 const PointerCoords* pointerCoords); 237 238 /* Receives the finished signal from the consumer in reply to the original dispatch signal. 239 * If a signal was received, returns the message sequence number, 240 * and whether the consumer handled the message. 241 * 242 * The returned sequence number is never 0 unless the operation failed. 243 * 244 * Returns OK on success. 245 * Returns WOULD_BLOCK if there is no signal present. 246 * Returns DEAD_OBJECT if the channel's peer has been closed. 247 * Other errors probably indicate that the channel is broken. 248 */ 249 status_t receiveFinishedSignal(uint32_t* outSeq, bool* outHandled); 250 251 private: 252 sp<InputChannel> mChannel; 253 }; 254 255 /* 256 * Consumes input events from an input channel. 257 */ 258 class InputConsumer { 259 public: 260 /* Creates a consumer associated with an input channel. */ 261 explicit InputConsumer(const sp<InputChannel>& channel); 262 263 /* Destroys the consumer and releases its input channel. */ 264 ~InputConsumer(); 265 266 /* Gets the underlying input channel. */ 267 inline sp<InputChannel> getChannel() { return mChannel; } 268 269 /* Consumes an input event from the input channel and copies its contents into 270 * an InputEvent object created using the specified factory. 271 * 272 * Tries to combine a series of move events into larger batches whenever possible. 273 * 274 * If consumeBatches is false, then defers consuming pending batched events if it 275 * is possible for additional samples to be added to them later. Call hasPendingBatch() 276 * to determine whether a pending batch is available to be consumed. 277 * 278 * If consumeBatches is true, then events are still batched but they are consumed 279 * immediately as soon as the input channel is exhausted. 280 * 281 * The frameTime parameter specifies the time when the current display frame started 282 * rendering in the CLOCK_MONOTONIC time base, or -1 if unknown. 283 * 284 * The returned sequence number is never 0 unless the operation failed. 285 * 286 * Returns OK on success. 287 * Returns WOULD_BLOCK if there is no event present. 288 * Returns DEAD_OBJECT if the channel's peer has been closed. 289 * Returns NO_MEMORY if the event could not be created. 290 * Other errors probably indicate that the channel is broken. 291 */ 292 status_t consume(InputEventFactoryInterface* factory, bool consumeBatches, 293 nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent); 294 295 /* Sends a finished signal to the publisher to inform it that the message 296 * with the specified sequence number has finished being process and whether 297 * the message was handled by the consumer. 298 * 299 * Returns OK on success. 300 * Returns BAD_VALUE if seq is 0. 301 * Other errors probably indicate that the channel is broken. 302 */ 303 status_t sendFinishedSignal(uint32_t seq, bool handled); 304 305 /* Returns true if there is a deferred event waiting. 306 * 307 * Should be called after calling consume() to determine whether the consumer 308 * has a deferred event to be processed. Deferred events are somewhat special in 309 * that they have already been removed from the input channel. If the input channel 310 * becomes empty, the client may need to do extra work to ensure that it processes 311 * the deferred event despite the fact that the input channel's file descriptor 312 * is not readable. 313 * 314 * One option is simply to call consume() in a loop until it returns WOULD_BLOCK. 315 * This guarantees that all deferred events will be processed. 316 * 317 * Alternately, the caller can call hasDeferredEvent() to determine whether there is 318 * a deferred event waiting and then ensure that its event loop wakes up at least 319 * one more time to consume the deferred event. 320 */ 321 bool hasDeferredEvent() const; 322 323 /* Returns true if there is a pending batch. 324 * 325 * Should be called after calling consume() with consumeBatches == false to determine 326 * whether consume() should be called again later on with consumeBatches == true. 327 */ 328 bool hasPendingBatch() const; 329 330 private: 331 // True if touch resampling is enabled. 332 const bool mResampleTouch; 333 334 // The input channel. 335 sp<InputChannel> mChannel; 336 337 // The current input message. 338 InputMessage mMsg; 339 340 // True if mMsg contains a valid input message that was deferred from the previous 341 // call to consume and that still needs to be handled. 342 bool mMsgDeferred; 343 344 // Batched motion events per device and source. 345 struct Batch { 346 Vector<InputMessage> samples; 347 }; 348 Vector<Batch> mBatches; 349 350 // Touch state per device and source, only for sources of class pointer. 351 struct History { 352 nsecs_t eventTime; 353 BitSet32 idBits; 354 int32_t idToIndex[MAX_POINTER_ID + 1]; 355 PointerCoords pointers[MAX_POINTERS]; 356 357 void initializeFrom(const InputMessage* msg) { 358 eventTime = msg->body.motion.eventTime; 359 idBits.clear(); 360 for (size_t i = 0; i < msg->body.motion.pointerCount; i++) { 361 uint32_t id = msg->body.motion.pointers[i].properties.id; 362 idBits.markBit(id); 363 idToIndex[id] = i; 364 pointers[i].copyFrom(msg->body.motion.pointers[i].coords); 365 } 366 } 367 368 const PointerCoords& getPointerById(uint32_t id) const { 369 return pointers[idToIndex[id]]; 370 } 371 }; 372 struct TouchState { 373 int32_t deviceId; 374 int32_t source; 375 size_t historyCurrent; 376 size_t historySize; 377 History history[2]; 378 History lastResample; 379 380 void initialize(int32_t deviceId, int32_t source) { 381 this->deviceId = deviceId; 382 this->source = source; 383 historyCurrent = 0; 384 historySize = 0; 385 lastResample.eventTime = 0; 386 lastResample.idBits.clear(); 387 } 388 389 void addHistory(const InputMessage* msg) { 390 historyCurrent ^= 1; 391 if (historySize < 2) { 392 historySize += 1; 393 } 394 history[historyCurrent].initializeFrom(msg); 395 } 396 397 const History* getHistory(size_t index) const { 398 return &history[(historyCurrent + index) & 1]; 399 } 400 }; 401 Vector<TouchState> mTouchStates; 402 403 // Chain of batched sequence numbers. When multiple input messages are combined into 404 // a batch, we append a record here that associates the last sequence number in the 405 // batch with the previous one. When the finished signal is sent, we traverse the 406 // chain to individually finish all input messages that were part of the batch. 407 struct SeqChain { 408 uint32_t seq; // sequence number of batched input message 409 uint32_t chain; // sequence number of previous batched input message 410 }; 411 Vector<SeqChain> mSeqChains; 412 413 status_t consumeBatch(InputEventFactoryInterface* factory, 414 nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent); 415 status_t consumeSamples(InputEventFactoryInterface* factory, 416 Batch& batch, size_t count, uint32_t* outSeq, InputEvent** outEvent); 417 418 void updateTouchState(InputMessage* msg); 419 void rewriteMessage(const TouchState& state, InputMessage* msg); 420 void resampleTouchState(nsecs_t frameTime, MotionEvent* event, 421 const InputMessage *next); 422 423 ssize_t findBatch(int32_t deviceId, int32_t source) const; 424 ssize_t findTouchState(int32_t deviceId, int32_t source) const; 425 426 status_t sendUnchainedFinishedSignal(uint32_t seq, bool handled); 427 428 static void initializeKeyEvent(KeyEvent* event, const InputMessage* msg); 429 static void initializeMotionEvent(MotionEvent* event, const InputMessage* msg); 430 static void addSample(MotionEvent* event, const InputMessage* msg); 431 static bool canAddSample(const Batch& batch, const InputMessage* msg); 432 static ssize_t findSampleNoLaterThan(const Batch& batch, nsecs_t time); 433 static bool shouldResampleTool(int32_t toolType); 434 435 static bool isTouchResamplingEnabled(); 436 }; 437 438 } // namespace android 439 440 #endif // _ANDROIDFW_INPUT_TRANSPORT_H 441