• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2010 The Android Open Source Project
3 //
4 // The input dispatcher.
5 //
6 #define LOG_TAG "InputDispatcher"
7 
8 //#define LOG_NDEBUG 0
9 
10 // Log detailed debug messages about each inbound event notification to the dispatcher.
11 #define DEBUG_INBOUND_EVENT_DETAILS 0
12 
13 // Log detailed debug messages about each outbound event processed by the dispatcher.
14 #define DEBUG_OUTBOUND_EVENT_DETAILS 0
15 
16 // Log debug messages about batching.
17 #define DEBUG_BATCHING 0
18 
19 // Log debug messages about the dispatch cycle.
20 #define DEBUG_DISPATCH_CYCLE 0
21 
22 // Log debug messages about registrations.
23 #define DEBUG_REGISTRATION 0
24 
25 // Log debug messages about performance statistics.
26 #define DEBUG_PERFORMANCE_STATISTICS 0
27 
28 // Log debug messages about input event injection.
29 #define DEBUG_INJECTION 0
30 
31 // Log debug messages about input event throttling.
32 #define DEBUG_THROTTLING 0
33 
34 // Log debug messages about input focus tracking.
35 #define DEBUG_FOCUS 0
36 
37 // Log debug messages about the app switch latency optimization.
38 #define DEBUG_APP_SWITCH 0
39 
40 #include <cutils/log.h>
41 #include <ui/InputDispatcher.h>
42 #include <ui/PowerManager.h>
43 
44 #include <stddef.h>
45 #include <unistd.h>
46 #include <errno.h>
47 #include <limits.h>
48 
49 #define INDENT "  "
50 #define INDENT2 "    "
51 
52 namespace android {
53 
54 // Delay before reporting long touch events to the power manager.
55 const nsecs_t LONG_TOUCH_DELAY = 300 * 1000000LL; // 300 ms
56 
57 // Default input dispatching timeout if there is no focused application or paused window
58 // from which to determine an appropriate dispatching timeout.
59 const nsecs_t DEFAULT_INPUT_DISPATCHING_TIMEOUT = 5000 * 1000000LL; // 5 sec
60 
61 // Amount of time to allow for all pending events to be processed when an app switch
62 // key is on the way.  This is used to preempt input dispatch and drop input events
63 // when an application takes too long to respond and the user has pressed an app switch key.
64 const nsecs_t APP_SWITCH_TIMEOUT = 500 * 1000000LL; // 0.5sec
65 
66 
now()67 static inline nsecs_t now() {
68     return systemTime(SYSTEM_TIME_MONOTONIC);
69 }
70 
toString(bool value)71 static inline const char* toString(bool value) {
72     return value ? "true" : "false";
73 }
74 
getMotionEventActionPointerIndex(int32_t action)75 static inline int32_t getMotionEventActionPointerIndex(int32_t action) {
76     return (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
77             >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
78 }
79 
isValidKeyAction(int32_t action)80 static bool isValidKeyAction(int32_t action) {
81     switch (action) {
82     case AKEY_EVENT_ACTION_DOWN:
83     case AKEY_EVENT_ACTION_UP:
84         return true;
85     default:
86         return false;
87     }
88 }
89 
validateKeyEvent(int32_t action)90 static bool validateKeyEvent(int32_t action) {
91     if (! isValidKeyAction(action)) {
92         LOGE("Key event has invalid action code 0x%x", action);
93         return false;
94     }
95     return true;
96 }
97 
isValidMotionAction(int32_t action,size_t pointerCount)98 static bool isValidMotionAction(int32_t action, size_t pointerCount) {
99     switch (action & AMOTION_EVENT_ACTION_MASK) {
100     case AMOTION_EVENT_ACTION_DOWN:
101     case AMOTION_EVENT_ACTION_UP:
102     case AMOTION_EVENT_ACTION_CANCEL:
103     case AMOTION_EVENT_ACTION_MOVE:
104     case AMOTION_EVENT_ACTION_OUTSIDE:
105         return true;
106     case AMOTION_EVENT_ACTION_POINTER_DOWN:
107     case AMOTION_EVENT_ACTION_POINTER_UP: {
108         int32_t index = getMotionEventActionPointerIndex(action);
109         return index >= 0 && size_t(index) < pointerCount;
110     }
111     default:
112         return false;
113     }
114 }
115 
validateMotionEvent(int32_t action,size_t pointerCount,const int32_t * pointerIds)116 static bool validateMotionEvent(int32_t action, size_t pointerCount,
117         const int32_t* pointerIds) {
118     if (! isValidMotionAction(action, pointerCount)) {
119         LOGE("Motion event has invalid action code 0x%x", action);
120         return false;
121     }
122     if (pointerCount < 1 || pointerCount > MAX_POINTERS) {
123         LOGE("Motion event has invalid pointer count %d; value must be between 1 and %d.",
124                 pointerCount, MAX_POINTERS);
125         return false;
126     }
127     BitSet32 pointerIdBits;
128     for (size_t i = 0; i < pointerCount; i++) {
129         int32_t id = pointerIds[i];
130         if (id < 0 || id > MAX_POINTER_ID) {
131             LOGE("Motion event has invalid pointer id %d; value must be between 0 and %d",
132                     id, MAX_POINTER_ID);
133             return false;
134         }
135         if (pointerIdBits.hasBit(id)) {
136             LOGE("Motion event has duplicate pointer id %d", id);
137             return false;
138         }
139         pointerIdBits.markBit(id);
140     }
141     return true;
142 }
143 
144 
145 // --- InputWindow ---
146 
touchableAreaContainsPoint(int32_t x,int32_t y) const147 bool InputWindow::touchableAreaContainsPoint(int32_t x, int32_t y) const {
148     return x >= touchableAreaLeft && x <= touchableAreaRight
149             && y >= touchableAreaTop && y <= touchableAreaBottom;
150 }
151 
frameContainsPoint(int32_t x,int32_t y) const152 bool InputWindow::frameContainsPoint(int32_t x, int32_t y) const {
153     return x >= frameLeft && x <= frameRight
154             && y >= frameTop && y <= frameBottom;
155 }
156 
isTrustedOverlay() const157 bool InputWindow::isTrustedOverlay() const {
158     return layoutParamsType == TYPE_INPUT_METHOD
159             || layoutParamsType == TYPE_INPUT_METHOD_DIALOG
160             || layoutParamsType == TYPE_SECURE_SYSTEM_OVERLAY;
161 }
162 
163 
164 // --- InputDispatcher ---
165 
InputDispatcher(const sp<InputDispatcherPolicyInterface> & policy)166 InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) :
167     mPolicy(policy),
168     mPendingEvent(NULL), mAppSwitchDueTime(LONG_LONG_MAX),
169     mDispatchEnabled(true), mDispatchFrozen(false),
170     mFocusedWindow(NULL),
171     mFocusedApplication(NULL),
172     mCurrentInputTargetsValid(false),
173     mInputTargetWaitCause(INPUT_TARGET_WAIT_CAUSE_NONE) {
174     mLooper = new Looper(false);
175 
176     mInboundQueue.headSentinel.refCount = -1;
177     mInboundQueue.headSentinel.type = EventEntry::TYPE_SENTINEL;
178     mInboundQueue.headSentinel.eventTime = LONG_LONG_MIN;
179 
180     mInboundQueue.tailSentinel.refCount = -1;
181     mInboundQueue.tailSentinel.type = EventEntry::TYPE_SENTINEL;
182     mInboundQueue.tailSentinel.eventTime = LONG_LONG_MAX;
183 
184     mKeyRepeatState.lastKeyEntry = NULL;
185 
186     int32_t maxEventsPerSecond = policy->getMaxEventsPerSecond();
187     mThrottleState.minTimeBetweenEvents = 1000000000LL / maxEventsPerSecond;
188     mThrottleState.lastDeviceId = -1;
189 
190 #if DEBUG_THROTTLING
191     mThrottleState.originalSampleCount = 0;
192     LOGD("Throttling - Max events per second = %d", maxEventsPerSecond);
193 #endif
194 }
195 
~InputDispatcher()196 InputDispatcher::~InputDispatcher() {
197     { // acquire lock
198         AutoMutex _l(mLock);
199 
200         resetKeyRepeatLocked();
201         releasePendingEventLocked();
202         drainInboundQueueLocked();
203     }
204 
205     while (mConnectionsByReceiveFd.size() != 0) {
206         unregisterInputChannel(mConnectionsByReceiveFd.valueAt(0)->inputChannel);
207     }
208 }
209 
dispatchOnce()210 void InputDispatcher::dispatchOnce() {
211     nsecs_t keyRepeatTimeout = mPolicy->getKeyRepeatTimeout();
212     nsecs_t keyRepeatDelay = mPolicy->getKeyRepeatDelay();
213 
214     nsecs_t nextWakeupTime = LONG_LONG_MAX;
215     { // acquire lock
216         AutoMutex _l(mLock);
217         dispatchOnceInnerLocked(keyRepeatTimeout, keyRepeatDelay, & nextWakeupTime);
218 
219         if (runCommandsLockedInterruptible()) {
220             nextWakeupTime = LONG_LONG_MIN;  // force next poll to wake up immediately
221         }
222     } // release lock
223 
224     // Wait for callback or timeout or wake.  (make sure we round up, not down)
225     nsecs_t currentTime = now();
226     int32_t timeoutMillis;
227     if (nextWakeupTime > currentTime) {
228         uint64_t timeout = uint64_t(nextWakeupTime - currentTime);
229         timeout = (timeout + 999999LL) / 1000000LL;
230         timeoutMillis = timeout > INT_MAX ? -1 : int32_t(timeout);
231     } else {
232         timeoutMillis = 0;
233     }
234 
235     mLooper->pollOnce(timeoutMillis);
236 }
237 
dispatchOnceInnerLocked(nsecs_t keyRepeatTimeout,nsecs_t keyRepeatDelay,nsecs_t * nextWakeupTime)238 void InputDispatcher::dispatchOnceInnerLocked(nsecs_t keyRepeatTimeout,
239         nsecs_t keyRepeatDelay, nsecs_t* nextWakeupTime) {
240     nsecs_t currentTime = now();
241 
242     // Reset the key repeat timer whenever we disallow key events, even if the next event
243     // is not a key.  This is to ensure that we abort a key repeat if the device is just coming
244     // out of sleep.
245     if (keyRepeatTimeout < 0) {
246         resetKeyRepeatLocked();
247     }
248 
249     // If dispatching is frozen, do not process timeouts or try to deliver any new events.
250     if (mDispatchFrozen) {
251 #if DEBUG_FOCUS
252         LOGD("Dispatch frozen.  Waiting some more.");
253 #endif
254         return;
255     }
256 
257     // Optimize latency of app switches.
258     // Essentially we start a short timeout when an app switch key (HOME / ENDCALL) has
259     // been pressed.  When it expires, we preempt dispatch and drop all other pending events.
260     bool isAppSwitchDue = mAppSwitchDueTime <= currentTime;
261     if (mAppSwitchDueTime < *nextWakeupTime) {
262         *nextWakeupTime = mAppSwitchDueTime;
263     }
264 
265     // Ready to start a new event.
266     // If we don't already have a pending event, go grab one.
267     if (! mPendingEvent) {
268         if (mInboundQueue.isEmpty()) {
269             if (isAppSwitchDue) {
270                 // The inbound queue is empty so the app switch key we were waiting
271                 // for will never arrive.  Stop waiting for it.
272                 resetPendingAppSwitchLocked(false);
273                 isAppSwitchDue = false;
274             }
275 
276             // Synthesize a key repeat if appropriate.
277             if (mKeyRepeatState.lastKeyEntry) {
278                 if (currentTime >= mKeyRepeatState.nextRepeatTime) {
279                     mPendingEvent = synthesizeKeyRepeatLocked(currentTime, keyRepeatDelay);
280                 } else {
281                     if (mKeyRepeatState.nextRepeatTime < *nextWakeupTime) {
282                         *nextWakeupTime = mKeyRepeatState.nextRepeatTime;
283                     }
284                 }
285             }
286             if (! mPendingEvent) {
287                 return;
288             }
289         } else {
290             // Inbound queue has at least one entry.
291             EventEntry* entry = mInboundQueue.headSentinel.next;
292 
293             // Throttle the entry if it is a move event and there are no
294             // other events behind it in the queue.  Due to movement batching, additional
295             // samples may be appended to this event by the time the throttling timeout
296             // expires.
297             // TODO Make this smarter and consider throttling per device independently.
298             if (entry->type == EventEntry::TYPE_MOTION
299                     && !isAppSwitchDue
300                     && mDispatchEnabled
301                     && (entry->policyFlags & POLICY_FLAG_PASS_TO_USER)
302                     && !entry->isInjected()) {
303                 MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
304                 int32_t deviceId = motionEntry->deviceId;
305                 uint32_t source = motionEntry->source;
306                 if (! isAppSwitchDue
307                         && motionEntry->next == & mInboundQueue.tailSentinel // exactly one event
308                         && motionEntry->action == AMOTION_EVENT_ACTION_MOVE
309                         && deviceId == mThrottleState.lastDeviceId
310                         && source == mThrottleState.lastSource) {
311                     nsecs_t nextTime = mThrottleState.lastEventTime
312                             + mThrottleState.minTimeBetweenEvents;
313                     if (currentTime < nextTime) {
314                         // Throttle it!
315 #if DEBUG_THROTTLING
316                         LOGD("Throttling - Delaying motion event for "
317                                 "device 0x%x, source 0x%08x by up to %0.3fms.",
318                                 deviceId, source, (nextTime - currentTime) * 0.000001);
319 #endif
320                         if (nextTime < *nextWakeupTime) {
321                             *nextWakeupTime = nextTime;
322                         }
323                         if (mThrottleState.originalSampleCount == 0) {
324                             mThrottleState.originalSampleCount =
325                                     motionEntry->countSamples();
326                         }
327                         return;
328                     }
329                 }
330 
331 #if DEBUG_THROTTLING
332                 if (mThrottleState.originalSampleCount != 0) {
333                     uint32_t count = motionEntry->countSamples();
334                     LOGD("Throttling - Motion event sample count grew by %d from %d to %d.",
335                             count - mThrottleState.originalSampleCount,
336                             mThrottleState.originalSampleCount, count);
337                     mThrottleState.originalSampleCount = 0;
338                 }
339 #endif
340 
341                 mThrottleState.lastEventTime = entry->eventTime < currentTime
342                         ? entry->eventTime : currentTime;
343                 mThrottleState.lastDeviceId = deviceId;
344                 mThrottleState.lastSource = source;
345             }
346 
347             mInboundQueue.dequeue(entry);
348             mPendingEvent = entry;
349         }
350 
351         // Poke user activity for this event.
352         if (mPendingEvent->policyFlags & POLICY_FLAG_PASS_TO_USER) {
353             pokeUserActivityLocked(mPendingEvent);
354         }
355     }
356 
357     // Now we have an event to dispatch.
358     assert(mPendingEvent != NULL);
359     bool done = false;
360     DropReason dropReason = DROP_REASON_NOT_DROPPED;
361     if (!(mPendingEvent->policyFlags & POLICY_FLAG_PASS_TO_USER)) {
362         dropReason = DROP_REASON_POLICY;
363     } else if (!mDispatchEnabled) {
364         dropReason = DROP_REASON_DISABLED;
365     }
366     switch (mPendingEvent->type) {
367     case EventEntry::TYPE_CONFIGURATION_CHANGED: {
368         ConfigurationChangedEntry* typedEntry =
369                 static_cast<ConfigurationChangedEntry*>(mPendingEvent);
370         done = dispatchConfigurationChangedLocked(currentTime, typedEntry);
371         dropReason = DROP_REASON_NOT_DROPPED; // configuration changes are never dropped
372         break;
373     }
374 
375     case EventEntry::TYPE_KEY: {
376         KeyEntry* typedEntry = static_cast<KeyEntry*>(mPendingEvent);
377         if (isAppSwitchDue) {
378             if (isAppSwitchKeyEventLocked(typedEntry)) {
379                 resetPendingAppSwitchLocked(true);
380                 isAppSwitchDue = false;
381             } else if (dropReason == DROP_REASON_NOT_DROPPED) {
382                 dropReason = DROP_REASON_APP_SWITCH;
383             }
384         }
385         done = dispatchKeyLocked(currentTime, typedEntry, keyRepeatTimeout,
386                 &dropReason, nextWakeupTime);
387         break;
388     }
389 
390     case EventEntry::TYPE_MOTION: {
391         MotionEntry* typedEntry = static_cast<MotionEntry*>(mPendingEvent);
392         if (dropReason == DROP_REASON_NOT_DROPPED && isAppSwitchDue) {
393             dropReason = DROP_REASON_APP_SWITCH;
394         }
395         done = dispatchMotionLocked(currentTime, typedEntry,
396                 &dropReason, nextWakeupTime);
397         break;
398     }
399 
400     default:
401         assert(false);
402         break;
403     }
404 
405     if (done) {
406         if (dropReason != DROP_REASON_NOT_DROPPED) {
407             dropInboundEventLocked(mPendingEvent, dropReason);
408         }
409 
410         releasePendingEventLocked();
411         *nextWakeupTime = LONG_LONG_MIN;  // force next poll to wake up immediately
412     }
413 }
414 
enqueueInboundEventLocked(EventEntry * entry)415 bool InputDispatcher::enqueueInboundEventLocked(EventEntry* entry) {
416     bool needWake = mInboundQueue.isEmpty();
417     mInboundQueue.enqueueAtTail(entry);
418 
419     switch (entry->type) {
420     case EventEntry::TYPE_KEY: {
421         KeyEntry* keyEntry = static_cast<KeyEntry*>(entry);
422         if (isAppSwitchKeyEventLocked(keyEntry)) {
423             if (keyEntry->action == AKEY_EVENT_ACTION_DOWN) {
424                 mAppSwitchSawKeyDown = true;
425             } else if (keyEntry->action == AKEY_EVENT_ACTION_UP) {
426                 if (mAppSwitchSawKeyDown) {
427 #if DEBUG_APP_SWITCH
428                     LOGD("App switch is pending!");
429 #endif
430                     mAppSwitchDueTime = keyEntry->eventTime + APP_SWITCH_TIMEOUT;
431                     mAppSwitchSawKeyDown = false;
432                     needWake = true;
433                 }
434             }
435         }
436         break;
437     }
438     }
439 
440     return needWake;
441 }
442 
dropInboundEventLocked(EventEntry * entry,DropReason dropReason)443 void InputDispatcher::dropInboundEventLocked(EventEntry* entry, DropReason dropReason) {
444     const char* reason;
445     switch (dropReason) {
446     case DROP_REASON_POLICY:
447 #if DEBUG_INBOUND_EVENT_DETAILS
448         LOGD("Dropped event because policy consumed it.");
449 #endif
450         reason = "inbound event was dropped because the policy consumed it";
451         break;
452     case DROP_REASON_DISABLED:
453         LOGI("Dropped event because input dispatch is disabled.");
454         reason = "inbound event was dropped because input dispatch is disabled";
455         break;
456     case DROP_REASON_APP_SWITCH:
457         LOGI("Dropped event because of pending overdue app switch.");
458         reason = "inbound event was dropped because of pending overdue app switch";
459         break;
460     default:
461         assert(false);
462         return;
463     }
464 
465     switch (entry->type) {
466     case EventEntry::TYPE_KEY:
467         synthesizeCancelationEventsForAllConnectionsLocked(
468                 InputState::CANCEL_NON_POINTER_EVENTS, reason);
469         break;
470     case EventEntry::TYPE_MOTION: {
471         MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
472         if (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER) {
473             synthesizeCancelationEventsForAllConnectionsLocked(
474                     InputState::CANCEL_POINTER_EVENTS, reason);
475         } else {
476             synthesizeCancelationEventsForAllConnectionsLocked(
477                     InputState::CANCEL_NON_POINTER_EVENTS, reason);
478         }
479         break;
480     }
481     }
482 }
483 
isAppSwitchKeyCode(int32_t keyCode)484 bool InputDispatcher::isAppSwitchKeyCode(int32_t keyCode) {
485     return keyCode == AKEYCODE_HOME || keyCode == AKEYCODE_ENDCALL;
486 }
487 
isAppSwitchKeyEventLocked(KeyEntry * keyEntry)488 bool InputDispatcher::isAppSwitchKeyEventLocked(KeyEntry* keyEntry) {
489     return ! (keyEntry->flags & AKEY_EVENT_FLAG_CANCELED)
490             && isAppSwitchKeyCode(keyEntry->keyCode)
491             && (keyEntry->policyFlags & POLICY_FLAG_TRUSTED)
492             && (keyEntry->policyFlags & POLICY_FLAG_PASS_TO_USER);
493 }
494 
isAppSwitchPendingLocked()495 bool InputDispatcher::isAppSwitchPendingLocked() {
496     return mAppSwitchDueTime != LONG_LONG_MAX;
497 }
498 
resetPendingAppSwitchLocked(bool handled)499 void InputDispatcher::resetPendingAppSwitchLocked(bool handled) {
500     mAppSwitchDueTime = LONG_LONG_MAX;
501 
502 #if DEBUG_APP_SWITCH
503     if (handled) {
504         LOGD("App switch has arrived.");
505     } else {
506         LOGD("App switch was abandoned.");
507     }
508 #endif
509 }
510 
runCommandsLockedInterruptible()511 bool InputDispatcher::runCommandsLockedInterruptible() {
512     if (mCommandQueue.isEmpty()) {
513         return false;
514     }
515 
516     do {
517         CommandEntry* commandEntry = mCommandQueue.dequeueAtHead();
518 
519         Command command = commandEntry->command;
520         (this->*command)(commandEntry); // commands are implicitly 'LockedInterruptible'
521 
522         commandEntry->connection.clear();
523         mAllocator.releaseCommandEntry(commandEntry);
524     } while (! mCommandQueue.isEmpty());
525     return true;
526 }
527 
postCommandLocked(Command command)528 InputDispatcher::CommandEntry* InputDispatcher::postCommandLocked(Command command) {
529     CommandEntry* commandEntry = mAllocator.obtainCommandEntry(command);
530     mCommandQueue.enqueueAtTail(commandEntry);
531     return commandEntry;
532 }
533 
drainInboundQueueLocked()534 void InputDispatcher::drainInboundQueueLocked() {
535     while (! mInboundQueue.isEmpty()) {
536         EventEntry* entry = mInboundQueue.dequeueAtHead();
537         releaseInboundEventLocked(entry);
538     }
539 }
540 
releasePendingEventLocked()541 void InputDispatcher::releasePendingEventLocked() {
542     if (mPendingEvent) {
543         releaseInboundEventLocked(mPendingEvent);
544         mPendingEvent = NULL;
545     }
546 }
547 
releaseInboundEventLocked(EventEntry * entry)548 void InputDispatcher::releaseInboundEventLocked(EventEntry* entry) {
549     InjectionState* injectionState = entry->injectionState;
550     if (injectionState && injectionState->injectionResult == INPUT_EVENT_INJECTION_PENDING) {
551 #if DEBUG_DISPATCH_CYCLE
552         LOGD("Injected inbound event was dropped.");
553 #endif
554         setInjectionResultLocked(entry, INPUT_EVENT_INJECTION_FAILED);
555     }
556     mAllocator.releaseEventEntry(entry);
557 }
558 
resetKeyRepeatLocked()559 void InputDispatcher::resetKeyRepeatLocked() {
560     if (mKeyRepeatState.lastKeyEntry) {
561         mAllocator.releaseKeyEntry(mKeyRepeatState.lastKeyEntry);
562         mKeyRepeatState.lastKeyEntry = NULL;
563     }
564 }
565 
synthesizeKeyRepeatLocked(nsecs_t currentTime,nsecs_t keyRepeatDelay)566 InputDispatcher::KeyEntry* InputDispatcher::synthesizeKeyRepeatLocked(
567         nsecs_t currentTime, nsecs_t keyRepeatDelay) {
568     KeyEntry* entry = mKeyRepeatState.lastKeyEntry;
569 
570     // Reuse the repeated key entry if it is otherwise unreferenced.
571     uint32_t policyFlags = (entry->policyFlags & POLICY_FLAG_RAW_MASK)
572             | POLICY_FLAG_PASS_TO_USER | POLICY_FLAG_TRUSTED;
573     if (entry->refCount == 1) {
574         mAllocator.recycleKeyEntry(entry);
575         entry->eventTime = currentTime;
576         entry->policyFlags = policyFlags;
577         entry->repeatCount += 1;
578     } else {
579         KeyEntry* newEntry = mAllocator.obtainKeyEntry(currentTime,
580                 entry->deviceId, entry->source, policyFlags,
581                 entry->action, entry->flags, entry->keyCode, entry->scanCode,
582                 entry->metaState, entry->repeatCount + 1, entry->downTime);
583 
584         mKeyRepeatState.lastKeyEntry = newEntry;
585         mAllocator.releaseKeyEntry(entry);
586 
587         entry = newEntry;
588     }
589     entry->syntheticRepeat = true;
590 
591     // Increment reference count since we keep a reference to the event in
592     // mKeyRepeatState.lastKeyEntry in addition to the one we return.
593     entry->refCount += 1;
594 
595     mKeyRepeatState.nextRepeatTime = currentTime + keyRepeatDelay;
596     return entry;
597 }
598 
dispatchConfigurationChangedLocked(nsecs_t currentTime,ConfigurationChangedEntry * entry)599 bool InputDispatcher::dispatchConfigurationChangedLocked(
600         nsecs_t currentTime, ConfigurationChangedEntry* entry) {
601 #if DEBUG_OUTBOUND_EVENT_DETAILS
602     LOGD("dispatchConfigurationChanged - eventTime=%lld", entry->eventTime);
603 #endif
604 
605     // Reset key repeating in case a keyboard device was added or removed or something.
606     resetKeyRepeatLocked();
607 
608     // Enqueue a command to run outside the lock to tell the policy that the configuration changed.
609     CommandEntry* commandEntry = postCommandLocked(
610             & InputDispatcher::doNotifyConfigurationChangedInterruptible);
611     commandEntry->eventTime = entry->eventTime;
612     return true;
613 }
614 
dispatchKeyLocked(nsecs_t currentTime,KeyEntry * entry,nsecs_t keyRepeatTimeout,DropReason * dropReason,nsecs_t * nextWakeupTime)615 bool InputDispatcher::dispatchKeyLocked(
616         nsecs_t currentTime, KeyEntry* entry, nsecs_t keyRepeatTimeout,
617         DropReason* dropReason, nsecs_t* nextWakeupTime) {
618     // Preprocessing.
619     if (! entry->dispatchInProgress) {
620         if (entry->repeatCount == 0
621                 && entry->action == AKEY_EVENT_ACTION_DOWN
622                 && (entry->policyFlags & POLICY_FLAG_TRUSTED)
623                 && !entry->isInjected()) {
624             if (mKeyRepeatState.lastKeyEntry
625                     && mKeyRepeatState.lastKeyEntry->keyCode == entry->keyCode) {
626                 // We have seen two identical key downs in a row which indicates that the device
627                 // driver is automatically generating key repeats itself.  We take note of the
628                 // repeat here, but we disable our own next key repeat timer since it is clear that
629                 // we will not need to synthesize key repeats ourselves.
630                 entry->repeatCount = mKeyRepeatState.lastKeyEntry->repeatCount + 1;
631                 resetKeyRepeatLocked();
632                 mKeyRepeatState.nextRepeatTime = LONG_LONG_MAX; // don't generate repeats ourselves
633             } else {
634                 // Not a repeat.  Save key down state in case we do see a repeat later.
635                 resetKeyRepeatLocked();
636                 mKeyRepeatState.nextRepeatTime = entry->eventTime + keyRepeatTimeout;
637             }
638             mKeyRepeatState.lastKeyEntry = entry;
639             entry->refCount += 1;
640         } else if (! entry->syntheticRepeat) {
641             resetKeyRepeatLocked();
642         }
643 
644         if (entry->repeatCount == 1) {
645             entry->flags |= AKEY_EVENT_FLAG_LONG_PRESS;
646         } else {
647             entry->flags &= ~AKEY_EVENT_FLAG_LONG_PRESS;
648         }
649 
650         entry->dispatchInProgress = true;
651         resetTargetsLocked();
652 
653         logOutboundKeyDetailsLocked("dispatchKey - ", entry);
654     }
655 
656     // Give the policy a chance to intercept the key.
657     if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN) {
658         if (entry->policyFlags & POLICY_FLAG_PASS_TO_USER) {
659             CommandEntry* commandEntry = postCommandLocked(
660                     & InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible);
661             if (mFocusedWindow) {
662                 commandEntry->inputChannel = mFocusedWindow->inputChannel;
663             }
664             commandEntry->keyEntry = entry;
665             entry->refCount += 1;
666             return false; // wait for the command to run
667         } else {
668             entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_CONTINUE;
669         }
670     } else if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_SKIP) {
671         if (*dropReason == DROP_REASON_NOT_DROPPED) {
672             *dropReason = DROP_REASON_POLICY;
673         }
674     }
675 
676     // Clean up if dropping the event.
677     if (*dropReason != DROP_REASON_NOT_DROPPED) {
678         resetTargetsLocked();
679         setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY
680                 ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED);
681         return true;
682     }
683 
684     // Identify targets.
685     if (! mCurrentInputTargetsValid) {
686         int32_t injectionResult = findFocusedWindowTargetsLocked(currentTime,
687                 entry, nextWakeupTime);
688         if (injectionResult == INPUT_EVENT_INJECTION_PENDING) {
689             return false;
690         }
691 
692         setInjectionResultLocked(entry, injectionResult);
693         if (injectionResult != INPUT_EVENT_INJECTION_SUCCEEDED) {
694             return true;
695         }
696 
697         addMonitoringTargetsLocked();
698         commitTargetsLocked();
699     }
700 
701     // Dispatch the key.
702     dispatchEventToCurrentInputTargetsLocked(currentTime, entry, false);
703     return true;
704 }
705 
logOutboundKeyDetailsLocked(const char * prefix,const KeyEntry * entry)706 void InputDispatcher::logOutboundKeyDetailsLocked(const char* prefix, const KeyEntry* entry) {
707 #if DEBUG_OUTBOUND_EVENT_DETAILS
708     LOGD("%seventTime=%lld, deviceId=0x%x, source=0x%x, policyFlags=0x%x, "
709             "action=0x%x, flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, "
710             "repeatCount=%d, downTime=%lld",
711             prefix,
712             entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
713             entry->action, entry->flags, entry->keyCode, entry->scanCode, entry->metaState,
714             entry->repeatCount, entry->downTime);
715 #endif
716 }
717 
dispatchMotionLocked(nsecs_t currentTime,MotionEntry * entry,DropReason * dropReason,nsecs_t * nextWakeupTime)718 bool InputDispatcher::dispatchMotionLocked(
719         nsecs_t currentTime, MotionEntry* entry, DropReason* dropReason, nsecs_t* nextWakeupTime) {
720     // Preprocessing.
721     if (! entry->dispatchInProgress) {
722         entry->dispatchInProgress = true;
723         resetTargetsLocked();
724 
725         logOutboundMotionDetailsLocked("dispatchMotion - ", entry);
726     }
727 
728     // Clean up if dropping the event.
729     if (*dropReason != DROP_REASON_NOT_DROPPED) {
730         resetTargetsLocked();
731         setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY
732                 ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED);
733         return true;
734     }
735 
736     bool isPointerEvent = entry->source & AINPUT_SOURCE_CLASS_POINTER;
737 
738     // Identify targets.
739     if (! mCurrentInputTargetsValid) {
740         int32_t injectionResult;
741         if (isPointerEvent) {
742             // Pointer event.  (eg. touchscreen)
743             injectionResult = findTouchedWindowTargetsLocked(currentTime,
744                     entry, nextWakeupTime);
745         } else {
746             // Non touch event.  (eg. trackball)
747             injectionResult = findFocusedWindowTargetsLocked(currentTime,
748                     entry, nextWakeupTime);
749         }
750         if (injectionResult == INPUT_EVENT_INJECTION_PENDING) {
751             return false;
752         }
753 
754         setInjectionResultLocked(entry, injectionResult);
755         if (injectionResult != INPUT_EVENT_INJECTION_SUCCEEDED) {
756             return true;
757         }
758 
759         addMonitoringTargetsLocked();
760         commitTargetsLocked();
761     }
762 
763     // Dispatch the motion.
764     dispatchEventToCurrentInputTargetsLocked(currentTime, entry, false);
765     return true;
766 }
767 
768 
logOutboundMotionDetailsLocked(const char * prefix,const MotionEntry * entry)769 void InputDispatcher::logOutboundMotionDetailsLocked(const char* prefix, const MotionEntry* entry) {
770 #if DEBUG_OUTBOUND_EVENT_DETAILS
771     LOGD("%seventTime=%lld, deviceId=0x%x, source=0x%x, policyFlags=0x%x, "
772             "action=0x%x, flags=0x%x, "
773             "metaState=0x%x, edgeFlags=0x%x, xPrecision=%f, yPrecision=%f, downTime=%lld",
774             prefix,
775             entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
776             entry->action, entry->flags,
777             entry->metaState, entry->edgeFlags, entry->xPrecision, entry->yPrecision,
778             entry->downTime);
779 
780     // Print the most recent sample that we have available, this may change due to batching.
781     size_t sampleCount = 1;
782     const MotionSample* sample = & entry->firstSample;
783     for (; sample->next != NULL; sample = sample->next) {
784         sampleCount += 1;
785     }
786     for (uint32_t i = 0; i < entry->pointerCount; i++) {
787         LOGD("  Pointer %d: id=%d, x=%f, y=%f, pressure=%f, size=%f, "
788                 "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
789                 "orientation=%f",
790                 i, entry->pointerIds[i],
791                 sample->pointerCoords[i].x, sample->pointerCoords[i].y,
792                 sample->pointerCoords[i].pressure, sample->pointerCoords[i].size,
793                 sample->pointerCoords[i].touchMajor, sample->pointerCoords[i].touchMinor,
794                 sample->pointerCoords[i].toolMajor, sample->pointerCoords[i].toolMinor,
795                 sample->pointerCoords[i].orientation);
796     }
797 
798     // Keep in mind that due to batching, it is possible for the number of samples actually
799     // dispatched to change before the application finally consumed them.
800     if (entry->action == AMOTION_EVENT_ACTION_MOVE) {
801         LOGD("  ... Total movement samples currently batched %d ...", sampleCount);
802     }
803 #endif
804 }
805 
dispatchEventToCurrentInputTargetsLocked(nsecs_t currentTime,EventEntry * eventEntry,bool resumeWithAppendedMotionSample)806 void InputDispatcher::dispatchEventToCurrentInputTargetsLocked(nsecs_t currentTime,
807         EventEntry* eventEntry, bool resumeWithAppendedMotionSample) {
808 #if DEBUG_DISPATCH_CYCLE
809     LOGD("dispatchEventToCurrentInputTargets - "
810             "resumeWithAppendedMotionSample=%s",
811             toString(resumeWithAppendedMotionSample));
812 #endif
813 
814     assert(eventEntry->dispatchInProgress); // should already have been set to true
815 
816     pokeUserActivityLocked(eventEntry);
817 
818     for (size_t i = 0; i < mCurrentInputTargets.size(); i++) {
819         const InputTarget& inputTarget = mCurrentInputTargets.itemAt(i);
820 
821         ssize_t connectionIndex = getConnectionIndexLocked(inputTarget.inputChannel);
822         if (connectionIndex >= 0) {
823             sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);
824             prepareDispatchCycleLocked(currentTime, connection, eventEntry, & inputTarget,
825                     resumeWithAppendedMotionSample);
826         } else {
827 #if DEBUG_FOCUS
828             LOGD("Dropping event delivery to target with channel '%s' because it "
829                     "is no longer registered with the input dispatcher.",
830                     inputTarget.inputChannel->getName().string());
831 #endif
832         }
833     }
834 }
835 
resetTargetsLocked()836 void InputDispatcher::resetTargetsLocked() {
837     mCurrentInputTargetsValid = false;
838     mCurrentInputTargets.clear();
839     mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_NONE;
840 }
841 
commitTargetsLocked()842 void InputDispatcher::commitTargetsLocked() {
843     mCurrentInputTargetsValid = true;
844 }
845 
handleTargetsNotReadyLocked(nsecs_t currentTime,const EventEntry * entry,const InputApplication * application,const InputWindow * window,nsecs_t * nextWakeupTime)846 int32_t InputDispatcher::handleTargetsNotReadyLocked(nsecs_t currentTime,
847         const EventEntry* entry, const InputApplication* application, const InputWindow* window,
848         nsecs_t* nextWakeupTime) {
849     if (application == NULL && window == NULL) {
850         if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY) {
851 #if DEBUG_FOCUS
852             LOGD("Waiting for system to become ready for input.");
853 #endif
854             mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY;
855             mInputTargetWaitStartTime = currentTime;
856             mInputTargetWaitTimeoutTime = LONG_LONG_MAX;
857             mInputTargetWaitTimeoutExpired = false;
858         }
859     } else {
860         if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) {
861 #if DEBUG_FOCUS
862             LOGD("Waiting for application to become ready for input: %s",
863                     getApplicationWindowLabelLocked(application, window).string());
864 #endif
865             nsecs_t timeout = window ? window->dispatchingTimeout :
866                 application ? application->dispatchingTimeout : DEFAULT_INPUT_DISPATCHING_TIMEOUT;
867 
868             mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY;
869             mInputTargetWaitStartTime = currentTime;
870             mInputTargetWaitTimeoutTime = currentTime + timeout;
871             mInputTargetWaitTimeoutExpired = false;
872         }
873     }
874 
875     if (mInputTargetWaitTimeoutExpired) {
876         return INPUT_EVENT_INJECTION_TIMED_OUT;
877     }
878 
879     if (currentTime >= mInputTargetWaitTimeoutTime) {
880         onANRLocked(currentTime, application, window, entry->eventTime, mInputTargetWaitStartTime);
881 
882         // Force poll loop to wake up immediately on next iteration once we get the
883         // ANR response back from the policy.
884         *nextWakeupTime = LONG_LONG_MIN;
885         return INPUT_EVENT_INJECTION_PENDING;
886     } else {
887         // Force poll loop to wake up when timeout is due.
888         if (mInputTargetWaitTimeoutTime < *nextWakeupTime) {
889             *nextWakeupTime = mInputTargetWaitTimeoutTime;
890         }
891         return INPUT_EVENT_INJECTION_PENDING;
892     }
893 }
894 
resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout,const sp<InputChannel> & inputChannel)895 void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout,
896         const sp<InputChannel>& inputChannel) {
897     if (newTimeout > 0) {
898         // Extend the timeout.
899         mInputTargetWaitTimeoutTime = now() + newTimeout;
900     } else {
901         // Give up.
902         mInputTargetWaitTimeoutExpired = true;
903 
904         // Release the touch targets.
905         mTouchState.reset();
906 
907         // Input state will not be realistic.  Mark it out of sync.
908         if (inputChannel.get()) {
909             ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
910             if (connectionIndex >= 0) {
911                 sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);
912                 synthesizeCancelationEventsForConnectionLocked(
913                         connection, InputState::CANCEL_ALL_EVENTS,
914                         "application not responding");
915             }
916         }
917     }
918 }
919 
getTimeSpentWaitingForApplicationLocked(nsecs_t currentTime)920 nsecs_t InputDispatcher::getTimeSpentWaitingForApplicationLocked(
921         nsecs_t currentTime) {
922     if (mInputTargetWaitCause == INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) {
923         return currentTime - mInputTargetWaitStartTime;
924     }
925     return 0;
926 }
927 
resetANRTimeoutsLocked()928 void InputDispatcher::resetANRTimeoutsLocked() {
929 #if DEBUG_FOCUS
930         LOGD("Resetting ANR timeouts.");
931 #endif
932 
933     // Reset input target wait timeout.
934     mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_NONE;
935 }
936 
findFocusedWindowTargetsLocked(nsecs_t currentTime,const EventEntry * entry,nsecs_t * nextWakeupTime)937 int32_t InputDispatcher::findFocusedWindowTargetsLocked(nsecs_t currentTime,
938         const EventEntry* entry, nsecs_t* nextWakeupTime) {
939     mCurrentInputTargets.clear();
940 
941     int32_t injectionResult;
942 
943     // If there is no currently focused window and no focused application
944     // then drop the event.
945     if (! mFocusedWindow) {
946         if (mFocusedApplication) {
947 #if DEBUG_FOCUS
948             LOGD("Waiting because there is no focused window but there is a "
949                     "focused application that may eventually add a window: %s.",
950                     getApplicationWindowLabelLocked(mFocusedApplication, NULL).string());
951 #endif
952             injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
953                     mFocusedApplication, NULL, nextWakeupTime);
954             goto Unresponsive;
955         }
956 
957         LOGI("Dropping event because there is no focused window or focused application.");
958         injectionResult = INPUT_EVENT_INJECTION_FAILED;
959         goto Failed;
960     }
961 
962     // Check permissions.
963     if (! checkInjectionPermission(mFocusedWindow, entry->injectionState)) {
964         injectionResult = INPUT_EVENT_INJECTION_PERMISSION_DENIED;
965         goto Failed;
966     }
967 
968     // If the currently focused window is paused then keep waiting.
969     if (mFocusedWindow->paused) {
970 #if DEBUG_FOCUS
971         LOGD("Waiting because focused window is paused.");
972 #endif
973         injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
974                 mFocusedApplication, mFocusedWindow, nextWakeupTime);
975         goto Unresponsive;
976     }
977 
978     // If the currently focused window is still working on previous events then keep waiting.
979     if (! isWindowFinishedWithPreviousInputLocked(mFocusedWindow)) {
980 #if DEBUG_FOCUS
981         LOGD("Waiting because focused window still processing previous input.");
982 #endif
983         injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
984                 mFocusedApplication, mFocusedWindow, nextWakeupTime);
985         goto Unresponsive;
986     }
987 
988     // Success!  Output targets.
989     injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
990     addWindowTargetLocked(mFocusedWindow, InputTarget::FLAG_FOREGROUND, BitSet32(0));
991 
992     // Done.
993 Failed:
994 Unresponsive:
995     nsecs_t timeSpentWaitingForApplication = getTimeSpentWaitingForApplicationLocked(currentTime);
996     updateDispatchStatisticsLocked(currentTime, entry,
997             injectionResult, timeSpentWaitingForApplication);
998 #if DEBUG_FOCUS
999     LOGD("findFocusedWindow finished: injectionResult=%d, "
1000             "timeSpendWaitingForApplication=%0.1fms",
1001             injectionResult, timeSpentWaitingForApplication / 1000000.0);
1002 #endif
1003     return injectionResult;
1004 }
1005 
findTouchedWindowTargetsLocked(nsecs_t currentTime,const MotionEntry * entry,nsecs_t * nextWakeupTime)1006 int32_t InputDispatcher::findTouchedWindowTargetsLocked(nsecs_t currentTime,
1007         const MotionEntry* entry, nsecs_t* nextWakeupTime) {
1008     enum InjectionPermission {
1009         INJECTION_PERMISSION_UNKNOWN,
1010         INJECTION_PERMISSION_GRANTED,
1011         INJECTION_PERMISSION_DENIED
1012     };
1013 
1014     mCurrentInputTargets.clear();
1015 
1016     nsecs_t startTime = now();
1017 
1018     // For security reasons, we defer updating the touch state until we are sure that
1019     // event injection will be allowed.
1020     //
1021     // FIXME In the original code, screenWasOff could never be set to true.
1022     //       The reason is that the POLICY_FLAG_WOKE_HERE
1023     //       and POLICY_FLAG_BRIGHT_HERE flags were set only when preprocessing raw
1024     //       EV_KEY, EV_REL and EV_ABS events.  As it happens, the touch event was
1025     //       actually enqueued using the policyFlags that appeared in the final EV_SYN
1026     //       events upon which no preprocessing took place.  So policyFlags was always 0.
1027     //       In the new native input dispatcher we're a bit more careful about event
1028     //       preprocessing so the touches we receive can actually have non-zero policyFlags.
1029     //       Unfortunately we obtain undesirable behavior.
1030     //
1031     //       Here's what happens:
1032     //
1033     //       When the device dims in anticipation of going to sleep, touches
1034     //       in windows which have FLAG_TOUCHABLE_WHEN_WAKING cause
1035     //       the device to brighten and reset the user activity timer.
1036     //       Touches on other windows (such as the launcher window)
1037     //       are dropped.  Then after a moment, the device goes to sleep.  Oops.
1038     //
1039     //       Also notice how screenWasOff was being initialized using POLICY_FLAG_BRIGHT_HERE
1040     //       instead of POLICY_FLAG_WOKE_HERE...
1041     //
1042     bool screenWasOff = false; // original policy: policyFlags & POLICY_FLAG_BRIGHT_HERE;
1043 
1044     int32_t action = entry->action;
1045     int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
1046 
1047     // Update the touch state as needed based on the properties of the touch event.
1048     int32_t injectionResult = INPUT_EVENT_INJECTION_PENDING;
1049     InjectionPermission injectionPermission = INJECTION_PERMISSION_UNKNOWN;
1050     if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
1051         mTempTouchState.reset();
1052         mTempTouchState.down = true;
1053     } else {
1054         mTempTouchState.copyFrom(mTouchState);
1055     }
1056 
1057     bool isSplit = mTempTouchState.split && mTempTouchState.down;
1058     if (maskedAction == AMOTION_EVENT_ACTION_DOWN
1059             || (isSplit && maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN)) {
1060         /* Case 1: New splittable pointer going down. */
1061 
1062         int32_t pointerIndex = getMotionEventActionPointerIndex(action);
1063         int32_t x = int32_t(entry->firstSample.pointerCoords[pointerIndex].x);
1064         int32_t y = int32_t(entry->firstSample.pointerCoords[pointerIndex].y);
1065         const InputWindow* newTouchedWindow = NULL;
1066         const InputWindow* topErrorWindow = NULL;
1067 
1068         // Traverse windows from front to back to find touched window and outside targets.
1069         size_t numWindows = mWindows.size();
1070         for (size_t i = 0; i < numWindows; i++) {
1071             const InputWindow* window = & mWindows.editItemAt(i);
1072             int32_t flags = window->layoutParamsFlags;
1073 
1074             if (flags & InputWindow::FLAG_SYSTEM_ERROR) {
1075                 if (! topErrorWindow) {
1076                     topErrorWindow = window;
1077                 }
1078             }
1079 
1080             if (window->visible) {
1081                 if (! (flags & InputWindow::FLAG_NOT_TOUCHABLE)) {
1082                     bool isTouchModal = (flags & (InputWindow::FLAG_NOT_FOCUSABLE
1083                             | InputWindow::FLAG_NOT_TOUCH_MODAL)) == 0;
1084                     if (isTouchModal || window->touchableAreaContainsPoint(x, y)) {
1085                         if (! screenWasOff || flags & InputWindow::FLAG_TOUCHABLE_WHEN_WAKING) {
1086                             newTouchedWindow = window;
1087                         }
1088                         break; // found touched window, exit window loop
1089                     }
1090                 }
1091 
1092                 if (maskedAction == AMOTION_EVENT_ACTION_DOWN
1093                         && (flags & InputWindow::FLAG_WATCH_OUTSIDE_TOUCH)) {
1094                     int32_t outsideTargetFlags = InputTarget::FLAG_OUTSIDE;
1095                     if (isWindowObscuredAtPointLocked(window, x, y)) {
1096                         outsideTargetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
1097                     }
1098 
1099                     mTempTouchState.addOrUpdateWindow(window, outsideTargetFlags, BitSet32(0));
1100                 }
1101             }
1102         }
1103 
1104         // If there is an error window but it is not taking focus (typically because
1105         // it is invisible) then wait for it.  Any other focused window may in
1106         // fact be in ANR state.
1107         if (topErrorWindow && newTouchedWindow != topErrorWindow) {
1108 #if DEBUG_FOCUS
1109             LOGD("Waiting because system error window is pending.");
1110 #endif
1111             injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1112                     NULL, NULL, nextWakeupTime);
1113             injectionPermission = INJECTION_PERMISSION_UNKNOWN;
1114             goto Unresponsive;
1115         }
1116 
1117         // Figure out whether splitting will be allowed for this window.
1118         if (newTouchedWindow
1119                 && (newTouchedWindow->layoutParamsFlags & InputWindow::FLAG_SPLIT_TOUCH)) {
1120             // New window supports splitting.
1121             isSplit = true;
1122         } else if (isSplit) {
1123             // New window does not support splitting but we have already split events.
1124             // Assign the pointer to the first foreground window we find.
1125             // (May be NULL which is why we put this code block before the next check.)
1126             newTouchedWindow = mTempTouchState.getFirstForegroundWindow();
1127         }
1128 
1129         // If we did not find a touched window then fail.
1130         if (! newTouchedWindow) {
1131             if (mFocusedApplication) {
1132 #if DEBUG_FOCUS
1133                 LOGD("Waiting because there is no touched window but there is a "
1134                         "focused application that may eventually add a new window: %s.",
1135                         getApplicationWindowLabelLocked(mFocusedApplication, NULL).string());
1136 #endif
1137                 injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1138                         mFocusedApplication, NULL, nextWakeupTime);
1139                 goto Unresponsive;
1140             }
1141 
1142             LOGI("Dropping event because there is no touched window or focused application.");
1143             injectionResult = INPUT_EVENT_INJECTION_FAILED;
1144             goto Failed;
1145         }
1146 
1147         // Set target flags.
1148         int32_t targetFlags = InputTarget::FLAG_FOREGROUND;
1149         if (isSplit) {
1150             targetFlags |= InputTarget::FLAG_SPLIT;
1151         }
1152         if (isWindowObscuredAtPointLocked(newTouchedWindow, x, y)) {
1153             targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
1154         }
1155 
1156         // Update the temporary touch state.
1157         BitSet32 pointerIds;
1158         if (isSplit) {
1159             uint32_t pointerId = entry->pointerIds[pointerIndex];
1160             pointerIds.markBit(pointerId);
1161         }
1162         mTempTouchState.addOrUpdateWindow(newTouchedWindow, targetFlags, pointerIds);
1163     } else {
1164         /* Case 2: Pointer move, up, cancel or non-splittable pointer down. */
1165 
1166         // If the pointer is not currently down, then ignore the event.
1167         if (! mTempTouchState.down) {
1168             LOGI("Dropping event because the pointer is not down.");
1169             injectionResult = INPUT_EVENT_INJECTION_FAILED;
1170             goto Failed;
1171         }
1172     }
1173 
1174     // Check permission to inject into all touched foreground windows and ensure there
1175     // is at least one touched foreground window.
1176     {
1177         bool haveForegroundWindow = false;
1178         for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
1179             const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
1180             if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
1181                 haveForegroundWindow = true;
1182                 if (! checkInjectionPermission(touchedWindow.window, entry->injectionState)) {
1183                     injectionResult = INPUT_EVENT_INJECTION_PERMISSION_DENIED;
1184                     injectionPermission = INJECTION_PERMISSION_DENIED;
1185                     goto Failed;
1186                 }
1187             }
1188         }
1189         if (! haveForegroundWindow) {
1190 #if DEBUG_INPUT_DISPATCHER_POLICY
1191             LOGD("Dropping event because there is no touched foreground window to receive it.");
1192 #endif
1193             injectionResult = INPUT_EVENT_INJECTION_FAILED;
1194             goto Failed;
1195         }
1196 
1197         // Permission granted to injection into all touched foreground windows.
1198         injectionPermission = INJECTION_PERMISSION_GRANTED;
1199     }
1200 
1201     // Ensure all touched foreground windows are ready for new input.
1202     for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
1203         const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
1204         if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
1205             // If the touched window is paused then keep waiting.
1206             if (touchedWindow.window->paused) {
1207 #if DEBUG_INPUT_DISPATCHER_POLICY
1208                 LOGD("Waiting because touched window is paused.");
1209 #endif
1210                 injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1211                         NULL, touchedWindow.window, nextWakeupTime);
1212                 goto Unresponsive;
1213             }
1214 
1215             // If the touched window is still working on previous events then keep waiting.
1216             if (! isWindowFinishedWithPreviousInputLocked(touchedWindow.window)) {
1217 #if DEBUG_FOCUS
1218                 LOGD("Waiting because touched window still processing previous input.");
1219 #endif
1220                 injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1221                         NULL, touchedWindow.window, nextWakeupTime);
1222                 goto Unresponsive;
1223             }
1224         }
1225     }
1226 
1227     // If this is the first pointer going down and the touched window has a wallpaper
1228     // then also add the touched wallpaper windows so they are locked in for the duration
1229     // of the touch gesture.
1230     if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
1231         const InputWindow* foregroundWindow = mTempTouchState.getFirstForegroundWindow();
1232         if (foregroundWindow->hasWallpaper) {
1233             for (size_t i = 0; i < mWindows.size(); i++) {
1234                 const InputWindow* window = & mWindows[i];
1235                 if (window->layoutParamsType == InputWindow::TYPE_WALLPAPER) {
1236                     mTempTouchState.addOrUpdateWindow(window,
1237                             InputTarget::FLAG_WINDOW_IS_OBSCURED, BitSet32(0));
1238                 }
1239             }
1240         }
1241     }
1242 
1243     // Success!  Output targets.
1244     injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
1245 
1246     for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
1247         const TouchedWindow& touchedWindow = mTempTouchState.windows.itemAt(i);
1248         addWindowTargetLocked(touchedWindow.window, touchedWindow.targetFlags,
1249                 touchedWindow.pointerIds);
1250     }
1251 
1252     // Drop the outside touch window since we will not care about them in the next iteration.
1253     mTempTouchState.removeOutsideTouchWindows();
1254 
1255 Failed:
1256     // Check injection permission once and for all.
1257     if (injectionPermission == INJECTION_PERMISSION_UNKNOWN) {
1258         if (checkInjectionPermission(NULL, entry->injectionState)) {
1259             injectionPermission = INJECTION_PERMISSION_GRANTED;
1260         } else {
1261             injectionPermission = INJECTION_PERMISSION_DENIED;
1262         }
1263     }
1264 
1265     // Update final pieces of touch state if the injector had permission.
1266     if (injectionPermission == INJECTION_PERMISSION_GRANTED) {
1267         if (maskedAction == AMOTION_EVENT_ACTION_UP
1268                 || maskedAction == AMOTION_EVENT_ACTION_CANCEL) {
1269             // All pointers up or canceled.
1270             mTempTouchState.reset();
1271         } else if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
1272             // First pointer went down.
1273             if (mTouchState.down) {
1274 #if DEBUG_FOCUS
1275                 LOGD("Pointer down received while already down.");
1276 #endif
1277             }
1278         } else if (maskedAction == AMOTION_EVENT_ACTION_POINTER_UP) {
1279             // One pointer went up.
1280             if (isSplit) {
1281                 int32_t pointerIndex = getMotionEventActionPointerIndex(action);
1282                 uint32_t pointerId = entry->pointerIds[pointerIndex];
1283 
1284                 for (size_t i = 0; i < mTempTouchState.windows.size(); ) {
1285                     TouchedWindow& touchedWindow = mTempTouchState.windows.editItemAt(i);
1286                     if (touchedWindow.targetFlags & InputTarget::FLAG_SPLIT) {
1287                         touchedWindow.pointerIds.clearBit(pointerId);
1288                         if (touchedWindow.pointerIds.isEmpty()) {
1289                             mTempTouchState.windows.removeAt(i);
1290                             continue;
1291                         }
1292                     }
1293                     i += 1;
1294                 }
1295             }
1296         }
1297 
1298         // Save changes to touch state.
1299         mTouchState.copyFrom(mTempTouchState);
1300     } else {
1301 #if DEBUG_FOCUS
1302         LOGD("Not updating touch focus because injection was denied.");
1303 #endif
1304     }
1305 
1306 Unresponsive:
1307     // Reset temporary touch state to ensure we release unnecessary references to input channels.
1308     mTempTouchState.reset();
1309 
1310     nsecs_t timeSpentWaitingForApplication = getTimeSpentWaitingForApplicationLocked(currentTime);
1311     updateDispatchStatisticsLocked(currentTime, entry,
1312             injectionResult, timeSpentWaitingForApplication);
1313 #if DEBUG_FOCUS
1314     LOGD("findTouchedWindow finished: injectionResult=%d, injectionPermission=%d, "
1315             "timeSpentWaitingForApplication=%0.1fms",
1316             injectionResult, injectionPermission, timeSpentWaitingForApplication / 1000000.0);
1317 #endif
1318     return injectionResult;
1319 }
1320 
addWindowTargetLocked(const InputWindow * window,int32_t targetFlags,BitSet32 pointerIds)1321 void InputDispatcher::addWindowTargetLocked(const InputWindow* window, int32_t targetFlags,
1322         BitSet32 pointerIds) {
1323     mCurrentInputTargets.push();
1324 
1325     InputTarget& target = mCurrentInputTargets.editTop();
1326     target.inputChannel = window->inputChannel;
1327     target.flags = targetFlags;
1328     target.xOffset = - window->frameLeft;
1329     target.yOffset = - window->frameTop;
1330     target.pointerIds = pointerIds;
1331 }
1332 
addMonitoringTargetsLocked()1333 void InputDispatcher::addMonitoringTargetsLocked() {
1334     for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
1335         mCurrentInputTargets.push();
1336 
1337         InputTarget& target = mCurrentInputTargets.editTop();
1338         target.inputChannel = mMonitoringChannels[i];
1339         target.flags = 0;
1340         target.xOffset = 0;
1341         target.yOffset = 0;
1342     }
1343 }
1344 
checkInjectionPermission(const InputWindow * window,const InjectionState * injectionState)1345 bool InputDispatcher::checkInjectionPermission(const InputWindow* window,
1346         const InjectionState* injectionState) {
1347     if (injectionState
1348             && (window == NULL || window->ownerUid != injectionState->injectorUid)
1349             && !hasInjectionPermission(injectionState->injectorPid, injectionState->injectorUid)) {
1350         if (window) {
1351             LOGW("Permission denied: injecting event from pid %d uid %d to window "
1352                     "with input channel %s owned by uid %d",
1353                     injectionState->injectorPid, injectionState->injectorUid,
1354                     window->inputChannel->getName().string(),
1355                     window->ownerUid);
1356         } else {
1357             LOGW("Permission denied: injecting event from pid %d uid %d",
1358                     injectionState->injectorPid, injectionState->injectorUid);
1359         }
1360         return false;
1361     }
1362     return true;
1363 }
1364 
isWindowObscuredAtPointLocked(const InputWindow * window,int32_t x,int32_t y) const1365 bool InputDispatcher::isWindowObscuredAtPointLocked(
1366         const InputWindow* window, int32_t x, int32_t y) const {
1367     size_t numWindows = mWindows.size();
1368     for (size_t i = 0; i < numWindows; i++) {
1369         const InputWindow* other = & mWindows.itemAt(i);
1370         if (other == window) {
1371             break;
1372         }
1373         if (other->visible && ! other->isTrustedOverlay() && other->frameContainsPoint(x, y)) {
1374             return true;
1375         }
1376     }
1377     return false;
1378 }
1379 
isWindowFinishedWithPreviousInputLocked(const InputWindow * window)1380 bool InputDispatcher::isWindowFinishedWithPreviousInputLocked(const InputWindow* window) {
1381     ssize_t connectionIndex = getConnectionIndexLocked(window->inputChannel);
1382     if (connectionIndex >= 0) {
1383         sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);
1384         return connection->outboundQueue.isEmpty();
1385     } else {
1386         return true;
1387     }
1388 }
1389 
getApplicationWindowLabelLocked(const InputApplication * application,const InputWindow * window)1390 String8 InputDispatcher::getApplicationWindowLabelLocked(const InputApplication* application,
1391         const InputWindow* window) {
1392     if (application) {
1393         if (window) {
1394             String8 label(application->name);
1395             label.append(" - ");
1396             label.append(window->name);
1397             return label;
1398         } else {
1399             return application->name;
1400         }
1401     } else if (window) {
1402         return window->name;
1403     } else {
1404         return String8("<unknown application or window>");
1405     }
1406 }
1407 
pokeUserActivityLocked(const EventEntry * eventEntry)1408 void InputDispatcher::pokeUserActivityLocked(const EventEntry* eventEntry) {
1409     int32_t eventType = POWER_MANAGER_BUTTON_EVENT;
1410     switch (eventEntry->type) {
1411     case EventEntry::TYPE_MOTION: {
1412         const MotionEntry* motionEntry = static_cast<const MotionEntry*>(eventEntry);
1413         if (motionEntry->action == AMOTION_EVENT_ACTION_CANCEL) {
1414             return;
1415         }
1416 
1417         if (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER) {
1418             switch (motionEntry->action) {
1419             case AMOTION_EVENT_ACTION_DOWN:
1420                 eventType = POWER_MANAGER_TOUCH_EVENT;
1421                 break;
1422             case AMOTION_EVENT_ACTION_UP:
1423                 eventType = POWER_MANAGER_TOUCH_UP_EVENT;
1424                 break;
1425             default:
1426                 if (motionEntry->eventTime - motionEntry->downTime < LONG_TOUCH_DELAY) {
1427                     eventType = POWER_MANAGER_TOUCH_EVENT;
1428                 } else {
1429                     eventType = POWER_MANAGER_LONG_TOUCH_EVENT;
1430                 }
1431                 break;
1432             }
1433         }
1434         break;
1435     }
1436     case EventEntry::TYPE_KEY: {
1437         const KeyEntry* keyEntry = static_cast<const KeyEntry*>(eventEntry);
1438         if (keyEntry->flags & AKEY_EVENT_FLAG_CANCELED) {
1439             return;
1440         }
1441         break;
1442     }
1443     }
1444 
1445     CommandEntry* commandEntry = postCommandLocked(
1446             & InputDispatcher::doPokeUserActivityLockedInterruptible);
1447     commandEntry->eventTime = eventEntry->eventTime;
1448     commandEntry->userActivityEventType = eventType;
1449 }
1450 
prepareDispatchCycleLocked(nsecs_t currentTime,const sp<Connection> & connection,EventEntry * eventEntry,const InputTarget * inputTarget,bool resumeWithAppendedMotionSample)1451 void InputDispatcher::prepareDispatchCycleLocked(nsecs_t currentTime,
1452         const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget,
1453         bool resumeWithAppendedMotionSample) {
1454 #if DEBUG_DISPATCH_CYCLE
1455     LOGD("channel '%s' ~ prepareDispatchCycle - flags=%d, "
1456             "xOffset=%f, yOffset=%f, "
1457             "windowType=%d, pointerIds=0x%x, "
1458             "resumeWithAppendedMotionSample=%s",
1459             connection->getInputChannelName(), inputTarget->flags,
1460             inputTarget->xOffset, inputTarget->yOffset,
1461             inputTarget->windowType, inputTarget->pointerIds.value,
1462             toString(resumeWithAppendedMotionSample));
1463 #endif
1464 
1465     // Make sure we are never called for streaming when splitting across multiple windows.
1466     bool isSplit = inputTarget->flags & InputTarget::FLAG_SPLIT;
1467     assert(! (resumeWithAppendedMotionSample && isSplit));
1468 
1469     // Skip this event if the connection status is not normal.
1470     // We don't want to enqueue additional outbound events if the connection is broken.
1471     if (connection->status != Connection::STATUS_NORMAL) {
1472 #if DEBUG_DISPATCH_CYCLE
1473         LOGD("channel '%s' ~ Dropping event because the channel status is %s",
1474                 connection->getInputChannelName(), connection->getStatusLabel());
1475 #endif
1476         return;
1477     }
1478 
1479     // Split a motion event if needed.
1480     if (isSplit) {
1481         assert(eventEntry->type == EventEntry::TYPE_MOTION);
1482 
1483         MotionEntry* originalMotionEntry = static_cast<MotionEntry*>(eventEntry);
1484         if (inputTarget->pointerIds.count() != originalMotionEntry->pointerCount) {
1485             MotionEntry* splitMotionEntry = splitMotionEvent(
1486                     originalMotionEntry, inputTarget->pointerIds);
1487 #if DEBUG_FOCUS
1488             LOGD("channel '%s' ~ Split motion event.",
1489                     connection->getInputChannelName());
1490             logOutboundMotionDetailsLocked("  ", splitMotionEntry);
1491 #endif
1492             eventEntry = splitMotionEntry;
1493         }
1494     }
1495 
1496     // Resume the dispatch cycle with a freshly appended motion sample.
1497     // First we check that the last dispatch entry in the outbound queue is for the same
1498     // motion event to which we appended the motion sample.  If we find such a dispatch
1499     // entry, and if it is currently in progress then we try to stream the new sample.
1500     bool wasEmpty = connection->outboundQueue.isEmpty();
1501 
1502     if (! wasEmpty && resumeWithAppendedMotionSample) {
1503         DispatchEntry* motionEventDispatchEntry =
1504                 connection->findQueuedDispatchEntryForEvent(eventEntry);
1505         if (motionEventDispatchEntry) {
1506             // If the dispatch entry is not in progress, then we must be busy dispatching an
1507             // earlier event.  Not a problem, the motion event is on the outbound queue and will
1508             // be dispatched later.
1509             if (! motionEventDispatchEntry->inProgress) {
1510 #if DEBUG_BATCHING
1511                 LOGD("channel '%s' ~ Not streaming because the motion event has "
1512                         "not yet been dispatched.  "
1513                         "(Waiting for earlier events to be consumed.)",
1514                         connection->getInputChannelName());
1515 #endif
1516                 return;
1517             }
1518 
1519             // If the dispatch entry is in progress but it already has a tail of pending
1520             // motion samples, then it must mean that the shared memory buffer filled up.
1521             // Not a problem, when this dispatch cycle is finished, we will eventually start
1522             // a new dispatch cycle to process the tail and that tail includes the newly
1523             // appended motion sample.
1524             if (motionEventDispatchEntry->tailMotionSample) {
1525 #if DEBUG_BATCHING
1526                 LOGD("channel '%s' ~ Not streaming because no new samples can "
1527                         "be appended to the motion event in this dispatch cycle.  "
1528                         "(Waiting for next dispatch cycle to start.)",
1529                         connection->getInputChannelName());
1530 #endif
1531                 return;
1532             }
1533 
1534             // The dispatch entry is in progress and is still potentially open for streaming.
1535             // Try to stream the new motion sample.  This might fail if the consumer has already
1536             // consumed the motion event (or if the channel is broken).
1537             MotionEntry* motionEntry = static_cast<MotionEntry*>(eventEntry);
1538             MotionSample* appendedMotionSample = motionEntry->lastSample;
1539             status_t status = connection->inputPublisher.appendMotionSample(
1540                     appendedMotionSample->eventTime, appendedMotionSample->pointerCoords);
1541             if (status == OK) {
1542 #if DEBUG_BATCHING
1543                 LOGD("channel '%s' ~ Successfully streamed new motion sample.",
1544                         connection->getInputChannelName());
1545 #endif
1546                 return;
1547             }
1548 
1549 #if DEBUG_BATCHING
1550             if (status == NO_MEMORY) {
1551                 LOGD("channel '%s' ~ Could not append motion sample to currently "
1552                         "dispatched move event because the shared memory buffer is full.  "
1553                         "(Waiting for next dispatch cycle to start.)",
1554                         connection->getInputChannelName());
1555             } else if (status == status_t(FAILED_TRANSACTION)) {
1556                 LOGD("channel '%s' ~ Could not append motion sample to currently "
1557                         "dispatched move event because the event has already been consumed.  "
1558                         "(Waiting for next dispatch cycle to start.)",
1559                         connection->getInputChannelName());
1560             } else {
1561                 LOGD("channel '%s' ~ Could not append motion sample to currently "
1562                         "dispatched move event due to an error, status=%d.  "
1563                         "(Waiting for next dispatch cycle to start.)",
1564                         connection->getInputChannelName(), status);
1565             }
1566 #endif
1567             // Failed to stream.  Start a new tail of pending motion samples to dispatch
1568             // in the next cycle.
1569             motionEventDispatchEntry->tailMotionSample = appendedMotionSample;
1570             return;
1571         }
1572     }
1573 
1574     // This is a new event.
1575     // Enqueue a new dispatch entry onto the outbound queue for this connection.
1576     DispatchEntry* dispatchEntry = mAllocator.obtainDispatchEntry(eventEntry, // increments ref
1577             inputTarget->flags, inputTarget->xOffset, inputTarget->yOffset);
1578     if (dispatchEntry->hasForegroundTarget()) {
1579         incrementPendingForegroundDispatchesLocked(eventEntry);
1580     }
1581 
1582     // Handle the case where we could not stream a new motion sample because the consumer has
1583     // already consumed the motion event (otherwise the corresponding dispatch entry would
1584     // still be in the outbound queue for this connection).  We set the head motion sample
1585     // to the list starting with the newly appended motion sample.
1586     if (resumeWithAppendedMotionSample) {
1587 #if DEBUG_BATCHING
1588         LOGD("channel '%s' ~ Preparing a new dispatch cycle for additional motion samples "
1589                 "that cannot be streamed because the motion event has already been consumed.",
1590                 connection->getInputChannelName());
1591 #endif
1592         MotionSample* appendedMotionSample = static_cast<MotionEntry*>(eventEntry)->lastSample;
1593         dispatchEntry->headMotionSample = appendedMotionSample;
1594     }
1595 
1596     // Enqueue the dispatch entry.
1597     connection->outboundQueue.enqueueAtTail(dispatchEntry);
1598 
1599     // If the outbound queue was previously empty, start the dispatch cycle going.
1600     if (wasEmpty) {
1601         activateConnectionLocked(connection.get());
1602         startDispatchCycleLocked(currentTime, connection);
1603     }
1604 }
1605 
startDispatchCycleLocked(nsecs_t currentTime,const sp<Connection> & connection)1606 void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
1607         const sp<Connection>& connection) {
1608 #if DEBUG_DISPATCH_CYCLE
1609     LOGD("channel '%s' ~ startDispatchCycle",
1610             connection->getInputChannelName());
1611 #endif
1612 
1613     assert(connection->status == Connection::STATUS_NORMAL);
1614     assert(! connection->outboundQueue.isEmpty());
1615 
1616     DispatchEntry* dispatchEntry = connection->outboundQueue.headSentinel.next;
1617     assert(! dispatchEntry->inProgress);
1618 
1619     // Mark the dispatch entry as in progress.
1620     dispatchEntry->inProgress = true;
1621 
1622     // Update the connection's input state.
1623     EventEntry* eventEntry = dispatchEntry->eventEntry;
1624     InputState::Consistency consistency = connection->inputState.trackEvent(eventEntry);
1625 
1626 #if FILTER_INPUT_EVENTS
1627     // Filter out inconsistent sequences of input events.
1628     // The input system may drop or inject events in a way that could violate implicit
1629     // invariants on input state and potentially cause an application to crash
1630     // or think that a key or pointer is stuck down.  Technically we make no guarantees
1631     // of consistency but it would be nice to improve on this where possible.
1632     // XXX: This code is a proof of concept only.  Not ready for prime time.
1633     if (consistency == InputState::TOLERABLE) {
1634 #if DEBUG_DISPATCH_CYCLE
1635         LOGD("channel '%s' ~ Sending an event that is inconsistent with the connection's "
1636                 "current input state but that is likely to be tolerated by the application.",
1637                 connection->getInputChannelName());
1638 #endif
1639     } else if (consistency == InputState::BROKEN) {
1640         LOGI("channel '%s' ~ Dropping an event that is inconsistent with the connection's "
1641                 "current input state and that is likely to cause the application to crash.",
1642                 connection->getInputChannelName());
1643         startNextDispatchCycleLocked(currentTime, connection);
1644         return;
1645     }
1646 #endif
1647 
1648     // Publish the event.
1649     status_t status;
1650     switch (eventEntry->type) {
1651     case EventEntry::TYPE_KEY: {
1652         KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
1653 
1654         // Apply target flags.
1655         int32_t action = keyEntry->action;
1656         int32_t flags = keyEntry->flags;
1657 
1658         // Publish the key event.
1659         status = connection->inputPublisher.publishKeyEvent(keyEntry->deviceId, keyEntry->source,
1660                 action, flags, keyEntry->keyCode, keyEntry->scanCode,
1661                 keyEntry->metaState, keyEntry->repeatCount, keyEntry->downTime,
1662                 keyEntry->eventTime);
1663 
1664         if (status) {
1665             LOGE("channel '%s' ~ Could not publish key event, "
1666                     "status=%d", connection->getInputChannelName(), status);
1667             abortBrokenDispatchCycleLocked(currentTime, connection);
1668             return;
1669         }
1670         break;
1671     }
1672 
1673     case EventEntry::TYPE_MOTION: {
1674         MotionEntry* motionEntry = static_cast<MotionEntry*>(eventEntry);
1675 
1676         // Apply target flags.
1677         int32_t action = motionEntry->action;
1678         int32_t flags = motionEntry->flags;
1679         if (dispatchEntry->targetFlags & InputTarget::FLAG_OUTSIDE) {
1680             action = AMOTION_EVENT_ACTION_OUTSIDE;
1681         }
1682         if (dispatchEntry->targetFlags & InputTarget::FLAG_WINDOW_IS_OBSCURED) {
1683             flags |= AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED;
1684         }
1685 
1686         // If headMotionSample is non-NULL, then it points to the first new sample that we
1687         // were unable to dispatch during the previous cycle so we resume dispatching from
1688         // that point in the list of motion samples.
1689         // Otherwise, we just start from the first sample of the motion event.
1690         MotionSample* firstMotionSample = dispatchEntry->headMotionSample;
1691         if (! firstMotionSample) {
1692             firstMotionSample = & motionEntry->firstSample;
1693         }
1694 
1695         // Set the X and Y offset depending on the input source.
1696         float xOffset, yOffset;
1697         if (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER) {
1698             xOffset = dispatchEntry->xOffset;
1699             yOffset = dispatchEntry->yOffset;
1700         } else {
1701             xOffset = 0.0f;
1702             yOffset = 0.0f;
1703         }
1704 
1705         // Publish the motion event and the first motion sample.
1706         status = connection->inputPublisher.publishMotionEvent(motionEntry->deviceId,
1707                 motionEntry->source, action, flags, motionEntry->edgeFlags, motionEntry->metaState,
1708                 xOffset, yOffset,
1709                 motionEntry->xPrecision, motionEntry->yPrecision,
1710                 motionEntry->downTime, firstMotionSample->eventTime,
1711                 motionEntry->pointerCount, motionEntry->pointerIds,
1712                 firstMotionSample->pointerCoords);
1713 
1714         if (status) {
1715             LOGE("channel '%s' ~ Could not publish motion event, "
1716                     "status=%d", connection->getInputChannelName(), status);
1717             abortBrokenDispatchCycleLocked(currentTime, connection);
1718             return;
1719         }
1720 
1721         // Append additional motion samples.
1722         MotionSample* nextMotionSample = firstMotionSample->next;
1723         for (; nextMotionSample != NULL; nextMotionSample = nextMotionSample->next) {
1724             status = connection->inputPublisher.appendMotionSample(
1725                     nextMotionSample->eventTime, nextMotionSample->pointerCoords);
1726             if (status == NO_MEMORY) {
1727 #if DEBUG_DISPATCH_CYCLE
1728                     LOGD("channel '%s' ~ Shared memory buffer full.  Some motion samples will "
1729                             "be sent in the next dispatch cycle.",
1730                             connection->getInputChannelName());
1731 #endif
1732                 break;
1733             }
1734             if (status != OK) {
1735                 LOGE("channel '%s' ~ Could not append motion sample "
1736                         "for a reason other than out of memory, status=%d",
1737                         connection->getInputChannelName(), status);
1738                 abortBrokenDispatchCycleLocked(currentTime, connection);
1739                 return;
1740             }
1741         }
1742 
1743         // Remember the next motion sample that we could not dispatch, in case we ran out
1744         // of space in the shared memory buffer.
1745         dispatchEntry->tailMotionSample = nextMotionSample;
1746         break;
1747     }
1748 
1749     default: {
1750         assert(false);
1751     }
1752     }
1753 
1754     // Send the dispatch signal.
1755     status = connection->inputPublisher.sendDispatchSignal();
1756     if (status) {
1757         LOGE("channel '%s' ~ Could not send dispatch signal, status=%d",
1758                 connection->getInputChannelName(), status);
1759         abortBrokenDispatchCycleLocked(currentTime, connection);
1760         return;
1761     }
1762 
1763     // Record information about the newly started dispatch cycle.
1764     connection->lastEventTime = eventEntry->eventTime;
1765     connection->lastDispatchTime = currentTime;
1766 
1767     // Notify other system components.
1768     onDispatchCycleStartedLocked(currentTime, connection);
1769 }
1770 
finishDispatchCycleLocked(nsecs_t currentTime,const sp<Connection> & connection)1771 void InputDispatcher::finishDispatchCycleLocked(nsecs_t currentTime,
1772         const sp<Connection>& connection) {
1773 #if DEBUG_DISPATCH_CYCLE
1774     LOGD("channel '%s' ~ finishDispatchCycle - %01.1fms since event, "
1775             "%01.1fms since dispatch",
1776             connection->getInputChannelName(),
1777             connection->getEventLatencyMillis(currentTime),
1778             connection->getDispatchLatencyMillis(currentTime));
1779 #endif
1780 
1781     if (connection->status == Connection::STATUS_BROKEN
1782             || connection->status == Connection::STATUS_ZOMBIE) {
1783         return;
1784     }
1785 
1786     // Notify other system components.
1787     onDispatchCycleFinishedLocked(currentTime, connection);
1788 
1789     // Reset the publisher since the event has been consumed.
1790     // We do this now so that the publisher can release some of its internal resources
1791     // while waiting for the next dispatch cycle to begin.
1792     status_t status = connection->inputPublisher.reset();
1793     if (status) {
1794         LOGE("channel '%s' ~ Could not reset publisher, status=%d",
1795                 connection->getInputChannelName(), status);
1796         abortBrokenDispatchCycleLocked(currentTime, connection);
1797         return;
1798     }
1799 
1800     startNextDispatchCycleLocked(currentTime, connection);
1801 }
1802 
startNextDispatchCycleLocked(nsecs_t currentTime,const sp<Connection> & connection)1803 void InputDispatcher::startNextDispatchCycleLocked(nsecs_t currentTime,
1804         const sp<Connection>& connection) {
1805     // Start the next dispatch cycle for this connection.
1806     while (! connection->outboundQueue.isEmpty()) {
1807         DispatchEntry* dispatchEntry = connection->outboundQueue.headSentinel.next;
1808         if (dispatchEntry->inProgress) {
1809              // Finish or resume current event in progress.
1810             if (dispatchEntry->tailMotionSample) {
1811                 // We have a tail of undispatched motion samples.
1812                 // Reuse the same DispatchEntry and start a new cycle.
1813                 dispatchEntry->inProgress = false;
1814                 dispatchEntry->headMotionSample = dispatchEntry->tailMotionSample;
1815                 dispatchEntry->tailMotionSample = NULL;
1816                 startDispatchCycleLocked(currentTime, connection);
1817                 return;
1818             }
1819             // Finished.
1820             connection->outboundQueue.dequeueAtHead();
1821             if (dispatchEntry->hasForegroundTarget()) {
1822                 decrementPendingForegroundDispatchesLocked(dispatchEntry->eventEntry);
1823             }
1824             mAllocator.releaseDispatchEntry(dispatchEntry);
1825         } else {
1826             // If the head is not in progress, then we must have already dequeued the in
1827             // progress event, which means we actually aborted it.
1828             // So just start the next event for this connection.
1829             startDispatchCycleLocked(currentTime, connection);
1830             return;
1831         }
1832     }
1833 
1834     // Outbound queue is empty, deactivate the connection.
1835     deactivateConnectionLocked(connection.get());
1836 }
1837 
abortBrokenDispatchCycleLocked(nsecs_t currentTime,const sp<Connection> & connection)1838 void InputDispatcher::abortBrokenDispatchCycleLocked(nsecs_t currentTime,
1839         const sp<Connection>& connection) {
1840 #if DEBUG_DISPATCH_CYCLE
1841     LOGD("channel '%s' ~ abortBrokenDispatchCycle - broken=%s",
1842             connection->getInputChannelName(), toString(broken));
1843 #endif
1844 
1845     // Clear the outbound queue.
1846     drainOutboundQueueLocked(connection.get());
1847 
1848     // The connection appears to be unrecoverably broken.
1849     // Ignore already broken or zombie connections.
1850     if (connection->status == Connection::STATUS_NORMAL) {
1851         connection->status = Connection::STATUS_BROKEN;
1852 
1853         // Notify other system components.
1854         onDispatchCycleBrokenLocked(currentTime, connection);
1855     }
1856 }
1857 
drainOutboundQueueLocked(Connection * connection)1858 void InputDispatcher::drainOutboundQueueLocked(Connection* connection) {
1859     while (! connection->outboundQueue.isEmpty()) {
1860         DispatchEntry* dispatchEntry = connection->outboundQueue.dequeueAtHead();
1861         if (dispatchEntry->hasForegroundTarget()) {
1862             decrementPendingForegroundDispatchesLocked(dispatchEntry->eventEntry);
1863         }
1864         mAllocator.releaseDispatchEntry(dispatchEntry);
1865     }
1866 
1867     deactivateConnectionLocked(connection);
1868 }
1869 
handleReceiveCallback(int receiveFd,int events,void * data)1870 int InputDispatcher::handleReceiveCallback(int receiveFd, int events, void* data) {
1871     InputDispatcher* d = static_cast<InputDispatcher*>(data);
1872 
1873     { // acquire lock
1874         AutoMutex _l(d->mLock);
1875 
1876         ssize_t connectionIndex = d->mConnectionsByReceiveFd.indexOfKey(receiveFd);
1877         if (connectionIndex < 0) {
1878             LOGE("Received spurious receive callback for unknown input channel.  "
1879                     "fd=%d, events=0x%x", receiveFd, events);
1880             return 0; // remove the callback
1881         }
1882 
1883         nsecs_t currentTime = now();
1884 
1885         sp<Connection> connection = d->mConnectionsByReceiveFd.valueAt(connectionIndex);
1886         if (events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP)) {
1887             LOGE("channel '%s' ~ Consumer closed input channel or an error occurred.  "
1888                     "events=0x%x", connection->getInputChannelName(), events);
1889             d->abortBrokenDispatchCycleLocked(currentTime, connection);
1890             d->runCommandsLockedInterruptible();
1891             return 0; // remove the callback
1892         }
1893 
1894         if (! (events & ALOOPER_EVENT_INPUT)) {
1895             LOGW("channel '%s' ~ Received spurious callback for unhandled poll event.  "
1896                     "events=0x%x", connection->getInputChannelName(), events);
1897             return 1;
1898         }
1899 
1900         status_t status = connection->inputPublisher.receiveFinishedSignal();
1901         if (status) {
1902             LOGE("channel '%s' ~ Failed to receive finished signal.  status=%d",
1903                     connection->getInputChannelName(), status);
1904             d->abortBrokenDispatchCycleLocked(currentTime, connection);
1905             d->runCommandsLockedInterruptible();
1906             return 0; // remove the callback
1907         }
1908 
1909         d->finishDispatchCycleLocked(currentTime, connection);
1910         d->runCommandsLockedInterruptible();
1911         return 1;
1912     } // release lock
1913 }
1914 
synthesizeCancelationEventsForAllConnectionsLocked(InputState::CancelationOptions options,const char * reason)1915 void InputDispatcher::synthesizeCancelationEventsForAllConnectionsLocked(
1916         InputState::CancelationOptions options, const char* reason) {
1917     for (size_t i = 0; i < mConnectionsByReceiveFd.size(); i++) {
1918         synthesizeCancelationEventsForConnectionLocked(
1919                 mConnectionsByReceiveFd.valueAt(i), options, reason);
1920     }
1921 }
1922 
synthesizeCancelationEventsForInputChannelLocked(const sp<InputChannel> & channel,InputState::CancelationOptions options,const char * reason)1923 void InputDispatcher::synthesizeCancelationEventsForInputChannelLocked(
1924         const sp<InputChannel>& channel, InputState::CancelationOptions options,
1925         const char* reason) {
1926     ssize_t index = getConnectionIndexLocked(channel);
1927     if (index >= 0) {
1928         synthesizeCancelationEventsForConnectionLocked(
1929                 mConnectionsByReceiveFd.valueAt(index), options, reason);
1930     }
1931 }
1932 
synthesizeCancelationEventsForConnectionLocked(const sp<Connection> & connection,InputState::CancelationOptions options,const char * reason)1933 void InputDispatcher::synthesizeCancelationEventsForConnectionLocked(
1934         const sp<Connection>& connection, InputState::CancelationOptions options,
1935         const char* reason) {
1936     nsecs_t currentTime = now();
1937 
1938     mTempCancelationEvents.clear();
1939     connection->inputState.synthesizeCancelationEvents(currentTime, & mAllocator,
1940             mTempCancelationEvents, options);
1941 
1942     if (! mTempCancelationEvents.isEmpty()
1943             && connection->status != Connection::STATUS_BROKEN) {
1944 #if DEBUG_OUTBOUND_EVENT_DETAILS
1945         LOGD("channel '%s' ~ Synthesized %d cancelation events to bring channel back in sync "
1946                 "with reality: %s, options=%d.",
1947                 connection->getInputChannelName(), mTempCancelationEvents.size(), reason, options);
1948 #endif
1949         for (size_t i = 0; i < mTempCancelationEvents.size(); i++) {
1950             EventEntry* cancelationEventEntry = mTempCancelationEvents.itemAt(i);
1951             switch (cancelationEventEntry->type) {
1952             case EventEntry::TYPE_KEY:
1953                 logOutboundKeyDetailsLocked("cancel - ",
1954                         static_cast<KeyEntry*>(cancelationEventEntry));
1955                 break;
1956             case EventEntry::TYPE_MOTION:
1957                 logOutboundMotionDetailsLocked("cancel - ",
1958                         static_cast<MotionEntry*>(cancelationEventEntry));
1959                 break;
1960             }
1961 
1962             int32_t xOffset, yOffset;
1963             const InputWindow* window = getWindowLocked(connection->inputChannel);
1964             if (window) {
1965                 xOffset = -window->frameLeft;
1966                 yOffset = -window->frameTop;
1967             } else {
1968                 xOffset = 0;
1969                 yOffset = 0;
1970             }
1971 
1972             DispatchEntry* cancelationDispatchEntry =
1973                     mAllocator.obtainDispatchEntry(cancelationEventEntry, // increments ref
1974                     0, xOffset, yOffset);
1975             connection->outboundQueue.enqueueAtTail(cancelationDispatchEntry);
1976 
1977             mAllocator.releaseEventEntry(cancelationEventEntry);
1978         }
1979 
1980         if (!connection->outboundQueue.headSentinel.next->inProgress) {
1981             startDispatchCycleLocked(currentTime, connection);
1982         }
1983     }
1984 }
1985 
1986 InputDispatcher::MotionEntry*
splitMotionEvent(const MotionEntry * originalMotionEntry,BitSet32 pointerIds)1987 InputDispatcher::splitMotionEvent(const MotionEntry* originalMotionEntry, BitSet32 pointerIds) {
1988     assert(pointerIds.value != 0);
1989 
1990     uint32_t splitPointerIndexMap[MAX_POINTERS];
1991     int32_t splitPointerIds[MAX_POINTERS];
1992     PointerCoords splitPointerCoords[MAX_POINTERS];
1993 
1994     uint32_t originalPointerCount = originalMotionEntry->pointerCount;
1995     uint32_t splitPointerCount = 0;
1996 
1997     for (uint32_t originalPointerIndex = 0; originalPointerIndex < originalPointerCount;
1998             originalPointerIndex++) {
1999         int32_t pointerId = uint32_t(originalMotionEntry->pointerIds[originalPointerIndex]);
2000         if (pointerIds.hasBit(pointerId)) {
2001             splitPointerIndexMap[splitPointerCount] = originalPointerIndex;
2002             splitPointerIds[splitPointerCount] = pointerId;
2003             splitPointerCoords[splitPointerCount] =
2004                     originalMotionEntry->firstSample.pointerCoords[originalPointerIndex];
2005             splitPointerCount += 1;
2006         }
2007     }
2008     assert(splitPointerCount == pointerIds.count());
2009 
2010     int32_t action = originalMotionEntry->action;
2011     int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
2012     if (maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN
2013             || maskedAction == AMOTION_EVENT_ACTION_POINTER_UP) {
2014         int32_t originalPointerIndex = getMotionEventActionPointerIndex(action);
2015         int32_t pointerId = originalMotionEntry->pointerIds[originalPointerIndex];
2016         if (pointerIds.hasBit(pointerId)) {
2017             if (pointerIds.count() == 1) {
2018                 // The first/last pointer went down/up.
2019                 action = maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN
2020                         ? AMOTION_EVENT_ACTION_DOWN : AMOTION_EVENT_ACTION_UP;
2021             } else {
2022                 // A secondary pointer went down/up.
2023                 uint32_t splitPointerIndex = 0;
2024                 while (pointerId != splitPointerIds[splitPointerIndex]) {
2025                     splitPointerIndex += 1;
2026                 }
2027                 action = maskedAction | (splitPointerIndex
2028                         << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT);
2029             }
2030         } else {
2031             // An unrelated pointer changed.
2032             action = AMOTION_EVENT_ACTION_MOVE;
2033         }
2034     }
2035 
2036     MotionEntry* splitMotionEntry = mAllocator.obtainMotionEntry(
2037             originalMotionEntry->eventTime,
2038             originalMotionEntry->deviceId,
2039             originalMotionEntry->source,
2040             originalMotionEntry->policyFlags,
2041             action,
2042             originalMotionEntry->flags,
2043             originalMotionEntry->metaState,
2044             originalMotionEntry->edgeFlags,
2045             originalMotionEntry->xPrecision,
2046             originalMotionEntry->yPrecision,
2047             originalMotionEntry->downTime,
2048             splitPointerCount, splitPointerIds, splitPointerCoords);
2049 
2050     for (MotionSample* originalMotionSample = originalMotionEntry->firstSample.next;
2051             originalMotionSample != NULL; originalMotionSample = originalMotionSample->next) {
2052         for (uint32_t splitPointerIndex = 0; splitPointerIndex < splitPointerCount;
2053                 splitPointerIndex++) {
2054             uint32_t originalPointerIndex = splitPointerIndexMap[splitPointerIndex];
2055             splitPointerCoords[splitPointerIndex] =
2056                     originalMotionSample->pointerCoords[originalPointerIndex];
2057         }
2058 
2059         mAllocator.appendMotionSample(splitMotionEntry, originalMotionSample->eventTime,
2060                 splitPointerCoords);
2061     }
2062 
2063     return splitMotionEntry;
2064 }
2065 
notifyConfigurationChanged(nsecs_t eventTime)2066 void InputDispatcher::notifyConfigurationChanged(nsecs_t eventTime) {
2067 #if DEBUG_INBOUND_EVENT_DETAILS
2068     LOGD("notifyConfigurationChanged - eventTime=%lld", eventTime);
2069 #endif
2070 
2071     bool needWake;
2072     { // acquire lock
2073         AutoMutex _l(mLock);
2074 
2075         ConfigurationChangedEntry* newEntry = mAllocator.obtainConfigurationChangedEntry(eventTime);
2076         needWake = enqueueInboundEventLocked(newEntry);
2077     } // release lock
2078 
2079     if (needWake) {
2080         mLooper->wake();
2081     }
2082 }
2083 
notifyKey(nsecs_t eventTime,int32_t deviceId,int32_t source,uint32_t policyFlags,int32_t action,int32_t flags,int32_t keyCode,int32_t scanCode,int32_t metaState,nsecs_t downTime)2084 void InputDispatcher::notifyKey(nsecs_t eventTime, int32_t deviceId, int32_t source,
2085         uint32_t policyFlags, int32_t action, int32_t flags,
2086         int32_t keyCode, int32_t scanCode, int32_t metaState, nsecs_t downTime) {
2087 #if DEBUG_INBOUND_EVENT_DETAILS
2088     LOGD("notifyKey - eventTime=%lld, deviceId=0x%x, source=0x%x, policyFlags=0x%x, action=0x%x, "
2089             "flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, downTime=%lld",
2090             eventTime, deviceId, source, policyFlags, action, flags,
2091             keyCode, scanCode, metaState, downTime);
2092 #endif
2093     if (! validateKeyEvent(action)) {
2094         return;
2095     }
2096 
2097     policyFlags |= POLICY_FLAG_TRUSTED;
2098     mPolicy->interceptKeyBeforeQueueing(eventTime, deviceId, action, /*byref*/ flags,
2099             keyCode, scanCode, /*byref*/ policyFlags);
2100 
2101     bool needWake;
2102     { // acquire lock
2103         AutoMutex _l(mLock);
2104 
2105         int32_t repeatCount = 0;
2106         KeyEntry* newEntry = mAllocator.obtainKeyEntry(eventTime,
2107                 deviceId, source, policyFlags, action, flags, keyCode, scanCode,
2108                 metaState, repeatCount, downTime);
2109 
2110         needWake = enqueueInboundEventLocked(newEntry);
2111     } // release lock
2112 
2113     if (needWake) {
2114         mLooper->wake();
2115     }
2116 }
2117 
notifyMotion(nsecs_t eventTime,int32_t deviceId,int32_t source,uint32_t policyFlags,int32_t action,int32_t flags,int32_t metaState,int32_t edgeFlags,uint32_t pointerCount,const int32_t * pointerIds,const PointerCoords * pointerCoords,float xPrecision,float yPrecision,nsecs_t downTime)2118 void InputDispatcher::notifyMotion(nsecs_t eventTime, int32_t deviceId, int32_t source,
2119         uint32_t policyFlags, int32_t action, int32_t flags, int32_t metaState, int32_t edgeFlags,
2120         uint32_t pointerCount, const int32_t* pointerIds, const PointerCoords* pointerCoords,
2121         float xPrecision, float yPrecision, nsecs_t downTime) {
2122 #if DEBUG_INBOUND_EVENT_DETAILS
2123     LOGD("notifyMotion - eventTime=%lld, deviceId=0x%x, source=0x%x, policyFlags=0x%x, "
2124             "action=0x%x, flags=0x%x, metaState=0x%x, edgeFlags=0x%x, "
2125             "xPrecision=%f, yPrecision=%f, downTime=%lld",
2126             eventTime, deviceId, source, policyFlags, action, flags, metaState, edgeFlags,
2127             xPrecision, yPrecision, downTime);
2128     for (uint32_t i = 0; i < pointerCount; i++) {
2129         LOGD("  Pointer %d: id=%d, x=%f, y=%f, pressure=%f, size=%f, "
2130                 "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
2131                 "orientation=%f",
2132                 i, pointerIds[i], pointerCoords[i].x, pointerCoords[i].y,
2133                 pointerCoords[i].pressure, pointerCoords[i].size,
2134                 pointerCoords[i].touchMajor, pointerCoords[i].touchMinor,
2135                 pointerCoords[i].toolMajor, pointerCoords[i].toolMinor,
2136                 pointerCoords[i].orientation);
2137     }
2138 #endif
2139     if (! validateMotionEvent(action, pointerCount, pointerIds)) {
2140         return;
2141     }
2142 
2143     policyFlags |= POLICY_FLAG_TRUSTED;
2144     mPolicy->interceptGenericBeforeQueueing(eventTime, /*byref*/ policyFlags);
2145 
2146     bool needWake;
2147     { // acquire lock
2148         AutoMutex _l(mLock);
2149 
2150         // Attempt batching and streaming of move events.
2151         if (action == AMOTION_EVENT_ACTION_MOVE) {
2152             // BATCHING CASE
2153             //
2154             // Try to append a move sample to the tail of the inbound queue for this device.
2155             // Give up if we encounter a non-move motion event for this device since that
2156             // means we cannot append any new samples until a new motion event has started.
2157             for (EventEntry* entry = mInboundQueue.tailSentinel.prev;
2158                     entry != & mInboundQueue.headSentinel; entry = entry->prev) {
2159                 if (entry->type != EventEntry::TYPE_MOTION) {
2160                     // Keep looking for motion events.
2161                     continue;
2162                 }
2163 
2164                 MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
2165                 if (motionEntry->deviceId != deviceId) {
2166                     // Keep looking for this device.
2167                     continue;
2168                 }
2169 
2170                 if (motionEntry->action != AMOTION_EVENT_ACTION_MOVE
2171                         || motionEntry->pointerCount != pointerCount
2172                         || motionEntry->isInjected()) {
2173                     // Last motion event in the queue for this device is not compatible for
2174                     // appending new samples.  Stop here.
2175                     goto NoBatchingOrStreaming;
2176                 }
2177 
2178                 // The last motion event is a move and is compatible for appending.
2179                 // Do the batching magic.
2180                 mAllocator.appendMotionSample(motionEntry, eventTime, pointerCoords);
2181 #if DEBUG_BATCHING
2182                 LOGD("Appended motion sample onto batch for most recent "
2183                         "motion event for this device in the inbound queue.");
2184 #endif
2185                 return; // done!
2186             }
2187 
2188             // STREAMING CASE
2189             //
2190             // There is no pending motion event (of any kind) for this device in the inbound queue.
2191             // Search the outbound queue for the current foreground targets to find a dispatched
2192             // motion event that is still in progress.  If found, then, appen the new sample to
2193             // that event and push it out to all current targets.  The logic in
2194             // prepareDispatchCycleLocked takes care of the case where some targets may
2195             // already have consumed the motion event by starting a new dispatch cycle if needed.
2196             if (mCurrentInputTargetsValid) {
2197                 for (size_t i = 0; i < mCurrentInputTargets.size(); i++) {
2198                     const InputTarget& inputTarget = mCurrentInputTargets[i];
2199                     if ((inputTarget.flags & InputTarget::FLAG_FOREGROUND) == 0) {
2200                         // Skip non-foreground targets.  We only want to stream if there is at
2201                         // least one foreground target whose dispatch is still in progress.
2202                         continue;
2203                     }
2204 
2205                     ssize_t connectionIndex = getConnectionIndexLocked(inputTarget.inputChannel);
2206                     if (connectionIndex < 0) {
2207                         // Connection must no longer be valid.
2208                         continue;
2209                     }
2210 
2211                     sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);
2212                     if (connection->outboundQueue.isEmpty()) {
2213                         // This foreground target has an empty outbound queue.
2214                         continue;
2215                     }
2216 
2217                     DispatchEntry* dispatchEntry = connection->outboundQueue.headSentinel.next;
2218                     if (! dispatchEntry->inProgress
2219                             || dispatchEntry->eventEntry->type != EventEntry::TYPE_MOTION
2220                             || dispatchEntry->isSplit()) {
2221                         // No motion event is being dispatched, or it is being split across
2222                         // windows in which case we cannot stream.
2223                         continue;
2224                     }
2225 
2226                     MotionEntry* motionEntry = static_cast<MotionEntry*>(
2227                             dispatchEntry->eventEntry);
2228                     if (motionEntry->action != AMOTION_EVENT_ACTION_MOVE
2229                             || motionEntry->deviceId != deviceId
2230                             || motionEntry->pointerCount != pointerCount
2231                             || motionEntry->isInjected()) {
2232                         // The motion event is not compatible with this move.
2233                         continue;
2234                     }
2235 
2236                     // Hurray!  This foreground target is currently dispatching a move event
2237                     // that we can stream onto.  Append the motion sample and resume dispatch.
2238                     mAllocator.appendMotionSample(motionEntry, eventTime, pointerCoords);
2239 #if DEBUG_BATCHING
2240                     LOGD("Appended motion sample onto batch for most recently dispatched "
2241                             "motion event for this device in the outbound queues.  "
2242                             "Attempting to stream the motion sample.");
2243 #endif
2244                     nsecs_t currentTime = now();
2245                     dispatchEventToCurrentInputTargetsLocked(currentTime, motionEntry,
2246                             true /*resumeWithAppendedMotionSample*/);
2247 
2248                     runCommandsLockedInterruptible();
2249                     return; // done!
2250                 }
2251             }
2252 
2253 NoBatchingOrStreaming:;
2254         }
2255 
2256         // Just enqueue a new motion event.
2257         MotionEntry* newEntry = mAllocator.obtainMotionEntry(eventTime,
2258                 deviceId, source, policyFlags, action, flags, metaState, edgeFlags,
2259                 xPrecision, yPrecision, downTime,
2260                 pointerCount, pointerIds, pointerCoords);
2261 
2262         needWake = enqueueInboundEventLocked(newEntry);
2263     } // release lock
2264 
2265     if (needWake) {
2266         mLooper->wake();
2267     }
2268 }
2269 
notifySwitch(nsecs_t when,int32_t switchCode,int32_t switchValue,uint32_t policyFlags)2270 void InputDispatcher::notifySwitch(nsecs_t when, int32_t switchCode, int32_t switchValue,
2271         uint32_t policyFlags) {
2272 #if DEBUG_INBOUND_EVENT_DETAILS
2273     LOGD("notifySwitch - switchCode=%d, switchValue=%d, policyFlags=0x%x",
2274             switchCode, switchValue, policyFlags);
2275 #endif
2276 
2277     policyFlags |= POLICY_FLAG_TRUSTED;
2278     mPolicy->notifySwitch(when, switchCode, switchValue, policyFlags);
2279 }
2280 
injectInputEvent(const InputEvent * event,int32_t injectorPid,int32_t injectorUid,int32_t syncMode,int32_t timeoutMillis)2281 int32_t InputDispatcher::injectInputEvent(const InputEvent* event,
2282         int32_t injectorPid, int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis) {
2283 #if DEBUG_INBOUND_EVENT_DETAILS
2284     LOGD("injectInputEvent - eventType=%d, injectorPid=%d, injectorUid=%d, "
2285             "syncMode=%d, timeoutMillis=%d",
2286             event->getType(), injectorPid, injectorUid, syncMode, timeoutMillis);
2287 #endif
2288 
2289     nsecs_t endTime = now() + milliseconds_to_nanoseconds(timeoutMillis);
2290 
2291     uint32_t policyFlags = POLICY_FLAG_INJECTED;
2292     if (hasInjectionPermission(injectorPid, injectorUid)) {
2293         policyFlags |= POLICY_FLAG_TRUSTED;
2294     }
2295 
2296     EventEntry* injectedEntry;
2297     switch (event->getType()) {
2298     case AINPUT_EVENT_TYPE_KEY: {
2299         const KeyEvent* keyEvent = static_cast<const KeyEvent*>(event);
2300         int32_t action = keyEvent->getAction();
2301         if (! validateKeyEvent(action)) {
2302             return INPUT_EVENT_INJECTION_FAILED;
2303         }
2304 
2305         nsecs_t eventTime = keyEvent->getEventTime();
2306         int32_t deviceId = keyEvent->getDeviceId();
2307         int32_t flags = keyEvent->getFlags();
2308         int32_t keyCode = keyEvent->getKeyCode();
2309         int32_t scanCode = keyEvent->getScanCode();
2310         mPolicy->interceptKeyBeforeQueueing(eventTime, deviceId, action, /*byref*/ flags,
2311                 keyCode, scanCode, /*byref*/ policyFlags);
2312 
2313         mLock.lock();
2314         injectedEntry = mAllocator.obtainKeyEntry(eventTime, deviceId, keyEvent->getSource(),
2315                 policyFlags, action, flags, keyCode, scanCode, keyEvent->getMetaState(),
2316                 keyEvent->getRepeatCount(), keyEvent->getDownTime());
2317         break;
2318     }
2319 
2320     case AINPUT_EVENT_TYPE_MOTION: {
2321         const MotionEvent* motionEvent = static_cast<const MotionEvent*>(event);
2322         int32_t action = motionEvent->getAction();
2323         size_t pointerCount = motionEvent->getPointerCount();
2324         const int32_t* pointerIds = motionEvent->getPointerIds();
2325         if (! validateMotionEvent(action, pointerCount, pointerIds)) {
2326             return INPUT_EVENT_INJECTION_FAILED;
2327         }
2328 
2329         nsecs_t eventTime = motionEvent->getEventTime();
2330         mPolicy->interceptGenericBeforeQueueing(eventTime, /*byref*/ policyFlags);
2331 
2332         mLock.lock();
2333         const nsecs_t* sampleEventTimes = motionEvent->getSampleEventTimes();
2334         const PointerCoords* samplePointerCoords = motionEvent->getSamplePointerCoords();
2335         MotionEntry* motionEntry = mAllocator.obtainMotionEntry(*sampleEventTimes,
2336                 motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
2337                 action, motionEvent->getFlags(),
2338                 motionEvent->getMetaState(), motionEvent->getEdgeFlags(),
2339                 motionEvent->getXPrecision(), motionEvent->getYPrecision(),
2340                 motionEvent->getDownTime(), uint32_t(pointerCount),
2341                 pointerIds, samplePointerCoords);
2342         for (size_t i = motionEvent->getHistorySize(); i > 0; i--) {
2343             sampleEventTimes += 1;
2344             samplePointerCoords += pointerCount;
2345             mAllocator.appendMotionSample(motionEntry, *sampleEventTimes, samplePointerCoords);
2346         }
2347         injectedEntry = motionEntry;
2348         break;
2349     }
2350 
2351     default:
2352         LOGW("Cannot inject event of type %d", event->getType());
2353         return INPUT_EVENT_INJECTION_FAILED;
2354     }
2355 
2356     InjectionState* injectionState = mAllocator.obtainInjectionState(injectorPid, injectorUid);
2357     if (syncMode == INPUT_EVENT_INJECTION_SYNC_NONE) {
2358         injectionState->injectionIsAsync = true;
2359     }
2360 
2361     injectionState->refCount += 1;
2362     injectedEntry->injectionState = injectionState;
2363 
2364     bool needWake = enqueueInboundEventLocked(injectedEntry);
2365     mLock.unlock();
2366 
2367     if (needWake) {
2368         mLooper->wake();
2369     }
2370 
2371     int32_t injectionResult;
2372     { // acquire lock
2373         AutoMutex _l(mLock);
2374 
2375         if (syncMode == INPUT_EVENT_INJECTION_SYNC_NONE) {
2376             injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
2377         } else {
2378             for (;;) {
2379                 injectionResult = injectionState->injectionResult;
2380                 if (injectionResult != INPUT_EVENT_INJECTION_PENDING) {
2381                     break;
2382                 }
2383 
2384                 nsecs_t remainingTimeout = endTime - now();
2385                 if (remainingTimeout <= 0) {
2386 #if DEBUG_INJECTION
2387                     LOGD("injectInputEvent - Timed out waiting for injection result "
2388                             "to become available.");
2389 #endif
2390                     injectionResult = INPUT_EVENT_INJECTION_TIMED_OUT;
2391                     break;
2392                 }
2393 
2394                 mInjectionResultAvailableCondition.waitRelative(mLock, remainingTimeout);
2395             }
2396 
2397             if (injectionResult == INPUT_EVENT_INJECTION_SUCCEEDED
2398                     && syncMode == INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISHED) {
2399                 while (injectionState->pendingForegroundDispatches != 0) {
2400 #if DEBUG_INJECTION
2401                     LOGD("injectInputEvent - Waiting for %d pending foreground dispatches.",
2402                             injectionState->pendingForegroundDispatches);
2403 #endif
2404                     nsecs_t remainingTimeout = endTime - now();
2405                     if (remainingTimeout <= 0) {
2406 #if DEBUG_INJECTION
2407                     LOGD("injectInputEvent - Timed out waiting for pending foreground "
2408                             "dispatches to finish.");
2409 #endif
2410                         injectionResult = INPUT_EVENT_INJECTION_TIMED_OUT;
2411                         break;
2412                     }
2413 
2414                     mInjectionSyncFinishedCondition.waitRelative(mLock, remainingTimeout);
2415                 }
2416             }
2417         }
2418 
2419         mAllocator.releaseInjectionState(injectionState);
2420     } // release lock
2421 
2422 #if DEBUG_INJECTION
2423     LOGD("injectInputEvent - Finished with result %d.  "
2424             "injectorPid=%d, injectorUid=%d",
2425             injectionResult, injectorPid, injectorUid);
2426 #endif
2427 
2428     return injectionResult;
2429 }
2430 
hasInjectionPermission(int32_t injectorPid,int32_t injectorUid)2431 bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
2432     return injectorUid == 0
2433             || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
2434 }
2435 
setInjectionResultLocked(EventEntry * entry,int32_t injectionResult)2436 void InputDispatcher::setInjectionResultLocked(EventEntry* entry, int32_t injectionResult) {
2437     InjectionState* injectionState = entry->injectionState;
2438     if (injectionState) {
2439 #if DEBUG_INJECTION
2440         LOGD("Setting input event injection result to %d.  "
2441                 "injectorPid=%d, injectorUid=%d",
2442                  injectionResult, injectionState->injectorPid, injectionState->injectorUid);
2443 #endif
2444 
2445         if (injectionState->injectionIsAsync) {
2446             // Log the outcome since the injector did not wait for the injection result.
2447             switch (injectionResult) {
2448             case INPUT_EVENT_INJECTION_SUCCEEDED:
2449                 LOGV("Asynchronous input event injection succeeded.");
2450                 break;
2451             case INPUT_EVENT_INJECTION_FAILED:
2452                 LOGW("Asynchronous input event injection failed.");
2453                 break;
2454             case INPUT_EVENT_INJECTION_PERMISSION_DENIED:
2455                 LOGW("Asynchronous input event injection permission denied.");
2456                 break;
2457             case INPUT_EVENT_INJECTION_TIMED_OUT:
2458                 LOGW("Asynchronous input event injection timed out.");
2459                 break;
2460             }
2461         }
2462 
2463         injectionState->injectionResult = injectionResult;
2464         mInjectionResultAvailableCondition.broadcast();
2465     }
2466 }
2467 
incrementPendingForegroundDispatchesLocked(EventEntry * entry)2468 void InputDispatcher::incrementPendingForegroundDispatchesLocked(EventEntry* entry) {
2469     InjectionState* injectionState = entry->injectionState;
2470     if (injectionState) {
2471         injectionState->pendingForegroundDispatches += 1;
2472     }
2473 }
2474 
decrementPendingForegroundDispatchesLocked(EventEntry * entry)2475 void InputDispatcher::decrementPendingForegroundDispatchesLocked(EventEntry* entry) {
2476     InjectionState* injectionState = entry->injectionState;
2477     if (injectionState) {
2478         injectionState->pendingForegroundDispatches -= 1;
2479 
2480         if (injectionState->pendingForegroundDispatches == 0) {
2481             mInjectionSyncFinishedCondition.broadcast();
2482         }
2483     }
2484 }
2485 
getWindowLocked(const sp<InputChannel> & inputChannel)2486 const InputWindow* InputDispatcher::getWindowLocked(const sp<InputChannel>& inputChannel) {
2487     for (size_t i = 0; i < mWindows.size(); i++) {
2488         const InputWindow* window = & mWindows[i];
2489         if (window->inputChannel == inputChannel) {
2490             return window;
2491         }
2492     }
2493     return NULL;
2494 }
2495 
setInputWindows(const Vector<InputWindow> & inputWindows)2496 void InputDispatcher::setInputWindows(const Vector<InputWindow>& inputWindows) {
2497 #if DEBUG_FOCUS
2498     LOGD("setInputWindows");
2499 #endif
2500     { // acquire lock
2501         AutoMutex _l(mLock);
2502 
2503         // Clear old window pointers.
2504         sp<InputChannel> oldFocusedWindowChannel;
2505         if (mFocusedWindow) {
2506             oldFocusedWindowChannel = mFocusedWindow->inputChannel;
2507             mFocusedWindow = NULL;
2508         }
2509 
2510         mWindows.clear();
2511 
2512         // Loop over new windows and rebuild the necessary window pointers for
2513         // tracking focus and touch.
2514         mWindows.appendVector(inputWindows);
2515 
2516         size_t numWindows = mWindows.size();
2517         for (size_t i = 0; i < numWindows; i++) {
2518             const InputWindow* window = & mWindows.itemAt(i);
2519             if (window->hasFocus) {
2520                 mFocusedWindow = window;
2521                 break;
2522             }
2523         }
2524 
2525         if (oldFocusedWindowChannel != NULL) {
2526             if (!mFocusedWindow || oldFocusedWindowChannel != mFocusedWindow->inputChannel) {
2527 #if DEBUG_FOCUS
2528                 LOGD("Focus left window: %s",
2529                         oldFocusedWindowChannel->getName().string());
2530 #endif
2531                 synthesizeCancelationEventsForInputChannelLocked(oldFocusedWindowChannel,
2532                         InputState::CANCEL_NON_POINTER_EVENTS, "focus left window");
2533                 oldFocusedWindowChannel.clear();
2534             }
2535         }
2536         if (mFocusedWindow && oldFocusedWindowChannel == NULL) {
2537 #if DEBUG_FOCUS
2538             LOGD("Focus entered window: %s",
2539                     mFocusedWindow->inputChannel->getName().string());
2540 #endif
2541         }
2542 
2543         for (size_t i = 0; i < mTouchState.windows.size(); ) {
2544             TouchedWindow& touchedWindow = mTouchState.windows.editItemAt(i);
2545             const InputWindow* window = getWindowLocked(touchedWindow.channel);
2546             if (window) {
2547                 touchedWindow.window = window;
2548                 i += 1;
2549             } else {
2550 #if DEBUG_FOCUS
2551                 LOGD("Touched window was removed: %s", touchedWindow.channel->getName().string());
2552 #endif
2553                 synthesizeCancelationEventsForInputChannelLocked(touchedWindow.channel,
2554                         InputState::CANCEL_POINTER_EVENTS, "touched window was removed");
2555                 mTouchState.windows.removeAt(i);
2556             }
2557         }
2558 
2559 #if DEBUG_FOCUS
2560         //logDispatchStateLocked();
2561 #endif
2562     } // release lock
2563 
2564     // Wake up poll loop since it may need to make new input dispatching choices.
2565     mLooper->wake();
2566 }
2567 
setFocusedApplication(const InputApplication * inputApplication)2568 void InputDispatcher::setFocusedApplication(const InputApplication* inputApplication) {
2569 #if DEBUG_FOCUS
2570     LOGD("setFocusedApplication");
2571 #endif
2572     { // acquire lock
2573         AutoMutex _l(mLock);
2574 
2575         releaseFocusedApplicationLocked();
2576 
2577         if (inputApplication) {
2578             mFocusedApplicationStorage = *inputApplication;
2579             mFocusedApplication = & mFocusedApplicationStorage;
2580         }
2581 
2582 #if DEBUG_FOCUS
2583         //logDispatchStateLocked();
2584 #endif
2585     } // release lock
2586 
2587     // Wake up poll loop since it may need to make new input dispatching choices.
2588     mLooper->wake();
2589 }
2590 
releaseFocusedApplicationLocked()2591 void InputDispatcher::releaseFocusedApplicationLocked() {
2592     if (mFocusedApplication) {
2593         mFocusedApplication = NULL;
2594         mFocusedApplicationStorage.handle.clear();
2595     }
2596 }
2597 
setInputDispatchMode(bool enabled,bool frozen)2598 void InputDispatcher::setInputDispatchMode(bool enabled, bool frozen) {
2599 #if DEBUG_FOCUS
2600     LOGD("setInputDispatchMode: enabled=%d, frozen=%d", enabled, frozen);
2601 #endif
2602 
2603     bool changed;
2604     { // acquire lock
2605         AutoMutex _l(mLock);
2606 
2607         if (mDispatchEnabled != enabled || mDispatchFrozen != frozen) {
2608             if (mDispatchFrozen && !frozen) {
2609                 resetANRTimeoutsLocked();
2610             }
2611 
2612             if (mDispatchEnabled && !enabled) {
2613                 resetAndDropEverythingLocked("dispatcher is being disabled");
2614             }
2615 
2616             mDispatchEnabled = enabled;
2617             mDispatchFrozen = frozen;
2618             changed = true;
2619         } else {
2620             changed = false;
2621         }
2622 
2623 #if DEBUG_FOCUS
2624         //logDispatchStateLocked();
2625 #endif
2626     } // release lock
2627 
2628     if (changed) {
2629         // Wake up poll loop since it may need to make new input dispatching choices.
2630         mLooper->wake();
2631     }
2632 }
2633 
resetAndDropEverythingLocked(const char * reason)2634 void InputDispatcher::resetAndDropEverythingLocked(const char* reason) {
2635 #if DEBUG_FOCUS
2636     LOGD("Resetting and dropping all events (%s).", reason);
2637 #endif
2638 
2639     synthesizeCancelationEventsForAllConnectionsLocked(InputState::CANCEL_ALL_EVENTS, reason);
2640 
2641     resetKeyRepeatLocked();
2642     releasePendingEventLocked();
2643     drainInboundQueueLocked();
2644     resetTargetsLocked();
2645 
2646     mTouchState.reset();
2647 }
2648 
logDispatchStateLocked()2649 void InputDispatcher::logDispatchStateLocked() {
2650     String8 dump;
2651     dumpDispatchStateLocked(dump);
2652 
2653     char* text = dump.lockBuffer(dump.size());
2654     char* start = text;
2655     while (*start != '\0') {
2656         char* end = strchr(start, '\n');
2657         if (*end == '\n') {
2658             *(end++) = '\0';
2659         }
2660         LOGD("%s", start);
2661         start = end;
2662     }
2663 }
2664 
dumpDispatchStateLocked(String8 & dump)2665 void InputDispatcher::dumpDispatchStateLocked(String8& dump) {
2666     dump.appendFormat(INDENT "DispatchEnabled: %d\n", mDispatchEnabled);
2667     dump.appendFormat(INDENT "DispatchFrozen: %d\n", mDispatchFrozen);
2668 
2669     if (mFocusedApplication) {
2670         dump.appendFormat(INDENT "FocusedApplication: name='%s', dispatchingTimeout=%0.3fms\n",
2671                 mFocusedApplication->name.string(),
2672                 mFocusedApplication->dispatchingTimeout / 1000000.0);
2673     } else {
2674         dump.append(INDENT "FocusedApplication: <null>\n");
2675     }
2676     dump.appendFormat(INDENT "FocusedWindow: name='%s'\n",
2677             mFocusedWindow != NULL ? mFocusedWindow->name.string() : "<null>");
2678 
2679     dump.appendFormat(INDENT "TouchDown: %s\n", toString(mTouchState.down));
2680     dump.appendFormat(INDENT "TouchSplit: %s\n", toString(mTouchState.split));
2681     if (!mTouchState.windows.isEmpty()) {
2682         dump.append(INDENT "TouchedWindows:\n");
2683         for (size_t i = 0; i < mTouchState.windows.size(); i++) {
2684             const TouchedWindow& touchedWindow = mTouchState.windows[i];
2685             dump.appendFormat(INDENT2 "%d: name='%s', pointerIds=0x%0x, targetFlags=0x%x\n",
2686                     i, touchedWindow.window->name.string(), touchedWindow.pointerIds.value,
2687                     touchedWindow.targetFlags);
2688         }
2689     } else {
2690         dump.append(INDENT "TouchedWindows: <none>\n");
2691     }
2692 
2693     if (!mWindows.isEmpty()) {
2694         dump.append(INDENT "Windows:\n");
2695         for (size_t i = 0; i < mWindows.size(); i++) {
2696             const InputWindow& window = mWindows[i];
2697             dump.appendFormat(INDENT2 "%d: name='%s', paused=%s, hasFocus=%s, hasWallpaper=%s, "
2698                     "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, "
2699                     "frame=[%d,%d][%d,%d], "
2700                     "visibleFrame=[%d,%d][%d,%d], "
2701                     "touchableArea=[%d,%d][%d,%d], "
2702                     "ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n",
2703                     i, window.name.string(),
2704                     toString(window.paused),
2705                     toString(window.hasFocus),
2706                     toString(window.hasWallpaper),
2707                     toString(window.visible),
2708                     toString(window.canReceiveKeys),
2709                     window.layoutParamsFlags, window.layoutParamsType,
2710                     window.layer,
2711                     window.frameLeft, window.frameTop,
2712                     window.frameRight, window.frameBottom,
2713                     window.visibleFrameLeft, window.visibleFrameTop,
2714                     window.visibleFrameRight, window.visibleFrameBottom,
2715                     window.touchableAreaLeft, window.touchableAreaTop,
2716                     window.touchableAreaRight, window.touchableAreaBottom,
2717                     window.ownerPid, window.ownerUid,
2718                     window.dispatchingTimeout / 1000000.0);
2719         }
2720     } else {
2721         dump.append(INDENT "Windows: <none>\n");
2722     }
2723 
2724     if (!mMonitoringChannels.isEmpty()) {
2725         dump.append(INDENT "MonitoringChannels:\n");
2726         for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
2727             const sp<InputChannel>& channel = mMonitoringChannels[i];
2728             dump.appendFormat(INDENT2 "%d: '%s'\n", i, channel->getName().string());
2729         }
2730     } else {
2731         dump.append(INDENT "MonitoringChannels: <none>\n");
2732     }
2733 
2734     dump.appendFormat(INDENT "InboundQueue: length=%u\n", mInboundQueue.count());
2735 
2736     if (!mActiveConnections.isEmpty()) {
2737         dump.append(INDENT "ActiveConnections:\n");
2738         for (size_t i = 0; i < mActiveConnections.size(); i++) {
2739             const Connection* connection = mActiveConnections[i];
2740             dump.appendFormat(INDENT2 "%d: '%s', status=%s, outboundQueueLength=%u"
2741                     "inputState.isNeutral=%s\n",
2742                     i, connection->getInputChannelName(), connection->getStatusLabel(),
2743                     connection->outboundQueue.count(),
2744                     toString(connection->inputState.isNeutral()));
2745         }
2746     } else {
2747         dump.append(INDENT "ActiveConnections: <none>\n");
2748     }
2749 
2750     if (isAppSwitchPendingLocked()) {
2751         dump.appendFormat(INDENT "AppSwitch: pending, due in %01.1fms\n",
2752                 (mAppSwitchDueTime - now()) / 1000000.0);
2753     } else {
2754         dump.append(INDENT "AppSwitch: not pending\n");
2755     }
2756 }
2757 
registerInputChannel(const sp<InputChannel> & inputChannel,bool monitor)2758 status_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChannel, bool monitor) {
2759 #if DEBUG_REGISTRATION
2760     LOGD("channel '%s' ~ registerInputChannel - monitor=%s", inputChannel->getName().string(),
2761             toString(monitor));
2762 #endif
2763 
2764     { // acquire lock
2765         AutoMutex _l(mLock);
2766 
2767         if (getConnectionIndexLocked(inputChannel) >= 0) {
2768             LOGW("Attempted to register already registered input channel '%s'",
2769                     inputChannel->getName().string());
2770             return BAD_VALUE;
2771         }
2772 
2773         sp<Connection> connection = new Connection(inputChannel);
2774         status_t status = connection->initialize();
2775         if (status) {
2776             LOGE("Failed to initialize input publisher for input channel '%s', status=%d",
2777                     inputChannel->getName().string(), status);
2778             return status;
2779         }
2780 
2781         int32_t receiveFd = inputChannel->getReceivePipeFd();
2782         mConnectionsByReceiveFd.add(receiveFd, connection);
2783 
2784         if (monitor) {
2785             mMonitoringChannels.push(inputChannel);
2786         }
2787 
2788         mLooper->addFd(receiveFd, 0, ALOOPER_EVENT_INPUT, handleReceiveCallback, this);
2789 
2790         runCommandsLockedInterruptible();
2791     } // release lock
2792     return OK;
2793 }
2794 
unregisterInputChannel(const sp<InputChannel> & inputChannel)2795 status_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputChannel) {
2796 #if DEBUG_REGISTRATION
2797     LOGD("channel '%s' ~ unregisterInputChannel", inputChannel->getName().string());
2798 #endif
2799 
2800     { // acquire lock
2801         AutoMutex _l(mLock);
2802 
2803         ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
2804         if (connectionIndex < 0) {
2805             LOGW("Attempted to unregister already unregistered input channel '%s'",
2806                     inputChannel->getName().string());
2807             return BAD_VALUE;
2808         }
2809 
2810         sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);
2811         mConnectionsByReceiveFd.removeItemsAt(connectionIndex);
2812 
2813         connection->status = Connection::STATUS_ZOMBIE;
2814 
2815         for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
2816             if (mMonitoringChannels[i] == inputChannel) {
2817                 mMonitoringChannels.removeAt(i);
2818                 break;
2819             }
2820         }
2821 
2822         mLooper->removeFd(inputChannel->getReceivePipeFd());
2823 
2824         nsecs_t currentTime = now();
2825         abortBrokenDispatchCycleLocked(currentTime, connection);
2826 
2827         runCommandsLockedInterruptible();
2828     } // release lock
2829 
2830     // Wake the poll loop because removing the connection may have changed the current
2831     // synchronization state.
2832     mLooper->wake();
2833     return OK;
2834 }
2835 
getConnectionIndexLocked(const sp<InputChannel> & inputChannel)2836 ssize_t InputDispatcher::getConnectionIndexLocked(const sp<InputChannel>& inputChannel) {
2837     ssize_t connectionIndex = mConnectionsByReceiveFd.indexOfKey(inputChannel->getReceivePipeFd());
2838     if (connectionIndex >= 0) {
2839         sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);
2840         if (connection->inputChannel.get() == inputChannel.get()) {
2841             return connectionIndex;
2842         }
2843     }
2844 
2845     return -1;
2846 }
2847 
activateConnectionLocked(Connection * connection)2848 void InputDispatcher::activateConnectionLocked(Connection* connection) {
2849     for (size_t i = 0; i < mActiveConnections.size(); i++) {
2850         if (mActiveConnections.itemAt(i) == connection) {
2851             return;
2852         }
2853     }
2854     mActiveConnections.add(connection);
2855 }
2856 
deactivateConnectionLocked(Connection * connection)2857 void InputDispatcher::deactivateConnectionLocked(Connection* connection) {
2858     for (size_t i = 0; i < mActiveConnections.size(); i++) {
2859         if (mActiveConnections.itemAt(i) == connection) {
2860             mActiveConnections.removeAt(i);
2861             return;
2862         }
2863     }
2864 }
2865 
onDispatchCycleStartedLocked(nsecs_t currentTime,const sp<Connection> & connection)2866 void InputDispatcher::onDispatchCycleStartedLocked(
2867         nsecs_t currentTime, const sp<Connection>& connection) {
2868 }
2869 
onDispatchCycleFinishedLocked(nsecs_t currentTime,const sp<Connection> & connection)2870 void InputDispatcher::onDispatchCycleFinishedLocked(
2871         nsecs_t currentTime, const sp<Connection>& connection) {
2872 }
2873 
onDispatchCycleBrokenLocked(nsecs_t currentTime,const sp<Connection> & connection)2874 void InputDispatcher::onDispatchCycleBrokenLocked(
2875         nsecs_t currentTime, const sp<Connection>& connection) {
2876     LOGE("channel '%s' ~ Channel is unrecoverably broken and will be disposed!",
2877             connection->getInputChannelName());
2878 
2879     CommandEntry* commandEntry = postCommandLocked(
2880             & InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible);
2881     commandEntry->connection = connection;
2882 }
2883 
onANRLocked(nsecs_t currentTime,const InputApplication * application,const InputWindow * window,nsecs_t eventTime,nsecs_t waitStartTime)2884 void InputDispatcher::onANRLocked(
2885         nsecs_t currentTime, const InputApplication* application, const InputWindow* window,
2886         nsecs_t eventTime, nsecs_t waitStartTime) {
2887     LOGI("Application is not responding: %s.  "
2888             "%01.1fms since event, %01.1fms since wait started",
2889             getApplicationWindowLabelLocked(application, window).string(),
2890             (currentTime - eventTime) / 1000000.0,
2891             (currentTime - waitStartTime) / 1000000.0);
2892 
2893     CommandEntry* commandEntry = postCommandLocked(
2894             & InputDispatcher::doNotifyANRLockedInterruptible);
2895     if (application) {
2896         commandEntry->inputApplicationHandle = application->handle;
2897     }
2898     if (window) {
2899         commandEntry->inputChannel = window->inputChannel;
2900     }
2901 }
2902 
doNotifyConfigurationChangedInterruptible(CommandEntry * commandEntry)2903 void InputDispatcher::doNotifyConfigurationChangedInterruptible(
2904         CommandEntry* commandEntry) {
2905     mLock.unlock();
2906 
2907     mPolicy->notifyConfigurationChanged(commandEntry->eventTime);
2908 
2909     mLock.lock();
2910 }
2911 
doNotifyInputChannelBrokenLockedInterruptible(CommandEntry * commandEntry)2912 void InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible(
2913         CommandEntry* commandEntry) {
2914     sp<Connection> connection = commandEntry->connection;
2915 
2916     if (connection->status != Connection::STATUS_ZOMBIE) {
2917         mLock.unlock();
2918 
2919         mPolicy->notifyInputChannelBroken(connection->inputChannel);
2920 
2921         mLock.lock();
2922     }
2923 }
2924 
doNotifyANRLockedInterruptible(CommandEntry * commandEntry)2925 void InputDispatcher::doNotifyANRLockedInterruptible(
2926         CommandEntry* commandEntry) {
2927     mLock.unlock();
2928 
2929     nsecs_t newTimeout = mPolicy->notifyANR(
2930             commandEntry->inputApplicationHandle, commandEntry->inputChannel);
2931 
2932     mLock.lock();
2933 
2934     resumeAfterTargetsNotReadyTimeoutLocked(newTimeout, commandEntry->inputChannel);
2935 }
2936 
doInterceptKeyBeforeDispatchingLockedInterruptible(CommandEntry * commandEntry)2937 void InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible(
2938         CommandEntry* commandEntry) {
2939     KeyEntry* entry = commandEntry->keyEntry;
2940     mReusableKeyEvent.initialize(entry->deviceId, entry->source, entry->action, entry->flags,
2941             entry->keyCode, entry->scanCode, entry->metaState, entry->repeatCount,
2942             entry->downTime, entry->eventTime);
2943 
2944     mLock.unlock();
2945 
2946     bool consumed = mPolicy->interceptKeyBeforeDispatching(commandEntry->inputChannel,
2947             & mReusableKeyEvent, entry->policyFlags);
2948 
2949     mLock.lock();
2950 
2951     entry->interceptKeyResult = consumed
2952             ? KeyEntry::INTERCEPT_KEY_RESULT_SKIP
2953             : KeyEntry::INTERCEPT_KEY_RESULT_CONTINUE;
2954     mAllocator.releaseKeyEntry(entry);
2955 }
2956 
doPokeUserActivityLockedInterruptible(CommandEntry * commandEntry)2957 void InputDispatcher::doPokeUserActivityLockedInterruptible(CommandEntry* commandEntry) {
2958     mLock.unlock();
2959 
2960     mPolicy->pokeUserActivity(commandEntry->eventTime, commandEntry->userActivityEventType);
2961 
2962     mLock.lock();
2963 }
2964 
updateDispatchStatisticsLocked(nsecs_t currentTime,const EventEntry * entry,int32_t injectionResult,nsecs_t timeSpentWaitingForApplication)2965 void InputDispatcher::updateDispatchStatisticsLocked(nsecs_t currentTime, const EventEntry* entry,
2966         int32_t injectionResult, nsecs_t timeSpentWaitingForApplication) {
2967     // TODO Write some statistics about how long we spend waiting.
2968 }
2969 
dump(String8 & dump)2970 void InputDispatcher::dump(String8& dump) {
2971     dump.append("Input Dispatcher State:\n");
2972     dumpDispatchStateLocked(dump);
2973 }
2974 
2975 
2976 // --- InputDispatcher::Queue ---
2977 
2978 template <typename T>
count() const2979 uint32_t InputDispatcher::Queue<T>::count() const {
2980     uint32_t result = 0;
2981     for (const T* entry = headSentinel.next; entry != & tailSentinel; entry = entry->next) {
2982         result += 1;
2983     }
2984     return result;
2985 }
2986 
2987 
2988 // --- InputDispatcher::Allocator ---
2989 
Allocator()2990 InputDispatcher::Allocator::Allocator() {
2991 }
2992 
2993 InputDispatcher::InjectionState*
obtainInjectionState(int32_t injectorPid,int32_t injectorUid)2994 InputDispatcher::Allocator::obtainInjectionState(int32_t injectorPid, int32_t injectorUid) {
2995     InjectionState* injectionState = mInjectionStatePool.alloc();
2996     injectionState->refCount = 1;
2997     injectionState->injectorPid = injectorPid;
2998     injectionState->injectorUid = injectorUid;
2999     injectionState->injectionIsAsync = false;
3000     injectionState->injectionResult = INPUT_EVENT_INJECTION_PENDING;
3001     injectionState->pendingForegroundDispatches = 0;
3002     return injectionState;
3003 }
3004 
initializeEventEntry(EventEntry * entry,int32_t type,nsecs_t eventTime,uint32_t policyFlags)3005 void InputDispatcher::Allocator::initializeEventEntry(EventEntry* entry, int32_t type,
3006         nsecs_t eventTime, uint32_t policyFlags) {
3007     entry->type = type;
3008     entry->refCount = 1;
3009     entry->dispatchInProgress = false;
3010     entry->eventTime = eventTime;
3011     entry->policyFlags = policyFlags;
3012     entry->injectionState = NULL;
3013 }
3014 
releaseEventEntryInjectionState(EventEntry * entry)3015 void InputDispatcher::Allocator::releaseEventEntryInjectionState(EventEntry* entry) {
3016     if (entry->injectionState) {
3017         releaseInjectionState(entry->injectionState);
3018         entry->injectionState = NULL;
3019     }
3020 }
3021 
3022 InputDispatcher::ConfigurationChangedEntry*
obtainConfigurationChangedEntry(nsecs_t eventTime)3023 InputDispatcher::Allocator::obtainConfigurationChangedEntry(nsecs_t eventTime) {
3024     ConfigurationChangedEntry* entry = mConfigurationChangeEntryPool.alloc();
3025     initializeEventEntry(entry, EventEntry::TYPE_CONFIGURATION_CHANGED, eventTime, 0);
3026     return entry;
3027 }
3028 
obtainKeyEntry(nsecs_t eventTime,int32_t deviceId,int32_t source,uint32_t policyFlags,int32_t action,int32_t flags,int32_t keyCode,int32_t scanCode,int32_t metaState,int32_t repeatCount,nsecs_t downTime)3029 InputDispatcher::KeyEntry* InputDispatcher::Allocator::obtainKeyEntry(nsecs_t eventTime,
3030         int32_t deviceId, int32_t source, uint32_t policyFlags, int32_t action,
3031         int32_t flags, int32_t keyCode, int32_t scanCode, int32_t metaState,
3032         int32_t repeatCount, nsecs_t downTime) {
3033     KeyEntry* entry = mKeyEntryPool.alloc();
3034     initializeEventEntry(entry, EventEntry::TYPE_KEY, eventTime, policyFlags);
3035 
3036     entry->deviceId = deviceId;
3037     entry->source = source;
3038     entry->action = action;
3039     entry->flags = flags;
3040     entry->keyCode = keyCode;
3041     entry->scanCode = scanCode;
3042     entry->metaState = metaState;
3043     entry->repeatCount = repeatCount;
3044     entry->downTime = downTime;
3045     entry->syntheticRepeat = false;
3046     entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
3047     return entry;
3048 }
3049 
obtainMotionEntry(nsecs_t eventTime,int32_t deviceId,int32_t source,uint32_t policyFlags,int32_t action,int32_t flags,int32_t metaState,int32_t edgeFlags,float xPrecision,float yPrecision,nsecs_t downTime,uint32_t pointerCount,const int32_t * pointerIds,const PointerCoords * pointerCoords)3050 InputDispatcher::MotionEntry* InputDispatcher::Allocator::obtainMotionEntry(nsecs_t eventTime,
3051         int32_t deviceId, int32_t source, uint32_t policyFlags, int32_t action, int32_t flags,
3052         int32_t metaState, int32_t edgeFlags, float xPrecision, float yPrecision,
3053         nsecs_t downTime, uint32_t pointerCount,
3054         const int32_t* pointerIds, const PointerCoords* pointerCoords) {
3055     MotionEntry* entry = mMotionEntryPool.alloc();
3056     initializeEventEntry(entry, EventEntry::TYPE_MOTION, eventTime, policyFlags);
3057 
3058     entry->eventTime = eventTime;
3059     entry->deviceId = deviceId;
3060     entry->source = source;
3061     entry->action = action;
3062     entry->flags = flags;
3063     entry->metaState = metaState;
3064     entry->edgeFlags = edgeFlags;
3065     entry->xPrecision = xPrecision;
3066     entry->yPrecision = yPrecision;
3067     entry->downTime = downTime;
3068     entry->pointerCount = pointerCount;
3069     entry->firstSample.eventTime = eventTime;
3070     entry->firstSample.next = NULL;
3071     entry->lastSample = & entry->firstSample;
3072     for (uint32_t i = 0; i < pointerCount; i++) {
3073         entry->pointerIds[i] = pointerIds[i];
3074         entry->firstSample.pointerCoords[i] = pointerCoords[i];
3075     }
3076     return entry;
3077 }
3078 
obtainDispatchEntry(EventEntry * eventEntry,int32_t targetFlags,float xOffset,float yOffset)3079 InputDispatcher::DispatchEntry* InputDispatcher::Allocator::obtainDispatchEntry(
3080         EventEntry* eventEntry,
3081         int32_t targetFlags, float xOffset, float yOffset) {
3082     DispatchEntry* entry = mDispatchEntryPool.alloc();
3083     entry->eventEntry = eventEntry;
3084     eventEntry->refCount += 1;
3085     entry->targetFlags = targetFlags;
3086     entry->xOffset = xOffset;
3087     entry->yOffset = yOffset;
3088     entry->inProgress = false;
3089     entry->headMotionSample = NULL;
3090     entry->tailMotionSample = NULL;
3091     return entry;
3092 }
3093 
obtainCommandEntry(Command command)3094 InputDispatcher::CommandEntry* InputDispatcher::Allocator::obtainCommandEntry(Command command) {
3095     CommandEntry* entry = mCommandEntryPool.alloc();
3096     entry->command = command;
3097     return entry;
3098 }
3099 
releaseInjectionState(InjectionState * injectionState)3100 void InputDispatcher::Allocator::releaseInjectionState(InjectionState* injectionState) {
3101     injectionState->refCount -= 1;
3102     if (injectionState->refCount == 0) {
3103         mInjectionStatePool.free(injectionState);
3104     } else {
3105         assert(injectionState->refCount > 0);
3106     }
3107 }
3108 
releaseEventEntry(EventEntry * entry)3109 void InputDispatcher::Allocator::releaseEventEntry(EventEntry* entry) {
3110     switch (entry->type) {
3111     case EventEntry::TYPE_CONFIGURATION_CHANGED:
3112         releaseConfigurationChangedEntry(static_cast<ConfigurationChangedEntry*>(entry));
3113         break;
3114     case EventEntry::TYPE_KEY:
3115         releaseKeyEntry(static_cast<KeyEntry*>(entry));
3116         break;
3117     case EventEntry::TYPE_MOTION:
3118         releaseMotionEntry(static_cast<MotionEntry*>(entry));
3119         break;
3120     default:
3121         assert(false);
3122         break;
3123     }
3124 }
3125 
releaseConfigurationChangedEntry(ConfigurationChangedEntry * entry)3126 void InputDispatcher::Allocator::releaseConfigurationChangedEntry(
3127         ConfigurationChangedEntry* entry) {
3128     entry->refCount -= 1;
3129     if (entry->refCount == 0) {
3130         releaseEventEntryInjectionState(entry);
3131         mConfigurationChangeEntryPool.free(entry);
3132     } else {
3133         assert(entry->refCount > 0);
3134     }
3135 }
3136 
releaseKeyEntry(KeyEntry * entry)3137 void InputDispatcher::Allocator::releaseKeyEntry(KeyEntry* entry) {
3138     entry->refCount -= 1;
3139     if (entry->refCount == 0) {
3140         releaseEventEntryInjectionState(entry);
3141         mKeyEntryPool.free(entry);
3142     } else {
3143         assert(entry->refCount > 0);
3144     }
3145 }
3146 
releaseMotionEntry(MotionEntry * entry)3147 void InputDispatcher::Allocator::releaseMotionEntry(MotionEntry* entry) {
3148     entry->refCount -= 1;
3149     if (entry->refCount == 0) {
3150         releaseEventEntryInjectionState(entry);
3151         for (MotionSample* sample = entry->firstSample.next; sample != NULL; ) {
3152             MotionSample* next = sample->next;
3153             mMotionSamplePool.free(sample);
3154             sample = next;
3155         }
3156         mMotionEntryPool.free(entry);
3157     } else {
3158         assert(entry->refCount > 0);
3159     }
3160 }
3161 
releaseDispatchEntry(DispatchEntry * entry)3162 void InputDispatcher::Allocator::releaseDispatchEntry(DispatchEntry* entry) {
3163     releaseEventEntry(entry->eventEntry);
3164     mDispatchEntryPool.free(entry);
3165 }
3166 
releaseCommandEntry(CommandEntry * entry)3167 void InputDispatcher::Allocator::releaseCommandEntry(CommandEntry* entry) {
3168     mCommandEntryPool.free(entry);
3169 }
3170 
appendMotionSample(MotionEntry * motionEntry,nsecs_t eventTime,const PointerCoords * pointerCoords)3171 void InputDispatcher::Allocator::appendMotionSample(MotionEntry* motionEntry,
3172         nsecs_t eventTime, const PointerCoords* pointerCoords) {
3173     MotionSample* sample = mMotionSamplePool.alloc();
3174     sample->eventTime = eventTime;
3175     uint32_t pointerCount = motionEntry->pointerCount;
3176     for (uint32_t i = 0; i < pointerCount; i++) {
3177         sample->pointerCoords[i] = pointerCoords[i];
3178     }
3179 
3180     sample->next = NULL;
3181     motionEntry->lastSample->next = sample;
3182     motionEntry->lastSample = sample;
3183 }
3184 
recycleKeyEntry(KeyEntry * keyEntry)3185 void InputDispatcher::Allocator::recycleKeyEntry(KeyEntry* keyEntry) {
3186     releaseEventEntryInjectionState(keyEntry);
3187 
3188     keyEntry->dispatchInProgress = false;
3189     keyEntry->syntheticRepeat = false;
3190     keyEntry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
3191 }
3192 
3193 
3194 // --- InputDispatcher::MotionEntry ---
3195 
countSamples() const3196 uint32_t InputDispatcher::MotionEntry::countSamples() const {
3197     uint32_t count = 1;
3198     for (MotionSample* sample = firstSample.next; sample != NULL; sample = sample->next) {
3199         count += 1;
3200     }
3201     return count;
3202 }
3203 
3204 
3205 // --- InputDispatcher::InputState ---
3206 
InputState()3207 InputDispatcher::InputState::InputState() {
3208 }
3209 
~InputState()3210 InputDispatcher::InputState::~InputState() {
3211 }
3212 
isNeutral() const3213 bool InputDispatcher::InputState::isNeutral() const {
3214     return mKeyMementos.isEmpty() && mMotionMementos.isEmpty();
3215 }
3216 
trackEvent(const EventEntry * entry)3217 InputDispatcher::InputState::Consistency InputDispatcher::InputState::trackEvent(
3218         const EventEntry* entry) {
3219     switch (entry->type) {
3220     case EventEntry::TYPE_KEY:
3221         return trackKey(static_cast<const KeyEntry*>(entry));
3222 
3223     case EventEntry::TYPE_MOTION:
3224         return trackMotion(static_cast<const MotionEntry*>(entry));
3225 
3226     default:
3227         return CONSISTENT;
3228     }
3229 }
3230 
trackKey(const KeyEntry * entry)3231 InputDispatcher::InputState::Consistency InputDispatcher::InputState::trackKey(
3232         const KeyEntry* entry) {
3233     int32_t action = entry->action;
3234     for (size_t i = 0; i < mKeyMementos.size(); i++) {
3235         KeyMemento& memento = mKeyMementos.editItemAt(i);
3236         if (memento.deviceId == entry->deviceId
3237                 && memento.source == entry->source
3238                 && memento.keyCode == entry->keyCode
3239                 && memento.scanCode == entry->scanCode) {
3240             switch (action) {
3241             case AKEY_EVENT_ACTION_UP:
3242                 mKeyMementos.removeAt(i);
3243                 return CONSISTENT;
3244 
3245             case AKEY_EVENT_ACTION_DOWN:
3246                 return TOLERABLE;
3247 
3248             default:
3249                 return BROKEN;
3250             }
3251         }
3252     }
3253 
3254     switch (action) {
3255     case AKEY_EVENT_ACTION_DOWN: {
3256         mKeyMementos.push();
3257         KeyMemento& memento = mKeyMementos.editTop();
3258         memento.deviceId = entry->deviceId;
3259         memento.source = entry->source;
3260         memento.keyCode = entry->keyCode;
3261         memento.scanCode = entry->scanCode;
3262         memento.downTime = entry->downTime;
3263         return CONSISTENT;
3264     }
3265 
3266     default:
3267         return BROKEN;
3268     }
3269 }
3270 
trackMotion(const MotionEntry * entry)3271 InputDispatcher::InputState::Consistency InputDispatcher::InputState::trackMotion(
3272         const MotionEntry* entry) {
3273     int32_t action = entry->action & AMOTION_EVENT_ACTION_MASK;
3274     for (size_t i = 0; i < mMotionMementos.size(); i++) {
3275         MotionMemento& memento = mMotionMementos.editItemAt(i);
3276         if (memento.deviceId == entry->deviceId
3277                 && memento.source == entry->source) {
3278             switch (action) {
3279             case AMOTION_EVENT_ACTION_UP:
3280             case AMOTION_EVENT_ACTION_CANCEL:
3281                 mMotionMementos.removeAt(i);
3282                 return CONSISTENT;
3283 
3284             case AMOTION_EVENT_ACTION_DOWN:
3285                 return TOLERABLE;
3286 
3287             case AMOTION_EVENT_ACTION_POINTER_DOWN:
3288                 if (entry->pointerCount == memento.pointerCount + 1) {
3289                     memento.setPointers(entry);
3290                     return CONSISTENT;
3291                 }
3292                 return BROKEN;
3293 
3294             case AMOTION_EVENT_ACTION_POINTER_UP:
3295                 if (entry->pointerCount == memento.pointerCount - 1) {
3296                     memento.setPointers(entry);
3297                     return CONSISTENT;
3298                 }
3299                 return BROKEN;
3300 
3301             case AMOTION_EVENT_ACTION_MOVE:
3302                 if (entry->pointerCount == memento.pointerCount) {
3303                     return CONSISTENT;
3304                 }
3305                 return BROKEN;
3306 
3307             default:
3308                 return BROKEN;
3309             }
3310         }
3311     }
3312 
3313     switch (action) {
3314     case AMOTION_EVENT_ACTION_DOWN: {
3315         mMotionMementos.push();
3316         MotionMemento& memento = mMotionMementos.editTop();
3317         memento.deviceId = entry->deviceId;
3318         memento.source = entry->source;
3319         memento.xPrecision = entry->xPrecision;
3320         memento.yPrecision = entry->yPrecision;
3321         memento.downTime = entry->downTime;
3322         memento.setPointers(entry);
3323         return CONSISTENT;
3324     }
3325 
3326     default:
3327         return BROKEN;
3328     }
3329 }
3330 
setPointers(const MotionEntry * entry)3331 void InputDispatcher::InputState::MotionMemento::setPointers(const MotionEntry* entry) {
3332     pointerCount = entry->pointerCount;
3333     for (uint32_t i = 0; i < entry->pointerCount; i++) {
3334         pointerIds[i] = entry->pointerIds[i];
3335         pointerCoords[i] = entry->lastSample->pointerCoords[i];
3336     }
3337 }
3338 
synthesizeCancelationEvents(nsecs_t currentTime,Allocator * allocator,Vector<EventEntry * > & outEvents,CancelationOptions options)3339 void InputDispatcher::InputState::synthesizeCancelationEvents(nsecs_t currentTime,
3340         Allocator* allocator, Vector<EventEntry*>& outEvents,
3341         CancelationOptions options) {
3342     for (size_t i = 0; i < mKeyMementos.size(); ) {
3343         const KeyMemento& memento = mKeyMementos.itemAt(i);
3344         if (shouldCancelEvent(memento.source, options)) {
3345             outEvents.push(allocator->obtainKeyEntry(currentTime,
3346                     memento.deviceId, memento.source, 0,
3347                     AKEY_EVENT_ACTION_UP, AKEY_EVENT_FLAG_CANCELED,
3348                     memento.keyCode, memento.scanCode, 0, 0, memento.downTime));
3349             mKeyMementos.removeAt(i);
3350         } else {
3351             i += 1;
3352         }
3353     }
3354 
3355     for (size_t i = 0; i < mMotionMementos.size(); ) {
3356         const MotionMemento& memento = mMotionMementos.itemAt(i);
3357         if (shouldCancelEvent(memento.source, options)) {
3358             outEvents.push(allocator->obtainMotionEntry(currentTime,
3359                     memento.deviceId, memento.source, 0,
3360                     AMOTION_EVENT_ACTION_CANCEL, 0, 0, 0,
3361                     memento.xPrecision, memento.yPrecision, memento.downTime,
3362                     memento.pointerCount, memento.pointerIds, memento.pointerCoords));
3363             mMotionMementos.removeAt(i);
3364         } else {
3365             i += 1;
3366         }
3367     }
3368 }
3369 
clear()3370 void InputDispatcher::InputState::clear() {
3371     mKeyMementos.clear();
3372     mMotionMementos.clear();
3373 }
3374 
shouldCancelEvent(int32_t eventSource,CancelationOptions options)3375 bool InputDispatcher::InputState::shouldCancelEvent(int32_t eventSource,
3376         CancelationOptions options) {
3377     switch (options) {
3378     case CANCEL_POINTER_EVENTS:
3379         return eventSource & AINPUT_SOURCE_CLASS_POINTER;
3380     case CANCEL_NON_POINTER_EVENTS:
3381         return !(eventSource & AINPUT_SOURCE_CLASS_POINTER);
3382     default:
3383         return true;
3384     }
3385 }
3386 
3387 
3388 // --- InputDispatcher::Connection ---
3389 
Connection(const sp<InputChannel> & inputChannel)3390 InputDispatcher::Connection::Connection(const sp<InputChannel>& inputChannel) :
3391         status(STATUS_NORMAL), inputChannel(inputChannel), inputPublisher(inputChannel),
3392         lastEventTime(LONG_LONG_MAX), lastDispatchTime(LONG_LONG_MAX) {
3393 }
3394 
~Connection()3395 InputDispatcher::Connection::~Connection() {
3396 }
3397 
initialize()3398 status_t InputDispatcher::Connection::initialize() {
3399     return inputPublisher.initialize();
3400 }
3401 
getStatusLabel() const3402 const char* InputDispatcher::Connection::getStatusLabel() const {
3403     switch (status) {
3404     case STATUS_NORMAL:
3405         return "NORMAL";
3406 
3407     case STATUS_BROKEN:
3408         return "BROKEN";
3409 
3410     case STATUS_ZOMBIE:
3411         return "ZOMBIE";
3412 
3413     default:
3414         return "UNKNOWN";
3415     }
3416 }
3417 
findQueuedDispatchEntryForEvent(const EventEntry * eventEntry) const3418 InputDispatcher::DispatchEntry* InputDispatcher::Connection::findQueuedDispatchEntryForEvent(
3419         const EventEntry* eventEntry) const {
3420     for (DispatchEntry* dispatchEntry = outboundQueue.tailSentinel.prev;
3421             dispatchEntry != & outboundQueue.headSentinel; dispatchEntry = dispatchEntry->prev) {
3422         if (dispatchEntry->eventEntry == eventEntry) {
3423             return dispatchEntry;
3424         }
3425     }
3426     return NULL;
3427 }
3428 
3429 
3430 // --- InputDispatcher::CommandEntry ---
3431 
CommandEntry()3432 InputDispatcher::CommandEntry::CommandEntry() :
3433     keyEntry(NULL) {
3434 }
3435 
~CommandEntry()3436 InputDispatcher::CommandEntry::~CommandEntry() {
3437 }
3438 
3439 
3440 // --- InputDispatcher::TouchState ---
3441 
TouchState()3442 InputDispatcher::TouchState::TouchState() :
3443     down(false), split(false) {
3444 }
3445 
~TouchState()3446 InputDispatcher::TouchState::~TouchState() {
3447 }
3448 
reset()3449 void InputDispatcher::TouchState::reset() {
3450     down = false;
3451     split = false;
3452     windows.clear();
3453 }
3454 
copyFrom(const TouchState & other)3455 void InputDispatcher::TouchState::copyFrom(const TouchState& other) {
3456     down = other.down;
3457     split = other.split;
3458     windows.clear();
3459     windows.appendVector(other.windows);
3460 }
3461 
addOrUpdateWindow(const InputWindow * window,int32_t targetFlags,BitSet32 pointerIds)3462 void InputDispatcher::TouchState::addOrUpdateWindow(const InputWindow* window,
3463         int32_t targetFlags, BitSet32 pointerIds) {
3464     if (targetFlags & InputTarget::FLAG_SPLIT) {
3465         split = true;
3466     }
3467 
3468     for (size_t i = 0; i < windows.size(); i++) {
3469         TouchedWindow& touchedWindow = windows.editItemAt(i);
3470         if (touchedWindow.window == window) {
3471             touchedWindow.targetFlags |= targetFlags;
3472             touchedWindow.pointerIds.value |= pointerIds.value;
3473             return;
3474         }
3475     }
3476 
3477     windows.push();
3478 
3479     TouchedWindow& touchedWindow = windows.editTop();
3480     touchedWindow.window = window;
3481     touchedWindow.targetFlags = targetFlags;
3482     touchedWindow.pointerIds = pointerIds;
3483     touchedWindow.channel = window->inputChannel;
3484 }
3485 
removeOutsideTouchWindows()3486 void InputDispatcher::TouchState::removeOutsideTouchWindows() {
3487     for (size_t i = 0 ; i < windows.size(); ) {
3488         if (windows[i].targetFlags & InputTarget::FLAG_OUTSIDE) {
3489             windows.removeAt(i);
3490         } else {
3491             i += 1;
3492         }
3493     }
3494 }
3495 
getFirstForegroundWindow()3496 const InputWindow* InputDispatcher::TouchState::getFirstForegroundWindow() {
3497     for (size_t i = 0; i < windows.size(); i++) {
3498         if (windows[i].targetFlags & InputTarget::FLAG_FOREGROUND) {
3499             return windows[i].window;
3500         }
3501     }
3502     return NULL;
3503 }
3504 
3505 
3506 // --- InputDispatcherThread ---
3507 
InputDispatcherThread(const sp<InputDispatcherInterface> & dispatcher)3508 InputDispatcherThread::InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher) :
3509         Thread(/*canCallJava*/ true), mDispatcher(dispatcher) {
3510 }
3511 
~InputDispatcherThread()3512 InputDispatcherThread::~InputDispatcherThread() {
3513 }
3514 
threadLoop()3515 bool InputDispatcherThread::threadLoop() {
3516     mDispatcher->dispatchOnce();
3517     return true;
3518 }
3519 
3520 } // namespace android
3521