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
52namespace android {
53
54// Delay before reporting long touch events to the power manager.
55const 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.
59const 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.
64const nsecs_t APP_SWITCH_TIMEOUT = 500 * 1000000LL; // 0.5sec
65
66
67static inline nsecs_t now() {
68    return systemTime(SYSTEM_TIME_MONOTONIC);
69}
70
71static inline const char* toString(bool value) {
72    return value ? "true" : "false";
73}
74
75static 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
80static 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
90static 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
98static 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
116static 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
147bool InputWindow::touchableAreaContainsPoint(int32_t x, int32_t y) const {
148    return x >= touchableAreaLeft && x <= touchableAreaRight
149            && y >= touchableAreaTop && y <= touchableAreaBottom;
150}
151
152bool InputWindow::frameContainsPoint(int32_t x, int32_t y) const {
153    return x >= frameLeft && x <= frameRight
154            && y >= frameTop && y <= frameBottom;
155}
156
157bool 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
166InputDispatcher::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
196InputDispatcher::~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
210void 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
238void 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
415bool 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
443void 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
484bool InputDispatcher::isAppSwitchKeyCode(int32_t keyCode) {
485    return keyCode == AKEYCODE_HOME || keyCode == AKEYCODE_ENDCALL;
486}
487
488bool 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
495bool InputDispatcher::isAppSwitchPendingLocked() {
496    return mAppSwitchDueTime != LONG_LONG_MAX;
497}
498
499void 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
511bool 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
528InputDispatcher::CommandEntry* InputDispatcher::postCommandLocked(Command command) {
529    CommandEntry* commandEntry = mAllocator.obtainCommandEntry(command);
530    mCommandQueue.enqueueAtTail(commandEntry);
531    return commandEntry;
532}
533
534void InputDispatcher::drainInboundQueueLocked() {
535    while (! mInboundQueue.isEmpty()) {
536        EventEntry* entry = mInboundQueue.dequeueAtHead();
537        releaseInboundEventLocked(entry);
538    }
539}
540
541void InputDispatcher::releasePendingEventLocked() {
542    if (mPendingEvent) {
543        releaseInboundEventLocked(mPendingEvent);
544        mPendingEvent = NULL;
545    }
546}
547
548void 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
559void InputDispatcher::resetKeyRepeatLocked() {
560    if (mKeyRepeatState.lastKeyEntry) {
561        mAllocator.releaseKeyEntry(mKeyRepeatState.lastKeyEntry);
562        mKeyRepeatState.lastKeyEntry = NULL;
563    }
564}
565
566InputDispatcher::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
599bool 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
615bool 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
706void 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
718bool 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
769void 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
806void 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
836void InputDispatcher::resetTargetsLocked() {
837    mCurrentInputTargetsValid = false;
838    mCurrentInputTargets.clear();
839    mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_NONE;
840}
841
842void InputDispatcher::commitTargetsLocked() {
843    mCurrentInputTargetsValid = true;
844}
845
846int32_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
895void 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
920nsecs_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
928void 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
937int32_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.
993Failed:
994Unresponsive:
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
1006int32_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
1255Failed:
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
1306Unresponsive:
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
1321void 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
1333void 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
1345bool 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
1365bool 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
1380bool 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
1390String8 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
1408void 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
1451void 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
1606void 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
1771void 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
1803void 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
1838void 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
1858void 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
1870int 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
1915void 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
1923void 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
1933void 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
1986InputDispatcher::MotionEntry*
1987InputDispatcher::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
2066void 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
2084void 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
2118void 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
2253NoBatchingOrStreaming:;
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
2270void 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
2281int32_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
2431bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
2432    return injectorUid == 0
2433            || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
2434}
2435
2436void 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
2468void InputDispatcher::incrementPendingForegroundDispatchesLocked(EventEntry* entry) {
2469    InjectionState* injectionState = entry->injectionState;
2470    if (injectionState) {
2471        injectionState->pendingForegroundDispatches += 1;
2472    }
2473}
2474
2475void 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
2486const 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
2496void 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
2568void 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
2591void InputDispatcher::releaseFocusedApplicationLocked() {
2592    if (mFocusedApplication) {
2593        mFocusedApplication = NULL;
2594        mFocusedApplicationStorage.handle.clear();
2595    }
2596}
2597
2598void 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
2634void 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
2649void 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
2665void 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
2758status_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
2795status_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
2836ssize_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
2848void 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
2857void 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
2866void InputDispatcher::onDispatchCycleStartedLocked(
2867        nsecs_t currentTime, const sp<Connection>& connection) {
2868}
2869
2870void InputDispatcher::onDispatchCycleFinishedLocked(
2871        nsecs_t currentTime, const sp<Connection>& connection) {
2872}
2873
2874void 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
2884void 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
2903void InputDispatcher::doNotifyConfigurationChangedInterruptible(
2904        CommandEntry* commandEntry) {
2905    mLock.unlock();
2906
2907    mPolicy->notifyConfigurationChanged(commandEntry->eventTime);
2908
2909    mLock.lock();
2910}
2911
2912void 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
2925void 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
2937void 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
2957void InputDispatcher::doPokeUserActivityLockedInterruptible(CommandEntry* commandEntry) {
2958    mLock.unlock();
2959
2960    mPolicy->pokeUserActivity(commandEntry->eventTime, commandEntry->userActivityEventType);
2961
2962    mLock.lock();
2963}
2964
2965void 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
2970void InputDispatcher::dump(String8& dump) {
2971    dump.append("Input Dispatcher State:\n");
2972    dumpDispatchStateLocked(dump);
2973}
2974
2975
2976// --- InputDispatcher::Queue ---
2977
2978template <typename T>
2979uint32_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
2990InputDispatcher::Allocator::Allocator() {
2991}
2992
2993InputDispatcher::InjectionState*
2994InputDispatcher::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
3005void 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
3015void InputDispatcher::Allocator::releaseEventEntryInjectionState(EventEntry* entry) {
3016    if (entry->injectionState) {
3017        releaseInjectionState(entry->injectionState);
3018        entry->injectionState = NULL;
3019    }
3020}
3021
3022InputDispatcher::ConfigurationChangedEntry*
3023InputDispatcher::Allocator::obtainConfigurationChangedEntry(nsecs_t eventTime) {
3024    ConfigurationChangedEntry* entry = mConfigurationChangeEntryPool.alloc();
3025    initializeEventEntry(entry, EventEntry::TYPE_CONFIGURATION_CHANGED, eventTime, 0);
3026    return entry;
3027}
3028
3029InputDispatcher::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
3050InputDispatcher::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
3079InputDispatcher::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
3094InputDispatcher::CommandEntry* InputDispatcher::Allocator::obtainCommandEntry(Command command) {
3095    CommandEntry* entry = mCommandEntryPool.alloc();
3096    entry->command = command;
3097    return entry;
3098}
3099
3100void 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
3109void 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
3126void 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
3137void 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
3147void 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
3162void InputDispatcher::Allocator::releaseDispatchEntry(DispatchEntry* entry) {
3163    releaseEventEntry(entry->eventEntry);
3164    mDispatchEntryPool.free(entry);
3165}
3166
3167void InputDispatcher::Allocator::releaseCommandEntry(CommandEntry* entry) {
3168    mCommandEntryPool.free(entry);
3169}
3170
3171void 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
3185void 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
3196uint32_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
3207InputDispatcher::InputState::InputState() {
3208}
3209
3210InputDispatcher::InputState::~InputState() {
3211}
3212
3213bool InputDispatcher::InputState::isNeutral() const {
3214    return mKeyMementos.isEmpty() && mMotionMementos.isEmpty();
3215}
3216
3217InputDispatcher::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
3231InputDispatcher::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
3271InputDispatcher::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
3331void 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
3339void 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
3370void InputDispatcher::InputState::clear() {
3371    mKeyMementos.clear();
3372    mMotionMementos.clear();
3373}
3374
3375bool 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
3390InputDispatcher::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
3395InputDispatcher::Connection::~Connection() {
3396}
3397
3398status_t InputDispatcher::Connection::initialize() {
3399    return inputPublisher.initialize();
3400}
3401
3402const 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
3418InputDispatcher::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
3432InputDispatcher::CommandEntry::CommandEntry() :
3433    keyEntry(NULL) {
3434}
3435
3436InputDispatcher::CommandEntry::~CommandEntry() {
3437}
3438
3439
3440// --- InputDispatcher::TouchState ---
3441
3442InputDispatcher::TouchState::TouchState() :
3443    down(false), split(false) {
3444}
3445
3446InputDispatcher::TouchState::~TouchState() {
3447}
3448
3449void InputDispatcher::TouchState::reset() {
3450    down = false;
3451    split = false;
3452    windows.clear();
3453}
3454
3455void InputDispatcher::TouchState::copyFrom(const TouchState& other) {
3456    down = other.down;
3457    split = other.split;
3458    windows.clear();
3459    windows.appendVector(other.windows);
3460}
3461
3462void 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
3486void 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
3496const 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
3508InputDispatcherThread::InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher) :
3509        Thread(/*canCallJava*/ true), mDispatcher(dispatcher) {
3510}
3511
3512InputDispatcherThread::~InputDispatcherThread() {
3513}
3514
3515bool InputDispatcherThread::threadLoop() {
3516    mDispatcher->dispatchOnce();
3517    return true;
3518}
3519
3520} // namespace android
3521