1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "InputDispatcher"
18#define ATRACE_TAG ATRACE_TAG_INPUT
19
20//#define LOG_NDEBUG 0
21
22// Log detailed debug messages about each inbound event notification to the dispatcher.
23#define DEBUG_INBOUND_EVENT_DETAILS 0
24
25// Log detailed debug messages about each outbound event processed by the dispatcher.
26#define DEBUG_OUTBOUND_EVENT_DETAILS 0
27
28// Log debug messages about the dispatch cycle.
29#define DEBUG_DISPATCH_CYCLE 0
30
31// Log debug messages about registrations.
32#define DEBUG_REGISTRATION 0
33
34// Log debug messages about input event injection.
35#define DEBUG_INJECTION 0
36
37// Log debug messages about input focus tracking.
38#define DEBUG_FOCUS 0
39
40// Log debug messages about the app switch latency optimization.
41#define DEBUG_APP_SWITCH 0
42
43// Log debug messages about hover events.
44#define DEBUG_HOVER 0
45
46#include "InputDispatcher.h"
47
48#include <utils/Trace.h>
49#include <cutils/log.h>
50#include <androidfw/PowerManager.h>
51
52#include <stddef.h>
53#include <unistd.h>
54#include <errno.h>
55#include <limits.h>
56#include <time.h>
57
58#define INDENT "  "
59#define INDENT2 "    "
60#define INDENT3 "      "
61#define INDENT4 "        "
62
63namespace android {
64
65// Default input dispatching timeout if there is no focused application or paused window
66// from which to determine an appropriate dispatching timeout.
67const nsecs_t DEFAULT_INPUT_DISPATCHING_TIMEOUT = 5000 * 1000000LL; // 5 sec
68
69// Amount of time to allow for all pending events to be processed when an app switch
70// key is on the way.  This is used to preempt input dispatch and drop input events
71// when an application takes too long to respond and the user has pressed an app switch key.
72const nsecs_t APP_SWITCH_TIMEOUT = 500 * 1000000LL; // 0.5sec
73
74// Amount of time to allow for an event to be dispatched (measured since its eventTime)
75// before considering it stale and dropping it.
76const nsecs_t STALE_EVENT_TIMEOUT = 10000 * 1000000LL; // 10sec
77
78// Amount of time to allow touch events to be streamed out to a connection before requiring
79// that the first event be finished.  This value extends the ANR timeout by the specified
80// amount.  For example, if streaming is allowed to get ahead by one second relative to the
81// queue of waiting unfinished events, then ANRs will similarly be delayed by one second.
82const nsecs_t STREAM_AHEAD_EVENT_TIMEOUT = 500 * 1000000LL; // 0.5sec
83
84// Log a warning when an event takes longer than this to process, even if an ANR does not occur.
85const nsecs_t SLOW_EVENT_PROCESSING_WARNING_TIMEOUT = 2000 * 1000000LL; // 2sec
86
87
88static inline nsecs_t now() {
89    return systemTime(SYSTEM_TIME_MONOTONIC);
90}
91
92static inline const char* toString(bool value) {
93    return value ? "true" : "false";
94}
95
96static inline int32_t getMotionEventActionPointerIndex(int32_t action) {
97    return (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
98            >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
99}
100
101static bool isValidKeyAction(int32_t action) {
102    switch (action) {
103    case AKEY_EVENT_ACTION_DOWN:
104    case AKEY_EVENT_ACTION_UP:
105        return true;
106    default:
107        return false;
108    }
109}
110
111static bool validateKeyEvent(int32_t action) {
112    if (! isValidKeyAction(action)) {
113        ALOGE("Key event has invalid action code 0x%x", action);
114        return false;
115    }
116    return true;
117}
118
119static bool isValidMotionAction(int32_t action, size_t pointerCount) {
120    switch (action & AMOTION_EVENT_ACTION_MASK) {
121    case AMOTION_EVENT_ACTION_DOWN:
122    case AMOTION_EVENT_ACTION_UP:
123    case AMOTION_EVENT_ACTION_CANCEL:
124    case AMOTION_EVENT_ACTION_MOVE:
125    case AMOTION_EVENT_ACTION_OUTSIDE:
126    case AMOTION_EVENT_ACTION_HOVER_ENTER:
127    case AMOTION_EVENT_ACTION_HOVER_MOVE:
128    case AMOTION_EVENT_ACTION_HOVER_EXIT:
129    case AMOTION_EVENT_ACTION_SCROLL:
130        return true;
131    case AMOTION_EVENT_ACTION_POINTER_DOWN:
132    case AMOTION_EVENT_ACTION_POINTER_UP: {
133        int32_t index = getMotionEventActionPointerIndex(action);
134        return index >= 0 && size_t(index) < pointerCount;
135    }
136    default:
137        return false;
138    }
139}
140
141static bool validateMotionEvent(int32_t action, size_t pointerCount,
142        const PointerProperties* pointerProperties) {
143    if (! isValidMotionAction(action, pointerCount)) {
144        ALOGE("Motion event has invalid action code 0x%x", action);
145        return false;
146    }
147    if (pointerCount < 1 || pointerCount > MAX_POINTERS) {
148        ALOGE("Motion event has invalid pointer count %d; value must be between 1 and %d.",
149                pointerCount, MAX_POINTERS);
150        return false;
151    }
152    BitSet32 pointerIdBits;
153    for (size_t i = 0; i < pointerCount; i++) {
154        int32_t id = pointerProperties[i].id;
155        if (id < 0 || id > MAX_POINTER_ID) {
156            ALOGE("Motion event has invalid pointer id %d; value must be between 0 and %d",
157                    id, MAX_POINTER_ID);
158            return false;
159        }
160        if (pointerIdBits.hasBit(id)) {
161            ALOGE("Motion event has duplicate pointer id %d", id);
162            return false;
163        }
164        pointerIdBits.markBit(id);
165    }
166    return true;
167}
168
169static bool isMainDisplay(int32_t displayId) {
170    return displayId == ADISPLAY_ID_DEFAULT || displayId == ADISPLAY_ID_NONE;
171}
172
173static void dumpRegion(String8& dump, const SkRegion& region) {
174    if (region.isEmpty()) {
175        dump.append("<empty>");
176        return;
177    }
178
179    bool first = true;
180    for (SkRegion::Iterator it(region); !it.done(); it.next()) {
181        if (first) {
182            first = false;
183        } else {
184            dump.append("|");
185        }
186        const SkIRect& rect = it.rect();
187        dump.appendFormat("[%d,%d][%d,%d]", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
188    }
189}
190
191
192// --- InputDispatcher ---
193
194InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) :
195    mPolicy(policy),
196    mPendingEvent(NULL), mAppSwitchSawKeyDown(false), mAppSwitchDueTime(LONG_LONG_MAX),
197    mNextUnblockedEvent(NULL),
198    mDispatchEnabled(false), mDispatchFrozen(false), mInputFilterEnabled(false),
199    mInputTargetWaitCause(INPUT_TARGET_WAIT_CAUSE_NONE) {
200    mLooper = new Looper(false);
201
202    mKeyRepeatState.lastKeyEntry = NULL;
203
204    policy->getDispatcherConfiguration(&mConfig);
205}
206
207InputDispatcher::~InputDispatcher() {
208    { // acquire lock
209        AutoMutex _l(mLock);
210
211        resetKeyRepeatLocked();
212        releasePendingEventLocked();
213        drainInboundQueueLocked();
214    }
215
216    while (mConnectionsByFd.size() != 0) {
217        unregisterInputChannel(mConnectionsByFd.valueAt(0)->inputChannel);
218    }
219}
220
221void InputDispatcher::dispatchOnce() {
222    nsecs_t nextWakeupTime = LONG_LONG_MAX;
223    { // acquire lock
224        AutoMutex _l(mLock);
225        mDispatcherIsAliveCondition.broadcast();
226
227        // Run a dispatch loop if there are no pending commands.
228        // The dispatch loop might enqueue commands to run afterwards.
229        if (!haveCommandsLocked()) {
230            dispatchOnceInnerLocked(&nextWakeupTime);
231        }
232
233        // Run all pending commands if there are any.
234        // If any commands were run then force the next poll to wake up immediately.
235        if (runCommandsLockedInterruptible()) {
236            nextWakeupTime = LONG_LONG_MIN;
237        }
238    } // release lock
239
240    // Wait for callback or timeout or wake.  (make sure we round up, not down)
241    nsecs_t currentTime = now();
242    int timeoutMillis = toMillisecondTimeoutDelay(currentTime, nextWakeupTime);
243    mLooper->pollOnce(timeoutMillis);
244}
245
246void InputDispatcher::dispatchOnceInnerLocked(nsecs_t* nextWakeupTime) {
247    nsecs_t currentTime = now();
248
249    // Reset the key repeat timer whenever we disallow key events, even if the next event
250    // is not a key.  This is to ensure that we abort a key repeat if the device is just coming
251    // out of sleep.
252    if (!mPolicy->isKeyRepeatEnabled()) {
253        resetKeyRepeatLocked();
254    }
255
256    // If dispatching is frozen, do not process timeouts or try to deliver any new events.
257    if (mDispatchFrozen) {
258#if DEBUG_FOCUS
259        ALOGD("Dispatch frozen.  Waiting some more.");
260#endif
261        return;
262    }
263
264    // Optimize latency of app switches.
265    // Essentially we start a short timeout when an app switch key (HOME / ENDCALL) has
266    // been pressed.  When it expires, we preempt dispatch and drop all other pending events.
267    bool isAppSwitchDue = mAppSwitchDueTime <= currentTime;
268    if (mAppSwitchDueTime < *nextWakeupTime) {
269        *nextWakeupTime = mAppSwitchDueTime;
270    }
271
272    // Ready to start a new event.
273    // If we don't already have a pending event, go grab one.
274    if (! mPendingEvent) {
275        if (mInboundQueue.isEmpty()) {
276            if (isAppSwitchDue) {
277                // The inbound queue is empty so the app switch key we were waiting
278                // for will never arrive.  Stop waiting for it.
279                resetPendingAppSwitchLocked(false);
280                isAppSwitchDue = false;
281            }
282
283            // Synthesize a key repeat if appropriate.
284            if (mKeyRepeatState.lastKeyEntry) {
285                if (currentTime >= mKeyRepeatState.nextRepeatTime) {
286                    mPendingEvent = synthesizeKeyRepeatLocked(currentTime);
287                } else {
288                    if (mKeyRepeatState.nextRepeatTime < *nextWakeupTime) {
289                        *nextWakeupTime = mKeyRepeatState.nextRepeatTime;
290                    }
291                }
292            }
293
294            // Nothing to do if there is no pending event.
295            if (!mPendingEvent) {
296                return;
297            }
298        } else {
299            // Inbound queue has at least one entry.
300            mPendingEvent = mInboundQueue.dequeueAtHead();
301            traceInboundQueueLengthLocked();
302        }
303
304        // Poke user activity for this event.
305        if (mPendingEvent->policyFlags & POLICY_FLAG_PASS_TO_USER) {
306            pokeUserActivityLocked(mPendingEvent);
307        }
308
309        // Get ready to dispatch the event.
310        resetANRTimeoutsLocked();
311    }
312
313    // Now we have an event to dispatch.
314    // All events are eventually dequeued and processed this way, even if we intend to drop them.
315    ALOG_ASSERT(mPendingEvent != NULL);
316    bool done = false;
317    DropReason dropReason = DROP_REASON_NOT_DROPPED;
318    if (!(mPendingEvent->policyFlags & POLICY_FLAG_PASS_TO_USER)) {
319        dropReason = DROP_REASON_POLICY;
320    } else if (!mDispatchEnabled) {
321        dropReason = DROP_REASON_DISABLED;
322    }
323
324    if (mNextUnblockedEvent == mPendingEvent) {
325        mNextUnblockedEvent = NULL;
326    }
327
328    switch (mPendingEvent->type) {
329    case EventEntry::TYPE_CONFIGURATION_CHANGED: {
330        ConfigurationChangedEntry* typedEntry =
331                static_cast<ConfigurationChangedEntry*>(mPendingEvent);
332        done = dispatchConfigurationChangedLocked(currentTime, typedEntry);
333        dropReason = DROP_REASON_NOT_DROPPED; // configuration changes are never dropped
334        break;
335    }
336
337    case EventEntry::TYPE_DEVICE_RESET: {
338        DeviceResetEntry* typedEntry =
339                static_cast<DeviceResetEntry*>(mPendingEvent);
340        done = dispatchDeviceResetLocked(currentTime, typedEntry);
341        dropReason = DROP_REASON_NOT_DROPPED; // device resets are never dropped
342        break;
343    }
344
345    case EventEntry::TYPE_KEY: {
346        KeyEntry* typedEntry = static_cast<KeyEntry*>(mPendingEvent);
347        if (isAppSwitchDue) {
348            if (isAppSwitchKeyEventLocked(typedEntry)) {
349                resetPendingAppSwitchLocked(true);
350                isAppSwitchDue = false;
351            } else if (dropReason == DROP_REASON_NOT_DROPPED) {
352                dropReason = DROP_REASON_APP_SWITCH;
353            }
354        }
355        if (dropReason == DROP_REASON_NOT_DROPPED
356                && isStaleEventLocked(currentTime, typedEntry)) {
357            dropReason = DROP_REASON_STALE;
358        }
359        if (dropReason == DROP_REASON_NOT_DROPPED && mNextUnblockedEvent) {
360            dropReason = DROP_REASON_BLOCKED;
361        }
362        done = dispatchKeyLocked(currentTime, typedEntry, &dropReason, nextWakeupTime);
363        break;
364    }
365
366    case EventEntry::TYPE_MOTION: {
367        MotionEntry* typedEntry = static_cast<MotionEntry*>(mPendingEvent);
368        if (dropReason == DROP_REASON_NOT_DROPPED && isAppSwitchDue) {
369            dropReason = DROP_REASON_APP_SWITCH;
370        }
371        if (dropReason == DROP_REASON_NOT_DROPPED
372                && isStaleEventLocked(currentTime, typedEntry)) {
373            dropReason = DROP_REASON_STALE;
374        }
375        if (dropReason == DROP_REASON_NOT_DROPPED && mNextUnblockedEvent) {
376            dropReason = DROP_REASON_BLOCKED;
377        }
378        done = dispatchMotionLocked(currentTime, typedEntry,
379                &dropReason, nextWakeupTime);
380        break;
381    }
382
383    default:
384        ALOG_ASSERT(false);
385        break;
386    }
387
388    if (done) {
389        if (dropReason != DROP_REASON_NOT_DROPPED) {
390            dropInboundEventLocked(mPendingEvent, dropReason);
391        }
392
393        releasePendingEventLocked();
394        *nextWakeupTime = LONG_LONG_MIN;  // force next poll to wake up immediately
395    }
396}
397
398bool InputDispatcher::enqueueInboundEventLocked(EventEntry* entry) {
399    bool needWake = mInboundQueue.isEmpty();
400    mInboundQueue.enqueueAtTail(entry);
401    traceInboundQueueLengthLocked();
402
403    switch (entry->type) {
404    case EventEntry::TYPE_KEY: {
405        // Optimize app switch latency.
406        // If the application takes too long to catch up then we drop all events preceding
407        // the app switch key.
408        KeyEntry* keyEntry = static_cast<KeyEntry*>(entry);
409        if (isAppSwitchKeyEventLocked(keyEntry)) {
410            if (keyEntry->action == AKEY_EVENT_ACTION_DOWN) {
411                mAppSwitchSawKeyDown = true;
412            } else if (keyEntry->action == AKEY_EVENT_ACTION_UP) {
413                if (mAppSwitchSawKeyDown) {
414#if DEBUG_APP_SWITCH
415                    ALOGD("App switch is pending!");
416#endif
417                    mAppSwitchDueTime = keyEntry->eventTime + APP_SWITCH_TIMEOUT;
418                    mAppSwitchSawKeyDown = false;
419                    needWake = true;
420                }
421            }
422        }
423        break;
424    }
425
426    case EventEntry::TYPE_MOTION: {
427        // Optimize case where the current application is unresponsive and the user
428        // decides to touch a window in a different application.
429        // If the application takes too long to catch up then we drop all events preceding
430        // the touch into the other window.
431        MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
432        if (motionEntry->action == AMOTION_EVENT_ACTION_DOWN
433                && (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER)
434                && mInputTargetWaitCause == INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY
435                && mInputTargetWaitApplicationHandle != NULL) {
436            int32_t displayId = motionEntry->displayId;
437            int32_t x = int32_t(motionEntry->pointerCoords[0].
438                    getAxisValue(AMOTION_EVENT_AXIS_X));
439            int32_t y = int32_t(motionEntry->pointerCoords[0].
440                    getAxisValue(AMOTION_EVENT_AXIS_Y));
441            sp<InputWindowHandle> touchedWindowHandle = findTouchedWindowAtLocked(displayId, x, y);
442            if (touchedWindowHandle != NULL
443                    && touchedWindowHandle->inputApplicationHandle
444                            != mInputTargetWaitApplicationHandle) {
445                // User touched a different application than the one we are waiting on.
446                // Flag the event, and start pruning the input queue.
447                mNextUnblockedEvent = motionEntry;
448                needWake = true;
449            }
450        }
451        break;
452    }
453    }
454
455    return needWake;
456}
457
458sp<InputWindowHandle> InputDispatcher::findTouchedWindowAtLocked(int32_t displayId,
459        int32_t x, int32_t y) {
460    // Traverse windows from front to back to find touched window.
461    size_t numWindows = mWindowHandles.size();
462    for (size_t i = 0; i < numWindows; i++) {
463        sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
464        const InputWindowInfo* windowInfo = windowHandle->getInfo();
465        if (windowInfo->displayId == displayId) {
466            int32_t flags = windowInfo->layoutParamsFlags;
467
468            if (windowInfo->visible) {
469                if (!(flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
470                    bool isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
471                            | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
472                    if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
473                        // Found window.
474                        return windowHandle;
475                    }
476                }
477            }
478
479            if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
480                // Error window is on top but not visible, so touch is dropped.
481                return NULL;
482            }
483        }
484    }
485    return NULL;
486}
487
488void InputDispatcher::dropInboundEventLocked(EventEntry* entry, DropReason dropReason) {
489    const char* reason;
490    switch (dropReason) {
491    case DROP_REASON_POLICY:
492#if DEBUG_INBOUND_EVENT_DETAILS
493        ALOGD("Dropped event because policy consumed it.");
494#endif
495        reason = "inbound event was dropped because the policy consumed it";
496        break;
497    case DROP_REASON_DISABLED:
498        ALOGI("Dropped event because input dispatch is disabled.");
499        reason = "inbound event was dropped because input dispatch is disabled";
500        break;
501    case DROP_REASON_APP_SWITCH:
502        ALOGI("Dropped event because of pending overdue app switch.");
503        reason = "inbound event was dropped because of pending overdue app switch";
504        break;
505    case DROP_REASON_BLOCKED:
506        ALOGI("Dropped event because the current application is not responding and the user "
507                "has started interacting with a different application.");
508        reason = "inbound event was dropped because the current application is not responding "
509                "and the user has started interacting with a different application";
510        break;
511    case DROP_REASON_STALE:
512        ALOGI("Dropped event because it is stale.");
513        reason = "inbound event was dropped because it is stale";
514        break;
515    default:
516        ALOG_ASSERT(false);
517        return;
518    }
519
520    switch (entry->type) {
521    case EventEntry::TYPE_KEY: {
522        CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, reason);
523        synthesizeCancelationEventsForAllConnectionsLocked(options);
524        break;
525    }
526    case EventEntry::TYPE_MOTION: {
527        MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
528        if (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER) {
529            CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS, reason);
530            synthesizeCancelationEventsForAllConnectionsLocked(options);
531        } else {
532            CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, reason);
533            synthesizeCancelationEventsForAllConnectionsLocked(options);
534        }
535        break;
536    }
537    }
538}
539
540bool InputDispatcher::isAppSwitchKeyCode(int32_t keyCode) {
541    return keyCode == AKEYCODE_HOME
542            || keyCode == AKEYCODE_ENDCALL
543            || keyCode == AKEYCODE_APP_SWITCH;
544}
545
546bool InputDispatcher::isAppSwitchKeyEventLocked(KeyEntry* keyEntry) {
547    return ! (keyEntry->flags & AKEY_EVENT_FLAG_CANCELED)
548            && isAppSwitchKeyCode(keyEntry->keyCode)
549            && (keyEntry->policyFlags & POLICY_FLAG_TRUSTED)
550            && (keyEntry->policyFlags & POLICY_FLAG_PASS_TO_USER);
551}
552
553bool InputDispatcher::isAppSwitchPendingLocked() {
554    return mAppSwitchDueTime != LONG_LONG_MAX;
555}
556
557void InputDispatcher::resetPendingAppSwitchLocked(bool handled) {
558    mAppSwitchDueTime = LONG_LONG_MAX;
559
560#if DEBUG_APP_SWITCH
561    if (handled) {
562        ALOGD("App switch has arrived.");
563    } else {
564        ALOGD("App switch was abandoned.");
565    }
566#endif
567}
568
569bool InputDispatcher::isStaleEventLocked(nsecs_t currentTime, EventEntry* entry) {
570    return currentTime - entry->eventTime >= STALE_EVENT_TIMEOUT;
571}
572
573bool InputDispatcher::haveCommandsLocked() const {
574    return !mCommandQueue.isEmpty();
575}
576
577bool InputDispatcher::runCommandsLockedInterruptible() {
578    if (mCommandQueue.isEmpty()) {
579        return false;
580    }
581
582    do {
583        CommandEntry* commandEntry = mCommandQueue.dequeueAtHead();
584
585        Command command = commandEntry->command;
586        (this->*command)(commandEntry); // commands are implicitly 'LockedInterruptible'
587
588        commandEntry->connection.clear();
589        delete commandEntry;
590    } while (! mCommandQueue.isEmpty());
591    return true;
592}
593
594InputDispatcher::CommandEntry* InputDispatcher::postCommandLocked(Command command) {
595    CommandEntry* commandEntry = new CommandEntry(command);
596    mCommandQueue.enqueueAtTail(commandEntry);
597    return commandEntry;
598}
599
600void InputDispatcher::drainInboundQueueLocked() {
601    while (! mInboundQueue.isEmpty()) {
602        EventEntry* entry = mInboundQueue.dequeueAtHead();
603        releaseInboundEventLocked(entry);
604    }
605    traceInboundQueueLengthLocked();
606}
607
608void InputDispatcher::releasePendingEventLocked() {
609    if (mPendingEvent) {
610        resetANRTimeoutsLocked();
611        releaseInboundEventLocked(mPendingEvent);
612        mPendingEvent = NULL;
613    }
614}
615
616void InputDispatcher::releaseInboundEventLocked(EventEntry* entry) {
617    InjectionState* injectionState = entry->injectionState;
618    if (injectionState && injectionState->injectionResult == INPUT_EVENT_INJECTION_PENDING) {
619#if DEBUG_DISPATCH_CYCLE
620        ALOGD("Injected inbound event was dropped.");
621#endif
622        setInjectionResultLocked(entry, INPUT_EVENT_INJECTION_FAILED);
623    }
624    if (entry == mNextUnblockedEvent) {
625        mNextUnblockedEvent = NULL;
626    }
627    entry->release();
628}
629
630void InputDispatcher::resetKeyRepeatLocked() {
631    if (mKeyRepeatState.lastKeyEntry) {
632        mKeyRepeatState.lastKeyEntry->release();
633        mKeyRepeatState.lastKeyEntry = NULL;
634    }
635}
636
637InputDispatcher::KeyEntry* InputDispatcher::synthesizeKeyRepeatLocked(nsecs_t currentTime) {
638    KeyEntry* entry = mKeyRepeatState.lastKeyEntry;
639
640    // Reuse the repeated key entry if it is otherwise unreferenced.
641    uint32_t policyFlags = (entry->policyFlags & POLICY_FLAG_RAW_MASK)
642            | POLICY_FLAG_PASS_TO_USER | POLICY_FLAG_TRUSTED;
643    if (entry->refCount == 1) {
644        entry->recycle();
645        entry->eventTime = currentTime;
646        entry->policyFlags = policyFlags;
647        entry->repeatCount += 1;
648    } else {
649        KeyEntry* newEntry = new KeyEntry(currentTime,
650                entry->deviceId, entry->source, policyFlags,
651                entry->action, entry->flags, entry->keyCode, entry->scanCode,
652                entry->metaState, entry->repeatCount + 1, entry->downTime);
653
654        mKeyRepeatState.lastKeyEntry = newEntry;
655        entry->release();
656
657        entry = newEntry;
658    }
659    entry->syntheticRepeat = true;
660
661    // Increment reference count since we keep a reference to the event in
662    // mKeyRepeatState.lastKeyEntry in addition to the one we return.
663    entry->refCount += 1;
664
665    mKeyRepeatState.nextRepeatTime = currentTime + mConfig.keyRepeatDelay;
666    return entry;
667}
668
669bool InputDispatcher::dispatchConfigurationChangedLocked(
670        nsecs_t currentTime, ConfigurationChangedEntry* entry) {
671#if DEBUG_OUTBOUND_EVENT_DETAILS
672    ALOGD("dispatchConfigurationChanged - eventTime=%lld", entry->eventTime);
673#endif
674
675    // Reset key repeating in case a keyboard device was added or removed or something.
676    resetKeyRepeatLocked();
677
678    // Enqueue a command to run outside the lock to tell the policy that the configuration changed.
679    CommandEntry* commandEntry = postCommandLocked(
680            & InputDispatcher::doNotifyConfigurationChangedInterruptible);
681    commandEntry->eventTime = entry->eventTime;
682    return true;
683}
684
685bool InputDispatcher::dispatchDeviceResetLocked(
686        nsecs_t currentTime, DeviceResetEntry* entry) {
687#if DEBUG_OUTBOUND_EVENT_DETAILS
688    ALOGD("dispatchDeviceReset - eventTime=%lld, deviceId=%d", entry->eventTime, entry->deviceId);
689#endif
690
691    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS,
692            "device was reset");
693    options.deviceId = entry->deviceId;
694    synthesizeCancelationEventsForAllConnectionsLocked(options);
695    return true;
696}
697
698bool InputDispatcher::dispatchKeyLocked(nsecs_t currentTime, KeyEntry* entry,
699        DropReason* dropReason, nsecs_t* nextWakeupTime) {
700    // Preprocessing.
701    if (! entry->dispatchInProgress) {
702        if (entry->repeatCount == 0
703                && entry->action == AKEY_EVENT_ACTION_DOWN
704                && (entry->policyFlags & POLICY_FLAG_TRUSTED)
705                && (!(entry->policyFlags & POLICY_FLAG_DISABLE_KEY_REPEAT))) {
706            if (mKeyRepeatState.lastKeyEntry
707                    && mKeyRepeatState.lastKeyEntry->keyCode == entry->keyCode) {
708                // We have seen two identical key downs in a row which indicates that the device
709                // driver is automatically generating key repeats itself.  We take note of the
710                // repeat here, but we disable our own next key repeat timer since it is clear that
711                // we will not need to synthesize key repeats ourselves.
712                entry->repeatCount = mKeyRepeatState.lastKeyEntry->repeatCount + 1;
713                resetKeyRepeatLocked();
714                mKeyRepeatState.nextRepeatTime = LONG_LONG_MAX; // don't generate repeats ourselves
715            } else {
716                // Not a repeat.  Save key down state in case we do see a repeat later.
717                resetKeyRepeatLocked();
718                mKeyRepeatState.nextRepeatTime = entry->eventTime + mConfig.keyRepeatTimeout;
719            }
720            mKeyRepeatState.lastKeyEntry = entry;
721            entry->refCount += 1;
722        } else if (! entry->syntheticRepeat) {
723            resetKeyRepeatLocked();
724        }
725
726        if (entry->repeatCount == 1) {
727            entry->flags |= AKEY_EVENT_FLAG_LONG_PRESS;
728        } else {
729            entry->flags &= ~AKEY_EVENT_FLAG_LONG_PRESS;
730        }
731
732        entry->dispatchInProgress = true;
733
734        logOutboundKeyDetailsLocked("dispatchKey - ", entry);
735    }
736
737    // Handle case where the policy asked us to try again later last time.
738    if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER) {
739        if (currentTime < entry->interceptKeyWakeupTime) {
740            if (entry->interceptKeyWakeupTime < *nextWakeupTime) {
741                *nextWakeupTime = entry->interceptKeyWakeupTime;
742            }
743            return false; // wait until next wakeup
744        }
745        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
746        entry->interceptKeyWakeupTime = 0;
747    }
748
749    // Give the policy a chance to intercept the key.
750    if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN) {
751        if (entry->policyFlags & POLICY_FLAG_PASS_TO_USER) {
752            CommandEntry* commandEntry = postCommandLocked(
753                    & InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible);
754            if (mFocusedWindowHandle != NULL) {
755                commandEntry->inputWindowHandle = mFocusedWindowHandle;
756            }
757            commandEntry->keyEntry = entry;
758            entry->refCount += 1;
759            return false; // wait for the command to run
760        } else {
761            entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_CONTINUE;
762        }
763    } else if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_SKIP) {
764        if (*dropReason == DROP_REASON_NOT_DROPPED) {
765            *dropReason = DROP_REASON_POLICY;
766        }
767    }
768
769    // Clean up if dropping the event.
770    if (*dropReason != DROP_REASON_NOT_DROPPED) {
771        setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY
772                ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED);
773        return true;
774    }
775
776    // Identify targets.
777    Vector<InputTarget> inputTargets;
778    int32_t injectionResult = findFocusedWindowTargetsLocked(currentTime,
779            entry, inputTargets, nextWakeupTime);
780    if (injectionResult == INPUT_EVENT_INJECTION_PENDING) {
781        return false;
782    }
783
784    setInjectionResultLocked(entry, injectionResult);
785    if (injectionResult != INPUT_EVENT_INJECTION_SUCCEEDED) {
786        return true;
787    }
788
789    addMonitoringTargetsLocked(inputTargets);
790
791    // Dispatch the key.
792    dispatchEventLocked(currentTime, entry, inputTargets);
793    return true;
794}
795
796void InputDispatcher::logOutboundKeyDetailsLocked(const char* prefix, const KeyEntry* entry) {
797#if DEBUG_OUTBOUND_EVENT_DETAILS
798    ALOGD("%seventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
799            "action=0x%x, flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, "
800            "repeatCount=%d, downTime=%lld",
801            prefix,
802            entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
803            entry->action, entry->flags, entry->keyCode, entry->scanCode, entry->metaState,
804            entry->repeatCount, entry->downTime);
805#endif
806}
807
808bool InputDispatcher::dispatchMotionLocked(
809        nsecs_t currentTime, MotionEntry* entry, DropReason* dropReason, nsecs_t* nextWakeupTime) {
810    // Preprocessing.
811    if (! entry->dispatchInProgress) {
812        entry->dispatchInProgress = true;
813
814        logOutboundMotionDetailsLocked("dispatchMotion - ", entry);
815    }
816
817    // Clean up if dropping the event.
818    if (*dropReason != DROP_REASON_NOT_DROPPED) {
819        setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY
820                ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED);
821        return true;
822    }
823
824    bool isPointerEvent = entry->source & AINPUT_SOURCE_CLASS_POINTER;
825
826    // Identify targets.
827    Vector<InputTarget> inputTargets;
828
829    bool conflictingPointerActions = false;
830    int32_t injectionResult;
831    if (isPointerEvent) {
832        // Pointer event.  (eg. touchscreen)
833        injectionResult = findTouchedWindowTargetsLocked(currentTime,
834                entry, inputTargets, nextWakeupTime, &conflictingPointerActions);
835    } else {
836        // Non touch event.  (eg. trackball)
837        injectionResult = findFocusedWindowTargetsLocked(currentTime,
838                entry, inputTargets, nextWakeupTime);
839    }
840    if (injectionResult == INPUT_EVENT_INJECTION_PENDING) {
841        return false;
842    }
843
844    setInjectionResultLocked(entry, injectionResult);
845    if (injectionResult != INPUT_EVENT_INJECTION_SUCCEEDED) {
846        return true;
847    }
848
849    // TODO: support sending secondary display events to input monitors
850    if (isMainDisplay(entry->displayId)) {
851        addMonitoringTargetsLocked(inputTargets);
852    }
853
854    // Dispatch the motion.
855    if (conflictingPointerActions) {
856        CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
857                "conflicting pointer actions");
858        synthesizeCancelationEventsForAllConnectionsLocked(options);
859    }
860    dispatchEventLocked(currentTime, entry, inputTargets);
861    return true;
862}
863
864
865void InputDispatcher::logOutboundMotionDetailsLocked(const char* prefix, const MotionEntry* entry) {
866#if DEBUG_OUTBOUND_EVENT_DETAILS
867    ALOGD("%seventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
868            "action=0x%x, flags=0x%x, "
869            "metaState=0x%x, buttonState=0x%x, "
870            "edgeFlags=0x%x, xPrecision=%f, yPrecision=%f, downTime=%lld",
871            prefix,
872            entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
873            entry->action, entry->flags,
874            entry->metaState, entry->buttonState,
875            entry->edgeFlags, entry->xPrecision, entry->yPrecision,
876            entry->downTime);
877
878    for (uint32_t i = 0; i < entry->pointerCount; i++) {
879        ALOGD("  Pointer %d: id=%d, toolType=%d, "
880                "x=%f, y=%f, pressure=%f, size=%f, "
881                "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
882                "orientation=%f",
883                i, entry->pointerProperties[i].id,
884                entry->pointerProperties[i].toolType,
885                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X),
886                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y),
887                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE),
888                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE),
889                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR),
890                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR),
891                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR),
892                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR),
893                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
894    }
895#endif
896}
897
898void InputDispatcher::dispatchEventLocked(nsecs_t currentTime,
899        EventEntry* eventEntry, const Vector<InputTarget>& inputTargets) {
900#if DEBUG_DISPATCH_CYCLE
901    ALOGD("dispatchEventToCurrentInputTargets");
902#endif
903
904    ALOG_ASSERT(eventEntry->dispatchInProgress); // should already have been set to true
905
906    pokeUserActivityLocked(eventEntry);
907
908    for (size_t i = 0; i < inputTargets.size(); i++) {
909        const InputTarget& inputTarget = inputTargets.itemAt(i);
910
911        ssize_t connectionIndex = getConnectionIndexLocked(inputTarget.inputChannel);
912        if (connectionIndex >= 0) {
913            sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
914            prepareDispatchCycleLocked(currentTime, connection, eventEntry, &inputTarget);
915        } else {
916#if DEBUG_FOCUS
917            ALOGD("Dropping event delivery to target with channel '%s' because it "
918                    "is no longer registered with the input dispatcher.",
919                    inputTarget.inputChannel->getName().string());
920#endif
921        }
922    }
923}
924
925int32_t InputDispatcher::handleTargetsNotReadyLocked(nsecs_t currentTime,
926        const EventEntry* entry,
927        const sp<InputApplicationHandle>& applicationHandle,
928        const sp<InputWindowHandle>& windowHandle,
929        nsecs_t* nextWakeupTime, const char* reason) {
930    if (applicationHandle == NULL && windowHandle == NULL) {
931        if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY) {
932#if DEBUG_FOCUS
933            ALOGD("Waiting for system to become ready for input.  Reason: %s", reason);
934#endif
935            mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY;
936            mInputTargetWaitStartTime = currentTime;
937            mInputTargetWaitTimeoutTime = LONG_LONG_MAX;
938            mInputTargetWaitTimeoutExpired = false;
939            mInputTargetWaitApplicationHandle.clear();
940        }
941    } else {
942        if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) {
943#if DEBUG_FOCUS
944            ALOGD("Waiting for application to become ready for input: %s.  Reason: %s",
945                    getApplicationWindowLabelLocked(applicationHandle, windowHandle).string(),
946                    reason);
947#endif
948            nsecs_t timeout;
949            if (windowHandle != NULL) {
950                timeout = windowHandle->getDispatchingTimeout(DEFAULT_INPUT_DISPATCHING_TIMEOUT);
951            } else if (applicationHandle != NULL) {
952                timeout = applicationHandle->getDispatchingTimeout(
953                        DEFAULT_INPUT_DISPATCHING_TIMEOUT);
954            } else {
955                timeout = DEFAULT_INPUT_DISPATCHING_TIMEOUT;
956            }
957
958            mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY;
959            mInputTargetWaitStartTime = currentTime;
960            mInputTargetWaitTimeoutTime = currentTime + timeout;
961            mInputTargetWaitTimeoutExpired = false;
962            mInputTargetWaitApplicationHandle.clear();
963
964            if (windowHandle != NULL) {
965                mInputTargetWaitApplicationHandle = windowHandle->inputApplicationHandle;
966            }
967            if (mInputTargetWaitApplicationHandle == NULL && applicationHandle != NULL) {
968                mInputTargetWaitApplicationHandle = applicationHandle;
969            }
970        }
971    }
972
973    if (mInputTargetWaitTimeoutExpired) {
974        return INPUT_EVENT_INJECTION_TIMED_OUT;
975    }
976
977    if (currentTime >= mInputTargetWaitTimeoutTime) {
978        onANRLocked(currentTime, applicationHandle, windowHandle,
979                entry->eventTime, mInputTargetWaitStartTime, reason);
980
981        // Force poll loop to wake up immediately on next iteration once we get the
982        // ANR response back from the policy.
983        *nextWakeupTime = LONG_LONG_MIN;
984        return INPUT_EVENT_INJECTION_PENDING;
985    } else {
986        // Force poll loop to wake up when timeout is due.
987        if (mInputTargetWaitTimeoutTime < *nextWakeupTime) {
988            *nextWakeupTime = mInputTargetWaitTimeoutTime;
989        }
990        return INPUT_EVENT_INJECTION_PENDING;
991    }
992}
993
994void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout,
995        const sp<InputChannel>& inputChannel) {
996    if (newTimeout > 0) {
997        // Extend the timeout.
998        mInputTargetWaitTimeoutTime = now() + newTimeout;
999    } else {
1000        // Give up.
1001        mInputTargetWaitTimeoutExpired = true;
1002
1003        // Input state will not be realistic.  Mark it out of sync.
1004        if (inputChannel.get()) {
1005            ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
1006            if (connectionIndex >= 0) {
1007                sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
1008                sp<InputWindowHandle> windowHandle = connection->inputWindowHandle;
1009
1010                if (windowHandle != NULL) {
1011                    mTouchState.removeWindow(windowHandle);
1012                }
1013
1014                if (connection->status == Connection::STATUS_NORMAL) {
1015                    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS,
1016                            "application not responding");
1017                    synthesizeCancelationEventsForConnectionLocked(connection, options);
1018                }
1019            }
1020        }
1021    }
1022}
1023
1024nsecs_t InputDispatcher::getTimeSpentWaitingForApplicationLocked(
1025        nsecs_t currentTime) {
1026    if (mInputTargetWaitCause == INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) {
1027        return currentTime - mInputTargetWaitStartTime;
1028    }
1029    return 0;
1030}
1031
1032void InputDispatcher::resetANRTimeoutsLocked() {
1033#if DEBUG_FOCUS
1034        ALOGD("Resetting ANR timeouts.");
1035#endif
1036
1037    // Reset input target wait timeout.
1038    mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_NONE;
1039    mInputTargetWaitApplicationHandle.clear();
1040}
1041
1042int32_t InputDispatcher::findFocusedWindowTargetsLocked(nsecs_t currentTime,
1043        const EventEntry* entry, Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime) {
1044    int32_t injectionResult;
1045
1046    // If there is no currently focused window and no focused application
1047    // then drop the event.
1048    if (mFocusedWindowHandle == NULL) {
1049        if (mFocusedApplicationHandle != NULL) {
1050            injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1051                    mFocusedApplicationHandle, NULL, nextWakeupTime,
1052                    "Waiting because no window has focus but there is a "
1053                    "focused application that may eventually add a window "
1054                    "when it finishes starting up.");
1055            goto Unresponsive;
1056        }
1057
1058        ALOGI("Dropping event because there is no focused window or focused application.");
1059        injectionResult = INPUT_EVENT_INJECTION_FAILED;
1060        goto Failed;
1061    }
1062
1063    // Check permissions.
1064    if (! checkInjectionPermission(mFocusedWindowHandle, entry->injectionState)) {
1065        injectionResult = INPUT_EVENT_INJECTION_PERMISSION_DENIED;
1066        goto Failed;
1067    }
1068
1069    // If the currently focused window is paused then keep waiting.
1070    if (mFocusedWindowHandle->getInfo()->paused) {
1071        injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1072                mFocusedApplicationHandle, mFocusedWindowHandle, nextWakeupTime,
1073                "Waiting because the focused window is paused.");
1074        goto Unresponsive;
1075    }
1076
1077    // If the currently focused window is still working on previous events then keep waiting.
1078    if (!isWindowReadyForMoreInputLocked(currentTime, mFocusedWindowHandle, entry)) {
1079        injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1080                mFocusedApplicationHandle, mFocusedWindowHandle, nextWakeupTime,
1081                "Waiting because the focused window has not finished "
1082                "processing the input events that were previously delivered to it.");
1083        goto Unresponsive;
1084    }
1085
1086    // Success!  Output targets.
1087    injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
1088    addWindowTargetLocked(mFocusedWindowHandle,
1089            InputTarget::FLAG_FOREGROUND | InputTarget::FLAG_DISPATCH_AS_IS, BitSet32(0),
1090            inputTargets);
1091
1092    // Done.
1093Failed:
1094Unresponsive:
1095    nsecs_t timeSpentWaitingForApplication = getTimeSpentWaitingForApplicationLocked(currentTime);
1096    updateDispatchStatisticsLocked(currentTime, entry,
1097            injectionResult, timeSpentWaitingForApplication);
1098#if DEBUG_FOCUS
1099    ALOGD("findFocusedWindow finished: injectionResult=%d, "
1100            "timeSpentWaitingForApplication=%0.1fms",
1101            injectionResult, timeSpentWaitingForApplication / 1000000.0);
1102#endif
1103    return injectionResult;
1104}
1105
1106int32_t InputDispatcher::findTouchedWindowTargetsLocked(nsecs_t currentTime,
1107        const MotionEntry* entry, Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime,
1108        bool* outConflictingPointerActions) {
1109    enum InjectionPermission {
1110        INJECTION_PERMISSION_UNKNOWN,
1111        INJECTION_PERMISSION_GRANTED,
1112        INJECTION_PERMISSION_DENIED
1113    };
1114
1115    nsecs_t startTime = now();
1116
1117    // For security reasons, we defer updating the touch state until we are sure that
1118    // event injection will be allowed.
1119    //
1120    // FIXME In the original code, screenWasOff could never be set to true.
1121    //       The reason is that the POLICY_FLAG_WOKE_HERE
1122    //       and POLICY_FLAG_BRIGHT_HERE flags were set only when preprocessing raw
1123    //       EV_KEY, EV_REL and EV_ABS events.  As it happens, the touch event was
1124    //       actually enqueued using the policyFlags that appeared in the final EV_SYN
1125    //       events upon which no preprocessing took place.  So policyFlags was always 0.
1126    //       In the new native input dispatcher we're a bit more careful about event
1127    //       preprocessing so the touches we receive can actually have non-zero policyFlags.
1128    //       Unfortunately we obtain undesirable behavior.
1129    //
1130    //       Here's what happens:
1131    //
1132    //       When the device dims in anticipation of going to sleep, touches
1133    //       in windows which have FLAG_TOUCHABLE_WHEN_WAKING cause
1134    //       the device to brighten and reset the user activity timer.
1135    //       Touches on other windows (such as the launcher window)
1136    //       are dropped.  Then after a moment, the device goes to sleep.  Oops.
1137    //
1138    //       Also notice how screenWasOff was being initialized using POLICY_FLAG_BRIGHT_HERE
1139    //       instead of POLICY_FLAG_WOKE_HERE...
1140    //
1141    bool screenWasOff = false; // original policy: policyFlags & POLICY_FLAG_BRIGHT_HERE;
1142
1143    int32_t displayId = entry->displayId;
1144    int32_t action = entry->action;
1145    int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
1146
1147    // Update the touch state as needed based on the properties of the touch event.
1148    int32_t injectionResult = INPUT_EVENT_INJECTION_PENDING;
1149    InjectionPermission injectionPermission = INJECTION_PERMISSION_UNKNOWN;
1150    sp<InputWindowHandle> newHoverWindowHandle;
1151
1152    bool isSplit = mTouchState.split;
1153    bool switchedDevice = mTouchState.deviceId >= 0 && mTouchState.displayId >= 0
1154            && (mTouchState.deviceId != entry->deviceId
1155                    || mTouchState.source != entry->source
1156                    || mTouchState.displayId != displayId);
1157    bool isHoverAction = (maskedAction == AMOTION_EVENT_ACTION_HOVER_MOVE
1158            || maskedAction == AMOTION_EVENT_ACTION_HOVER_ENTER
1159            || maskedAction == AMOTION_EVENT_ACTION_HOVER_EXIT);
1160    bool newGesture = (maskedAction == AMOTION_EVENT_ACTION_DOWN
1161            || maskedAction == AMOTION_EVENT_ACTION_SCROLL
1162            || isHoverAction);
1163    bool wrongDevice = false;
1164    if (newGesture) {
1165        bool down = maskedAction == AMOTION_EVENT_ACTION_DOWN;
1166        if (switchedDevice && mTouchState.down && !down) {
1167#if DEBUG_FOCUS
1168            ALOGD("Dropping event because a pointer for a different device is already down.");
1169#endif
1170            mTempTouchState.copyFrom(mTouchState);
1171            injectionResult = INPUT_EVENT_INJECTION_FAILED;
1172            switchedDevice = false;
1173            wrongDevice = true;
1174            goto Failed;
1175        }
1176        mTempTouchState.reset();
1177        mTempTouchState.down = down;
1178        mTempTouchState.deviceId = entry->deviceId;
1179        mTempTouchState.source = entry->source;
1180        mTempTouchState.displayId = displayId;
1181        isSplit = false;
1182    } else {
1183        mTempTouchState.copyFrom(mTouchState);
1184    }
1185
1186    if (newGesture || (isSplit && maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN)) {
1187        /* Case 1: New splittable pointer going down, or need target for hover or scroll. */
1188
1189        int32_t pointerIndex = getMotionEventActionPointerIndex(action);
1190        int32_t x = int32_t(entry->pointerCoords[pointerIndex].
1191                getAxisValue(AMOTION_EVENT_AXIS_X));
1192        int32_t y = int32_t(entry->pointerCoords[pointerIndex].
1193                getAxisValue(AMOTION_EVENT_AXIS_Y));
1194        sp<InputWindowHandle> newTouchedWindowHandle;
1195        sp<InputWindowHandle> topErrorWindowHandle;
1196        bool isTouchModal = false;
1197
1198        // Traverse windows from front to back to find touched window and outside targets.
1199        size_t numWindows = mWindowHandles.size();
1200        for (size_t i = 0; i < numWindows; i++) {
1201            sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
1202            const InputWindowInfo* windowInfo = windowHandle->getInfo();
1203            if (windowInfo->displayId != displayId) {
1204                continue; // wrong display
1205            }
1206
1207            int32_t flags = windowInfo->layoutParamsFlags;
1208            if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
1209                if (topErrorWindowHandle == NULL) {
1210                    topErrorWindowHandle = windowHandle;
1211                }
1212            }
1213
1214            if (windowInfo->visible) {
1215                if (! (flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
1216                    isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
1217                            | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
1218                    if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
1219                        if (! screenWasOff
1220                                || (flags & InputWindowInfo::FLAG_TOUCHABLE_WHEN_WAKING)) {
1221                            newTouchedWindowHandle = windowHandle;
1222                        }
1223                        break; // found touched window, exit window loop
1224                    }
1225                }
1226
1227                if (maskedAction == AMOTION_EVENT_ACTION_DOWN
1228                        && (flags & InputWindowInfo::FLAG_WATCH_OUTSIDE_TOUCH)) {
1229                    int32_t outsideTargetFlags = InputTarget::FLAG_DISPATCH_AS_OUTSIDE;
1230                    if (isWindowObscuredAtPointLocked(windowHandle, x, y)) {
1231                        outsideTargetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
1232                    }
1233
1234                    mTempTouchState.addOrUpdateWindow(
1235                            windowHandle, outsideTargetFlags, BitSet32(0));
1236                }
1237            }
1238        }
1239
1240        // If there is an error window but it is not taking focus (typically because
1241        // it is invisible) then wait for it.  Any other focused window may in
1242        // fact be in ANR state.
1243        if (topErrorWindowHandle != NULL && newTouchedWindowHandle != topErrorWindowHandle) {
1244            injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1245                    NULL, NULL, nextWakeupTime,
1246                    "Waiting because a system error window is about to be displayed.");
1247            injectionPermission = INJECTION_PERMISSION_UNKNOWN;
1248            goto Unresponsive;
1249        }
1250
1251        // Figure out whether splitting will be allowed for this window.
1252        if (newTouchedWindowHandle != NULL
1253                && newTouchedWindowHandle->getInfo()->supportsSplitTouch()) {
1254            // New window supports splitting.
1255            isSplit = true;
1256        } else if (isSplit) {
1257            // New window does not support splitting but we have already split events.
1258            // Ignore the new window.
1259            newTouchedWindowHandle = NULL;
1260        }
1261
1262        // Handle the case where we did not find a window.
1263        if (newTouchedWindowHandle == NULL) {
1264            // Try to assign the pointer to the first foreground window we find, if there is one.
1265            newTouchedWindowHandle = mTempTouchState.getFirstForegroundWindowHandle();
1266            if (newTouchedWindowHandle == NULL) {
1267                // There is no touched window.  If this is an initial down event
1268                // then wait for a window to appear that will handle the touch.  This is
1269                // to ensure that we report an ANR in the case where an application has started
1270                // but not yet put up a window and the user is starting to get impatient.
1271                if (maskedAction == AMOTION_EVENT_ACTION_DOWN
1272                        && mFocusedApplicationHandle != NULL) {
1273                    injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1274                            mFocusedApplicationHandle, NULL, nextWakeupTime,
1275                            "Waiting because there is no touchable window that can "
1276                            "handle the event but there is focused application that may "
1277                            "eventually add a new window when it finishes starting up.");
1278                    goto Unresponsive;
1279                }
1280
1281                ALOGI("Dropping event because there is no touched window.");
1282                injectionResult = INPUT_EVENT_INJECTION_FAILED;
1283                goto Failed;
1284            }
1285        }
1286
1287        // Set target flags.
1288        int32_t targetFlags = InputTarget::FLAG_FOREGROUND | InputTarget::FLAG_DISPATCH_AS_IS;
1289        if (isSplit) {
1290            targetFlags |= InputTarget::FLAG_SPLIT;
1291        }
1292        if (isWindowObscuredAtPointLocked(newTouchedWindowHandle, x, y)) {
1293            targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
1294        }
1295
1296        // Update hover state.
1297        if (isHoverAction) {
1298            newHoverWindowHandle = newTouchedWindowHandle;
1299        } else if (maskedAction == AMOTION_EVENT_ACTION_SCROLL) {
1300            newHoverWindowHandle = mLastHoverWindowHandle;
1301        }
1302
1303        // Update the temporary touch state.
1304        BitSet32 pointerIds;
1305        if (isSplit) {
1306            uint32_t pointerId = entry->pointerProperties[pointerIndex].id;
1307            pointerIds.markBit(pointerId);
1308        }
1309        mTempTouchState.addOrUpdateWindow(newTouchedWindowHandle, targetFlags, pointerIds);
1310    } else {
1311        /* Case 2: Pointer move, up, cancel or non-splittable pointer down. */
1312
1313        // If the pointer is not currently down, then ignore the event.
1314        if (! mTempTouchState.down) {
1315#if DEBUG_FOCUS
1316            ALOGD("Dropping event because the pointer is not down or we previously "
1317                    "dropped the pointer down event.");
1318#endif
1319            injectionResult = INPUT_EVENT_INJECTION_FAILED;
1320            goto Failed;
1321        }
1322
1323        // Check whether touches should slip outside of the current foreground window.
1324        if (maskedAction == AMOTION_EVENT_ACTION_MOVE
1325                && entry->pointerCount == 1
1326                && mTempTouchState.isSlippery()) {
1327            int32_t x = int32_t(entry->pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X));
1328            int32_t y = int32_t(entry->pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y));
1329
1330            sp<InputWindowHandle> oldTouchedWindowHandle =
1331                    mTempTouchState.getFirstForegroundWindowHandle();
1332            sp<InputWindowHandle> newTouchedWindowHandle =
1333                    findTouchedWindowAtLocked(displayId, x, y);
1334            if (oldTouchedWindowHandle != newTouchedWindowHandle
1335                    && newTouchedWindowHandle != NULL) {
1336#if DEBUG_FOCUS
1337                ALOGD("Touch is slipping out of window %s into window %s.",
1338                        oldTouchedWindowHandle->getName().string(),
1339                        newTouchedWindowHandle->getName().string());
1340#endif
1341                // Make a slippery exit from the old window.
1342                mTempTouchState.addOrUpdateWindow(oldTouchedWindowHandle,
1343                        InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT, BitSet32(0));
1344
1345                // Make a slippery entrance into the new window.
1346                if (newTouchedWindowHandle->getInfo()->supportsSplitTouch()) {
1347                    isSplit = true;
1348                }
1349
1350                int32_t targetFlags = InputTarget::FLAG_FOREGROUND
1351                        | InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER;
1352                if (isSplit) {
1353                    targetFlags |= InputTarget::FLAG_SPLIT;
1354                }
1355                if (isWindowObscuredAtPointLocked(newTouchedWindowHandle, x, y)) {
1356                    targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
1357                }
1358
1359                BitSet32 pointerIds;
1360                if (isSplit) {
1361                    pointerIds.markBit(entry->pointerProperties[0].id);
1362                }
1363                mTempTouchState.addOrUpdateWindow(newTouchedWindowHandle, targetFlags, pointerIds);
1364            }
1365        }
1366    }
1367
1368    if (newHoverWindowHandle != mLastHoverWindowHandle) {
1369        // Let the previous window know that the hover sequence is over.
1370        if (mLastHoverWindowHandle != NULL) {
1371#if DEBUG_HOVER
1372            ALOGD("Sending hover exit event to window %s.",
1373                    mLastHoverWindowHandle->getName().string());
1374#endif
1375            mTempTouchState.addOrUpdateWindow(mLastHoverWindowHandle,
1376                    InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT, BitSet32(0));
1377        }
1378
1379        // Let the new window know that the hover sequence is starting.
1380        if (newHoverWindowHandle != NULL) {
1381#if DEBUG_HOVER
1382            ALOGD("Sending hover enter event to window %s.",
1383                    newHoverWindowHandle->getName().string());
1384#endif
1385            mTempTouchState.addOrUpdateWindow(newHoverWindowHandle,
1386                    InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER, BitSet32(0));
1387        }
1388    }
1389
1390    // Check permission to inject into all touched foreground windows and ensure there
1391    // is at least one touched foreground window.
1392    {
1393        bool haveForegroundWindow = false;
1394        for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
1395            const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
1396            if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
1397                haveForegroundWindow = true;
1398                if (! checkInjectionPermission(touchedWindow.windowHandle,
1399                        entry->injectionState)) {
1400                    injectionResult = INPUT_EVENT_INJECTION_PERMISSION_DENIED;
1401                    injectionPermission = INJECTION_PERMISSION_DENIED;
1402                    goto Failed;
1403                }
1404            }
1405        }
1406        if (! haveForegroundWindow) {
1407#if DEBUG_FOCUS
1408            ALOGD("Dropping event because there is no touched foreground window to receive it.");
1409#endif
1410            injectionResult = INPUT_EVENT_INJECTION_FAILED;
1411            goto Failed;
1412        }
1413
1414        // Permission granted to injection into all touched foreground windows.
1415        injectionPermission = INJECTION_PERMISSION_GRANTED;
1416    }
1417
1418    // Check whether windows listening for outside touches are owned by the same UID. If it is
1419    // set the policy flag that we will not reveal coordinate information to this window.
1420    if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
1421        sp<InputWindowHandle> foregroundWindowHandle =
1422                mTempTouchState.getFirstForegroundWindowHandle();
1423        const int32_t foregroundWindowUid = foregroundWindowHandle->getInfo()->ownerUid;
1424        for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
1425            const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
1426            if (touchedWindow.targetFlags & InputTarget::FLAG_DISPATCH_AS_OUTSIDE) {
1427                sp<InputWindowHandle> inputWindowHandle = touchedWindow.windowHandle;
1428                if (inputWindowHandle->getInfo()->ownerUid != foregroundWindowUid) {
1429                    mTempTouchState.addOrUpdateWindow(inputWindowHandle,
1430                            InputTarget::FLAG_ZERO_COORDS, BitSet32(0));
1431                }
1432            }
1433        }
1434    }
1435
1436    // Ensure all touched foreground windows are ready for new input.
1437    for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
1438        const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
1439        if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
1440            // If the touched window is paused then keep waiting.
1441            if (touchedWindow.windowHandle->getInfo()->paused) {
1442                injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1443                        NULL, touchedWindow.windowHandle, nextWakeupTime,
1444                        "Waiting because the touched window is paused.");
1445                goto Unresponsive;
1446            }
1447
1448            // If the touched window is still working on previous events then keep waiting.
1449            if (!isWindowReadyForMoreInputLocked(currentTime, touchedWindow.windowHandle, entry)) {
1450                injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1451                        NULL, touchedWindow.windowHandle, nextWakeupTime,
1452                        "Waiting because the touched window has not finished "
1453                        "processing the input events that were previously delivered to it.");
1454                goto Unresponsive;
1455            }
1456        }
1457    }
1458
1459    // If this is the first pointer going down and the touched window has a wallpaper
1460    // then also add the touched wallpaper windows so they are locked in for the duration
1461    // of the touch gesture.
1462    // We do not collect wallpapers during HOVER_MOVE or SCROLL because the wallpaper
1463    // engine only supports touch events.  We would need to add a mechanism similar
1464    // to View.onGenericMotionEvent to enable wallpapers to handle these events.
1465    if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
1466        sp<InputWindowHandle> foregroundWindowHandle =
1467                mTempTouchState.getFirstForegroundWindowHandle();
1468        if (foregroundWindowHandle->getInfo()->hasWallpaper) {
1469            for (size_t i = 0; i < mWindowHandles.size(); i++) {
1470                sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
1471                const InputWindowInfo* info = windowHandle->getInfo();
1472                if (info->displayId == displayId
1473                        && windowHandle->getInfo()->layoutParamsType
1474                                == InputWindowInfo::TYPE_WALLPAPER) {
1475                    mTempTouchState.addOrUpdateWindow(windowHandle,
1476                            InputTarget::FLAG_WINDOW_IS_OBSCURED
1477                                    | InputTarget::FLAG_DISPATCH_AS_IS,
1478                            BitSet32(0));
1479                }
1480            }
1481        }
1482    }
1483
1484    // Success!  Output targets.
1485    injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
1486
1487    for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
1488        const TouchedWindow& touchedWindow = mTempTouchState.windows.itemAt(i);
1489        addWindowTargetLocked(touchedWindow.windowHandle, touchedWindow.targetFlags,
1490                touchedWindow.pointerIds, inputTargets);
1491    }
1492
1493    // Drop the outside or hover touch windows since we will not care about them
1494    // in the next iteration.
1495    mTempTouchState.filterNonAsIsTouchWindows();
1496
1497Failed:
1498    // Check injection permission once and for all.
1499    if (injectionPermission == INJECTION_PERMISSION_UNKNOWN) {
1500        if (checkInjectionPermission(NULL, entry->injectionState)) {
1501            injectionPermission = INJECTION_PERMISSION_GRANTED;
1502        } else {
1503            injectionPermission = INJECTION_PERMISSION_DENIED;
1504        }
1505    }
1506
1507    // Update final pieces of touch state if the injector had permission.
1508    if (injectionPermission == INJECTION_PERMISSION_GRANTED) {
1509        if (!wrongDevice) {
1510            if (switchedDevice) {
1511#if DEBUG_FOCUS
1512                ALOGD("Conflicting pointer actions: Switched to a different device.");
1513#endif
1514                *outConflictingPointerActions = true;
1515            }
1516
1517            if (isHoverAction) {
1518                // Started hovering, therefore no longer down.
1519                if (mTouchState.down) {
1520#if DEBUG_FOCUS
1521                    ALOGD("Conflicting pointer actions: Hover received while pointer was down.");
1522#endif
1523                    *outConflictingPointerActions = true;
1524                }
1525                mTouchState.reset();
1526                if (maskedAction == AMOTION_EVENT_ACTION_HOVER_ENTER
1527                        || maskedAction == AMOTION_EVENT_ACTION_HOVER_MOVE) {
1528                    mTouchState.deviceId = entry->deviceId;
1529                    mTouchState.source = entry->source;
1530                    mTouchState.displayId = displayId;
1531                }
1532            } else if (maskedAction == AMOTION_EVENT_ACTION_UP
1533                    || maskedAction == AMOTION_EVENT_ACTION_CANCEL) {
1534                // All pointers up or canceled.
1535                mTouchState.reset();
1536            } else if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
1537                // First pointer went down.
1538                if (mTouchState.down) {
1539#if DEBUG_FOCUS
1540                    ALOGD("Conflicting pointer actions: Down received while already down.");
1541#endif
1542                    *outConflictingPointerActions = true;
1543                }
1544                mTouchState.copyFrom(mTempTouchState);
1545            } else if (maskedAction == AMOTION_EVENT_ACTION_POINTER_UP) {
1546                // One pointer went up.
1547                if (isSplit) {
1548                    int32_t pointerIndex = getMotionEventActionPointerIndex(action);
1549                    uint32_t pointerId = entry->pointerProperties[pointerIndex].id;
1550
1551                    for (size_t i = 0; i < mTempTouchState.windows.size(); ) {
1552                        TouchedWindow& touchedWindow = mTempTouchState.windows.editItemAt(i);
1553                        if (touchedWindow.targetFlags & InputTarget::FLAG_SPLIT) {
1554                            touchedWindow.pointerIds.clearBit(pointerId);
1555                            if (touchedWindow.pointerIds.isEmpty()) {
1556                                mTempTouchState.windows.removeAt(i);
1557                                continue;
1558                            }
1559                        }
1560                        i += 1;
1561                    }
1562                }
1563                mTouchState.copyFrom(mTempTouchState);
1564            } else if (maskedAction == AMOTION_EVENT_ACTION_SCROLL) {
1565                // Discard temporary touch state since it was only valid for this action.
1566            } else {
1567                // Save changes to touch state as-is for all other actions.
1568                mTouchState.copyFrom(mTempTouchState);
1569            }
1570
1571            // Update hover state.
1572            mLastHoverWindowHandle = newHoverWindowHandle;
1573        }
1574    } else {
1575#if DEBUG_FOCUS
1576        ALOGD("Not updating touch focus because injection was denied.");
1577#endif
1578    }
1579
1580Unresponsive:
1581    // Reset temporary touch state to ensure we release unnecessary references to input channels.
1582    mTempTouchState.reset();
1583
1584    nsecs_t timeSpentWaitingForApplication = getTimeSpentWaitingForApplicationLocked(currentTime);
1585    updateDispatchStatisticsLocked(currentTime, entry,
1586            injectionResult, timeSpentWaitingForApplication);
1587#if DEBUG_FOCUS
1588    ALOGD("findTouchedWindow finished: injectionResult=%d, injectionPermission=%d, "
1589            "timeSpentWaitingForApplication=%0.1fms",
1590            injectionResult, injectionPermission, timeSpentWaitingForApplication / 1000000.0);
1591#endif
1592    return injectionResult;
1593}
1594
1595void InputDispatcher::addWindowTargetLocked(const sp<InputWindowHandle>& windowHandle,
1596        int32_t targetFlags, BitSet32 pointerIds, Vector<InputTarget>& inputTargets) {
1597    inputTargets.push();
1598
1599    const InputWindowInfo* windowInfo = windowHandle->getInfo();
1600    InputTarget& target = inputTargets.editTop();
1601    target.inputChannel = windowInfo->inputChannel;
1602    target.flags = targetFlags;
1603    target.xOffset = - windowInfo->frameLeft;
1604    target.yOffset = - windowInfo->frameTop;
1605    target.scaleFactor = windowInfo->scaleFactor;
1606    target.pointerIds = pointerIds;
1607}
1608
1609void InputDispatcher::addMonitoringTargetsLocked(Vector<InputTarget>& inputTargets) {
1610    for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
1611        inputTargets.push();
1612
1613        InputTarget& target = inputTargets.editTop();
1614        target.inputChannel = mMonitoringChannels[i];
1615        target.flags = InputTarget::FLAG_DISPATCH_AS_IS;
1616        target.xOffset = 0;
1617        target.yOffset = 0;
1618        target.pointerIds.clear();
1619        target.scaleFactor = 1.0f;
1620    }
1621}
1622
1623bool InputDispatcher::checkInjectionPermission(const sp<InputWindowHandle>& windowHandle,
1624        const InjectionState* injectionState) {
1625    if (injectionState
1626            && (windowHandle == NULL
1627                    || windowHandle->getInfo()->ownerUid != injectionState->injectorUid)
1628            && !hasInjectionPermission(injectionState->injectorPid, injectionState->injectorUid)) {
1629        if (windowHandle != NULL) {
1630            ALOGW("Permission denied: injecting event from pid %d uid %d to window %s "
1631                    "owned by uid %d",
1632                    injectionState->injectorPid, injectionState->injectorUid,
1633                    windowHandle->getName().string(),
1634                    windowHandle->getInfo()->ownerUid);
1635        } else {
1636            ALOGW("Permission denied: injecting event from pid %d uid %d",
1637                    injectionState->injectorPid, injectionState->injectorUid);
1638        }
1639        return false;
1640    }
1641    return true;
1642}
1643
1644bool InputDispatcher::isWindowObscuredAtPointLocked(
1645        const sp<InputWindowHandle>& windowHandle, int32_t x, int32_t y) const {
1646    int32_t displayId = windowHandle->getInfo()->displayId;
1647    size_t numWindows = mWindowHandles.size();
1648    for (size_t i = 0; i < numWindows; i++) {
1649        sp<InputWindowHandle> otherHandle = mWindowHandles.itemAt(i);
1650        if (otherHandle == windowHandle) {
1651            break;
1652        }
1653
1654        const InputWindowInfo* otherInfo = otherHandle->getInfo();
1655        if (otherInfo->displayId == displayId
1656                && otherInfo->visible && !otherInfo->isTrustedOverlay()
1657                && otherInfo->frameContainsPoint(x, y)) {
1658            return true;
1659        }
1660    }
1661    return false;
1662}
1663
1664bool InputDispatcher::isWindowReadyForMoreInputLocked(nsecs_t currentTime,
1665        const sp<InputWindowHandle>& windowHandle, const EventEntry* eventEntry) {
1666    ssize_t connectionIndex = getConnectionIndexLocked(windowHandle->getInputChannel());
1667    if (connectionIndex >= 0) {
1668        sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
1669        if (connection->inputPublisherBlocked) {
1670            return false;
1671        }
1672        if (eventEntry->type == EventEntry::TYPE_KEY) {
1673            // If the event is a key event, then we must wait for all previous events to
1674            // complete before delivering it because previous events may have the
1675            // side-effect of transferring focus to a different window and we want to
1676            // ensure that the following keys are sent to the new window.
1677            //
1678            // Suppose the user touches a button in a window then immediately presses "A".
1679            // If the button causes a pop-up window to appear then we want to ensure that
1680            // the "A" key is delivered to the new pop-up window.  This is because users
1681            // often anticipate pending UI changes when typing on a keyboard.
1682            // To obtain this behavior, we must serialize key events with respect to all
1683            // prior input events.
1684            return connection->outboundQueue.isEmpty()
1685                    && connection->waitQueue.isEmpty();
1686        }
1687        // Touch events can always be sent to a window immediately because the user intended
1688        // to touch whatever was visible at the time.  Even if focus changes or a new
1689        // window appears moments later, the touch event was meant to be delivered to
1690        // whatever window happened to be on screen at the time.
1691        //
1692        // Generic motion events, such as trackball or joystick events are a little trickier.
1693        // Like key events, generic motion events are delivered to the focused window.
1694        // Unlike key events, generic motion events don't tend to transfer focus to other
1695        // windows and it is not important for them to be serialized.  So we prefer to deliver
1696        // generic motion events as soon as possible to improve efficiency and reduce lag
1697        // through batching.
1698        //
1699        // The one case where we pause input event delivery is when the wait queue is piling
1700        // up with lots of events because the application is not responding.
1701        // This condition ensures that ANRs are detected reliably.
1702        if (!connection->waitQueue.isEmpty()
1703                && currentTime >= connection->waitQueue.head->eventEntry->eventTime
1704                        + STREAM_AHEAD_EVENT_TIMEOUT) {
1705            return false;
1706        }
1707    }
1708    return true;
1709}
1710
1711String8 InputDispatcher::getApplicationWindowLabelLocked(
1712        const sp<InputApplicationHandle>& applicationHandle,
1713        const sp<InputWindowHandle>& windowHandle) {
1714    if (applicationHandle != NULL) {
1715        if (windowHandle != NULL) {
1716            String8 label(applicationHandle->getName());
1717            label.append(" - ");
1718            label.append(windowHandle->getName());
1719            return label;
1720        } else {
1721            return applicationHandle->getName();
1722        }
1723    } else if (windowHandle != NULL) {
1724        return windowHandle->getName();
1725    } else {
1726        return String8("<unknown application or window>");
1727    }
1728}
1729
1730void InputDispatcher::pokeUserActivityLocked(const EventEntry* eventEntry) {
1731    if (mFocusedWindowHandle != NULL) {
1732        const InputWindowInfo* info = mFocusedWindowHandle->getInfo();
1733        if (info->inputFeatures & InputWindowInfo::INPUT_FEATURE_DISABLE_USER_ACTIVITY) {
1734#if DEBUG_DISPATCH_CYCLE
1735            ALOGD("Not poking user activity: disabled by window '%s'.", info->name.string());
1736#endif
1737            return;
1738        }
1739    }
1740
1741    int32_t eventType = USER_ACTIVITY_EVENT_OTHER;
1742    switch (eventEntry->type) {
1743    case EventEntry::TYPE_MOTION: {
1744        const MotionEntry* motionEntry = static_cast<const MotionEntry*>(eventEntry);
1745        if (motionEntry->action == AMOTION_EVENT_ACTION_CANCEL) {
1746            return;
1747        }
1748
1749        if (MotionEvent::isTouchEvent(motionEntry->source, motionEntry->action)) {
1750            eventType = USER_ACTIVITY_EVENT_TOUCH;
1751        }
1752        break;
1753    }
1754    case EventEntry::TYPE_KEY: {
1755        const KeyEntry* keyEntry = static_cast<const KeyEntry*>(eventEntry);
1756        if (keyEntry->flags & AKEY_EVENT_FLAG_CANCELED) {
1757            return;
1758        }
1759        eventType = USER_ACTIVITY_EVENT_BUTTON;
1760        break;
1761    }
1762    }
1763
1764    CommandEntry* commandEntry = postCommandLocked(
1765            & InputDispatcher::doPokeUserActivityLockedInterruptible);
1766    commandEntry->eventTime = eventEntry->eventTime;
1767    commandEntry->userActivityEventType = eventType;
1768}
1769
1770void InputDispatcher::prepareDispatchCycleLocked(nsecs_t currentTime,
1771        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget) {
1772#if DEBUG_DISPATCH_CYCLE
1773    ALOGD("channel '%s' ~ prepareDispatchCycle - flags=0x%08x, "
1774            "xOffset=%f, yOffset=%f, scaleFactor=%f, "
1775            "pointerIds=0x%x",
1776            connection->getInputChannelName(), inputTarget->flags,
1777            inputTarget->xOffset, inputTarget->yOffset,
1778            inputTarget->scaleFactor, inputTarget->pointerIds.value);
1779#endif
1780
1781    // Skip this event if the connection status is not normal.
1782    // We don't want to enqueue additional outbound events if the connection is broken.
1783    if (connection->status != Connection::STATUS_NORMAL) {
1784#if DEBUG_DISPATCH_CYCLE
1785        ALOGD("channel '%s' ~ Dropping event because the channel status is %s",
1786                connection->getInputChannelName(), connection->getStatusLabel());
1787#endif
1788        return;
1789    }
1790
1791    // Split a motion event if needed.
1792    if (inputTarget->flags & InputTarget::FLAG_SPLIT) {
1793        ALOG_ASSERT(eventEntry->type == EventEntry::TYPE_MOTION);
1794
1795        MotionEntry* originalMotionEntry = static_cast<MotionEntry*>(eventEntry);
1796        if (inputTarget->pointerIds.count() != originalMotionEntry->pointerCount) {
1797            MotionEntry* splitMotionEntry = splitMotionEvent(
1798                    originalMotionEntry, inputTarget->pointerIds);
1799            if (!splitMotionEntry) {
1800                return; // split event was dropped
1801            }
1802#if DEBUG_FOCUS
1803            ALOGD("channel '%s' ~ Split motion event.",
1804                    connection->getInputChannelName());
1805            logOutboundMotionDetailsLocked("  ", splitMotionEntry);
1806#endif
1807            enqueueDispatchEntriesLocked(currentTime, connection,
1808                    splitMotionEntry, inputTarget);
1809            splitMotionEntry->release();
1810            return;
1811        }
1812    }
1813
1814    // Not splitting.  Enqueue dispatch entries for the event as is.
1815    enqueueDispatchEntriesLocked(currentTime, connection, eventEntry, inputTarget);
1816}
1817
1818void InputDispatcher::enqueueDispatchEntriesLocked(nsecs_t currentTime,
1819        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget) {
1820    bool wasEmpty = connection->outboundQueue.isEmpty();
1821
1822    // Enqueue dispatch entries for the requested modes.
1823    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
1824            InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT);
1825    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
1826            InputTarget::FLAG_DISPATCH_AS_OUTSIDE);
1827    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
1828            InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER);
1829    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
1830            InputTarget::FLAG_DISPATCH_AS_IS);
1831    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
1832            InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT);
1833    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
1834            InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER);
1835
1836    // If the outbound queue was previously empty, start the dispatch cycle going.
1837    if (wasEmpty && !connection->outboundQueue.isEmpty()) {
1838        startDispatchCycleLocked(currentTime, connection);
1839    }
1840}
1841
1842void InputDispatcher::enqueueDispatchEntryLocked(
1843        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget,
1844        int32_t dispatchMode) {
1845    int32_t inputTargetFlags = inputTarget->flags;
1846    if (!(inputTargetFlags & dispatchMode)) {
1847        return;
1848    }
1849    inputTargetFlags = (inputTargetFlags & ~InputTarget::FLAG_DISPATCH_MASK) | dispatchMode;
1850
1851    // This is a new event.
1852    // Enqueue a new dispatch entry onto the outbound queue for this connection.
1853    DispatchEntry* dispatchEntry = new DispatchEntry(eventEntry, // increments ref
1854            inputTargetFlags, inputTarget->xOffset, inputTarget->yOffset,
1855            inputTarget->scaleFactor);
1856
1857    // Apply target flags and update the connection's input state.
1858    switch (eventEntry->type) {
1859    case EventEntry::TYPE_KEY: {
1860        KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
1861        dispatchEntry->resolvedAction = keyEntry->action;
1862        dispatchEntry->resolvedFlags = keyEntry->flags;
1863
1864        if (!connection->inputState.trackKey(keyEntry,
1865                dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags)) {
1866#if DEBUG_DISPATCH_CYCLE
1867            ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent key event",
1868                    connection->getInputChannelName());
1869#endif
1870            delete dispatchEntry;
1871            return; // skip the inconsistent event
1872        }
1873        break;
1874    }
1875
1876    case EventEntry::TYPE_MOTION: {
1877        MotionEntry* motionEntry = static_cast<MotionEntry*>(eventEntry);
1878        if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_OUTSIDE) {
1879            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_OUTSIDE;
1880        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT) {
1881            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_EXIT;
1882        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER) {
1883            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_ENTER;
1884        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT) {
1885            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_CANCEL;
1886        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER) {
1887            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_DOWN;
1888        } else {
1889            dispatchEntry->resolvedAction = motionEntry->action;
1890        }
1891        if (dispatchEntry->resolvedAction == AMOTION_EVENT_ACTION_HOVER_MOVE
1892                && !connection->inputState.isHovering(
1893                        motionEntry->deviceId, motionEntry->source, motionEntry->displayId)) {
1894#if DEBUG_DISPATCH_CYCLE
1895        ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: filling in missing hover enter event",
1896                connection->getInputChannelName());
1897#endif
1898            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_ENTER;
1899        }
1900
1901        dispatchEntry->resolvedFlags = motionEntry->flags;
1902        if (dispatchEntry->targetFlags & InputTarget::FLAG_WINDOW_IS_OBSCURED) {
1903            dispatchEntry->resolvedFlags |= AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED;
1904        }
1905
1906        if (!connection->inputState.trackMotion(motionEntry,
1907                dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags)) {
1908#if DEBUG_DISPATCH_CYCLE
1909            ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent motion event",
1910                    connection->getInputChannelName());
1911#endif
1912            delete dispatchEntry;
1913            return; // skip the inconsistent event
1914        }
1915        break;
1916    }
1917    }
1918
1919    // Remember that we are waiting for this dispatch to complete.
1920    if (dispatchEntry->hasForegroundTarget()) {
1921        incrementPendingForegroundDispatchesLocked(eventEntry);
1922    }
1923
1924    // Enqueue the dispatch entry.
1925    connection->outboundQueue.enqueueAtTail(dispatchEntry);
1926    traceOutboundQueueLengthLocked(connection);
1927}
1928
1929void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
1930        const sp<Connection>& connection) {
1931#if DEBUG_DISPATCH_CYCLE
1932    ALOGD("channel '%s' ~ startDispatchCycle",
1933            connection->getInputChannelName());
1934#endif
1935
1936    while (connection->status == Connection::STATUS_NORMAL
1937            && !connection->outboundQueue.isEmpty()) {
1938        DispatchEntry* dispatchEntry = connection->outboundQueue.head;
1939        dispatchEntry->deliveryTime = currentTime;
1940
1941        // Publish the event.
1942        status_t status;
1943        EventEntry* eventEntry = dispatchEntry->eventEntry;
1944        switch (eventEntry->type) {
1945        case EventEntry::TYPE_KEY: {
1946            KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
1947
1948            // Publish the key event.
1949            status = connection->inputPublisher.publishKeyEvent(dispatchEntry->seq,
1950                    keyEntry->deviceId, keyEntry->source,
1951                    dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags,
1952                    keyEntry->keyCode, keyEntry->scanCode,
1953                    keyEntry->metaState, keyEntry->repeatCount, keyEntry->downTime,
1954                    keyEntry->eventTime);
1955            break;
1956        }
1957
1958        case EventEntry::TYPE_MOTION: {
1959            MotionEntry* motionEntry = static_cast<MotionEntry*>(eventEntry);
1960
1961            PointerCoords scaledCoords[MAX_POINTERS];
1962            const PointerCoords* usingCoords = motionEntry->pointerCoords;
1963
1964            // Set the X and Y offset depending on the input source.
1965            float xOffset, yOffset, scaleFactor;
1966            if ((motionEntry->source & AINPUT_SOURCE_CLASS_POINTER)
1967                    && !(dispatchEntry->targetFlags & InputTarget::FLAG_ZERO_COORDS)) {
1968                scaleFactor = dispatchEntry->scaleFactor;
1969                xOffset = dispatchEntry->xOffset * scaleFactor;
1970                yOffset = dispatchEntry->yOffset * scaleFactor;
1971                if (scaleFactor != 1.0f) {
1972                    for (size_t i = 0; i < motionEntry->pointerCount; i++) {
1973                        scaledCoords[i] = motionEntry->pointerCoords[i];
1974                        scaledCoords[i].scale(scaleFactor);
1975                    }
1976                    usingCoords = scaledCoords;
1977                }
1978            } else {
1979                xOffset = 0.0f;
1980                yOffset = 0.0f;
1981                scaleFactor = 1.0f;
1982
1983                // We don't want the dispatch target to know.
1984                if (dispatchEntry->targetFlags & InputTarget::FLAG_ZERO_COORDS) {
1985                    for (size_t i = 0; i < motionEntry->pointerCount; i++) {
1986                        scaledCoords[i].clear();
1987                    }
1988                    usingCoords = scaledCoords;
1989                }
1990            }
1991
1992            // Publish the motion event.
1993            status = connection->inputPublisher.publishMotionEvent(dispatchEntry->seq,
1994                    motionEntry->deviceId, motionEntry->source,
1995                    dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags,
1996                    motionEntry->edgeFlags, motionEntry->metaState, motionEntry->buttonState,
1997                    xOffset, yOffset,
1998                    motionEntry->xPrecision, motionEntry->yPrecision,
1999                    motionEntry->downTime, motionEntry->eventTime,
2000                    motionEntry->pointerCount, motionEntry->pointerProperties,
2001                    usingCoords);
2002            break;
2003        }
2004
2005        default:
2006            ALOG_ASSERT(false);
2007            return;
2008        }
2009
2010        // Check the result.
2011        if (status) {
2012            if (status == WOULD_BLOCK) {
2013                if (connection->waitQueue.isEmpty()) {
2014                    ALOGE("channel '%s' ~ Could not publish event because the pipe is full. "
2015                            "This is unexpected because the wait queue is empty, so the pipe "
2016                            "should be empty and we shouldn't have any problems writing an "
2017                            "event to it, status=%d", connection->getInputChannelName(), status);
2018                    abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
2019                } else {
2020                    // Pipe is full and we are waiting for the app to finish process some events
2021                    // before sending more events to it.
2022#if DEBUG_DISPATCH_CYCLE
2023                    ALOGD("channel '%s' ~ Could not publish event because the pipe is full, "
2024                            "waiting for the application to catch up",
2025                            connection->getInputChannelName());
2026#endif
2027                    connection->inputPublisherBlocked = true;
2028                }
2029            } else {
2030                ALOGE("channel '%s' ~ Could not publish event due to an unexpected error, "
2031                        "status=%d", connection->getInputChannelName(), status);
2032                abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
2033            }
2034            return;
2035        }
2036
2037        // Re-enqueue the event on the wait queue.
2038        connection->outboundQueue.dequeue(dispatchEntry);
2039        traceOutboundQueueLengthLocked(connection);
2040        connection->waitQueue.enqueueAtTail(dispatchEntry);
2041        traceWaitQueueLengthLocked(connection);
2042    }
2043}
2044
2045void InputDispatcher::finishDispatchCycleLocked(nsecs_t currentTime,
2046        const sp<Connection>& connection, uint32_t seq, bool handled) {
2047#if DEBUG_DISPATCH_CYCLE
2048    ALOGD("channel '%s' ~ finishDispatchCycle - seq=%u, handled=%s",
2049            connection->getInputChannelName(), seq, toString(handled));
2050#endif
2051
2052    connection->inputPublisherBlocked = false;
2053
2054    if (connection->status == Connection::STATUS_BROKEN
2055            || connection->status == Connection::STATUS_ZOMBIE) {
2056        return;
2057    }
2058
2059    // Notify other system components and prepare to start the next dispatch cycle.
2060    onDispatchCycleFinishedLocked(currentTime, connection, seq, handled);
2061}
2062
2063void InputDispatcher::abortBrokenDispatchCycleLocked(nsecs_t currentTime,
2064        const sp<Connection>& connection, bool notify) {
2065#if DEBUG_DISPATCH_CYCLE
2066    ALOGD("channel '%s' ~ abortBrokenDispatchCycle - notify=%s",
2067            connection->getInputChannelName(), toString(notify));
2068#endif
2069
2070    // Clear the dispatch queues.
2071    drainDispatchQueueLocked(&connection->outboundQueue);
2072    traceOutboundQueueLengthLocked(connection);
2073    drainDispatchQueueLocked(&connection->waitQueue);
2074    traceWaitQueueLengthLocked(connection);
2075
2076    // The connection appears to be unrecoverably broken.
2077    // Ignore already broken or zombie connections.
2078    if (connection->status == Connection::STATUS_NORMAL) {
2079        connection->status = Connection::STATUS_BROKEN;
2080
2081        if (notify) {
2082            // Notify other system components.
2083            onDispatchCycleBrokenLocked(currentTime, connection);
2084        }
2085    }
2086}
2087
2088void InputDispatcher::drainDispatchQueueLocked(Queue<DispatchEntry>* queue) {
2089    while (!queue->isEmpty()) {
2090        DispatchEntry* dispatchEntry = queue->dequeueAtHead();
2091        releaseDispatchEntryLocked(dispatchEntry);
2092    }
2093}
2094
2095void InputDispatcher::releaseDispatchEntryLocked(DispatchEntry* dispatchEntry) {
2096    if (dispatchEntry->hasForegroundTarget()) {
2097        decrementPendingForegroundDispatchesLocked(dispatchEntry->eventEntry);
2098    }
2099    delete dispatchEntry;
2100}
2101
2102int InputDispatcher::handleReceiveCallback(int fd, int events, void* data) {
2103    InputDispatcher* d = static_cast<InputDispatcher*>(data);
2104
2105    { // acquire lock
2106        AutoMutex _l(d->mLock);
2107
2108        ssize_t connectionIndex = d->mConnectionsByFd.indexOfKey(fd);
2109        if (connectionIndex < 0) {
2110            ALOGE("Received spurious receive callback for unknown input channel.  "
2111                    "fd=%d, events=0x%x", fd, events);
2112            return 0; // remove the callback
2113        }
2114
2115        bool notify;
2116        sp<Connection> connection = d->mConnectionsByFd.valueAt(connectionIndex);
2117        if (!(events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP))) {
2118            if (!(events & ALOOPER_EVENT_INPUT)) {
2119                ALOGW("channel '%s' ~ Received spurious callback for unhandled poll event.  "
2120                        "events=0x%x", connection->getInputChannelName(), events);
2121                return 1;
2122            }
2123
2124            nsecs_t currentTime = now();
2125            bool gotOne = false;
2126            status_t status;
2127            for (;;) {
2128                uint32_t seq;
2129                bool handled;
2130                status = connection->inputPublisher.receiveFinishedSignal(&seq, &handled);
2131                if (status) {
2132                    break;
2133                }
2134                d->finishDispatchCycleLocked(currentTime, connection, seq, handled);
2135                gotOne = true;
2136            }
2137            if (gotOne) {
2138                d->runCommandsLockedInterruptible();
2139                if (status == WOULD_BLOCK) {
2140                    return 1;
2141                }
2142            }
2143
2144            notify = status != DEAD_OBJECT || !connection->monitor;
2145            if (notify) {
2146                ALOGE("channel '%s' ~ Failed to receive finished signal.  status=%d",
2147                        connection->getInputChannelName(), status);
2148            }
2149        } else {
2150            // Monitor channels are never explicitly unregistered.
2151            // We do it automatically when the remote endpoint is closed so don't warn
2152            // about them.
2153            notify = !connection->monitor;
2154            if (notify) {
2155                ALOGW("channel '%s' ~ Consumer closed input channel or an error occurred.  "
2156                        "events=0x%x", connection->getInputChannelName(), events);
2157            }
2158        }
2159
2160        // Unregister the channel.
2161        d->unregisterInputChannelLocked(connection->inputChannel, notify);
2162        return 0; // remove the callback
2163    } // release lock
2164}
2165
2166void InputDispatcher::synthesizeCancelationEventsForAllConnectionsLocked(
2167        const CancelationOptions& options) {
2168    for (size_t i = 0; i < mConnectionsByFd.size(); i++) {
2169        synthesizeCancelationEventsForConnectionLocked(
2170                mConnectionsByFd.valueAt(i), options);
2171    }
2172}
2173
2174void InputDispatcher::synthesizeCancelationEventsForInputChannelLocked(
2175        const sp<InputChannel>& channel, const CancelationOptions& options) {
2176    ssize_t index = getConnectionIndexLocked(channel);
2177    if (index >= 0) {
2178        synthesizeCancelationEventsForConnectionLocked(
2179                mConnectionsByFd.valueAt(index), options);
2180    }
2181}
2182
2183void InputDispatcher::synthesizeCancelationEventsForConnectionLocked(
2184        const sp<Connection>& connection, const CancelationOptions& options) {
2185    if (connection->status == Connection::STATUS_BROKEN) {
2186        return;
2187    }
2188
2189    nsecs_t currentTime = now();
2190
2191    Vector<EventEntry*> cancelationEvents;
2192    connection->inputState.synthesizeCancelationEvents(currentTime,
2193            cancelationEvents, options);
2194
2195    if (!cancelationEvents.isEmpty()) {
2196#if DEBUG_OUTBOUND_EVENT_DETAILS
2197        ALOGD("channel '%s' ~ Synthesized %d cancelation events to bring channel back in sync "
2198                "with reality: %s, mode=%d.",
2199                connection->getInputChannelName(), cancelationEvents.size(),
2200                options.reason, options.mode);
2201#endif
2202        for (size_t i = 0; i < cancelationEvents.size(); i++) {
2203            EventEntry* cancelationEventEntry = cancelationEvents.itemAt(i);
2204            switch (cancelationEventEntry->type) {
2205            case EventEntry::TYPE_KEY:
2206                logOutboundKeyDetailsLocked("cancel - ",
2207                        static_cast<KeyEntry*>(cancelationEventEntry));
2208                break;
2209            case EventEntry::TYPE_MOTION:
2210                logOutboundMotionDetailsLocked("cancel - ",
2211                        static_cast<MotionEntry*>(cancelationEventEntry));
2212                break;
2213            }
2214
2215            InputTarget target;
2216            sp<InputWindowHandle> windowHandle = getWindowHandleLocked(connection->inputChannel);
2217            if (windowHandle != NULL) {
2218                const InputWindowInfo* windowInfo = windowHandle->getInfo();
2219                target.xOffset = -windowInfo->frameLeft;
2220                target.yOffset = -windowInfo->frameTop;
2221                target.scaleFactor = windowInfo->scaleFactor;
2222            } else {
2223                target.xOffset = 0;
2224                target.yOffset = 0;
2225                target.scaleFactor = 1.0f;
2226            }
2227            target.inputChannel = connection->inputChannel;
2228            target.flags = InputTarget::FLAG_DISPATCH_AS_IS;
2229
2230            enqueueDispatchEntryLocked(connection, cancelationEventEntry, // increments ref
2231                    &target, InputTarget::FLAG_DISPATCH_AS_IS);
2232
2233            cancelationEventEntry->release();
2234        }
2235
2236        startDispatchCycleLocked(currentTime, connection);
2237    }
2238}
2239
2240InputDispatcher::MotionEntry*
2241InputDispatcher::splitMotionEvent(const MotionEntry* originalMotionEntry, BitSet32 pointerIds) {
2242    ALOG_ASSERT(pointerIds.value != 0);
2243
2244    uint32_t splitPointerIndexMap[MAX_POINTERS];
2245    PointerProperties splitPointerProperties[MAX_POINTERS];
2246    PointerCoords splitPointerCoords[MAX_POINTERS];
2247
2248    uint32_t originalPointerCount = originalMotionEntry->pointerCount;
2249    uint32_t splitPointerCount = 0;
2250
2251    for (uint32_t originalPointerIndex = 0; originalPointerIndex < originalPointerCount;
2252            originalPointerIndex++) {
2253        const PointerProperties& pointerProperties =
2254                originalMotionEntry->pointerProperties[originalPointerIndex];
2255        uint32_t pointerId = uint32_t(pointerProperties.id);
2256        if (pointerIds.hasBit(pointerId)) {
2257            splitPointerIndexMap[splitPointerCount] = originalPointerIndex;
2258            splitPointerProperties[splitPointerCount].copyFrom(pointerProperties);
2259            splitPointerCoords[splitPointerCount].copyFrom(
2260                    originalMotionEntry->pointerCoords[originalPointerIndex]);
2261            splitPointerCount += 1;
2262        }
2263    }
2264
2265    if (splitPointerCount != pointerIds.count()) {
2266        // This is bad.  We are missing some of the pointers that we expected to deliver.
2267        // Most likely this indicates that we received an ACTION_MOVE events that has
2268        // different pointer ids than we expected based on the previous ACTION_DOWN
2269        // or ACTION_POINTER_DOWN events that caused us to decide to split the pointers
2270        // in this way.
2271        ALOGW("Dropping split motion event because the pointer count is %d but "
2272                "we expected there to be %d pointers.  This probably means we received "
2273                "a broken sequence of pointer ids from the input device.",
2274                splitPointerCount, pointerIds.count());
2275        return NULL;
2276    }
2277
2278    int32_t action = originalMotionEntry->action;
2279    int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
2280    if (maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN
2281            || maskedAction == AMOTION_EVENT_ACTION_POINTER_UP) {
2282        int32_t originalPointerIndex = getMotionEventActionPointerIndex(action);
2283        const PointerProperties& pointerProperties =
2284                originalMotionEntry->pointerProperties[originalPointerIndex];
2285        uint32_t pointerId = uint32_t(pointerProperties.id);
2286        if (pointerIds.hasBit(pointerId)) {
2287            if (pointerIds.count() == 1) {
2288                // The first/last pointer went down/up.
2289                action = maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN
2290                        ? AMOTION_EVENT_ACTION_DOWN : AMOTION_EVENT_ACTION_UP;
2291            } else {
2292                // A secondary pointer went down/up.
2293                uint32_t splitPointerIndex = 0;
2294                while (pointerId != uint32_t(splitPointerProperties[splitPointerIndex].id)) {
2295                    splitPointerIndex += 1;
2296                }
2297                action = maskedAction | (splitPointerIndex
2298                        << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT);
2299            }
2300        } else {
2301            // An unrelated pointer changed.
2302            action = AMOTION_EVENT_ACTION_MOVE;
2303        }
2304    }
2305
2306    MotionEntry* splitMotionEntry = new MotionEntry(
2307            originalMotionEntry->eventTime,
2308            originalMotionEntry->deviceId,
2309            originalMotionEntry->source,
2310            originalMotionEntry->policyFlags,
2311            action,
2312            originalMotionEntry->flags,
2313            originalMotionEntry->metaState,
2314            originalMotionEntry->buttonState,
2315            originalMotionEntry->edgeFlags,
2316            originalMotionEntry->xPrecision,
2317            originalMotionEntry->yPrecision,
2318            originalMotionEntry->downTime,
2319            originalMotionEntry->displayId,
2320            splitPointerCount, splitPointerProperties, splitPointerCoords);
2321
2322    if (originalMotionEntry->injectionState) {
2323        splitMotionEntry->injectionState = originalMotionEntry->injectionState;
2324        splitMotionEntry->injectionState->refCount += 1;
2325    }
2326
2327    return splitMotionEntry;
2328}
2329
2330void InputDispatcher::notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
2331#if DEBUG_INBOUND_EVENT_DETAILS
2332    ALOGD("notifyConfigurationChanged - eventTime=%lld", args->eventTime);
2333#endif
2334
2335    bool needWake;
2336    { // acquire lock
2337        AutoMutex _l(mLock);
2338
2339        ConfigurationChangedEntry* newEntry = new ConfigurationChangedEntry(args->eventTime);
2340        needWake = enqueueInboundEventLocked(newEntry);
2341    } // release lock
2342
2343    if (needWake) {
2344        mLooper->wake();
2345    }
2346}
2347
2348void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {
2349#if DEBUG_INBOUND_EVENT_DETAILS
2350    ALOGD("notifyKey - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, action=0x%x, "
2351            "flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, downTime=%lld",
2352            args->eventTime, args->deviceId, args->source, args->policyFlags,
2353            args->action, args->flags, args->keyCode, args->scanCode,
2354            args->metaState, args->downTime);
2355#endif
2356    if (!validateKeyEvent(args->action)) {
2357        return;
2358    }
2359
2360    uint32_t policyFlags = args->policyFlags;
2361    int32_t flags = args->flags;
2362    int32_t metaState = args->metaState;
2363    if ((policyFlags & POLICY_FLAG_VIRTUAL) || (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY)) {
2364        policyFlags |= POLICY_FLAG_VIRTUAL;
2365        flags |= AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY;
2366    }
2367    if (policyFlags & POLICY_FLAG_ALT) {
2368        metaState |= AMETA_ALT_ON | AMETA_ALT_LEFT_ON;
2369    }
2370    if (policyFlags & POLICY_FLAG_ALT_GR) {
2371        metaState |= AMETA_ALT_ON | AMETA_ALT_RIGHT_ON;
2372    }
2373    if (policyFlags & POLICY_FLAG_SHIFT) {
2374        metaState |= AMETA_SHIFT_ON | AMETA_SHIFT_LEFT_ON;
2375    }
2376    if (policyFlags & POLICY_FLAG_CAPS_LOCK) {
2377        metaState |= AMETA_CAPS_LOCK_ON;
2378    }
2379    if (policyFlags & POLICY_FLAG_FUNCTION) {
2380        metaState |= AMETA_FUNCTION_ON;
2381    }
2382
2383    policyFlags |= POLICY_FLAG_TRUSTED;
2384
2385    KeyEvent event;
2386    event.initialize(args->deviceId, args->source, args->action,
2387            flags, args->keyCode, args->scanCode, metaState, 0,
2388            args->downTime, args->eventTime);
2389
2390    mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
2391
2392    if (policyFlags & POLICY_FLAG_WOKE_HERE) {
2393        flags |= AKEY_EVENT_FLAG_WOKE_HERE;
2394    }
2395
2396    bool needWake;
2397    { // acquire lock
2398        mLock.lock();
2399
2400        if (shouldSendKeyToInputFilterLocked(args)) {
2401            mLock.unlock();
2402
2403            policyFlags |= POLICY_FLAG_FILTERED;
2404            if (!mPolicy->filterInputEvent(&event, policyFlags)) {
2405                return; // event was consumed by the filter
2406            }
2407
2408            mLock.lock();
2409        }
2410
2411        int32_t repeatCount = 0;
2412        KeyEntry* newEntry = new KeyEntry(args->eventTime,
2413                args->deviceId, args->source, policyFlags,
2414                args->action, flags, args->keyCode, args->scanCode,
2415                metaState, repeatCount, args->downTime);
2416
2417        needWake = enqueueInboundEventLocked(newEntry);
2418        mLock.unlock();
2419    } // release lock
2420
2421    if (needWake) {
2422        mLooper->wake();
2423    }
2424}
2425
2426bool InputDispatcher::shouldSendKeyToInputFilterLocked(const NotifyKeyArgs* args) {
2427    return mInputFilterEnabled;
2428}
2429
2430void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
2431#if DEBUG_INBOUND_EVENT_DETAILS
2432    ALOGD("notifyMotion - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
2433            "action=0x%x, flags=0x%x, metaState=0x%x, buttonState=0x%x, edgeFlags=0x%x, "
2434            "xPrecision=%f, yPrecision=%f, downTime=%lld",
2435            args->eventTime, args->deviceId, args->source, args->policyFlags,
2436            args->action, args->flags, args->metaState, args->buttonState,
2437            args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime);
2438    for (uint32_t i = 0; i < args->pointerCount; i++) {
2439        ALOGD("  Pointer %d: id=%d, toolType=%d, "
2440                "x=%f, y=%f, pressure=%f, size=%f, "
2441                "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
2442                "orientation=%f",
2443                i, args->pointerProperties[i].id,
2444                args->pointerProperties[i].toolType,
2445                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X),
2446                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y),
2447                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE),
2448                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE),
2449                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR),
2450                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR),
2451                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR),
2452                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR),
2453                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
2454    }
2455#endif
2456    if (!validateMotionEvent(args->action, args->pointerCount, args->pointerProperties)) {
2457        return;
2458    }
2459
2460    uint32_t policyFlags = args->policyFlags;
2461    policyFlags |= POLICY_FLAG_TRUSTED;
2462    mPolicy->interceptMotionBeforeQueueing(args->eventTime, /*byref*/ policyFlags);
2463
2464    bool needWake;
2465    { // acquire lock
2466        mLock.lock();
2467
2468        if (shouldSendMotionToInputFilterLocked(args)) {
2469            mLock.unlock();
2470
2471            MotionEvent event;
2472            event.initialize(args->deviceId, args->source, args->action, args->flags,
2473                    args->edgeFlags, args->metaState, args->buttonState, 0, 0,
2474                    args->xPrecision, args->yPrecision,
2475                    args->downTime, args->eventTime,
2476                    args->pointerCount, args->pointerProperties, args->pointerCoords);
2477
2478            policyFlags |= POLICY_FLAG_FILTERED;
2479            if (!mPolicy->filterInputEvent(&event, policyFlags)) {
2480                return; // event was consumed by the filter
2481            }
2482
2483            mLock.lock();
2484        }
2485
2486        // Just enqueue a new motion event.
2487        MotionEntry* newEntry = new MotionEntry(args->eventTime,
2488                args->deviceId, args->source, policyFlags,
2489                args->action, args->flags, args->metaState, args->buttonState,
2490                args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime,
2491                args->displayId,
2492                args->pointerCount, args->pointerProperties, args->pointerCoords);
2493
2494        needWake = enqueueInboundEventLocked(newEntry);
2495        mLock.unlock();
2496    } // release lock
2497
2498    if (needWake) {
2499        mLooper->wake();
2500    }
2501}
2502
2503bool InputDispatcher::shouldSendMotionToInputFilterLocked(const NotifyMotionArgs* args) {
2504    // TODO: support sending secondary display events to input filter
2505    return mInputFilterEnabled && isMainDisplay(args->displayId);
2506}
2507
2508void InputDispatcher::notifySwitch(const NotifySwitchArgs* args) {
2509#if DEBUG_INBOUND_EVENT_DETAILS
2510    ALOGD("notifySwitch - eventTime=%lld, policyFlags=0x%x, switchValues=0x%08x, switchMask=0x%08x",
2511            args->eventTime, args->policyFlags,
2512            args->switchValues, args->switchMask);
2513#endif
2514
2515    uint32_t policyFlags = args->policyFlags;
2516    policyFlags |= POLICY_FLAG_TRUSTED;
2517    mPolicy->notifySwitch(args->eventTime,
2518            args->switchValues, args->switchMask, policyFlags);
2519}
2520
2521void InputDispatcher::notifyDeviceReset(const NotifyDeviceResetArgs* args) {
2522#if DEBUG_INBOUND_EVENT_DETAILS
2523    ALOGD("notifyDeviceReset - eventTime=%lld, deviceId=%d",
2524            args->eventTime, args->deviceId);
2525#endif
2526
2527    bool needWake;
2528    { // acquire lock
2529        AutoMutex _l(mLock);
2530
2531        DeviceResetEntry* newEntry = new DeviceResetEntry(args->eventTime, args->deviceId);
2532        needWake = enqueueInboundEventLocked(newEntry);
2533    } // release lock
2534
2535    if (needWake) {
2536        mLooper->wake();
2537    }
2538}
2539
2540int32_t InputDispatcher::injectInputEvent(const InputEvent* event,
2541        int32_t injectorPid, int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis,
2542        uint32_t policyFlags) {
2543#if DEBUG_INBOUND_EVENT_DETAILS
2544    ALOGD("injectInputEvent - eventType=%d, injectorPid=%d, injectorUid=%d, "
2545            "syncMode=%d, timeoutMillis=%d, policyFlags=0x%08x",
2546            event->getType(), injectorPid, injectorUid, syncMode, timeoutMillis, policyFlags);
2547#endif
2548
2549    nsecs_t endTime = now() + milliseconds_to_nanoseconds(timeoutMillis);
2550
2551    policyFlags |= POLICY_FLAG_INJECTED;
2552    if (hasInjectionPermission(injectorPid, injectorUid)) {
2553        policyFlags |= POLICY_FLAG_TRUSTED;
2554    }
2555
2556    EventEntry* firstInjectedEntry;
2557    EventEntry* lastInjectedEntry;
2558    switch (event->getType()) {
2559    case AINPUT_EVENT_TYPE_KEY: {
2560        const KeyEvent* keyEvent = static_cast<const KeyEvent*>(event);
2561        int32_t action = keyEvent->getAction();
2562        if (! validateKeyEvent(action)) {
2563            return INPUT_EVENT_INJECTION_FAILED;
2564        }
2565
2566        int32_t flags = keyEvent->getFlags();
2567        if (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY) {
2568            policyFlags |= POLICY_FLAG_VIRTUAL;
2569        }
2570
2571        if (!(policyFlags & POLICY_FLAG_FILTERED)) {
2572            mPolicy->interceptKeyBeforeQueueing(keyEvent, /*byref*/ policyFlags);
2573        }
2574
2575        if (policyFlags & POLICY_FLAG_WOKE_HERE) {
2576            flags |= AKEY_EVENT_FLAG_WOKE_HERE;
2577        }
2578
2579        mLock.lock();
2580        firstInjectedEntry = new KeyEntry(keyEvent->getEventTime(),
2581                keyEvent->getDeviceId(), keyEvent->getSource(),
2582                policyFlags, action, flags,
2583                keyEvent->getKeyCode(), keyEvent->getScanCode(), keyEvent->getMetaState(),
2584                keyEvent->getRepeatCount(), keyEvent->getDownTime());
2585        lastInjectedEntry = firstInjectedEntry;
2586        break;
2587    }
2588
2589    case AINPUT_EVENT_TYPE_MOTION: {
2590        const MotionEvent* motionEvent = static_cast<const MotionEvent*>(event);
2591        int32_t displayId = ADISPLAY_ID_DEFAULT;
2592        int32_t action = motionEvent->getAction();
2593        size_t pointerCount = motionEvent->getPointerCount();
2594        const PointerProperties* pointerProperties = motionEvent->getPointerProperties();
2595        if (! validateMotionEvent(action, pointerCount, pointerProperties)) {
2596            return INPUT_EVENT_INJECTION_FAILED;
2597        }
2598
2599        if (!(policyFlags & POLICY_FLAG_FILTERED)) {
2600            nsecs_t eventTime = motionEvent->getEventTime();
2601            mPolicy->interceptMotionBeforeQueueing(eventTime, /*byref*/ policyFlags);
2602        }
2603
2604        mLock.lock();
2605        const nsecs_t* sampleEventTimes = motionEvent->getSampleEventTimes();
2606        const PointerCoords* samplePointerCoords = motionEvent->getSamplePointerCoords();
2607        firstInjectedEntry = new MotionEntry(*sampleEventTimes,
2608                motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
2609                action, motionEvent->getFlags(),
2610                motionEvent->getMetaState(), motionEvent->getButtonState(),
2611                motionEvent->getEdgeFlags(),
2612                motionEvent->getXPrecision(), motionEvent->getYPrecision(),
2613                motionEvent->getDownTime(), displayId,
2614                uint32_t(pointerCount), pointerProperties, samplePointerCoords);
2615        lastInjectedEntry = firstInjectedEntry;
2616        for (size_t i = motionEvent->getHistorySize(); i > 0; i--) {
2617            sampleEventTimes += 1;
2618            samplePointerCoords += pointerCount;
2619            MotionEntry* nextInjectedEntry = new MotionEntry(*sampleEventTimes,
2620                    motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
2621                    action, motionEvent->getFlags(),
2622                    motionEvent->getMetaState(), motionEvent->getButtonState(),
2623                    motionEvent->getEdgeFlags(),
2624                    motionEvent->getXPrecision(), motionEvent->getYPrecision(),
2625                    motionEvent->getDownTime(), displayId,
2626                    uint32_t(pointerCount), pointerProperties, samplePointerCoords);
2627            lastInjectedEntry->next = nextInjectedEntry;
2628            lastInjectedEntry = nextInjectedEntry;
2629        }
2630        break;
2631    }
2632
2633    default:
2634        ALOGW("Cannot inject event of type %d", event->getType());
2635        return INPUT_EVENT_INJECTION_FAILED;
2636    }
2637
2638    InjectionState* injectionState = new InjectionState(injectorPid, injectorUid);
2639    if (syncMode == INPUT_EVENT_INJECTION_SYNC_NONE) {
2640        injectionState->injectionIsAsync = true;
2641    }
2642
2643    injectionState->refCount += 1;
2644    lastInjectedEntry->injectionState = injectionState;
2645
2646    bool needWake = false;
2647    for (EventEntry* entry = firstInjectedEntry; entry != NULL; ) {
2648        EventEntry* nextEntry = entry->next;
2649        needWake |= enqueueInboundEventLocked(entry);
2650        entry = nextEntry;
2651    }
2652
2653    mLock.unlock();
2654
2655    if (needWake) {
2656        mLooper->wake();
2657    }
2658
2659    int32_t injectionResult;
2660    { // acquire lock
2661        AutoMutex _l(mLock);
2662
2663        if (syncMode == INPUT_EVENT_INJECTION_SYNC_NONE) {
2664            injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
2665        } else {
2666            for (;;) {
2667                injectionResult = injectionState->injectionResult;
2668                if (injectionResult != INPUT_EVENT_INJECTION_PENDING) {
2669                    break;
2670                }
2671
2672                nsecs_t remainingTimeout = endTime - now();
2673                if (remainingTimeout <= 0) {
2674#if DEBUG_INJECTION
2675                    ALOGD("injectInputEvent - Timed out waiting for injection result "
2676                            "to become available.");
2677#endif
2678                    injectionResult = INPUT_EVENT_INJECTION_TIMED_OUT;
2679                    break;
2680                }
2681
2682                mInjectionResultAvailableCondition.waitRelative(mLock, remainingTimeout);
2683            }
2684
2685            if (injectionResult == INPUT_EVENT_INJECTION_SUCCEEDED
2686                    && syncMode == INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISHED) {
2687                while (injectionState->pendingForegroundDispatches != 0) {
2688#if DEBUG_INJECTION
2689                    ALOGD("injectInputEvent - Waiting for %d pending foreground dispatches.",
2690                            injectionState->pendingForegroundDispatches);
2691#endif
2692                    nsecs_t remainingTimeout = endTime - now();
2693                    if (remainingTimeout <= 0) {
2694#if DEBUG_INJECTION
2695                    ALOGD("injectInputEvent - Timed out waiting for pending foreground "
2696                            "dispatches to finish.");
2697#endif
2698                        injectionResult = INPUT_EVENT_INJECTION_TIMED_OUT;
2699                        break;
2700                    }
2701
2702                    mInjectionSyncFinishedCondition.waitRelative(mLock, remainingTimeout);
2703                }
2704            }
2705        }
2706
2707        injectionState->release();
2708    } // release lock
2709
2710#if DEBUG_INJECTION
2711    ALOGD("injectInputEvent - Finished with result %d.  "
2712            "injectorPid=%d, injectorUid=%d",
2713            injectionResult, injectorPid, injectorUid);
2714#endif
2715
2716    return injectionResult;
2717}
2718
2719bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
2720    return injectorUid == 0
2721            || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
2722}
2723
2724void InputDispatcher::setInjectionResultLocked(EventEntry* entry, int32_t injectionResult) {
2725    InjectionState* injectionState = entry->injectionState;
2726    if (injectionState) {
2727#if DEBUG_INJECTION
2728        ALOGD("Setting input event injection result to %d.  "
2729                "injectorPid=%d, injectorUid=%d",
2730                 injectionResult, injectionState->injectorPid, injectionState->injectorUid);
2731#endif
2732
2733        if (injectionState->injectionIsAsync
2734                && !(entry->policyFlags & POLICY_FLAG_FILTERED)) {
2735            // Log the outcome since the injector did not wait for the injection result.
2736            switch (injectionResult) {
2737            case INPUT_EVENT_INJECTION_SUCCEEDED:
2738                ALOGV("Asynchronous input event injection succeeded.");
2739                break;
2740            case INPUT_EVENT_INJECTION_FAILED:
2741                ALOGW("Asynchronous input event injection failed.");
2742                break;
2743            case INPUT_EVENT_INJECTION_PERMISSION_DENIED:
2744                ALOGW("Asynchronous input event injection permission denied.");
2745                break;
2746            case INPUT_EVENT_INJECTION_TIMED_OUT:
2747                ALOGW("Asynchronous input event injection timed out.");
2748                break;
2749            }
2750        }
2751
2752        injectionState->injectionResult = injectionResult;
2753        mInjectionResultAvailableCondition.broadcast();
2754    }
2755}
2756
2757void InputDispatcher::incrementPendingForegroundDispatchesLocked(EventEntry* entry) {
2758    InjectionState* injectionState = entry->injectionState;
2759    if (injectionState) {
2760        injectionState->pendingForegroundDispatches += 1;
2761    }
2762}
2763
2764void InputDispatcher::decrementPendingForegroundDispatchesLocked(EventEntry* entry) {
2765    InjectionState* injectionState = entry->injectionState;
2766    if (injectionState) {
2767        injectionState->pendingForegroundDispatches -= 1;
2768
2769        if (injectionState->pendingForegroundDispatches == 0) {
2770            mInjectionSyncFinishedCondition.broadcast();
2771        }
2772    }
2773}
2774
2775sp<InputWindowHandle> InputDispatcher::getWindowHandleLocked(
2776        const sp<InputChannel>& inputChannel) const {
2777    size_t numWindows = mWindowHandles.size();
2778    for (size_t i = 0; i < numWindows; i++) {
2779        const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
2780        if (windowHandle->getInputChannel() == inputChannel) {
2781            return windowHandle;
2782        }
2783    }
2784    return NULL;
2785}
2786
2787bool InputDispatcher::hasWindowHandleLocked(
2788        const sp<InputWindowHandle>& windowHandle) const {
2789    size_t numWindows = mWindowHandles.size();
2790    for (size_t i = 0; i < numWindows; i++) {
2791        if (mWindowHandles.itemAt(i) == windowHandle) {
2792            return true;
2793        }
2794    }
2795    return false;
2796}
2797
2798void InputDispatcher::setInputWindows(const Vector<sp<InputWindowHandle> >& inputWindowHandles) {
2799#if DEBUG_FOCUS
2800    ALOGD("setInputWindows");
2801#endif
2802    { // acquire lock
2803        AutoMutex _l(mLock);
2804
2805        Vector<sp<InputWindowHandle> > oldWindowHandles = mWindowHandles;
2806        mWindowHandles = inputWindowHandles;
2807
2808        sp<InputWindowHandle> newFocusedWindowHandle;
2809        bool foundHoveredWindow = false;
2810        for (size_t i = 0; i < mWindowHandles.size(); i++) {
2811            const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
2812            if (!windowHandle->updateInfo() || windowHandle->getInputChannel() == NULL) {
2813                mWindowHandles.removeAt(i--);
2814                continue;
2815            }
2816            if (windowHandle->getInfo()->hasFocus) {
2817                newFocusedWindowHandle = windowHandle;
2818            }
2819            if (windowHandle == mLastHoverWindowHandle) {
2820                foundHoveredWindow = true;
2821            }
2822        }
2823
2824        if (!foundHoveredWindow) {
2825            mLastHoverWindowHandle = NULL;
2826        }
2827
2828        if (mFocusedWindowHandle != newFocusedWindowHandle) {
2829            if (mFocusedWindowHandle != NULL) {
2830#if DEBUG_FOCUS
2831                ALOGD("Focus left window: %s",
2832                        mFocusedWindowHandle->getName().string());
2833#endif
2834                sp<InputChannel> focusedInputChannel = mFocusedWindowHandle->getInputChannel();
2835                if (focusedInputChannel != NULL) {
2836                    CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS,
2837                            "focus left window");
2838                    synthesizeCancelationEventsForInputChannelLocked(
2839                            focusedInputChannel, options);
2840                }
2841            }
2842            if (newFocusedWindowHandle != NULL) {
2843#if DEBUG_FOCUS
2844                ALOGD("Focus entered window: %s",
2845                        newFocusedWindowHandle->getName().string());
2846#endif
2847            }
2848            mFocusedWindowHandle = newFocusedWindowHandle;
2849        }
2850
2851        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
2852            TouchedWindow& touchedWindow = mTouchState.windows.editItemAt(i);
2853            if (!hasWindowHandleLocked(touchedWindow.windowHandle)) {
2854#if DEBUG_FOCUS
2855                ALOGD("Touched window was removed: %s",
2856                        touchedWindow.windowHandle->getName().string());
2857#endif
2858                sp<InputChannel> touchedInputChannel =
2859                        touchedWindow.windowHandle->getInputChannel();
2860                if (touchedInputChannel != NULL) {
2861                    CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
2862                            "touched window was removed");
2863                    synthesizeCancelationEventsForInputChannelLocked(
2864                            touchedInputChannel, options);
2865                }
2866                mTouchState.windows.removeAt(i--);
2867            }
2868        }
2869
2870        // Release information for windows that are no longer present.
2871        // This ensures that unused input channels are released promptly.
2872        // Otherwise, they might stick around until the window handle is destroyed
2873        // which might not happen until the next GC.
2874        for (size_t i = 0; i < oldWindowHandles.size(); i++) {
2875            const sp<InputWindowHandle>& oldWindowHandle = oldWindowHandles.itemAt(i);
2876            if (!hasWindowHandleLocked(oldWindowHandle)) {
2877#if DEBUG_FOCUS
2878                ALOGD("Window went away: %s", oldWindowHandle->getName().string());
2879#endif
2880                oldWindowHandle->releaseInfo();
2881            }
2882        }
2883    } // release lock
2884
2885    // Wake up poll loop since it may need to make new input dispatching choices.
2886    mLooper->wake();
2887}
2888
2889void InputDispatcher::setFocusedApplication(
2890        const sp<InputApplicationHandle>& inputApplicationHandle) {
2891#if DEBUG_FOCUS
2892    ALOGD("setFocusedApplication");
2893#endif
2894    { // acquire lock
2895        AutoMutex _l(mLock);
2896
2897        if (inputApplicationHandle != NULL && inputApplicationHandle->updateInfo()) {
2898            if (mFocusedApplicationHandle != inputApplicationHandle) {
2899                if (mFocusedApplicationHandle != NULL) {
2900                    resetANRTimeoutsLocked();
2901                    mFocusedApplicationHandle->releaseInfo();
2902                }
2903                mFocusedApplicationHandle = inputApplicationHandle;
2904            }
2905        } else if (mFocusedApplicationHandle != NULL) {
2906            resetANRTimeoutsLocked();
2907            mFocusedApplicationHandle->releaseInfo();
2908            mFocusedApplicationHandle.clear();
2909        }
2910
2911#if DEBUG_FOCUS
2912        //logDispatchStateLocked();
2913#endif
2914    } // release lock
2915
2916    // Wake up poll loop since it may need to make new input dispatching choices.
2917    mLooper->wake();
2918}
2919
2920void InputDispatcher::setInputDispatchMode(bool enabled, bool frozen) {
2921#if DEBUG_FOCUS
2922    ALOGD("setInputDispatchMode: enabled=%d, frozen=%d", enabled, frozen);
2923#endif
2924
2925    bool changed;
2926    { // acquire lock
2927        AutoMutex _l(mLock);
2928
2929        if (mDispatchEnabled != enabled || mDispatchFrozen != frozen) {
2930            if (mDispatchFrozen && !frozen) {
2931                resetANRTimeoutsLocked();
2932            }
2933
2934            if (mDispatchEnabled && !enabled) {
2935                resetAndDropEverythingLocked("dispatcher is being disabled");
2936            }
2937
2938            mDispatchEnabled = enabled;
2939            mDispatchFrozen = frozen;
2940            changed = true;
2941        } else {
2942            changed = false;
2943        }
2944
2945#if DEBUG_FOCUS
2946        //logDispatchStateLocked();
2947#endif
2948    } // release lock
2949
2950    if (changed) {
2951        // Wake up poll loop since it may need to make new input dispatching choices.
2952        mLooper->wake();
2953    }
2954}
2955
2956void InputDispatcher::setInputFilterEnabled(bool enabled) {
2957#if DEBUG_FOCUS
2958    ALOGD("setInputFilterEnabled: enabled=%d", enabled);
2959#endif
2960
2961    { // acquire lock
2962        AutoMutex _l(mLock);
2963
2964        if (mInputFilterEnabled == enabled) {
2965            return;
2966        }
2967
2968        mInputFilterEnabled = enabled;
2969        resetAndDropEverythingLocked("input filter is being enabled or disabled");
2970    } // release lock
2971
2972    // Wake up poll loop since there might be work to do to drop everything.
2973    mLooper->wake();
2974}
2975
2976bool InputDispatcher::transferTouchFocus(const sp<InputChannel>& fromChannel,
2977        const sp<InputChannel>& toChannel) {
2978#if DEBUG_FOCUS
2979    ALOGD("transferTouchFocus: fromChannel=%s, toChannel=%s",
2980            fromChannel->getName().string(), toChannel->getName().string());
2981#endif
2982    { // acquire lock
2983        AutoMutex _l(mLock);
2984
2985        sp<InputWindowHandle> fromWindowHandle = getWindowHandleLocked(fromChannel);
2986        sp<InputWindowHandle> toWindowHandle = getWindowHandleLocked(toChannel);
2987        if (fromWindowHandle == NULL || toWindowHandle == NULL) {
2988#if DEBUG_FOCUS
2989            ALOGD("Cannot transfer focus because from or to window not found.");
2990#endif
2991            return false;
2992        }
2993        if (fromWindowHandle == toWindowHandle) {
2994#if DEBUG_FOCUS
2995            ALOGD("Trivial transfer to same window.");
2996#endif
2997            return true;
2998        }
2999        if (fromWindowHandle->getInfo()->displayId != toWindowHandle->getInfo()->displayId) {
3000#if DEBUG_FOCUS
3001            ALOGD("Cannot transfer focus because windows are on different displays.");
3002#endif
3003            return false;
3004        }
3005
3006        bool found = false;
3007        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
3008            const TouchedWindow& touchedWindow = mTouchState.windows[i];
3009            if (touchedWindow.windowHandle == fromWindowHandle) {
3010                int32_t oldTargetFlags = touchedWindow.targetFlags;
3011                BitSet32 pointerIds = touchedWindow.pointerIds;
3012
3013                mTouchState.windows.removeAt(i);
3014
3015                int32_t newTargetFlags = oldTargetFlags
3016                        & (InputTarget::FLAG_FOREGROUND
3017                                | InputTarget::FLAG_SPLIT | InputTarget::FLAG_DISPATCH_AS_IS);
3018                mTouchState.addOrUpdateWindow(toWindowHandle, newTargetFlags, pointerIds);
3019
3020                found = true;
3021                break;
3022            }
3023        }
3024
3025        if (! found) {
3026#if DEBUG_FOCUS
3027            ALOGD("Focus transfer failed because from window did not have focus.");
3028#endif
3029            return false;
3030        }
3031
3032        ssize_t fromConnectionIndex = getConnectionIndexLocked(fromChannel);
3033        ssize_t toConnectionIndex = getConnectionIndexLocked(toChannel);
3034        if (fromConnectionIndex >= 0 && toConnectionIndex >= 0) {
3035            sp<Connection> fromConnection = mConnectionsByFd.valueAt(fromConnectionIndex);
3036            sp<Connection> toConnection = mConnectionsByFd.valueAt(toConnectionIndex);
3037
3038            fromConnection->inputState.copyPointerStateTo(toConnection->inputState);
3039            CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
3040                    "transferring touch focus from this window to another window");
3041            synthesizeCancelationEventsForConnectionLocked(fromConnection, options);
3042        }
3043
3044#if DEBUG_FOCUS
3045        logDispatchStateLocked();
3046#endif
3047    } // release lock
3048
3049    // Wake up poll loop since it may need to make new input dispatching choices.
3050    mLooper->wake();
3051    return true;
3052}
3053
3054void InputDispatcher::resetAndDropEverythingLocked(const char* reason) {
3055#if DEBUG_FOCUS
3056    ALOGD("Resetting and dropping all events (%s).", reason);
3057#endif
3058
3059    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS, reason);
3060    synthesizeCancelationEventsForAllConnectionsLocked(options);
3061
3062    resetKeyRepeatLocked();
3063    releasePendingEventLocked();
3064    drainInboundQueueLocked();
3065    resetANRTimeoutsLocked();
3066
3067    mTouchState.reset();
3068    mLastHoverWindowHandle.clear();
3069}
3070
3071void InputDispatcher::logDispatchStateLocked() {
3072    String8 dump;
3073    dumpDispatchStateLocked(dump);
3074
3075    char* text = dump.lockBuffer(dump.size());
3076    char* start = text;
3077    while (*start != '\0') {
3078        char* end = strchr(start, '\n');
3079        if (*end == '\n') {
3080            *(end++) = '\0';
3081        }
3082        ALOGD("%s", start);
3083        start = end;
3084    }
3085}
3086
3087void InputDispatcher::dumpDispatchStateLocked(String8& dump) {
3088    dump.appendFormat(INDENT "DispatchEnabled: %d\n", mDispatchEnabled);
3089    dump.appendFormat(INDENT "DispatchFrozen: %d\n", mDispatchFrozen);
3090
3091    if (mFocusedApplicationHandle != NULL) {
3092        dump.appendFormat(INDENT "FocusedApplication: name='%s', dispatchingTimeout=%0.3fms\n",
3093                mFocusedApplicationHandle->getName().string(),
3094                mFocusedApplicationHandle->getDispatchingTimeout(
3095                        DEFAULT_INPUT_DISPATCHING_TIMEOUT) / 1000000.0);
3096    } else {
3097        dump.append(INDENT "FocusedApplication: <null>\n");
3098    }
3099    dump.appendFormat(INDENT "FocusedWindow: name='%s'\n",
3100            mFocusedWindowHandle != NULL ? mFocusedWindowHandle->getName().string() : "<null>");
3101
3102    dump.appendFormat(INDENT "TouchDown: %s\n", toString(mTouchState.down));
3103    dump.appendFormat(INDENT "TouchSplit: %s\n", toString(mTouchState.split));
3104    dump.appendFormat(INDENT "TouchDeviceId: %d\n", mTouchState.deviceId);
3105    dump.appendFormat(INDENT "TouchSource: 0x%08x\n", mTouchState.source);
3106    dump.appendFormat(INDENT "TouchDisplayId: %d\n", mTouchState.displayId);
3107    if (!mTouchState.windows.isEmpty()) {
3108        dump.append(INDENT "TouchedWindows:\n");
3109        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
3110            const TouchedWindow& touchedWindow = mTouchState.windows[i];
3111            dump.appendFormat(INDENT2 "%d: name='%s', pointerIds=0x%0x, targetFlags=0x%x\n",
3112                    i, touchedWindow.windowHandle->getName().string(),
3113                    touchedWindow.pointerIds.value,
3114                    touchedWindow.targetFlags);
3115        }
3116    } else {
3117        dump.append(INDENT "TouchedWindows: <none>\n");
3118    }
3119
3120    if (!mWindowHandles.isEmpty()) {
3121        dump.append(INDENT "Windows:\n");
3122        for (size_t i = 0; i < mWindowHandles.size(); i++) {
3123            const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
3124            const InputWindowInfo* windowInfo = windowHandle->getInfo();
3125
3126            dump.appendFormat(INDENT2 "%d: name='%s', displayId=%d, "
3127                    "paused=%s, hasFocus=%s, hasWallpaper=%s, "
3128                    "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, "
3129                    "frame=[%d,%d][%d,%d], scale=%f, "
3130                    "touchableRegion=",
3131                    i, windowInfo->name.string(), windowInfo->displayId,
3132                    toString(windowInfo->paused),
3133                    toString(windowInfo->hasFocus),
3134                    toString(windowInfo->hasWallpaper),
3135                    toString(windowInfo->visible),
3136                    toString(windowInfo->canReceiveKeys),
3137                    windowInfo->layoutParamsFlags, windowInfo->layoutParamsType,
3138                    windowInfo->layer,
3139                    windowInfo->frameLeft, windowInfo->frameTop,
3140                    windowInfo->frameRight, windowInfo->frameBottom,
3141                    windowInfo->scaleFactor);
3142            dumpRegion(dump, windowInfo->touchableRegion);
3143            dump.appendFormat(", inputFeatures=0x%08x", windowInfo->inputFeatures);
3144            dump.appendFormat(", ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n",
3145                    windowInfo->ownerPid, windowInfo->ownerUid,
3146                    windowInfo->dispatchingTimeout / 1000000.0);
3147        }
3148    } else {
3149        dump.append(INDENT "Windows: <none>\n");
3150    }
3151
3152    if (!mMonitoringChannels.isEmpty()) {
3153        dump.append(INDENT "MonitoringChannels:\n");
3154        for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
3155            const sp<InputChannel>& channel = mMonitoringChannels[i];
3156            dump.appendFormat(INDENT2 "%d: '%s'\n", i, channel->getName().string());
3157        }
3158    } else {
3159        dump.append(INDENT "MonitoringChannels: <none>\n");
3160    }
3161
3162    nsecs_t currentTime = now();
3163
3164    if (!mInboundQueue.isEmpty()) {
3165        dump.appendFormat(INDENT "InboundQueue: length=%u\n", mInboundQueue.count());
3166        for (EventEntry* entry = mInboundQueue.head; entry; entry = entry->next) {
3167            dump.append(INDENT2);
3168            entry->appendDescription(dump);
3169            dump.appendFormat(", age=%0.1fms\n",
3170                    (currentTime - entry->eventTime) * 0.000001f);
3171        }
3172    } else {
3173        dump.append(INDENT "InboundQueue: <empty>\n");
3174    }
3175
3176    if (!mConnectionsByFd.isEmpty()) {
3177        dump.append(INDENT "Connections:\n");
3178        for (size_t i = 0; i < mConnectionsByFd.size(); i++) {
3179            const sp<Connection>& connection = mConnectionsByFd.valueAt(i);
3180            dump.appendFormat(INDENT2 "%d: channelName='%s', windowName='%s', "
3181                    "status=%s, monitor=%s, inputPublisherBlocked=%s\n",
3182                    i, connection->getInputChannelName(), connection->getWindowName(),
3183                    connection->getStatusLabel(), toString(connection->monitor),
3184                    toString(connection->inputPublisherBlocked));
3185
3186            if (!connection->outboundQueue.isEmpty()) {
3187                dump.appendFormat(INDENT3 "OutboundQueue: length=%u\n",
3188                        connection->outboundQueue.count());
3189                for (DispatchEntry* entry = connection->outboundQueue.head; entry;
3190                        entry = entry->next) {
3191                    dump.append(INDENT4);
3192                    entry->eventEntry->appendDescription(dump);
3193                    dump.appendFormat(", targetFlags=0x%08x, resolvedAction=%d, age=%0.1fms\n",
3194                            entry->targetFlags, entry->resolvedAction,
3195                            (currentTime - entry->eventEntry->eventTime) * 0.000001f);
3196                }
3197            } else {
3198                dump.append(INDENT3 "OutboundQueue: <empty>\n");
3199            }
3200
3201            if (!connection->waitQueue.isEmpty()) {
3202                dump.appendFormat(INDENT3 "WaitQueue: length=%u\n",
3203                        connection->waitQueue.count());
3204                for (DispatchEntry* entry = connection->waitQueue.head; entry;
3205                        entry = entry->next) {
3206                    dump.append(INDENT4);
3207                    entry->eventEntry->appendDescription(dump);
3208                    dump.appendFormat(", targetFlags=0x%08x, resolvedAction=%d, "
3209                            "age=%0.1fms, wait=%0.1fms\n",
3210                            entry->targetFlags, entry->resolvedAction,
3211                            (currentTime - entry->eventEntry->eventTime) * 0.000001f,
3212                            (currentTime - entry->deliveryTime) * 0.000001f);
3213                }
3214            } else {
3215                dump.append(INDENT3 "WaitQueue: <empty>\n");
3216            }
3217        }
3218    } else {
3219        dump.append(INDENT "Connections: <none>\n");
3220    }
3221
3222    if (isAppSwitchPendingLocked()) {
3223        dump.appendFormat(INDENT "AppSwitch: pending, due in %0.1fms\n",
3224                (mAppSwitchDueTime - now()) / 1000000.0);
3225    } else {
3226        dump.append(INDENT "AppSwitch: not pending\n");
3227    }
3228
3229    dump.append(INDENT "Configuration:\n");
3230    dump.appendFormat(INDENT2 "KeyRepeatDelay: %0.1fms\n",
3231            mConfig.keyRepeatDelay * 0.000001f);
3232    dump.appendFormat(INDENT2 "KeyRepeatTimeout: %0.1fms\n",
3233            mConfig.keyRepeatTimeout * 0.000001f);
3234}
3235
3236status_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChannel,
3237        const sp<InputWindowHandle>& inputWindowHandle, bool monitor) {
3238#if DEBUG_REGISTRATION
3239    ALOGD("channel '%s' ~ registerInputChannel - monitor=%s", inputChannel->getName().string(),
3240            toString(monitor));
3241#endif
3242
3243    { // acquire lock
3244        AutoMutex _l(mLock);
3245
3246        if (getConnectionIndexLocked(inputChannel) >= 0) {
3247            ALOGW("Attempted to register already registered input channel '%s'",
3248                    inputChannel->getName().string());
3249            return BAD_VALUE;
3250        }
3251
3252        sp<Connection> connection = new Connection(inputChannel, inputWindowHandle, monitor);
3253
3254        int fd = inputChannel->getFd();
3255        mConnectionsByFd.add(fd, connection);
3256
3257        if (monitor) {
3258            mMonitoringChannels.push(inputChannel);
3259        }
3260
3261        mLooper->addFd(fd, 0, ALOOPER_EVENT_INPUT, handleReceiveCallback, this);
3262    } // release lock
3263
3264    // Wake the looper because some connections have changed.
3265    mLooper->wake();
3266    return OK;
3267}
3268
3269status_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputChannel) {
3270#if DEBUG_REGISTRATION
3271    ALOGD("channel '%s' ~ unregisterInputChannel", inputChannel->getName().string());
3272#endif
3273
3274    { // acquire lock
3275        AutoMutex _l(mLock);
3276
3277        status_t status = unregisterInputChannelLocked(inputChannel, false /*notify*/);
3278        if (status) {
3279            return status;
3280        }
3281    } // release lock
3282
3283    // Wake the poll loop because removing the connection may have changed the current
3284    // synchronization state.
3285    mLooper->wake();
3286    return OK;
3287}
3288
3289status_t InputDispatcher::unregisterInputChannelLocked(const sp<InputChannel>& inputChannel,
3290        bool notify) {
3291    ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
3292    if (connectionIndex < 0) {
3293        ALOGW("Attempted to unregister already unregistered input channel '%s'",
3294                inputChannel->getName().string());
3295        return BAD_VALUE;
3296    }
3297
3298    sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
3299    mConnectionsByFd.removeItemsAt(connectionIndex);
3300
3301    if (connection->monitor) {
3302        removeMonitorChannelLocked(inputChannel);
3303    }
3304
3305    mLooper->removeFd(inputChannel->getFd());
3306
3307    nsecs_t currentTime = now();
3308    abortBrokenDispatchCycleLocked(currentTime, connection, notify);
3309
3310    connection->status = Connection::STATUS_ZOMBIE;
3311    return OK;
3312}
3313
3314void InputDispatcher::removeMonitorChannelLocked(const sp<InputChannel>& inputChannel) {
3315    for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
3316         if (mMonitoringChannels[i] == inputChannel) {
3317             mMonitoringChannels.removeAt(i);
3318             break;
3319         }
3320    }
3321}
3322
3323ssize_t InputDispatcher::getConnectionIndexLocked(const sp<InputChannel>& inputChannel) {
3324    ssize_t connectionIndex = mConnectionsByFd.indexOfKey(inputChannel->getFd());
3325    if (connectionIndex >= 0) {
3326        sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
3327        if (connection->inputChannel.get() == inputChannel.get()) {
3328            return connectionIndex;
3329        }
3330    }
3331
3332    return -1;
3333}
3334
3335void InputDispatcher::onDispatchCycleFinishedLocked(
3336        nsecs_t currentTime, const sp<Connection>& connection, uint32_t seq, bool handled) {
3337    CommandEntry* commandEntry = postCommandLocked(
3338            & InputDispatcher::doDispatchCycleFinishedLockedInterruptible);
3339    commandEntry->connection = connection;
3340    commandEntry->eventTime = currentTime;
3341    commandEntry->seq = seq;
3342    commandEntry->handled = handled;
3343}
3344
3345void InputDispatcher::onDispatchCycleBrokenLocked(
3346        nsecs_t currentTime, const sp<Connection>& connection) {
3347    ALOGE("channel '%s' ~ Channel is unrecoverably broken and will be disposed!",
3348            connection->getInputChannelName());
3349
3350    CommandEntry* commandEntry = postCommandLocked(
3351            & InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible);
3352    commandEntry->connection = connection;
3353}
3354
3355void InputDispatcher::onANRLocked(
3356        nsecs_t currentTime, const sp<InputApplicationHandle>& applicationHandle,
3357        const sp<InputWindowHandle>& windowHandle,
3358        nsecs_t eventTime, nsecs_t waitStartTime, const char* reason) {
3359    float dispatchLatency = (currentTime - eventTime) * 0.000001f;
3360    float waitDuration = (currentTime - waitStartTime) * 0.000001f;
3361    ALOGI("Application is not responding: %s.  "
3362            "It has been %0.1fms since event, %0.1fms since wait started.  Reason: %s",
3363            getApplicationWindowLabelLocked(applicationHandle, windowHandle).string(),
3364            dispatchLatency, waitDuration, reason);
3365
3366    // Capture a record of the InputDispatcher state at the time of the ANR.
3367    time_t t = time(NULL);
3368    struct tm tm;
3369    localtime_r(&t, &tm);
3370    char timestr[64];
3371    strftime(timestr, sizeof(timestr), "%F %T", &tm);
3372    mLastANRState.clear();
3373    mLastANRState.append(INDENT "ANR:\n");
3374    mLastANRState.appendFormat(INDENT2 "Time: %s\n", timestr);
3375    mLastANRState.appendFormat(INDENT2 "Window: %s\n",
3376            getApplicationWindowLabelLocked(applicationHandle, windowHandle).string());
3377    mLastANRState.appendFormat(INDENT2 "DispatchLatency: %0.1fms\n", dispatchLatency);
3378    mLastANRState.appendFormat(INDENT2 "WaitDuration: %0.1fms\n", waitDuration);
3379    mLastANRState.appendFormat(INDENT2 "Reason: %s\n", reason);
3380    dumpDispatchStateLocked(mLastANRState);
3381
3382    CommandEntry* commandEntry = postCommandLocked(
3383            & InputDispatcher::doNotifyANRLockedInterruptible);
3384    commandEntry->inputApplicationHandle = applicationHandle;
3385    commandEntry->inputWindowHandle = windowHandle;
3386}
3387
3388void InputDispatcher::doNotifyConfigurationChangedInterruptible(
3389        CommandEntry* commandEntry) {
3390    mLock.unlock();
3391
3392    mPolicy->notifyConfigurationChanged(commandEntry->eventTime);
3393
3394    mLock.lock();
3395}
3396
3397void InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible(
3398        CommandEntry* commandEntry) {
3399    sp<Connection> connection = commandEntry->connection;
3400
3401    if (connection->status != Connection::STATUS_ZOMBIE) {
3402        mLock.unlock();
3403
3404        mPolicy->notifyInputChannelBroken(connection->inputWindowHandle);
3405
3406        mLock.lock();
3407    }
3408}
3409
3410void InputDispatcher::doNotifyANRLockedInterruptible(
3411        CommandEntry* commandEntry) {
3412    mLock.unlock();
3413
3414    nsecs_t newTimeout = mPolicy->notifyANR(
3415            commandEntry->inputApplicationHandle, commandEntry->inputWindowHandle);
3416
3417    mLock.lock();
3418
3419    resumeAfterTargetsNotReadyTimeoutLocked(newTimeout,
3420            commandEntry->inputWindowHandle != NULL
3421                    ? commandEntry->inputWindowHandle->getInputChannel() : NULL);
3422}
3423
3424void InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible(
3425        CommandEntry* commandEntry) {
3426    KeyEntry* entry = commandEntry->keyEntry;
3427
3428    KeyEvent event;
3429    initializeKeyEvent(&event, entry);
3430
3431    mLock.unlock();
3432
3433    nsecs_t delay = mPolicy->interceptKeyBeforeDispatching(commandEntry->inputWindowHandle,
3434            &event, entry->policyFlags);
3435
3436    mLock.lock();
3437
3438    if (delay < 0) {
3439        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_SKIP;
3440    } else if (!delay) {
3441        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_CONTINUE;
3442    } else {
3443        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER;
3444        entry->interceptKeyWakeupTime = now() + delay;
3445    }
3446    entry->release();
3447}
3448
3449void InputDispatcher::doDispatchCycleFinishedLockedInterruptible(
3450        CommandEntry* commandEntry) {
3451    sp<Connection> connection = commandEntry->connection;
3452    nsecs_t finishTime = commandEntry->eventTime;
3453    uint32_t seq = commandEntry->seq;
3454    bool handled = commandEntry->handled;
3455
3456    // Handle post-event policy actions.
3457    DispatchEntry* dispatchEntry = connection->findWaitQueueEntry(seq);
3458    if (dispatchEntry) {
3459        nsecs_t eventDuration = finishTime - dispatchEntry->deliveryTime;
3460        if (eventDuration > SLOW_EVENT_PROCESSING_WARNING_TIMEOUT) {
3461            String8 msg;
3462            msg.appendFormat("Window '%s' spent %0.1fms processing the last input event: ",
3463                    connection->getWindowName(), eventDuration * 0.000001f);
3464            dispatchEntry->eventEntry->appendDescription(msg);
3465            ALOGI("%s", msg.string());
3466        }
3467
3468        bool restartEvent;
3469        if (dispatchEntry->eventEntry->type == EventEntry::TYPE_KEY) {
3470            KeyEntry* keyEntry = static_cast<KeyEntry*>(dispatchEntry->eventEntry);
3471            restartEvent = afterKeyEventLockedInterruptible(connection,
3472                    dispatchEntry, keyEntry, handled);
3473        } else if (dispatchEntry->eventEntry->type == EventEntry::TYPE_MOTION) {
3474            MotionEntry* motionEntry = static_cast<MotionEntry*>(dispatchEntry->eventEntry);
3475            restartEvent = afterMotionEventLockedInterruptible(connection,
3476                    dispatchEntry, motionEntry, handled);
3477        } else {
3478            restartEvent = false;
3479        }
3480
3481        // Dequeue the event and start the next cycle.
3482        // Note that because the lock might have been released, it is possible that the
3483        // contents of the wait queue to have been drained, so we need to double-check
3484        // a few things.
3485        if (dispatchEntry == connection->findWaitQueueEntry(seq)) {
3486            connection->waitQueue.dequeue(dispatchEntry);
3487            traceWaitQueueLengthLocked(connection);
3488            if (restartEvent && connection->status == Connection::STATUS_NORMAL) {
3489                connection->outboundQueue.enqueueAtHead(dispatchEntry);
3490                traceOutboundQueueLengthLocked(connection);
3491            } else {
3492                releaseDispatchEntryLocked(dispatchEntry);
3493            }
3494        }
3495
3496        // Start the next dispatch cycle for this connection.
3497        startDispatchCycleLocked(now(), connection);
3498    }
3499}
3500
3501bool InputDispatcher::afterKeyEventLockedInterruptible(const sp<Connection>& connection,
3502        DispatchEntry* dispatchEntry, KeyEntry* keyEntry, bool handled) {
3503    if (!(keyEntry->flags & AKEY_EVENT_FLAG_FALLBACK)) {
3504        // Get the fallback key state.
3505        // Clear it out after dispatching the UP.
3506        int32_t originalKeyCode = keyEntry->keyCode;
3507        int32_t fallbackKeyCode = connection->inputState.getFallbackKey(originalKeyCode);
3508        if (keyEntry->action == AKEY_EVENT_ACTION_UP) {
3509            connection->inputState.removeFallbackKey(originalKeyCode);
3510        }
3511
3512        if (handled || !dispatchEntry->hasForegroundTarget()) {
3513            // If the application handles the original key for which we previously
3514            // generated a fallback or if the window is not a foreground window,
3515            // then cancel the associated fallback key, if any.
3516            if (fallbackKeyCode != -1) {
3517                // Dispatch the unhandled key to the policy with the cancel flag.
3518#if DEBUG_OUTBOUND_EVENT_DETAILS
3519                ALOGD("Unhandled key event: Asking policy to cancel fallback action.  "
3520                        "keyCode=%d, action=%d, repeatCount=%d, policyFlags=0x%08x",
3521                        keyEntry->keyCode, keyEntry->action, keyEntry->repeatCount,
3522                        keyEntry->policyFlags);
3523#endif
3524                KeyEvent event;
3525                initializeKeyEvent(&event, keyEntry);
3526                event.setFlags(event.getFlags() | AKEY_EVENT_FLAG_CANCELED);
3527
3528                mLock.unlock();
3529
3530                mPolicy->dispatchUnhandledKey(connection->inputWindowHandle,
3531                        &event, keyEntry->policyFlags, &event);
3532
3533                mLock.lock();
3534
3535                // Cancel the fallback key.
3536                if (fallbackKeyCode != AKEYCODE_UNKNOWN) {
3537                    CancelationOptions options(CancelationOptions::CANCEL_FALLBACK_EVENTS,
3538                            "application handled the original non-fallback key "
3539                            "or is no longer a foreground target, "
3540                            "canceling previously dispatched fallback key");
3541                    options.keyCode = fallbackKeyCode;
3542                    synthesizeCancelationEventsForConnectionLocked(connection, options);
3543                }
3544                connection->inputState.removeFallbackKey(originalKeyCode);
3545            }
3546        } else {
3547            // If the application did not handle a non-fallback key, first check
3548            // that we are in a good state to perform unhandled key event processing
3549            // Then ask the policy what to do with it.
3550            bool initialDown = keyEntry->action == AKEY_EVENT_ACTION_DOWN
3551                    && keyEntry->repeatCount == 0;
3552            if (fallbackKeyCode == -1 && !initialDown) {
3553#if DEBUG_OUTBOUND_EVENT_DETAILS
3554                ALOGD("Unhandled key event: Skipping unhandled key event processing "
3555                        "since this is not an initial down.  "
3556                        "keyCode=%d, action=%d, repeatCount=%d, policyFlags=0x%08x",
3557                        originalKeyCode, keyEntry->action, keyEntry->repeatCount,
3558                        keyEntry->policyFlags);
3559#endif
3560                return false;
3561            }
3562
3563            // Dispatch the unhandled key to the policy.
3564#if DEBUG_OUTBOUND_EVENT_DETAILS
3565            ALOGD("Unhandled key event: Asking policy to perform fallback action.  "
3566                    "keyCode=%d, action=%d, repeatCount=%d, policyFlags=0x%08x",
3567                    keyEntry->keyCode, keyEntry->action, keyEntry->repeatCount,
3568                    keyEntry->policyFlags);
3569#endif
3570            KeyEvent event;
3571            initializeKeyEvent(&event, keyEntry);
3572
3573            mLock.unlock();
3574
3575            bool fallback = mPolicy->dispatchUnhandledKey(connection->inputWindowHandle,
3576                    &event, keyEntry->policyFlags, &event);
3577
3578            mLock.lock();
3579
3580            if (connection->status != Connection::STATUS_NORMAL) {
3581                connection->inputState.removeFallbackKey(originalKeyCode);
3582                return false;
3583            }
3584
3585            // Latch the fallback keycode for this key on an initial down.
3586            // The fallback keycode cannot change at any other point in the lifecycle.
3587            if (initialDown) {
3588                if (fallback) {
3589                    fallbackKeyCode = event.getKeyCode();
3590                } else {
3591                    fallbackKeyCode = AKEYCODE_UNKNOWN;
3592                }
3593                connection->inputState.setFallbackKey(originalKeyCode, fallbackKeyCode);
3594            }
3595
3596            ALOG_ASSERT(fallbackKeyCode != -1);
3597
3598            // Cancel the fallback key if the policy decides not to send it anymore.
3599            // We will continue to dispatch the key to the policy but we will no
3600            // longer dispatch a fallback key to the application.
3601            if (fallbackKeyCode != AKEYCODE_UNKNOWN
3602                    && (!fallback || fallbackKeyCode != event.getKeyCode())) {
3603#if DEBUG_OUTBOUND_EVENT_DETAILS
3604                if (fallback) {
3605                    ALOGD("Unhandled key event: Policy requested to send key %d"
3606                            "as a fallback for %d, but on the DOWN it had requested "
3607                            "to send %d instead.  Fallback canceled.",
3608                            event.getKeyCode(), originalKeyCode, fallbackKeyCode);
3609                } else {
3610                    ALOGD("Unhandled key event: Policy did not request fallback for %d, "
3611                            "but on the DOWN it had requested to send %d.  "
3612                            "Fallback canceled.",
3613                            originalKeyCode, fallbackKeyCode);
3614                }
3615#endif
3616
3617                CancelationOptions options(CancelationOptions::CANCEL_FALLBACK_EVENTS,
3618                        "canceling fallback, policy no longer desires it");
3619                options.keyCode = fallbackKeyCode;
3620                synthesizeCancelationEventsForConnectionLocked(connection, options);
3621
3622                fallback = false;
3623                fallbackKeyCode = AKEYCODE_UNKNOWN;
3624                if (keyEntry->action != AKEY_EVENT_ACTION_UP) {
3625                    connection->inputState.setFallbackKey(originalKeyCode,
3626                            fallbackKeyCode);
3627                }
3628            }
3629
3630#if DEBUG_OUTBOUND_EVENT_DETAILS
3631            {
3632                String8 msg;
3633                const KeyedVector<int32_t, int32_t>& fallbackKeys =
3634                        connection->inputState.getFallbackKeys();
3635                for (size_t i = 0; i < fallbackKeys.size(); i++) {
3636                    msg.appendFormat(", %d->%d", fallbackKeys.keyAt(i),
3637                            fallbackKeys.valueAt(i));
3638                }
3639                ALOGD("Unhandled key event: %d currently tracked fallback keys%s.",
3640                        fallbackKeys.size(), msg.string());
3641            }
3642#endif
3643
3644            if (fallback) {
3645                // Restart the dispatch cycle using the fallback key.
3646                keyEntry->eventTime = event.getEventTime();
3647                keyEntry->deviceId = event.getDeviceId();
3648                keyEntry->source = event.getSource();
3649                keyEntry->flags = event.getFlags() | AKEY_EVENT_FLAG_FALLBACK;
3650                keyEntry->keyCode = fallbackKeyCode;
3651                keyEntry->scanCode = event.getScanCode();
3652                keyEntry->metaState = event.getMetaState();
3653                keyEntry->repeatCount = event.getRepeatCount();
3654                keyEntry->downTime = event.getDownTime();
3655                keyEntry->syntheticRepeat = false;
3656
3657#if DEBUG_OUTBOUND_EVENT_DETAILS
3658                ALOGD("Unhandled key event: Dispatching fallback key.  "
3659                        "originalKeyCode=%d, fallbackKeyCode=%d, fallbackMetaState=%08x",
3660                        originalKeyCode, fallbackKeyCode, keyEntry->metaState);
3661#endif
3662                return true; // restart the event
3663            } else {
3664#if DEBUG_OUTBOUND_EVENT_DETAILS
3665                ALOGD("Unhandled key event: No fallback key.");
3666#endif
3667            }
3668        }
3669    }
3670    return false;
3671}
3672
3673bool InputDispatcher::afterMotionEventLockedInterruptible(const sp<Connection>& connection,
3674        DispatchEntry* dispatchEntry, MotionEntry* motionEntry, bool handled) {
3675    return false;
3676}
3677
3678void InputDispatcher::doPokeUserActivityLockedInterruptible(CommandEntry* commandEntry) {
3679    mLock.unlock();
3680
3681    mPolicy->pokeUserActivity(commandEntry->eventTime, commandEntry->userActivityEventType);
3682
3683    mLock.lock();
3684}
3685
3686void InputDispatcher::initializeKeyEvent(KeyEvent* event, const KeyEntry* entry) {
3687    event->initialize(entry->deviceId, entry->source, entry->action, entry->flags,
3688            entry->keyCode, entry->scanCode, entry->metaState, entry->repeatCount,
3689            entry->downTime, entry->eventTime);
3690}
3691
3692void InputDispatcher::updateDispatchStatisticsLocked(nsecs_t currentTime, const EventEntry* entry,
3693        int32_t injectionResult, nsecs_t timeSpentWaitingForApplication) {
3694    // TODO Write some statistics about how long we spend waiting.
3695}
3696
3697void InputDispatcher::traceInboundQueueLengthLocked() {
3698    if (ATRACE_ENABLED()) {
3699        ATRACE_INT("iq", mInboundQueue.count());
3700    }
3701}
3702
3703void InputDispatcher::traceOutboundQueueLengthLocked(const sp<Connection>& connection) {
3704    if (ATRACE_ENABLED()) {
3705        char counterName[40];
3706        snprintf(counterName, sizeof(counterName), "oq:%s", connection->getWindowName());
3707        ATRACE_INT(counterName, connection->outboundQueue.count());
3708    }
3709}
3710
3711void InputDispatcher::traceWaitQueueLengthLocked(const sp<Connection>& connection) {
3712    if (ATRACE_ENABLED()) {
3713        char counterName[40];
3714        snprintf(counterName, sizeof(counterName), "wq:%s", connection->getWindowName());
3715        ATRACE_INT(counterName, connection->waitQueue.count());
3716    }
3717}
3718
3719void InputDispatcher::dump(String8& dump) {
3720    AutoMutex _l(mLock);
3721
3722    dump.append("Input Dispatcher State:\n");
3723    dumpDispatchStateLocked(dump);
3724
3725    if (!mLastANRState.isEmpty()) {
3726        dump.append("\nInput Dispatcher State at time of last ANR:\n");
3727        dump.append(mLastANRState);
3728    }
3729}
3730
3731void InputDispatcher::monitor() {
3732    // Acquire and release the lock to ensure that the dispatcher has not deadlocked.
3733    mLock.lock();
3734    mLooper->wake();
3735    mDispatcherIsAliveCondition.wait(mLock);
3736    mLock.unlock();
3737}
3738
3739
3740// --- InputDispatcher::Queue ---
3741
3742template <typename T>
3743uint32_t InputDispatcher::Queue<T>::count() const {
3744    uint32_t result = 0;
3745    for (const T* entry = head; entry; entry = entry->next) {
3746        result += 1;
3747    }
3748    return result;
3749}
3750
3751
3752// --- InputDispatcher::InjectionState ---
3753
3754InputDispatcher::InjectionState::InjectionState(int32_t injectorPid, int32_t injectorUid) :
3755        refCount(1),
3756        injectorPid(injectorPid), injectorUid(injectorUid),
3757        injectionResult(INPUT_EVENT_INJECTION_PENDING), injectionIsAsync(false),
3758        pendingForegroundDispatches(0) {
3759}
3760
3761InputDispatcher::InjectionState::~InjectionState() {
3762}
3763
3764void InputDispatcher::InjectionState::release() {
3765    refCount -= 1;
3766    if (refCount == 0) {
3767        delete this;
3768    } else {
3769        ALOG_ASSERT(refCount > 0);
3770    }
3771}
3772
3773
3774// --- InputDispatcher::EventEntry ---
3775
3776InputDispatcher::EventEntry::EventEntry(int32_t type, nsecs_t eventTime, uint32_t policyFlags) :
3777        refCount(1), type(type), eventTime(eventTime), policyFlags(policyFlags),
3778        injectionState(NULL), dispatchInProgress(false) {
3779}
3780
3781InputDispatcher::EventEntry::~EventEntry() {
3782    releaseInjectionState();
3783}
3784
3785void InputDispatcher::EventEntry::release() {
3786    refCount -= 1;
3787    if (refCount == 0) {
3788        delete this;
3789    } else {
3790        ALOG_ASSERT(refCount > 0);
3791    }
3792}
3793
3794void InputDispatcher::EventEntry::releaseInjectionState() {
3795    if (injectionState) {
3796        injectionState->release();
3797        injectionState = NULL;
3798    }
3799}
3800
3801
3802// --- InputDispatcher::ConfigurationChangedEntry ---
3803
3804InputDispatcher::ConfigurationChangedEntry::ConfigurationChangedEntry(nsecs_t eventTime) :
3805        EventEntry(TYPE_CONFIGURATION_CHANGED, eventTime, 0) {
3806}
3807
3808InputDispatcher::ConfigurationChangedEntry::~ConfigurationChangedEntry() {
3809}
3810
3811void InputDispatcher::ConfigurationChangedEntry::appendDescription(String8& msg) const {
3812    msg.append("ConfigurationChangedEvent()");
3813}
3814
3815
3816// --- InputDispatcher::DeviceResetEntry ---
3817
3818InputDispatcher::DeviceResetEntry::DeviceResetEntry(nsecs_t eventTime, int32_t deviceId) :
3819        EventEntry(TYPE_DEVICE_RESET, eventTime, 0),
3820        deviceId(deviceId) {
3821}
3822
3823InputDispatcher::DeviceResetEntry::~DeviceResetEntry() {
3824}
3825
3826void InputDispatcher::DeviceResetEntry::appendDescription(String8& msg) const {
3827    msg.appendFormat("DeviceResetEvent(deviceId=%d)", deviceId);
3828}
3829
3830
3831// --- InputDispatcher::KeyEntry ---
3832
3833InputDispatcher::KeyEntry::KeyEntry(nsecs_t eventTime,
3834        int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action,
3835        int32_t flags, int32_t keyCode, int32_t scanCode, int32_t metaState,
3836        int32_t repeatCount, nsecs_t downTime) :
3837        EventEntry(TYPE_KEY, eventTime, policyFlags),
3838        deviceId(deviceId), source(source), action(action), flags(flags),
3839        keyCode(keyCode), scanCode(scanCode), metaState(metaState),
3840        repeatCount(repeatCount), downTime(downTime),
3841        syntheticRepeat(false), interceptKeyResult(KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN),
3842        interceptKeyWakeupTime(0) {
3843}
3844
3845InputDispatcher::KeyEntry::~KeyEntry() {
3846}
3847
3848void InputDispatcher::KeyEntry::appendDescription(String8& msg) const {
3849    msg.appendFormat("KeyEvent(action=%d, deviceId=%d, source=0x%08x)",
3850            action, deviceId, source);
3851}
3852
3853void InputDispatcher::KeyEntry::recycle() {
3854    releaseInjectionState();
3855
3856    dispatchInProgress = false;
3857    syntheticRepeat = false;
3858    interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
3859    interceptKeyWakeupTime = 0;
3860}
3861
3862
3863// --- InputDispatcher::MotionEntry ---
3864
3865InputDispatcher::MotionEntry::MotionEntry(nsecs_t eventTime,
3866        int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action, int32_t flags,
3867        int32_t metaState, int32_t buttonState,
3868        int32_t edgeFlags, float xPrecision, float yPrecision,
3869        nsecs_t downTime, int32_t displayId, uint32_t pointerCount,
3870        const PointerProperties* pointerProperties, const PointerCoords* pointerCoords) :
3871        EventEntry(TYPE_MOTION, eventTime, policyFlags),
3872        eventTime(eventTime),
3873        deviceId(deviceId), source(source), action(action), flags(flags),
3874        metaState(metaState), buttonState(buttonState), edgeFlags(edgeFlags),
3875        xPrecision(xPrecision), yPrecision(yPrecision),
3876        downTime(downTime), displayId(displayId), pointerCount(pointerCount) {
3877    for (uint32_t i = 0; i < pointerCount; i++) {
3878        this->pointerProperties[i].copyFrom(pointerProperties[i]);
3879        this->pointerCoords[i].copyFrom(pointerCoords[i]);
3880    }
3881}
3882
3883InputDispatcher::MotionEntry::~MotionEntry() {
3884}
3885
3886void InputDispatcher::MotionEntry::appendDescription(String8& msg) const {
3887    msg.appendFormat("MotionEvent(action=%d, deviceId=%d, source=0x%08x, displayId=%d)",
3888            action, deviceId, source, displayId);
3889}
3890
3891
3892// --- InputDispatcher::DispatchEntry ---
3893
3894volatile int32_t InputDispatcher::DispatchEntry::sNextSeqAtomic;
3895
3896InputDispatcher::DispatchEntry::DispatchEntry(EventEntry* eventEntry,
3897        int32_t targetFlags, float xOffset, float yOffset, float scaleFactor) :
3898        seq(nextSeq()),
3899        eventEntry(eventEntry), targetFlags(targetFlags),
3900        xOffset(xOffset), yOffset(yOffset), scaleFactor(scaleFactor),
3901        deliveryTime(0), resolvedAction(0), resolvedFlags(0) {
3902    eventEntry->refCount += 1;
3903}
3904
3905InputDispatcher::DispatchEntry::~DispatchEntry() {
3906    eventEntry->release();
3907}
3908
3909uint32_t InputDispatcher::DispatchEntry::nextSeq() {
3910    // Sequence number 0 is reserved and will never be returned.
3911    uint32_t seq;
3912    do {
3913        seq = android_atomic_inc(&sNextSeqAtomic);
3914    } while (!seq);
3915    return seq;
3916}
3917
3918
3919// --- InputDispatcher::InputState ---
3920
3921InputDispatcher::InputState::InputState() {
3922}
3923
3924InputDispatcher::InputState::~InputState() {
3925}
3926
3927bool InputDispatcher::InputState::isNeutral() const {
3928    return mKeyMementos.isEmpty() && mMotionMementos.isEmpty();
3929}
3930
3931bool InputDispatcher::InputState::isHovering(int32_t deviceId, uint32_t source,
3932        int32_t displayId) const {
3933    for (size_t i = 0; i < mMotionMementos.size(); i++) {
3934        const MotionMemento& memento = mMotionMementos.itemAt(i);
3935        if (memento.deviceId == deviceId
3936                && memento.source == source
3937                && memento.displayId == displayId
3938                && memento.hovering) {
3939            return true;
3940        }
3941    }
3942    return false;
3943}
3944
3945bool InputDispatcher::InputState::trackKey(const KeyEntry* entry,
3946        int32_t action, int32_t flags) {
3947    switch (action) {
3948    case AKEY_EVENT_ACTION_UP: {
3949        if (entry->flags & AKEY_EVENT_FLAG_FALLBACK) {
3950            for (size_t i = 0; i < mFallbackKeys.size(); ) {
3951                if (mFallbackKeys.valueAt(i) == entry->keyCode) {
3952                    mFallbackKeys.removeItemsAt(i);
3953                } else {
3954                    i += 1;
3955                }
3956            }
3957        }
3958        ssize_t index = findKeyMemento(entry);
3959        if (index >= 0) {
3960            mKeyMementos.removeAt(index);
3961            return true;
3962        }
3963        /* FIXME: We can't just drop the key up event because that prevents creating
3964         * popup windows that are automatically shown when a key is held and then
3965         * dismissed when the key is released.  The problem is that the popup will
3966         * not have received the original key down, so the key up will be considered
3967         * to be inconsistent with its observed state.  We could perhaps handle this
3968         * by synthesizing a key down but that will cause other problems.
3969         *
3970         * So for now, allow inconsistent key up events to be dispatched.
3971         *
3972#if DEBUG_OUTBOUND_EVENT_DETAILS
3973        ALOGD("Dropping inconsistent key up event: deviceId=%d, source=%08x, "
3974                "keyCode=%d, scanCode=%d",
3975                entry->deviceId, entry->source, entry->keyCode, entry->scanCode);
3976#endif
3977        return false;
3978        */
3979        return true;
3980    }
3981
3982    case AKEY_EVENT_ACTION_DOWN: {
3983        ssize_t index = findKeyMemento(entry);
3984        if (index >= 0) {
3985            mKeyMementos.removeAt(index);
3986        }
3987        addKeyMemento(entry, flags);
3988        return true;
3989    }
3990
3991    default:
3992        return true;
3993    }
3994}
3995
3996bool InputDispatcher::InputState::trackMotion(const MotionEntry* entry,
3997        int32_t action, int32_t flags) {
3998    int32_t actionMasked = action & AMOTION_EVENT_ACTION_MASK;
3999    switch (actionMasked) {
4000    case AMOTION_EVENT_ACTION_UP:
4001    case AMOTION_EVENT_ACTION_CANCEL: {
4002        ssize_t index = findMotionMemento(entry, false /*hovering*/);
4003        if (index >= 0) {
4004            mMotionMementos.removeAt(index);
4005            return true;
4006        }
4007#if DEBUG_OUTBOUND_EVENT_DETAILS
4008        ALOGD("Dropping inconsistent motion up or cancel event: deviceId=%d, source=%08x, "
4009                "actionMasked=%d",
4010                entry->deviceId, entry->source, actionMasked);
4011#endif
4012        return false;
4013    }
4014
4015    case AMOTION_EVENT_ACTION_DOWN: {
4016        ssize_t index = findMotionMemento(entry, false /*hovering*/);
4017        if (index >= 0) {
4018            mMotionMementos.removeAt(index);
4019        }
4020        addMotionMemento(entry, flags, false /*hovering*/);
4021        return true;
4022    }
4023
4024    case AMOTION_EVENT_ACTION_POINTER_UP:
4025    case AMOTION_EVENT_ACTION_POINTER_DOWN:
4026    case AMOTION_EVENT_ACTION_MOVE: {
4027        ssize_t index = findMotionMemento(entry, false /*hovering*/);
4028        if (index >= 0) {
4029            MotionMemento& memento = mMotionMementos.editItemAt(index);
4030            memento.setPointers(entry);
4031            return true;
4032        }
4033        if (actionMasked == AMOTION_EVENT_ACTION_MOVE
4034                && (entry->source & (AINPUT_SOURCE_CLASS_JOYSTICK
4035                        | AINPUT_SOURCE_CLASS_NAVIGATION))) {
4036            // Joysticks and trackballs can send MOVE events without corresponding DOWN or UP.
4037            return true;
4038        }
4039#if DEBUG_OUTBOUND_EVENT_DETAILS
4040        ALOGD("Dropping inconsistent motion pointer up/down or move event: "
4041                "deviceId=%d, source=%08x, actionMasked=%d",
4042                entry->deviceId, entry->source, actionMasked);
4043#endif
4044        return false;
4045    }
4046
4047    case AMOTION_EVENT_ACTION_HOVER_EXIT: {
4048        ssize_t index = findMotionMemento(entry, true /*hovering*/);
4049        if (index >= 0) {
4050            mMotionMementos.removeAt(index);
4051            return true;
4052        }
4053#if DEBUG_OUTBOUND_EVENT_DETAILS
4054        ALOGD("Dropping inconsistent motion hover exit event: deviceId=%d, source=%08x",
4055                entry->deviceId, entry->source);
4056#endif
4057        return false;
4058    }
4059
4060    case AMOTION_EVENT_ACTION_HOVER_ENTER:
4061    case AMOTION_EVENT_ACTION_HOVER_MOVE: {
4062        ssize_t index = findMotionMemento(entry, true /*hovering*/);
4063        if (index >= 0) {
4064            mMotionMementos.removeAt(index);
4065        }
4066        addMotionMemento(entry, flags, true /*hovering*/);
4067        return true;
4068    }
4069
4070    default:
4071        return true;
4072    }
4073}
4074
4075ssize_t InputDispatcher::InputState::findKeyMemento(const KeyEntry* entry) const {
4076    for (size_t i = 0; i < mKeyMementos.size(); i++) {
4077        const KeyMemento& memento = mKeyMementos.itemAt(i);
4078        if (memento.deviceId == entry->deviceId
4079                && memento.source == entry->source
4080                && memento.keyCode == entry->keyCode
4081                && memento.scanCode == entry->scanCode) {
4082            return i;
4083        }
4084    }
4085    return -1;
4086}
4087
4088ssize_t InputDispatcher::InputState::findMotionMemento(const MotionEntry* entry,
4089        bool hovering) const {
4090    for (size_t i = 0; i < mMotionMementos.size(); i++) {
4091        const MotionMemento& memento = mMotionMementos.itemAt(i);
4092        if (memento.deviceId == entry->deviceId
4093                && memento.source == entry->source
4094                && memento.displayId == entry->displayId
4095                && memento.hovering == hovering) {
4096            return i;
4097        }
4098    }
4099    return -1;
4100}
4101
4102void InputDispatcher::InputState::addKeyMemento(const KeyEntry* entry, int32_t flags) {
4103    mKeyMementos.push();
4104    KeyMemento& memento = mKeyMementos.editTop();
4105    memento.deviceId = entry->deviceId;
4106    memento.source = entry->source;
4107    memento.keyCode = entry->keyCode;
4108    memento.scanCode = entry->scanCode;
4109    memento.metaState = entry->metaState;
4110    memento.flags = flags;
4111    memento.downTime = entry->downTime;
4112    memento.policyFlags = entry->policyFlags;
4113}
4114
4115void InputDispatcher::InputState::addMotionMemento(const MotionEntry* entry,
4116        int32_t flags, bool hovering) {
4117    mMotionMementos.push();
4118    MotionMemento& memento = mMotionMementos.editTop();
4119    memento.deviceId = entry->deviceId;
4120    memento.source = entry->source;
4121    memento.flags = flags;
4122    memento.xPrecision = entry->xPrecision;
4123    memento.yPrecision = entry->yPrecision;
4124    memento.downTime = entry->downTime;
4125    memento.displayId = entry->displayId;
4126    memento.setPointers(entry);
4127    memento.hovering = hovering;
4128    memento.policyFlags = entry->policyFlags;
4129}
4130
4131void InputDispatcher::InputState::MotionMemento::setPointers(const MotionEntry* entry) {
4132    pointerCount = entry->pointerCount;
4133    for (uint32_t i = 0; i < entry->pointerCount; i++) {
4134        pointerProperties[i].copyFrom(entry->pointerProperties[i]);
4135        pointerCoords[i].copyFrom(entry->pointerCoords[i]);
4136    }
4137}
4138
4139void InputDispatcher::InputState::synthesizeCancelationEvents(nsecs_t currentTime,
4140        Vector<EventEntry*>& outEvents, const CancelationOptions& options) {
4141    for (size_t i = 0; i < mKeyMementos.size(); i++) {
4142        const KeyMemento& memento = mKeyMementos.itemAt(i);
4143        if (shouldCancelKey(memento, options)) {
4144            outEvents.push(new KeyEntry(currentTime,
4145                    memento.deviceId, memento.source, memento.policyFlags,
4146                    AKEY_EVENT_ACTION_UP, memento.flags | AKEY_EVENT_FLAG_CANCELED,
4147                    memento.keyCode, memento.scanCode, memento.metaState, 0, memento.downTime));
4148        }
4149    }
4150
4151    for (size_t i = 0; i < mMotionMementos.size(); i++) {
4152        const MotionMemento& memento = mMotionMementos.itemAt(i);
4153        if (shouldCancelMotion(memento, options)) {
4154            outEvents.push(new MotionEntry(currentTime,
4155                    memento.deviceId, memento.source, memento.policyFlags,
4156                    memento.hovering
4157                            ? AMOTION_EVENT_ACTION_HOVER_EXIT
4158                            : AMOTION_EVENT_ACTION_CANCEL,
4159                    memento.flags, 0, 0, 0,
4160                    memento.xPrecision, memento.yPrecision, memento.downTime,
4161                    memento.displayId,
4162                    memento.pointerCount, memento.pointerProperties, memento.pointerCoords));
4163        }
4164    }
4165}
4166
4167void InputDispatcher::InputState::clear() {
4168    mKeyMementos.clear();
4169    mMotionMementos.clear();
4170    mFallbackKeys.clear();
4171}
4172
4173void InputDispatcher::InputState::copyPointerStateTo(InputState& other) const {
4174    for (size_t i = 0; i < mMotionMementos.size(); i++) {
4175        const MotionMemento& memento = mMotionMementos.itemAt(i);
4176        if (memento.source & AINPUT_SOURCE_CLASS_POINTER) {
4177            for (size_t j = 0; j < other.mMotionMementos.size(); ) {
4178                const MotionMemento& otherMemento = other.mMotionMementos.itemAt(j);
4179                if (memento.deviceId == otherMemento.deviceId
4180                        && memento.source == otherMemento.source
4181                        && memento.displayId == otherMemento.displayId) {
4182                    other.mMotionMementos.removeAt(j);
4183                } else {
4184                    j += 1;
4185                }
4186            }
4187            other.mMotionMementos.push(memento);
4188        }
4189    }
4190}
4191
4192int32_t InputDispatcher::InputState::getFallbackKey(int32_t originalKeyCode) {
4193    ssize_t index = mFallbackKeys.indexOfKey(originalKeyCode);
4194    return index >= 0 ? mFallbackKeys.valueAt(index) : -1;
4195}
4196
4197void InputDispatcher::InputState::setFallbackKey(int32_t originalKeyCode,
4198        int32_t fallbackKeyCode) {
4199    ssize_t index = mFallbackKeys.indexOfKey(originalKeyCode);
4200    if (index >= 0) {
4201        mFallbackKeys.replaceValueAt(index, fallbackKeyCode);
4202    } else {
4203        mFallbackKeys.add(originalKeyCode, fallbackKeyCode);
4204    }
4205}
4206
4207void InputDispatcher::InputState::removeFallbackKey(int32_t originalKeyCode) {
4208    mFallbackKeys.removeItem(originalKeyCode);
4209}
4210
4211bool InputDispatcher::InputState::shouldCancelKey(const KeyMemento& memento,
4212        const CancelationOptions& options) {
4213    if (options.keyCode != -1 && memento.keyCode != options.keyCode) {
4214        return false;
4215    }
4216
4217    if (options.deviceId != -1 && memento.deviceId != options.deviceId) {
4218        return false;
4219    }
4220
4221    switch (options.mode) {
4222    case CancelationOptions::CANCEL_ALL_EVENTS:
4223    case CancelationOptions::CANCEL_NON_POINTER_EVENTS:
4224        return true;
4225    case CancelationOptions::CANCEL_FALLBACK_EVENTS:
4226        return memento.flags & AKEY_EVENT_FLAG_FALLBACK;
4227    default:
4228        return false;
4229    }
4230}
4231
4232bool InputDispatcher::InputState::shouldCancelMotion(const MotionMemento& memento,
4233        const CancelationOptions& options) {
4234    if (options.deviceId != -1 && memento.deviceId != options.deviceId) {
4235        return false;
4236    }
4237
4238    switch (options.mode) {
4239    case CancelationOptions::CANCEL_ALL_EVENTS:
4240        return true;
4241    case CancelationOptions::CANCEL_POINTER_EVENTS:
4242        return memento.source & AINPUT_SOURCE_CLASS_POINTER;
4243    case CancelationOptions::CANCEL_NON_POINTER_EVENTS:
4244        return !(memento.source & AINPUT_SOURCE_CLASS_POINTER);
4245    default:
4246        return false;
4247    }
4248}
4249
4250
4251// --- InputDispatcher::Connection ---
4252
4253InputDispatcher::Connection::Connection(const sp<InputChannel>& inputChannel,
4254        const sp<InputWindowHandle>& inputWindowHandle, bool monitor) :
4255        status(STATUS_NORMAL), inputChannel(inputChannel), inputWindowHandle(inputWindowHandle),
4256        monitor(monitor),
4257        inputPublisher(inputChannel), inputPublisherBlocked(false) {
4258}
4259
4260InputDispatcher::Connection::~Connection() {
4261}
4262
4263const char* InputDispatcher::Connection::getWindowName() const {
4264    if (inputWindowHandle != NULL) {
4265        return inputWindowHandle->getName().string();
4266    }
4267    if (monitor) {
4268        return "monitor";
4269    }
4270    return "?";
4271}
4272
4273const char* InputDispatcher::Connection::getStatusLabel() const {
4274    switch (status) {
4275    case STATUS_NORMAL:
4276        return "NORMAL";
4277
4278    case STATUS_BROKEN:
4279        return "BROKEN";
4280
4281    case STATUS_ZOMBIE:
4282        return "ZOMBIE";
4283
4284    default:
4285        return "UNKNOWN";
4286    }
4287}
4288
4289InputDispatcher::DispatchEntry* InputDispatcher::Connection::findWaitQueueEntry(uint32_t seq) {
4290    for (DispatchEntry* entry = waitQueue.head; entry != NULL; entry = entry->next) {
4291        if (entry->seq == seq) {
4292            return entry;
4293        }
4294    }
4295    return NULL;
4296}
4297
4298
4299// --- InputDispatcher::CommandEntry ---
4300
4301InputDispatcher::CommandEntry::CommandEntry(Command command) :
4302    command(command), eventTime(0), keyEntry(NULL), userActivityEventType(0),
4303    seq(0), handled(false) {
4304}
4305
4306InputDispatcher::CommandEntry::~CommandEntry() {
4307}
4308
4309
4310// --- InputDispatcher::TouchState ---
4311
4312InputDispatcher::TouchState::TouchState() :
4313    down(false), split(false), deviceId(-1), source(0), displayId(-1) {
4314}
4315
4316InputDispatcher::TouchState::~TouchState() {
4317}
4318
4319void InputDispatcher::TouchState::reset() {
4320    down = false;
4321    split = false;
4322    deviceId = -1;
4323    source = 0;
4324    displayId = -1;
4325    windows.clear();
4326}
4327
4328void InputDispatcher::TouchState::copyFrom(const TouchState& other) {
4329    down = other.down;
4330    split = other.split;
4331    deviceId = other.deviceId;
4332    source = other.source;
4333    displayId = other.displayId;
4334    windows = other.windows;
4335}
4336
4337void InputDispatcher::TouchState::addOrUpdateWindow(const sp<InputWindowHandle>& windowHandle,
4338        int32_t targetFlags, BitSet32 pointerIds) {
4339    if (targetFlags & InputTarget::FLAG_SPLIT) {
4340        split = true;
4341    }
4342
4343    for (size_t i = 0; i < windows.size(); i++) {
4344        TouchedWindow& touchedWindow = windows.editItemAt(i);
4345        if (touchedWindow.windowHandle == windowHandle) {
4346            touchedWindow.targetFlags |= targetFlags;
4347            if (targetFlags & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT) {
4348                touchedWindow.targetFlags &= ~InputTarget::FLAG_DISPATCH_AS_IS;
4349            }
4350            touchedWindow.pointerIds.value |= pointerIds.value;
4351            return;
4352        }
4353    }
4354
4355    windows.push();
4356
4357    TouchedWindow& touchedWindow = windows.editTop();
4358    touchedWindow.windowHandle = windowHandle;
4359    touchedWindow.targetFlags = targetFlags;
4360    touchedWindow.pointerIds = pointerIds;
4361}
4362
4363void InputDispatcher::TouchState::removeWindow(const sp<InputWindowHandle>& windowHandle) {
4364    for (size_t i = 0; i < windows.size(); i++) {
4365        if (windows.itemAt(i).windowHandle == windowHandle) {
4366            windows.removeAt(i);
4367            return;
4368        }
4369    }
4370}
4371
4372void InputDispatcher::TouchState::filterNonAsIsTouchWindows() {
4373    for (size_t i = 0 ; i < windows.size(); ) {
4374        TouchedWindow& window = windows.editItemAt(i);
4375        if (window.targetFlags & (InputTarget::FLAG_DISPATCH_AS_IS
4376                | InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER)) {
4377            window.targetFlags &= ~InputTarget::FLAG_DISPATCH_MASK;
4378            window.targetFlags |= InputTarget::FLAG_DISPATCH_AS_IS;
4379            i += 1;
4380        } else {
4381            windows.removeAt(i);
4382        }
4383    }
4384}
4385
4386sp<InputWindowHandle> InputDispatcher::TouchState::getFirstForegroundWindowHandle() const {
4387    for (size_t i = 0; i < windows.size(); i++) {
4388        const TouchedWindow& window = windows.itemAt(i);
4389        if (window.targetFlags & InputTarget::FLAG_FOREGROUND) {
4390            return window.windowHandle;
4391        }
4392    }
4393    return NULL;
4394}
4395
4396bool InputDispatcher::TouchState::isSlippery() const {
4397    // Must have exactly one foreground window.
4398    bool haveSlipperyForegroundWindow = false;
4399    for (size_t i = 0; i < windows.size(); i++) {
4400        const TouchedWindow& window = windows.itemAt(i);
4401        if (window.targetFlags & InputTarget::FLAG_FOREGROUND) {
4402            if (haveSlipperyForegroundWindow
4403                    || !(window.windowHandle->getInfo()->layoutParamsFlags
4404                            & InputWindowInfo::FLAG_SLIPPERY)) {
4405                return false;
4406            }
4407            haveSlipperyForegroundWindow = true;
4408        }
4409    }
4410    return haveSlipperyForegroundWindow;
4411}
4412
4413
4414// --- InputDispatcherThread ---
4415
4416InputDispatcherThread::InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher) :
4417        Thread(/*canCallJava*/ true), mDispatcher(dispatcher) {
4418}
4419
4420InputDispatcherThread::~InputDispatcherThread() {
4421}
4422
4423bool InputDispatcherThread::threadLoop() {
4424    mDispatcher->dispatchOnce();
4425    return true;
4426}
4427
4428} // namespace android
4429