InputDispatcher.cpp revision 481c1570dc5cdf58265b53f657801709dd05d1df
1b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown/*
2b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Copyright (C) 2010 The Android Open Source Project
3b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *
4b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * you may not use this file except in compliance with the License.
6b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * You may obtain a copy of the License at
7b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *
8b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *
10b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Unless required by applicable law or agreed to in writing, software
11b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * See the License for the specific language governing permissions and
14b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * limitations under the License.
15b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown */
16b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define LOG_TAG "InputDispatcher"
18481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown#define ATRACE_TAG ATRACE_TAG_INPUT
1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//#define LOG_NDEBUG 0
2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Log detailed debug messages about each inbound event notification to the dispatcher.
23349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_INBOUND_EVENT_DETAILS 0
2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Log detailed debug messages about each outbound event processed by the dispatcher.
26349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_OUTBOUND_EVENT_DETAILS 0
2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Log debug messages about the dispatch cycle.
29349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_DISPATCH_CYCLE 0
3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
319c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// Log debug messages about registrations.
32349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_REGISTRATION 0
339c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
347fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown// Log debug messages about input event injection.
35349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#define DEBUG_INJECTION 0
367fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
37b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// Log debug messages about input focus tracking.
38b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#define DEBUG_FOCUS 0
39b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
40b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// Log debug messages about the app switch latency optimization.
41b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#define DEBUG_APP_SWITCH 0
42b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
43a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown// Log debug messages about hover events.
44a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#define DEBUG_HOVER 0
45a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
46b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "InputDispatcher.h"
47b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
48481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown#include <utils/Trace.h>
4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <cutils/log.h>
50b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/PowerManager.h>
5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <stddef.h>
5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <unistd.h>
5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <errno.h>
5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <limits.h>
5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
57f2f487183052865d50c004a835360be1728b5a52Jeff Brown#define INDENT "  "
58f2f487183052865d50c004a835360be1728b5a52Jeff Brown#define INDENT2 "    "
59f2f487183052865d50c004a835360be1728b5a52Jeff Brown
6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
62b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// Default input dispatching timeout if there is no focused application or paused window
63b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// from which to determine an appropriate dispatching timeout.
64b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownconst nsecs_t DEFAULT_INPUT_DISPATCHING_TIMEOUT = 5000 * 1000000LL; // 5 sec
65b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
66b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// Amount of time to allow for all pending events to be processed when an app switch
67b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// key is on the way.  This is used to preempt input dispatch and drop input events
68b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// when an application takes too long to respond and the user has pressed an app switch key.
69b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownconst nsecs_t APP_SWITCH_TIMEOUT = 500 * 1000000LL; // 0.5sec
70b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
71928e054931d357326613c78e62f4d850b7c442ffJeff Brown// Amount of time to allow for an event to be dispatched (measured since its eventTime)
72928e054931d357326613c78e62f4d850b7c442ffJeff Brown// before considering it stale and dropping it.
73928e054931d357326613c78e62f4d850b7c442ffJeff Brownconst nsecs_t STALE_EVENT_TIMEOUT = 10000 * 1000000LL; // 10sec
74928e054931d357326613c78e62f4d850b7c442ffJeff Brown
75d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown// Amount of time to allow touch events to be streamed out to a connection before requiring
76d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown// that the first event be finished.  This value extends the ANR timeout by the specified
77d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown// amount.  For example, if streaming is allowed to get ahead by one second relative to the
78d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown// queue of waiting unfinished events, then ANRs will similarly be delayed by one second.
79d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brownconst nsecs_t STREAM_AHEAD_EVENT_TIMEOUT = 500 * 1000000LL; // 0.5sec
80d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
8146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatic inline nsecs_t now() {
837fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    return systemTime(SYSTEM_TIME_MONOTONIC);
847fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
857fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
86b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownstatic inline const char* toString(bool value) {
87b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return value ? "true" : "false";
88b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
89b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
9001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownstatic inline int32_t getMotionEventActionPointerIndex(int32_t action) {
9101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
9201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
9301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
9401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
9501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownstatic bool isValidKeyAction(int32_t action) {
9601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    switch (action) {
9701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AKEY_EVENT_ACTION_DOWN:
9801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AKEY_EVENT_ACTION_UP:
9901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return true;
10001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    default:
10101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
10201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
10301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
10401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
10501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownstatic bool validateKeyEvent(int32_t action) {
10601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (! isValidKeyAction(action)) {
1073762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Key event has invalid action code 0x%x", action);
10801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
10901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
11001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return true;
11101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
11201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
113b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownstatic bool isValidMotionAction(int32_t action, size_t pointerCount) {
11401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    switch (action & AMOTION_EVENT_ACTION_MASK) {
11501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_DOWN:
11601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_UP:
11701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_CANCEL:
11801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_MOVE:
11901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_OUTSIDE:
120a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    case AMOTION_EVENT_ACTION_HOVER_ENTER:
121cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    case AMOTION_EVENT_ACTION_HOVER_MOVE:
122a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    case AMOTION_EVENT_ACTION_HOVER_EXIT:
12333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    case AMOTION_EVENT_ACTION_SCROLL:
12401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return true;
125b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case AMOTION_EVENT_ACTION_POINTER_DOWN:
126b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case AMOTION_EVENT_ACTION_POINTER_UP: {
127b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        int32_t index = getMotionEventActionPointerIndex(action);
128b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return index >= 0 && size_t(index) < pointerCount;
129b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
13001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    default:
13101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
13201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
13301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
13401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
13501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownstatic bool validateMotionEvent(int32_t action, size_t pointerCount,
136fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        const PointerProperties* pointerProperties) {
137b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (! isValidMotionAction(action, pointerCount)) {
1383762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Motion event has invalid action code 0x%x", action);
13901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
14001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
14101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (pointerCount < 1 || pointerCount > MAX_POINTERS) {
1423762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Motion event has invalid pointer count %d; value must be between 1 and %d.",
14301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                pointerCount, MAX_POINTERS);
14401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
14501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    BitSet32 pointerIdBits;
14701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
148fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        int32_t id = pointerProperties[i].id;
149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (id < 0 || id > MAX_POINTER_ID) {
1503762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Motion event has invalid pointer id %d; value must be between 0 and %d",
151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                    id, MAX_POINTER_ID);
15201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            return false;
15301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (pointerIdBits.hasBit(id)) {
1553762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Motion event has duplicate pointer id %d", id);
156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            return false;
157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        pointerIdBits.markBit(id);
15901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
16001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return true;
16101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
16201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
163fbf097732137a32930d151f7ba6816a5b870c32aJeff Brownstatic void dumpRegion(String8& dump, const SkRegion& region) {
164fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    if (region.isEmpty()) {
165fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        dump.append("<empty>");
166fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        return;
167fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    }
168fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
169fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    bool first = true;
170fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    for (SkRegion::Iterator it(region); !it.done(); it.next()) {
171fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        if (first) {
172fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            first = false;
173fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        } else {
174fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            dump.append("|");
175fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        }
176fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        const SkIRect& rect = it.rect();
177fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        dump.appendFormat("[%d,%d][%d,%d]", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
178fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    }
179fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown}
180fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
181b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
18246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// --- InputDispatcher ---
18346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownInputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) :
185b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mPolicy(policy),
186928e054931d357326613c78e62f4d850b7c442ffJeff Brown    mPendingEvent(NULL), mAppSwitchSawKeyDown(false), mAppSwitchDueTime(LONG_LONG_MAX),
187928e054931d357326613c78e62f4d850b7c442ffJeff Brown    mNextUnblockedEvent(NULL),
1880029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    mDispatchEnabled(true), mDispatchFrozen(false), mInputFilterEnabled(false),
1899302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    mInputTargetWaitCause(INPUT_TARGET_WAIT_CAUSE_NONE) {
1904fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper = new Looper(false);
19146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
19246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mKeyRepeatState.lastKeyEntry = NULL;
1939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
194214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    policy->getDispatcherConfiguration(&mConfig);
19546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
19646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
19746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputDispatcher::~InputDispatcher() {
198b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    { // acquire lock
199b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        AutoMutex _l(mLock);
20046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
201b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        resetKeyRepeatLocked();
20254a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        releasePendingEventLocked();
203b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        drainInboundQueueLocked();
20446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
20546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
206cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    while (mConnectionsByFd.size() != 0) {
207cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        unregisterInputChannel(mConnectionsByFd.valueAt(0)->inputChannel);
20846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
20946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
21046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
21146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid InputDispatcher::dispatchOnce() {
21246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    nsecs_t nextWakeupTime = LONG_LONG_MAX;
21346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
21446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        AutoMutex _l(mLock);
215112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown        mDispatcherIsAliveCondition.broadcast();
216112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown
217214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        dispatchOnceInnerLocked(&nextWakeupTime);
21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
219b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (runCommandsLockedInterruptible()) {
220b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            nextWakeupTime = LONG_LONG_MIN;  // force next poll to wake up immediately
221b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
222b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } // release lock
223b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
224b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Wait for callback or timeout or wake.  (make sure we round up, not down)
225b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    nsecs_t currentTime = now();
226aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    int timeoutMillis = toMillisecondTimeoutDelay(currentTime, nextWakeupTime);
2274fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->pollOnce(timeoutMillis);
228b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
229b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
230214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid InputDispatcher::dispatchOnceInnerLocked(nsecs_t* nextWakeupTime) {
231b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    nsecs_t currentTime = now();
232b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
233b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Reset the key repeat timer whenever we disallow key events, even if the next event
234b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // is not a key.  This is to ensure that we abort a key repeat if the device is just coming
235b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // out of sleep.
236214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    if (!mPolicy->isKeyRepeatEnabled()) {
237b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        resetKeyRepeatLocked();
238b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
239b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
240b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // If dispatching is frozen, do not process timeouts or try to deliver any new events.
241b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mDispatchFrozen) {
242b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
2435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dispatch frozen.  Waiting some more.");
244b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
245b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return;
246b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
24746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
248b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Optimize latency of app switches.
249b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Essentially we start a short timeout when an app switch key (HOME / ENDCALL) has
250b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // been pressed.  When it expires, we preempt dispatch and drop all other pending events.
251b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool isAppSwitchDue = mAppSwitchDueTime <= currentTime;
252b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mAppSwitchDueTime < *nextWakeupTime) {
253b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        *nextWakeupTime = mAppSwitchDueTime;
254b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
25546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
256b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Ready to start a new event.
257b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // If we don't already have a pending event, go grab one.
258b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (! mPendingEvent) {
259b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mInboundQueue.isEmpty()) {
260b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            if (isAppSwitchDue) {
261b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // The inbound queue is empty so the app switch key we were waiting
262b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // for will never arrive.  Stop waiting for it.
263b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetPendingAppSwitchLocked(false);
264b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                isAppSwitchDue = false;
265b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
266b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
267b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            // Synthesize a key repeat if appropriate.
268b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            if (mKeyRepeatState.lastKeyEntry) {
269b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                if (currentTime >= mKeyRepeatState.nextRepeatTime) {
270214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                    mPendingEvent = synthesizeKeyRepeatLocked(currentTime);
271b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                } else {
272b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    if (mKeyRepeatState.nextRepeatTime < *nextWakeupTime) {
273b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                        *nextWakeupTime = mKeyRepeatState.nextRepeatTime;
27446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    }
27546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
276b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
277cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
278cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // Nothing to do if there is no pending event.
279e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            if (!mPendingEvent) {
280b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                return;
281b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
282b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        } else {
283b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            // Inbound queue has at least one entry.
284e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            mPendingEvent = mInboundQueue.dequeueAtHead();
285481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            traceInboundQueueLengthLocked();
286b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
287e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown
288e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown        // Poke user activity for this event.
289e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown        if (mPendingEvent->policyFlags & POLICY_FLAG_PASS_TO_USER) {
290e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown            pokeUserActivityLocked(mPendingEvent);
291e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown        }
292e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown
293e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        // Get ready to dispatch the event.
294e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        resetANRTimeoutsLocked();
295b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
29646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
297b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Now we have an event to dispatch.
298928e054931d357326613c78e62f4d850b7c442ffJeff Brown    // All events are eventually dequeued and processed this way, even if we intend to drop them.
299ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block    ALOG_ASSERT(mPendingEvent != NULL);
30054a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown    bool done = false;
301b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    DropReason dropReason = DROP_REASON_NOT_DROPPED;
302b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (!(mPendingEvent->policyFlags & POLICY_FLAG_PASS_TO_USER)) {
303b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        dropReason = DROP_REASON_POLICY;
304b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    } else if (!mDispatchEnabled) {
305b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        dropReason = DROP_REASON_DISABLED;
306b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
307928e054931d357326613c78e62f4d850b7c442ffJeff Brown
308928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (mNextUnblockedEvent == mPendingEvent) {
309928e054931d357326613c78e62f4d850b7c442ffJeff Brown        mNextUnblockedEvent = NULL;
310928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
311928e054931d357326613c78e62f4d850b7c442ffJeff Brown
312b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    switch (mPendingEvent->type) {
313b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    case EventEntry::TYPE_CONFIGURATION_CHANGED: {
314b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        ConfigurationChangedEntry* typedEntry =
315b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                static_cast<ConfigurationChangedEntry*>(mPendingEvent);
31654a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        done = dispatchConfigurationChangedLocked(currentTime, typedEntry);
317b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        dropReason = DROP_REASON_NOT_DROPPED; // configuration changes are never dropped
318b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
319b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
32046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
32165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    case EventEntry::TYPE_DEVICE_RESET: {
32265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        DeviceResetEntry* typedEntry =
32365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                static_cast<DeviceResetEntry*>(mPendingEvent);
32465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        done = dispatchDeviceResetLocked(currentTime, typedEntry);
32565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        dropReason = DROP_REASON_NOT_DROPPED; // device resets are never dropped
32665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        break;
32765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
32865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
329b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    case EventEntry::TYPE_KEY: {
330b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        KeyEntry* typedEntry = static_cast<KeyEntry*>(mPendingEvent);
331b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (isAppSwitchDue) {
332b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            if (isAppSwitchKeyEventLocked(typedEntry)) {
333b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetPendingAppSwitchLocked(true);
334b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                isAppSwitchDue = false;
335b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            } else if (dropReason == DROP_REASON_NOT_DROPPED) {
336b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                dropReason = DROP_REASON_APP_SWITCH;
337b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
338b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
339928e054931d357326613c78e62f4d850b7c442ffJeff Brown        if (dropReason == DROP_REASON_NOT_DROPPED
340928e054931d357326613c78e62f4d850b7c442ffJeff Brown                && isStaleEventLocked(currentTime, typedEntry)) {
341928e054931d357326613c78e62f4d850b7c442ffJeff Brown            dropReason = DROP_REASON_STALE;
342928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
343928e054931d357326613c78e62f4d850b7c442ffJeff Brown        if (dropReason == DROP_REASON_NOT_DROPPED && mNextUnblockedEvent) {
344928e054931d357326613c78e62f4d850b7c442ffJeff Brown            dropReason = DROP_REASON_BLOCKED;
345928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
346214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        done = dispatchKeyLocked(currentTime, typedEntry, &dropReason, nextWakeupTime);
347b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
348b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
34946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
350b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    case EventEntry::TYPE_MOTION: {
351b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        MotionEntry* typedEntry = static_cast<MotionEntry*>(mPendingEvent);
352b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (dropReason == DROP_REASON_NOT_DROPPED && isAppSwitchDue) {
353b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            dropReason = DROP_REASON_APP_SWITCH;
354b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
355928e054931d357326613c78e62f4d850b7c442ffJeff Brown        if (dropReason == DROP_REASON_NOT_DROPPED
356928e054931d357326613c78e62f4d850b7c442ffJeff Brown                && isStaleEventLocked(currentTime, typedEntry)) {
357928e054931d357326613c78e62f4d850b7c442ffJeff Brown            dropReason = DROP_REASON_STALE;
358928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
359928e054931d357326613c78e62f4d850b7c442ffJeff Brown        if (dropReason == DROP_REASON_NOT_DROPPED && mNextUnblockedEvent) {
360928e054931d357326613c78e62f4d850b7c442ffJeff Brown            dropReason = DROP_REASON_BLOCKED;
361928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
362b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        done = dispatchMotionLocked(currentTime, typedEntry,
363e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown                &dropReason, nextWakeupTime);
364b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
365b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3669c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
367b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    default:
368ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(false);
369b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
370b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
371ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown
37254a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown    if (done) {
373b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (dropReason != DROP_REASON_NOT_DROPPED) {
374b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            dropInboundEventLocked(mPendingEvent, dropReason);
375b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
376b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
37754a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        releasePendingEventLocked();
378b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        *nextWakeupTime = LONG_LONG_MIN;  // force next poll to wake up immediately
379b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
380b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
382b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool InputDispatcher::enqueueInboundEventLocked(EventEntry* entry) {
383b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool needWake = mInboundQueue.isEmpty();
384b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mInboundQueue.enqueueAtTail(entry);
385481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceInboundQueueLengthLocked();
38646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
387b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    switch (entry->type) {
388b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case EventEntry::TYPE_KEY: {
389928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // Optimize app switch latency.
390928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // If the application takes too long to catch up then we drop all events preceding
391928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // the app switch key.
392b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        KeyEntry* keyEntry = static_cast<KeyEntry*>(entry);
393b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (isAppSwitchKeyEventLocked(keyEntry)) {
394b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            if (keyEntry->action == AKEY_EVENT_ACTION_DOWN) {
395b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                mAppSwitchSawKeyDown = true;
396b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            } else if (keyEntry->action == AKEY_EVENT_ACTION_UP) {
397b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                if (mAppSwitchSawKeyDown) {
398b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_APP_SWITCH
3995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("App switch is pending!");
400b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
401b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    mAppSwitchDueTime = keyEntry->eventTime + APP_SWITCH_TIMEOUT;
402b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    mAppSwitchSawKeyDown = false;
403b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    needWake = true;
404b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                }
405b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            }
406b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
407b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
4089c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
409928e054931d357326613c78e62f4d850b7c442ffJeff Brown
410928e054931d357326613c78e62f4d850b7c442ffJeff Brown    case EventEntry::TYPE_MOTION: {
411928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // Optimize case where the current application is unresponsive and the user
412928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // decides to touch a window in a different application.
413928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // If the application takes too long to catch up then we drop all events preceding
414928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // the touch into the other window.
415928e054931d357326613c78e62f4d850b7c442ffJeff Brown        MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
41633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        if (motionEntry->action == AMOTION_EVENT_ACTION_DOWN
417928e054931d357326613c78e62f4d850b7c442ffJeff Brown                && (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER)
418928e054931d357326613c78e62f4d850b7c442ffJeff Brown                && mInputTargetWaitCause == INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY
4199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                && mInputTargetWaitApplicationHandle != NULL) {
4203241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            int32_t x = int32_t(motionEntry->pointerCoords[0].
421ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                    getAxisValue(AMOTION_EVENT_AXIS_X));
4223241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            int32_t y = int32_t(motionEntry->pointerCoords[0].
423ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                    getAxisValue(AMOTION_EVENT_AXIS_Y));
4249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> touchedWindowHandle = findTouchedWindowAtLocked(x, y);
4259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (touchedWindowHandle != NULL
4269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    && touchedWindowHandle->inputApplicationHandle
4279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                            != mInputTargetWaitApplicationHandle) {
428928e054931d357326613c78e62f4d850b7c442ffJeff Brown                // User touched a different application than the one we are waiting on.
429928e054931d357326613c78e62f4d850b7c442ffJeff Brown                // Flag the event, and start pruning the input queue.
430928e054931d357326613c78e62f4d850b7c442ffJeff Brown                mNextUnblockedEvent = motionEntry;
431928e054931d357326613c78e62f4d850b7c442ffJeff Brown                needWake = true;
432928e054931d357326613c78e62f4d850b7c442ffJeff Brown            }
433928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
434928e054931d357326613c78e62f4d850b7c442ffJeff Brown        break;
435928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
436b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
4379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
438b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return needWake;
439b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
440b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
4419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownsp<InputWindowHandle> InputDispatcher::findTouchedWindowAtLocked(int32_t x, int32_t y) {
442928e054931d357326613c78e62f4d850b7c442ffJeff Brown    // Traverse windows from front to back to find touched window.
4439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = mWindowHandles.size();
444928e054931d357326613c78e62f4d850b7c442ffJeff Brown    for (size_t i = 0; i < numWindows; i++) {
4459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
446cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const InputWindowInfo* windowInfo = windowHandle->getInfo();
447cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        int32_t flags = windowInfo->layoutParamsFlags;
448cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
449cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (windowInfo->visible) {
450cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (!(flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
451cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                bool isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
452cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
453cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
454928e054931d357326613c78e62f4d850b7c442ffJeff Brown                    // Found window.
4559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    return windowHandle;
456928e054931d357326613c78e62f4d850b7c442ffJeff Brown                }
457928e054931d357326613c78e62f4d850b7c442ffJeff Brown            }
458928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
459928e054931d357326613c78e62f4d850b7c442ffJeff Brown
460cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
461928e054931d357326613c78e62f4d850b7c442ffJeff Brown            // Error window is on top but not visible, so touch is dropped.
462928e054931d357326613c78e62f4d850b7c442ffJeff Brown            return NULL;
463928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
464928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
465928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return NULL;
466928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
467928e054931d357326613c78e62f4d850b7c442ffJeff Brown
468b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::dropInboundEventLocked(EventEntry* entry, DropReason dropReason) {
469b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    const char* reason;
470b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    switch (dropReason) {
471b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case DROP_REASON_POLICY:
472e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
4735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropped event because policy consumed it.");
474e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#endif
4753122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        reason = "inbound event was dropped because the policy consumed it";
476b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
477b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case DROP_REASON_DISABLED:
4786215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropped event because input dispatch is disabled.");
479b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        reason = "inbound event was dropped because input dispatch is disabled";
480b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
481b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case DROP_REASON_APP_SWITCH:
4826215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropped event because of pending overdue app switch.");
483b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        reason = "inbound event was dropped because of pending overdue app switch";
484b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
485928e054931d357326613c78e62f4d850b7c442ffJeff Brown    case DROP_REASON_BLOCKED:
4866215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropped event because the current application is not responding and the user "
4878134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "has started interacting with a different application.");
488928e054931d357326613c78e62f4d850b7c442ffJeff Brown        reason = "inbound event was dropped because the current application is not responding "
4898134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "and the user has started interacting with a different application";
490928e054931d357326613c78e62f4d850b7c442ffJeff Brown        break;
491928e054931d357326613c78e62f4d850b7c442ffJeff Brown    case DROP_REASON_STALE:
4926215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropped event because it is stale.");
493928e054931d357326613c78e62f4d850b7c442ffJeff Brown        reason = "inbound event was dropped because it is stale";
494928e054931d357326613c78e62f4d850b7c442ffJeff Brown        break;
495b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    default:
496ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(false);
497b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return;
498b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
499b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
500b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    switch (entry->type) {
501da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case EventEntry::TYPE_KEY: {
502da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, reason);
503da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        synthesizeCancelationEventsForAllConnectionsLocked(options);
504b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
505da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
506b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case EventEntry::TYPE_MOTION: {
507b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
508b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER) {
509da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS, reason);
510da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            synthesizeCancelationEventsForAllConnectionsLocked(options);
511b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        } else {
512da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, reason);
513da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            synthesizeCancelationEventsForAllConnectionsLocked(options);
514b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
515b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
516b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
517b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
518b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
519b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
520b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownbool InputDispatcher::isAppSwitchKeyCode(int32_t keyCode) {
521b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return keyCode == AKEYCODE_HOME || keyCode == AKEYCODE_ENDCALL;
522b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
523b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
524b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownbool InputDispatcher::isAppSwitchKeyEventLocked(KeyEntry* keyEntry) {
525b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    return ! (keyEntry->flags & AKEY_EVENT_FLAG_CANCELED)
526b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            && isAppSwitchKeyCode(keyEntry->keyCode)
527e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown            && (keyEntry->policyFlags & POLICY_FLAG_TRUSTED)
528b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            && (keyEntry->policyFlags & POLICY_FLAG_PASS_TO_USER);
529b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
530b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
531b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownbool InputDispatcher::isAppSwitchPendingLocked() {
532b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    return mAppSwitchDueTime != LONG_LONG_MAX;
533b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
534b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
535b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::resetPendingAppSwitchLocked(bool handled) {
536b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mAppSwitchDueTime = LONG_LONG_MAX;
537b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
538b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_APP_SWITCH
539b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (handled) {
5405baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("App switch has arrived.");
541b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
5425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("App switch was abandoned.");
543b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
544b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
54546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
54646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
547928e054931d357326613c78e62f4d850b7c442ffJeff Brownbool InputDispatcher::isStaleEventLocked(nsecs_t currentTime, EventEntry* entry) {
548928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return currentTime - entry->eventTime >= STALE_EVENT_TIMEOUT;
549928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
550928e054931d357326613c78e62f4d850b7c442ffJeff Brown
5519c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownbool InputDispatcher::runCommandsLockedInterruptible() {
5529c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    if (mCommandQueue.isEmpty()) {
5539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return false;
5549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
5559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5569c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    do {
5579c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        CommandEntry* commandEntry = mCommandQueue.dequeueAtHead();
5589c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        Command command = commandEntry->command;
5609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        (this->*command)(commandEntry); // commands are implicitly 'LockedInterruptible'
5619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5627fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        commandEntry->connection.clear();
563ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        delete commandEntry;
5649c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    } while (! mCommandQueue.isEmpty());
5659c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    return true;
5669c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
5679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownInputDispatcher::CommandEntry* InputDispatcher::postCommandLocked(Command command) {
569ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    CommandEntry* commandEntry = new CommandEntry(command);
5709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    mCommandQueue.enqueueAtTail(commandEntry);
5719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    return commandEntry;
5729c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
5739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
574b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::drainInboundQueueLocked() {
575b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    while (! mInboundQueue.isEmpty()) {
576b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        EventEntry* entry = mInboundQueue.dequeueAtHead();
57754a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        releaseInboundEventLocked(entry);
578b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
579481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceInboundQueueLengthLocked();
580b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
5819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
58254a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brownvoid InputDispatcher::releasePendingEventLocked() {
583b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mPendingEvent) {
584e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        resetANRTimeoutsLocked();
58554a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        releaseInboundEventLocked(mPendingEvent);
586b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        mPendingEvent = NULL;
587b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
58846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
58946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
59054a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brownvoid InputDispatcher::releaseInboundEventLocked(EventEntry* entry) {
59101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionState* injectionState = entry->injectionState;
59201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState && injectionState->injectionResult == INPUT_EVENT_INJECTION_PENDING) {
593b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_DISPATCH_CYCLE
5945baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Injected inbound event was dropped.");
59546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
596b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        setInjectionResultLocked(entry, INPUT_EVENT_INJECTION_FAILED);
59746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
598abb4d446a10b2defd342b1a2fa6462b52b82cdefJeff Brown    if (entry == mNextUnblockedEvent) {
599abb4d446a10b2defd342b1a2fa6462b52b82cdefJeff Brown        mNextUnblockedEvent = NULL;
600abb4d446a10b2defd342b1a2fa6462b52b82cdefJeff Brown    }
601ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    entry->release();
602b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
60346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
604b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::resetKeyRepeatLocked() {
605b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mKeyRepeatState.lastKeyEntry) {
606ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        mKeyRepeatState.lastKeyEntry->release();
607b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        mKeyRepeatState.lastKeyEntry = NULL;
608b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
609b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
610b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
611214eaf48878bba00cbd5831871bcbd82632b6e34Jeff BrownInputDispatcher::KeyEntry* InputDispatcher::synthesizeKeyRepeatLocked(nsecs_t currentTime) {
612349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    KeyEntry* entry = mKeyRepeatState.lastKeyEntry;
613349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
614349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Reuse the repeated key entry if it is otherwise unreferenced.
615e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    uint32_t policyFlags = (entry->policyFlags & POLICY_FLAG_RAW_MASK)
616e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown            | POLICY_FLAG_PASS_TO_USER | POLICY_FLAG_TRUSTED;
61746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (entry->refCount == 1) {
618ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        entry->recycle();
6197fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        entry->eventTime = currentTime;
6207fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        entry->policyFlags = policyFlags;
62146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        entry->repeatCount += 1;
62246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } else {
623ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        KeyEntry* newEntry = new KeyEntry(currentTime,
624c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                entry->deviceId, entry->source, policyFlags,
6257fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                entry->action, entry->flags, entry->keyCode, entry->scanCode,
62600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                entry->metaState, entry->repeatCount + 1, entry->downTime);
62746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
62846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mKeyRepeatState.lastKeyEntry = newEntry;
629ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        entry->release();
63046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
63146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        entry = newEntry;
63246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
633b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    entry->syntheticRepeat = true;
634b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
635b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Increment reference count since we keep a reference to the event in
636b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // mKeyRepeatState.lastKeyEntry in addition to the one we return.
637b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    entry->refCount += 1;
63846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
639214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    mKeyRepeatState.nextRepeatTime = currentTime + mConfig.keyRepeatDelay;
640b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return entry;
641b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
642b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
643b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool InputDispatcher::dispatchConfigurationChangedLocked(
644b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        nsecs_t currentTime, ConfigurationChangedEntry* entry) {
645b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
6465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("dispatchConfigurationChanged - eventTime=%lld", entry->eventTime);
647b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
648b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
649b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Reset key repeating in case a keyboard device was added or removed or something.
650b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    resetKeyRepeatLocked();
651b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
652b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Enqueue a command to run outside the lock to tell the policy that the configuration changed.
653b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    CommandEntry* commandEntry = postCommandLocked(
654b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            & InputDispatcher::doNotifyConfigurationChangedInterruptible);
655b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    commandEntry->eventTime = entry->eventTime;
656b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return true;
657b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
65846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
65965fd251c3913fc921468a3dad190810db19eb9dfJeff Brownbool InputDispatcher::dispatchDeviceResetLocked(
66065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        nsecs_t currentTime, DeviceResetEntry* entry) {
66165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
6625baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("dispatchDeviceReset - eventTime=%lld, deviceId=%d", entry->eventTime, entry->deviceId);
66365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown#endif
66465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
66565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS,
66665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            "device was reset");
66765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    options.deviceId = entry->deviceId;
66865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    synthesizeCancelationEventsForAllConnectionsLocked(options);
66965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    return true;
67065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
67165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
672214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownbool InputDispatcher::dispatchKeyLocked(nsecs_t currentTime, KeyEntry* entry,
673e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        DropReason* dropReason, nsecs_t* nextWakeupTime) {
674b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Preprocessing.
675b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (! entry->dispatchInProgress) {
676b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (entry->repeatCount == 0
677b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                && entry->action == AKEY_EVENT_ACTION_DOWN
678e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown                && (entry->policyFlags & POLICY_FLAG_TRUSTED)
6790029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                && (!(entry->policyFlags & POLICY_FLAG_DISABLE_KEY_REPEAT))) {
680b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            if (mKeyRepeatState.lastKeyEntry
681b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    && mKeyRepeatState.lastKeyEntry->keyCode == entry->keyCode) {
682b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // We have seen two identical key downs in a row which indicates that the device
683b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // driver is automatically generating key repeats itself.  We take note of the
684b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // repeat here, but we disable our own next key repeat timer since it is clear that
685b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // we will not need to synthesize key repeats ourselves.
686b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                entry->repeatCount = mKeyRepeatState.lastKeyEntry->repeatCount + 1;
687b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetKeyRepeatLocked();
688b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                mKeyRepeatState.nextRepeatTime = LONG_LONG_MAX; // don't generate repeats ourselves
689b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            } else {
690b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // Not a repeat.  Save key down state in case we do see a repeat later.
691b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetKeyRepeatLocked();
692214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                mKeyRepeatState.nextRepeatTime = entry->eventTime + mConfig.keyRepeatTimeout;
693b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
694b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mKeyRepeatState.lastKeyEntry = entry;
695b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            entry->refCount += 1;
696b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        } else if (! entry->syntheticRepeat) {
697b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            resetKeyRepeatLocked();
698b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
699b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
700e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown        if (entry->repeatCount == 1) {
701e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown            entry->flags |= AKEY_EVENT_FLAG_LONG_PRESS;
702e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown        } else {
703e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown            entry->flags &= ~AKEY_EVENT_FLAG_LONG_PRESS;
704e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown        }
705e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown
706b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        entry->dispatchInProgress = true;
707e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
708e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        logOutboundKeyDetailsLocked("dispatchKey - ", entry);
709e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    }
710e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
711905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    // Handle case where the policy asked us to try again later last time.
712905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER) {
713905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        if (currentTime < entry->interceptKeyWakeupTime) {
714905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            if (entry->interceptKeyWakeupTime < *nextWakeupTime) {
715905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown                *nextWakeupTime = entry->interceptKeyWakeupTime;
716905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            }
717905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            return false; // wait until next wakeup
718905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        }
719905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
720905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyWakeupTime = 0;
721905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    }
722905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown
723e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    // Give the policy a chance to intercept the key.
724e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN) {
725e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        if (entry->policyFlags & POLICY_FLAG_PASS_TO_USER) {
726e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            CommandEntry* commandEntry = postCommandLocked(
727e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown                    & InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible);
7289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (mFocusedWindowHandle != NULL) {
7299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                commandEntry->inputWindowHandle = mFocusedWindowHandle;
730e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            }
731e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            commandEntry->keyEntry = entry;
732e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            entry->refCount += 1;
733e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            return false; // wait for the command to run
734e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        } else {
735e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_CONTINUE;
736e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        }
737e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    } else if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_SKIP) {
738e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        if (*dropReason == DROP_REASON_NOT_DROPPED) {
739e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            *dropReason = DROP_REASON_POLICY;
740e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        }
741e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    }
742e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
743e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    // Clean up if dropping the event.
744e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    if (*dropReason != DROP_REASON_NOT_DROPPED) {
745e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY
746e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown                ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED);
747e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        return true;
748b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
749b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
750b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Identify targets.
751e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    Vector<InputTarget> inputTargets;
752e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    int32_t injectionResult = findFocusedWindowTargetsLocked(currentTime,
753e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            entry, inputTargets, nextWakeupTime);
754e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (injectionResult == INPUT_EVENT_INJECTION_PENDING) {
755e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        return false;
756e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    }
757b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
758e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    setInjectionResultLocked(entry, injectionResult);
759e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (injectionResult != INPUT_EVENT_INJECTION_SUCCEEDED) {
760e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        return true;
761b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
762b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
763e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    addMonitoringTargetsLocked(inputTargets);
764e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown
765b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Dispatch the key.
766e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    dispatchEventLocked(currentTime, entry, inputTargets);
767b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return true;
768b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
769b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
770b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::logOutboundKeyDetailsLocked(const char* prefix, const KeyEntry* entry) {
77146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
7725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("%seventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
77346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "action=0x%x, flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, "
774e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            "repeatCount=%d, downTime=%lld",
775b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            prefix,
776c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
77746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            entry->action, entry->flags, entry->keyCode, entry->scanCode, entry->metaState,
778e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            entry->repeatCount, entry->downTime);
77946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
780b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
781b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
782b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool InputDispatcher::dispatchMotionLocked(
783e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        nsecs_t currentTime, MotionEntry* entry, DropReason* dropReason, nsecs_t* nextWakeupTime) {
784e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    // Preprocessing.
785e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    if (! entry->dispatchInProgress) {
786e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        entry->dispatchInProgress = true;
787e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
788e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        logOutboundMotionDetailsLocked("dispatchMotion - ", entry);
789e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    }
790e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
79154a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown    // Clean up if dropping the event.
792e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    if (*dropReason != DROP_REASON_NOT_DROPPED) {
7933122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY
7943122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown                ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED);
79554a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        return true;
79654a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown    }
79754a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown
798b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool isPointerEvent = entry->source & AINPUT_SOURCE_CLASS_POINTER;
799b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
800b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Identify targets.
801e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    Vector<InputTarget> inputTargets;
80246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
803e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    bool conflictingPointerActions = false;
804e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    int32_t injectionResult;
805e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (isPointerEvent) {
806e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        // Pointer event.  (eg. touchscreen)
807e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        injectionResult = findTouchedWindowTargetsLocked(currentTime,
808e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown                entry, inputTargets, nextWakeupTime, &conflictingPointerActions);
809e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    } else {
810e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        // Non touch event.  (eg. trackball)
811e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        injectionResult = findFocusedWindowTargetsLocked(currentTime,
812e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown                entry, inputTargets, nextWakeupTime);
813e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    }
814e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (injectionResult == INPUT_EVENT_INJECTION_PENDING) {
815e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        return false;
816e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    }
817b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
818e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    setInjectionResultLocked(entry, injectionResult);
819e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (injectionResult != INPUT_EVENT_INJECTION_SUCCEEDED) {
820e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        return true;
821b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
822b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
823e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    addMonitoringTargetsLocked(inputTargets);
824e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown
825b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Dispatch the motion.
826cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    if (conflictingPointerActions) {
827da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
828da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                "conflicting pointer actions");
829da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        synthesizeCancelationEventsForAllConnectionsLocked(options);
830cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    }
831e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    dispatchEventLocked(currentTime, entry, inputTargets);
832b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return true;
83346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
83446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
835b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
836b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::logOutboundMotionDetailsLocked(const char* prefix, const MotionEntry* entry) {
83746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
8385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("%seventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
83985a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            "action=0x%x, flags=0x%x, "
840fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            "metaState=0x%x, buttonState=0x%x, "
841fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            "edgeFlags=0x%x, xPrecision=%f, yPrecision=%f, downTime=%lld",
842b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            prefix,
84385a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
84485a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            entry->action, entry->flags,
845fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            entry->metaState, entry->buttonState,
846fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            entry->edgeFlags, entry->xPrecision, entry->yPrecision,
84746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            entry->downTime);
84846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
84946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    for (uint32_t i = 0; i < entry->pointerCount; i++) {
8505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("  Pointer %d: id=%d, toolType=%d, "
851fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                "x=%f, y=%f, pressure=%f, size=%f, "
85285a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown                "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
8538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                "orientation=%f",
854fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                i, entry->pointerProperties[i].id,
855fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                entry->pointerProperties[i].toolType,
8563241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X),
8573241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y),
8583241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE),
8593241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE),
8603241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR),
8613241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR),
8623241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR),
8633241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR),
8643241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
86546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
86646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
86746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
86846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
869e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brownvoid InputDispatcher::dispatchEventLocked(nsecs_t currentTime,
870e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        EventEntry* eventEntry, const Vector<InputTarget>& inputTargets) {
87146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
8723241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    ALOGD("dispatchEventToCurrentInputTargets");
87346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
87446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
875ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block    ALOG_ASSERT(eventEntry->dispatchInProgress); // should already have been set to true
8769c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
877e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown    pokeUserActivityLocked(eventEntry);
878e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown
879e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    for (size_t i = 0; i < inputTargets.size(); i++) {
880e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        const InputTarget& inputTarget = inputTargets.itemAt(i);
88146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
882519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        ssize_t connectionIndex = getConnectionIndexLocked(inputTarget.inputChannel);
883b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (connectionIndex >= 0) {
884cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
8853241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            prepareDispatchCycleLocked(currentTime, connection, eventEntry, &inputTarget);
886b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        } else {
887b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
8885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Dropping event delivery to target with channel '%s' because it "
889b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    "is no longer registered with the input dispatcher.",
890b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    inputTarget.inputChannel->getName().string());
891b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
892b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
893b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
894b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
895b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
896b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownint32_t InputDispatcher::handleTargetsNotReadyLocked(nsecs_t currentTime,
8979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const EventEntry* entry,
8989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputApplicationHandle>& applicationHandle,
8999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle,
900b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        nsecs_t* nextWakeupTime) {
9019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (applicationHandle == NULL && windowHandle == NULL) {
902b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY) {
903b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
9045baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Waiting for system to become ready for input.");
905b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
906b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY;
907b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitStartTime = currentTime;
908b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitTimeoutTime = LONG_LONG_MAX;
909b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitTimeoutExpired = false;
9109302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputTargetWaitApplicationHandle.clear();
911b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
912b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
913b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) {
914b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
9155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Waiting for application to become ready for input: %s",
9169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    getApplicationWindowLabelLocked(applicationHandle, windowHandle).string());
917b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
918cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            nsecs_t timeout;
919cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (windowHandle != NULL) {
920cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                timeout = windowHandle->getDispatchingTimeout(DEFAULT_INPUT_DISPATCHING_TIMEOUT);
921cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            } else if (applicationHandle != NULL) {
922cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                timeout = applicationHandle->getDispatchingTimeout(
923cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        DEFAULT_INPUT_DISPATCHING_TIMEOUT);
924cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            } else {
925cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                timeout = DEFAULT_INPUT_DISPATCHING_TIMEOUT;
926cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
927b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
928b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY;
929b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitStartTime = currentTime;
930b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitTimeoutTime = currentTime + timeout;
931b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitTimeoutExpired = false;
9329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputTargetWaitApplicationHandle.clear();
933928e054931d357326613c78e62f4d850b7c442ffJeff Brown
9349302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (windowHandle != NULL) {
9359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mInputTargetWaitApplicationHandle = windowHandle->inputApplicationHandle;
936928e054931d357326613c78e62f4d850b7c442ffJeff Brown            }
9379302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (mInputTargetWaitApplicationHandle == NULL && applicationHandle != NULL) {
9389302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mInputTargetWaitApplicationHandle = applicationHandle;
939928e054931d357326613c78e62f4d850b7c442ffJeff Brown            }
940b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
941b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
942b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
943b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mInputTargetWaitTimeoutExpired) {
944b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return INPUT_EVENT_INJECTION_TIMED_OUT;
945b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
946b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
947b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (currentTime >= mInputTargetWaitTimeoutTime) {
9489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        onANRLocked(currentTime, applicationHandle, windowHandle,
9499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                entry->eventTime, mInputTargetWaitStartTime);
9509c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
951b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Force poll loop to wake up immediately on next iteration once we get the
952b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // ANR response back from the policy.
953b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        *nextWakeupTime = LONG_LONG_MIN;
954b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return INPUT_EVENT_INJECTION_PENDING;
955b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
956b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Force poll loop to wake up when timeout is due.
957b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mInputTargetWaitTimeoutTime < *nextWakeupTime) {
958b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            *nextWakeupTime = mInputTargetWaitTimeoutTime;
959b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
960b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return INPUT_EVENT_INJECTION_PENDING;
961b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
962b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
9637fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
964519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownvoid InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout,
965519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        const sp<InputChannel>& inputChannel) {
966b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (newTimeout > 0) {
967b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Extend the timeout.
968b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        mInputTargetWaitTimeoutTime = now() + newTimeout;
969b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
970b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Give up.
971b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        mInputTargetWaitTimeoutExpired = true;
972519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
97301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        // Release the touch targets.
97401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        mTouchState.reset();
9752a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown
976519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        // Input state will not be realistic.  Mark it out of sync.
977dc3e00563ee6400936e3cb82405bb94df0b35078Jeff Brown        if (inputChannel.get()) {
978dc3e00563ee6400936e3cb82405bb94df0b35078Jeff Brown            ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
979dc3e00563ee6400936e3cb82405bb94df0b35078Jeff Brown            if (connectionIndex >= 0) {
980cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown                sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
98100045a7e6fbed88f3325d2bbb048dc96a082078cJeff Brown                if (connection->status == Connection::STATUS_NORMAL) {
982da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS,
98300045a7e6fbed88f3325d2bbb048dc96a082078cJeff Brown                            "application not responding");
984da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                    synthesizeCancelationEventsForConnectionLocked(connection, options);
98500045a7e6fbed88f3325d2bbb048dc96a082078cJeff Brown                }
986dc3e00563ee6400936e3cb82405bb94df0b35078Jeff Brown            }
987519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        }
988349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    }
98946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
99046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
991519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownnsecs_t InputDispatcher::getTimeSpentWaitingForApplicationLocked(
992b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        nsecs_t currentTime) {
993b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mInputTargetWaitCause == INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) {
994b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return currentTime - mInputTargetWaitStartTime;
995b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
996b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return 0;
997b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
998b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
999b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::resetANRTimeoutsLocked() {
1000b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
10015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Resetting ANR timeouts.");
100246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
100346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1004b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Reset input target wait timeout.
1005b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_NONE;
10065ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown    mInputTargetWaitApplicationHandle.clear();
1007b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
100846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
100901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownint32_t InputDispatcher::findFocusedWindowTargetsLocked(nsecs_t currentTime,
1010e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        const EventEntry* entry, Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime) {
1011b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    int32_t injectionResult;
10129c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
1013b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // If there is no currently focused window and no focused application
1014b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // then drop the event.
10159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (mFocusedWindowHandle == NULL) {
10169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mFocusedApplicationHandle != NULL) {
1017b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
10185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Waiting because there is no focused window but there is a "
1019519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown                    "focused application that may eventually add a window: %s.",
10209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    getApplicationWindowLabelLocked(mFocusedApplicationHandle, NULL).string());
1021b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1022b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
10239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mFocusedApplicationHandle, NULL, nextWakeupTime);
1024b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Unresponsive;
1025b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
10267fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
10276215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropping event because there is no focused window or focused application.");
1028b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        injectionResult = INPUT_EVENT_INJECTION_FAILED;
1029b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        goto Failed;
1030349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    }
1031b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1032b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Check permissions.
10339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (! checkInjectionPermission(mFocusedWindowHandle, entry->injectionState)) {
1034b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        injectionResult = INPUT_EVENT_INJECTION_PERMISSION_DENIED;
1035b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        goto Failed;
1036b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1037b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1038b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // If the currently focused window is paused then keep waiting.
1039cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (mFocusedWindowHandle->getInfo()->paused) {
1040b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
10415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Waiting because focused window is paused.");
1042b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1043b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
10449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mFocusedApplicationHandle, mFocusedWindowHandle, nextWakeupTime);
1045b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        goto Unresponsive;
1046b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1047b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1048519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    // If the currently focused window is still working on previous events then keep waiting.
10490952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown    if (!isWindowReadyForMoreInputLocked(currentTime, mFocusedWindowHandle, entry)) {
1050519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown#if DEBUG_FOCUS
10515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Waiting because focused window still processing previous input.");
1052519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown#endif
1053519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
10549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mFocusedApplicationHandle, mFocusedWindowHandle, nextWakeupTime);
1055519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        goto Unresponsive;
1056519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    }
1057519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
1058b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Success!  Output targets.
1059b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
10609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    addWindowTargetLocked(mFocusedWindowHandle,
1061e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            InputTarget::FLAG_FOREGROUND | InputTarget::FLAG_DISPATCH_AS_IS, BitSet32(0),
1062e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            inputTargets);
1063b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1064b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Done.
1065b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownFailed:
1066b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownUnresponsive:
1067519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    nsecs_t timeSpentWaitingForApplication = getTimeSpentWaitingForApplicationLocked(currentTime);
1068519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    updateDispatchStatisticsLocked(currentTime, entry,
1069519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            injectionResult, timeSpentWaitingForApplication);
1070b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
10715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("findFocusedWindow finished: injectionResult=%d, "
1072519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            "timeSpendWaitingForApplication=%0.1fms",
1073519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            injectionResult, timeSpentWaitingForApplication / 1000000.0);
1074b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1075b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return injectionResult;
107646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
107746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
107801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownint32_t InputDispatcher::findTouchedWindowTargetsLocked(nsecs_t currentTime,
1079e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        const MotionEntry* entry, Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime,
1080e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        bool* outConflictingPointerActions) {
1081b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    enum InjectionPermission {
1082b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        INJECTION_PERMISSION_UNKNOWN,
1083b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        INJECTION_PERMISSION_GRANTED,
1084b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        INJECTION_PERMISSION_DENIED
1085b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    };
1086b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1087b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    nsecs_t startTime = now();
1088b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1089b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // For security reasons, we defer updating the touch state until we are sure that
1090b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // event injection will be allowed.
1091b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1092b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // FIXME In the original code, screenWasOff could never be set to true.
1093b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       The reason is that the POLICY_FLAG_WOKE_HERE
1094b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       and POLICY_FLAG_BRIGHT_HERE flags were set only when preprocessing raw
1095b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       EV_KEY, EV_REL and EV_ABS events.  As it happens, the touch event was
1096b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       actually enqueued using the policyFlags that appeared in the final EV_SYN
1097b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       events upon which no preprocessing took place.  So policyFlags was always 0.
1098b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       In the new native input dispatcher we're a bit more careful about event
1099b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       preprocessing so the touches we receive can actually have non-zero policyFlags.
1100b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       Unfortunately we obtain undesirable behavior.
1101b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1102b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       Here's what happens:
1103b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1104b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       When the device dims in anticipation of going to sleep, touches
1105b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       in windows which have FLAG_TOUCHABLE_WHEN_WAKING cause
1106b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       the device to brighten and reset the user activity timer.
1107b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       Touches on other windows (such as the launcher window)
1108b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       are dropped.  Then after a moment, the device goes to sleep.  Oops.
1109b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1110b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       Also notice how screenWasOff was being initialized using POLICY_FLAG_BRIGHT_HERE
1111b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       instead of POLICY_FLAG_WOKE_HERE...
1112b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1113b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool screenWasOff = false; // original policy: policyFlags & POLICY_FLAG_BRIGHT_HERE;
1114b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1115b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    int32_t action = entry->action;
111601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
1117b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1118b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Update the touch state as needed based on the properties of the touch event.
111901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    int32_t injectionResult = INPUT_EVENT_INJECTION_PENDING;
112001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionPermission injectionPermission = INJECTION_PERMISSION_UNKNOWN;
11219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    sp<InputWindowHandle> newHoverWindowHandle;
1122cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown
1123cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    bool isSplit = mTouchState.split;
11242717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown    bool switchedDevice = mTouchState.deviceId >= 0
11252717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown            && (mTouchState.deviceId != entry->deviceId
11262717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown                    || mTouchState.source != entry->source);
1127a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    bool isHoverAction = (maskedAction == AMOTION_EVENT_ACTION_HOVER_MOVE
1128a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            || maskedAction == AMOTION_EVENT_ACTION_HOVER_ENTER
1129a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            || maskedAction == AMOTION_EVENT_ACTION_HOVER_EXIT);
1130a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    bool newGesture = (maskedAction == AMOTION_EVENT_ACTION_DOWN
1131a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            || maskedAction == AMOTION_EVENT_ACTION_SCROLL
1132a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            || isHoverAction);
11338134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    bool wrongDevice = false;
1134a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    if (newGesture) {
1135cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown        bool down = maskedAction == AMOTION_EVENT_ACTION_DOWN;
11368134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (switchedDevice && mTouchState.down && !down) {
11378134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_FOCUS
11385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Dropping event because a pointer for a different device is already down.");
11398134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
1140cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown            mTempTouchState.copyFrom(mTouchState);
11418134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            injectionResult = INPUT_EVENT_INJECTION_FAILED;
11428134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            switchedDevice = false;
11438134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            wrongDevice = true;
11448134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            goto Failed;
1145cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown        }
11468134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        mTempTouchState.reset();
11478134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        mTempTouchState.down = down;
11488134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        mTempTouchState.deviceId = entry->deviceId;
11498134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        mTempTouchState.source = entry->source;
11508134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        isSplit = false;
115101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    } else {
115201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        mTempTouchState.copyFrom(mTouchState);
1153cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    }
1154b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1155a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    if (newGesture || (isSplit && maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN)) {
115633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        /* Case 1: New splittable pointer going down, or need target for hover or scroll. */
1157b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
115801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        int32_t pointerIndex = getMotionEventActionPointerIndex(action);
11593241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        int32_t x = int32_t(entry->pointerCoords[pointerIndex].
1160ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                getAxisValue(AMOTION_EVENT_AXIS_X));
11613241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        int32_t y = int32_t(entry->pointerCoords[pointerIndex].
1162ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                getAxisValue(AMOTION_EVENT_AXIS_Y));
11639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> newTouchedWindowHandle;
11649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> topErrorWindowHandle;
1165a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        bool isTouchModal = false;
1166b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1167b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Traverse windows from front to back to find touched window and outside targets.
11689302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        size_t numWindows = mWindowHandles.size();
1169b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        for (size_t i = 0; i < numWindows; i++) {
11709302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
1171cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            const InputWindowInfo* windowInfo = windowHandle->getInfo();
1172cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            int32_t flags = windowInfo->layoutParamsFlags;
1173b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1174cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
11759302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                if (topErrorWindowHandle == NULL) {
11769302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    topErrorWindowHandle = windowHandle;
1177b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                }
1178b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
1179b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1180cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (windowInfo->visible) {
1181cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (! (flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
1182cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
1183cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                            | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
1184cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
11859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                        if (! screenWasOff
1186cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                                || (flags & InputWindowInfo::FLAG_TOUCHABLE_WHEN_WAKING)) {
11879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                            newTouchedWindowHandle = windowHandle;
1188b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                        }
1189b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                        break; // found touched window, exit window loop
1190b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    }
1191b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                }
1192b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
119301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                if (maskedAction == AMOTION_EVENT_ACTION_DOWN
1194cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        && (flags & InputWindowInfo::FLAG_WATCH_OUTSIDE_TOUCH)) {
1195a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                    int32_t outsideTargetFlags = InputTarget::FLAG_DISPATCH_AS_OUTSIDE;
11969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    if (isWindowObscuredAtPointLocked(windowHandle, x, y)) {
119719dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown                        outsideTargetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
119819dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown                    }
119919dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown
12009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mTempTouchState.addOrUpdateWindow(
12019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                            windowHandle, outsideTargetFlags, BitSet32(0));
1202b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                }
1203b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
1204b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1205b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1206b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // If there is an error window but it is not taking focus (typically because
1207b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // it is invisible) then wait for it.  Any other focused window may in
1208b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // fact be in ANR state.
12099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (topErrorWindowHandle != NULL && newTouchedWindowHandle != topErrorWindowHandle) {
1210b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
12115baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Waiting because system error window is pending.");
121246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
1213b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1214b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    NULL, NULL, nextWakeupTime);
1215b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionPermission = INJECTION_PERMISSION_UNKNOWN;
1216b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Unresponsive;
1217b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
121846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
121901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        // Figure out whether splitting will be allowed for this window.
1220cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (newTouchedWindowHandle != NULL
1221cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                && newTouchedWindowHandle->getInfo()->supportsSplitTouch()) {
122201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // New window supports splitting.
122301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            isSplit = true;
122401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        } else if (isSplit) {
122501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // New window does not support splitting but we have already split events.
122601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // Assign the pointer to the first foreground window we find.
122701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // (May be NULL which is why we put this code block before the next check.)
12289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            newTouchedWindowHandle = mTempTouchState.getFirstForegroundWindowHandle();
122901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
123001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1231b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // If we did not find a touched window then fail.
12329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (newTouchedWindowHandle == NULL) {
12339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (mFocusedApplicationHandle != NULL) {
1234b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
12355baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Waiting because there is no touched window but there is a "
1236519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown                        "focused application that may eventually add a new window: %s.",
12379302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                        getApplicationWindowLabelLocked(mFocusedApplicationHandle, NULL).string());
1238b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1239b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
12409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                        mFocusedApplicationHandle, NULL, nextWakeupTime);
1241b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                goto Unresponsive;
1242b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
12439c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
12446215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block            ALOGI("Dropping event because there is no touched window or focused application.");
1245b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = INPUT_EVENT_INJECTION_FAILED;
1246b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Failed;
1247b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1248b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
124919dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown        // Set target flags.
1250a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        int32_t targetFlags = InputTarget::FLAG_FOREGROUND | InputTarget::FLAG_DISPATCH_AS_IS;
125119dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown        if (isSplit) {
125219dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown            targetFlags |= InputTarget::FLAG_SPLIT;
125319dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown        }
12549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (isWindowObscuredAtPointLocked(newTouchedWindowHandle, x, y)) {
125519dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown            targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
125619dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown        }
125719dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown
1258a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        // Update hover state.
1259a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        if (isHoverAction) {
12609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            newHoverWindowHandle = newTouchedWindowHandle;
1261a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        } else if (maskedAction == AMOTION_EVENT_ACTION_SCROLL) {
12629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            newHoverWindowHandle = mLastHoverWindowHandle;
1263a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        }
1264a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
126501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        // Update the temporary touch state.
126601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        BitSet32 pointerIds;
126701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (isSplit) {
1268fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            uint32_t pointerId = entry->pointerProperties[pointerIndex].id;
126901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            pointerIds.markBit(pointerId);
1270b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
12719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        mTempTouchState.addOrUpdateWindow(newTouchedWindowHandle, targetFlags, pointerIds);
1272b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
127301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        /* Case 2: Pointer move, up, cancel or non-splittable pointer down. */
1274b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1275b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // If the pointer is not currently down, then ignore the event.
127601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (! mTempTouchState.down) {
1277a2cc28d732577dd48a02de637c635e9764400248Jeff Brown#if DEBUG_FOCUS
12785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Dropping event because the pointer is not down or we previously "
127976860e3fe73a791b1b04f33d78b908eb3163b4b2Jeff Brown                    "dropped the pointer down event.");
128076860e3fe73a791b1b04f33d78b908eb3163b4b2Jeff Brown#endif
1281b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = INPUT_EVENT_INJECTION_FAILED;
1282b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Failed;
1283b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
128498db5fabdad86dca379740d8050697950b9f026cJeff Brown
128598db5fabdad86dca379740d8050697950b9f026cJeff Brown        // Check whether touches should slip outside of the current foreground window.
128698db5fabdad86dca379740d8050697950b9f026cJeff Brown        if (maskedAction == AMOTION_EVENT_ACTION_MOVE
128798db5fabdad86dca379740d8050697950b9f026cJeff Brown                && entry->pointerCount == 1
128898db5fabdad86dca379740d8050697950b9f026cJeff Brown                && mTempTouchState.isSlippery()) {
12893241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            int32_t x = int32_t(entry->pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X));
12903241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            int32_t y = int32_t(entry->pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y));
129198db5fabdad86dca379740d8050697950b9f026cJeff Brown
12929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> oldTouchedWindowHandle =
12939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mTempTouchState.getFirstForegroundWindowHandle();
12949302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> newTouchedWindowHandle = findTouchedWindowAtLocked(x, y);
12959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (oldTouchedWindowHandle != newTouchedWindowHandle
12969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    && newTouchedWindowHandle != NULL) {
129798db5fabdad86dca379740d8050697950b9f026cJeff Brown#if DEBUG_FOCUS
12985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Touch is slipping out of window %s into window %s.",
1299cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        oldTouchedWindowHandle->getName().string(),
1300cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        newTouchedWindowHandle->getName().string());
130198db5fabdad86dca379740d8050697950b9f026cJeff Brown#endif
130298db5fabdad86dca379740d8050697950b9f026cJeff Brown                // Make a slippery exit from the old window.
13039302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTempTouchState.addOrUpdateWindow(oldTouchedWindowHandle,
130498db5fabdad86dca379740d8050697950b9f026cJeff Brown                        InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT, BitSet32(0));
130598db5fabdad86dca379740d8050697950b9f026cJeff Brown
130698db5fabdad86dca379740d8050697950b9f026cJeff Brown                // Make a slippery entrance into the new window.
1307cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (newTouchedWindowHandle->getInfo()->supportsSplitTouch()) {
130898db5fabdad86dca379740d8050697950b9f026cJeff Brown                    isSplit = true;
130998db5fabdad86dca379740d8050697950b9f026cJeff Brown                }
131098db5fabdad86dca379740d8050697950b9f026cJeff Brown
131198db5fabdad86dca379740d8050697950b9f026cJeff Brown                int32_t targetFlags = InputTarget::FLAG_FOREGROUND
131298db5fabdad86dca379740d8050697950b9f026cJeff Brown                        | InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER;
131398db5fabdad86dca379740d8050697950b9f026cJeff Brown                if (isSplit) {
131498db5fabdad86dca379740d8050697950b9f026cJeff Brown                    targetFlags |= InputTarget::FLAG_SPLIT;
131598db5fabdad86dca379740d8050697950b9f026cJeff Brown                }
13169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                if (isWindowObscuredAtPointLocked(newTouchedWindowHandle, x, y)) {
131798db5fabdad86dca379740d8050697950b9f026cJeff Brown                    targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
131898db5fabdad86dca379740d8050697950b9f026cJeff Brown                }
131998db5fabdad86dca379740d8050697950b9f026cJeff Brown
132098db5fabdad86dca379740d8050697950b9f026cJeff Brown                BitSet32 pointerIds;
132198db5fabdad86dca379740d8050697950b9f026cJeff Brown                if (isSplit) {
132298db5fabdad86dca379740d8050697950b9f026cJeff Brown                    pointerIds.markBit(entry->pointerProperties[0].id);
132398db5fabdad86dca379740d8050697950b9f026cJeff Brown                }
13249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTempTouchState.addOrUpdateWindow(newTouchedWindowHandle, targetFlags, pointerIds);
132598db5fabdad86dca379740d8050697950b9f026cJeff Brown            }
132698db5fabdad86dca379740d8050697950b9f026cJeff Brown        }
132701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
1328b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
13299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (newHoverWindowHandle != mLastHoverWindowHandle) {
1330a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        // Let the previous window know that the hover sequence is over.
13319302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mLastHoverWindowHandle != NULL) {
1332a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#if DEBUG_HOVER
13335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Sending hover exit event to window %s.",
1334cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    mLastHoverWindowHandle->getName().string());
1335a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#endif
13369302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mTempTouchState.addOrUpdateWindow(mLastHoverWindowHandle,
1337a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                    InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT, BitSet32(0));
1338a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        }
1339a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
1340a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        // Let the new window know that the hover sequence is starting.
13419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (newHoverWindowHandle != NULL) {
1342a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#if DEBUG_HOVER
13435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Sending hover enter event to window %s.",
1344cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    newHoverWindowHandle->getName().string());
1345a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#endif
13469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mTempTouchState.addOrUpdateWindow(newHoverWindowHandle,
1347a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                    InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER, BitSet32(0));
1348a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        }
1349a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    }
1350a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
135101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // Check permission to inject into all touched foreground windows and ensure there
135201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // is at least one touched foreground window.
135301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    {
135401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        bool haveForegroundWindow = false;
135501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
135601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
135701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
135801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                haveForegroundWindow = true;
13599302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                if (! checkInjectionPermission(touchedWindow.windowHandle,
13609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                        entry->injectionState)) {
136101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    injectionResult = INPUT_EVENT_INJECTION_PERMISSION_DENIED;
136201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    injectionPermission = INJECTION_PERMISSION_DENIED;
136301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    goto Failed;
136401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                }
136501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            }
136601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
136701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (! haveForegroundWindow) {
1368a2cc28d732577dd48a02de637c635e9764400248Jeff Brown#if DEBUG_FOCUS
13695baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Dropping event because there is no touched foreground window to receive it.");
1370b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1371b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = INPUT_EVENT_INJECTION_FAILED;
1372b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Failed;
1373b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1374b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
137501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        // Permission granted to injection into all touched foreground windows.
137601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        injectionPermission = INJECTION_PERMISSION_GRANTED;
137701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
137801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
13797a9db181a64e0e752a447c6408639bbb33c412fcKenny Root    // Check whether windows listening for outside touches are owned by the same UID. If it is
13807a9db181a64e0e752a447c6408639bbb33c412fcKenny Root    // set the policy flag that we will not reveal coordinate information to this window.
13817a9db181a64e0e752a447c6408639bbb33c412fcKenny Root    if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
13829302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> foregroundWindowHandle =
13839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTempTouchState.getFirstForegroundWindowHandle();
1384cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const int32_t foregroundWindowUid = foregroundWindowHandle->getInfo()->ownerUid;
13857a9db181a64e0e752a447c6408639bbb33c412fcKenny Root        for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
13867a9db181a64e0e752a447c6408639bbb33c412fcKenny Root            const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
13877a9db181a64e0e752a447c6408639bbb33c412fcKenny Root            if (touchedWindow.targetFlags & InputTarget::FLAG_DISPATCH_AS_OUTSIDE) {
13889302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                sp<InputWindowHandle> inputWindowHandle = touchedWindow.windowHandle;
1389cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (inputWindowHandle->getInfo()->ownerUid != foregroundWindowUid) {
13909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mTempTouchState.addOrUpdateWindow(inputWindowHandle,
13917a9db181a64e0e752a447c6408639bbb33c412fcKenny Root                            InputTarget::FLAG_ZERO_COORDS, BitSet32(0));
13927a9db181a64e0e752a447c6408639bbb33c412fcKenny Root                }
13937a9db181a64e0e752a447c6408639bbb33c412fcKenny Root            }
13947a9db181a64e0e752a447c6408639bbb33c412fcKenny Root        }
13957a9db181a64e0e752a447c6408639bbb33c412fcKenny Root    }
13967a9db181a64e0e752a447c6408639bbb33c412fcKenny Root
139701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // Ensure all touched foreground windows are ready for new input.
139801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
139901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
140001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
140101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // If the touched window is paused then keep waiting.
1402cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (touchedWindow.windowHandle->getInfo()->paused) {
1403a2cc28d732577dd48a02de637c635e9764400248Jeff Brown#if DEBUG_FOCUS
14045baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Waiting because touched window is paused.");
1405b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
140601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
14079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                        NULL, touchedWindow.windowHandle, nextWakeupTime);
140801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                goto Unresponsive;
140901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            }
1410519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
141101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // If the touched window is still working on previous events then keep waiting.
14120952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            if (!isWindowReadyForMoreInputLocked(currentTime, touchedWindow.windowHandle, entry)) {
1413519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown#if DEBUG_FOCUS
14145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Waiting because touched window still processing previous input.");
1415519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown#endif
141601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
14179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                        NULL, touchedWindow.windowHandle, nextWakeupTime);
141801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                goto Unresponsive;
141901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            }
1420519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        }
1421b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1422b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
142301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // If this is the first pointer going down and the touched window has a wallpaper
142401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // then also add the touched wallpaper windows so they are locked in for the duration
142501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // of the touch gesture.
142633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    // We do not collect wallpapers during HOVER_MOVE or SCROLL because the wallpaper
142733bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    // engine only supports touch events.  We would need to add a mechanism similar
142833bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    // to View.onGenericMotionEvent to enable wallpapers to handle these events.
142933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
14309302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> foregroundWindowHandle =
14319302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTempTouchState.getFirstForegroundWindowHandle();
1432cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (foregroundWindowHandle->getInfo()->hasWallpaper) {
14339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            for (size_t i = 0; i < mWindowHandles.size(); i++) {
14349302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
1435cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (windowHandle->getInfo()->layoutParamsType
1436cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        == InputWindowInfo::TYPE_WALLPAPER) {
14379302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mTempTouchState.addOrUpdateWindow(windowHandle,
1438a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                            InputTarget::FLAG_WINDOW_IS_OBSCURED
1439a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                                    | InputTarget::FLAG_DISPATCH_AS_IS,
1440a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                            BitSet32(0));
144101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                }
1442b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
1443b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
144401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
1445b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
144601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // Success!  Output targets.
144701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
144801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
144901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
145001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        const TouchedWindow& touchedWindow = mTempTouchState.windows.itemAt(i);
14519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        addWindowTargetLocked(touchedWindow.windowHandle, touchedWindow.targetFlags,
1452e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown                touchedWindow.pointerIds, inputTargets);
145301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
145401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1455a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    // Drop the outside or hover touch windows since we will not care about them
1456a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    // in the next iteration.
1457a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    mTempTouchState.filterNonAsIsTouchWindows();
145801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1459b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownFailed:
1460b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Check injection permission once and for all.
1461b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (injectionPermission == INJECTION_PERMISSION_UNKNOWN) {
146201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (checkInjectionPermission(NULL, entry->injectionState)) {
1463b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionPermission = INJECTION_PERMISSION_GRANTED;
146446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        } else {
1465b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionPermission = INJECTION_PERMISSION_DENIED;
1466b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1467b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1468b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1469b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Update final pieces of touch state if the injector had permission.
1470b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (injectionPermission == INJECTION_PERMISSION_GRANTED) {
147195712850665492af670824abdba77f0944d984d1Jeff Brown        if (!wrongDevice) {
14728134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            if (switchedDevice) {
14738134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_FOCUS
14745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Conflicting pointer actions: Switched to a different device.");
14758134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
14768134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                *outConflictingPointerActions = true;
14778134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            }
14788134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
14798134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            if (isHoverAction) {
14808134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                // Started hovering, therefore no longer down.
14818134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                if (mTouchState.down) {
14828134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_FOCUS
14835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("Conflicting pointer actions: Hover received while pointer was down.");
14848134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
14858134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    *outConflictingPointerActions = true;
14868134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                }
14878134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                mTouchState.reset();
14888134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                if (maskedAction == AMOTION_EVENT_ACTION_HOVER_ENTER
14898134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                        || maskedAction == AMOTION_EVENT_ACTION_HOVER_MOVE) {
14908134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    mTouchState.deviceId = entry->deviceId;
14918134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    mTouchState.source = entry->source;
14928134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                }
14938134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            } else if (maskedAction == AMOTION_EVENT_ACTION_UP
14948134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    || maskedAction == AMOTION_EVENT_ACTION_CANCEL) {
149595712850665492af670824abdba77f0944d984d1Jeff Brown                // All pointers up or canceled.
149633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mTouchState.reset();
149795712850665492af670824abdba77f0944d984d1Jeff Brown            } else if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
149895712850665492af670824abdba77f0944d984d1Jeff Brown                // First pointer went down.
149995712850665492af670824abdba77f0944d984d1Jeff Brown                if (mTouchState.down) {
1500b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
15015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("Conflicting pointer actions: Down received while already down.");
1502b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
15038134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    *outConflictingPointerActions = true;
150495712850665492af670824abdba77f0944d984d1Jeff Brown                }
150533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mTouchState.copyFrom(mTempTouchState);
150695712850665492af670824abdba77f0944d984d1Jeff Brown            } else if (maskedAction == AMOTION_EVENT_ACTION_POINTER_UP) {
150795712850665492af670824abdba77f0944d984d1Jeff Brown                // One pointer went up.
150895712850665492af670824abdba77f0944d984d1Jeff Brown                if (isSplit) {
150995712850665492af670824abdba77f0944d984d1Jeff Brown                    int32_t pointerIndex = getMotionEventActionPointerIndex(action);
1510fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    uint32_t pointerId = entry->pointerProperties[pointerIndex].id;
151195712850665492af670824abdba77f0944d984d1Jeff Brown
151295712850665492af670824abdba77f0944d984d1Jeff Brown                    for (size_t i = 0; i < mTempTouchState.windows.size(); ) {
151395712850665492af670824abdba77f0944d984d1Jeff Brown                        TouchedWindow& touchedWindow = mTempTouchState.windows.editItemAt(i);
151495712850665492af670824abdba77f0944d984d1Jeff Brown                        if (touchedWindow.targetFlags & InputTarget::FLAG_SPLIT) {
151595712850665492af670824abdba77f0944d984d1Jeff Brown                            touchedWindow.pointerIds.clearBit(pointerId);
151695712850665492af670824abdba77f0944d984d1Jeff Brown                            if (touchedWindow.pointerIds.isEmpty()) {
151795712850665492af670824abdba77f0944d984d1Jeff Brown                                mTempTouchState.windows.removeAt(i);
151895712850665492af670824abdba77f0944d984d1Jeff Brown                                continue;
151995712850665492af670824abdba77f0944d984d1Jeff Brown                            }
152001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                        }
152195712850665492af670824abdba77f0944d984d1Jeff Brown                        i += 1;
152201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    }
152301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                }
152433bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mTouchState.copyFrom(mTempTouchState);
152533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            } else if (maskedAction == AMOTION_EVENT_ACTION_SCROLL) {
152633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                // Discard temporary touch state since it was only valid for this action.
152733bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            } else {
152833bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                // Save changes to touch state as-is for all other actions.
152933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mTouchState.copyFrom(mTempTouchState);
1530b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
1531a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
1532a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            // Update hover state.
15339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mLastHoverWindowHandle = newHoverWindowHandle;
153495712850665492af670824abdba77f0944d984d1Jeff Brown        }
1535b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
153601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#if DEBUG_FOCUS
15375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Not updating touch focus because injection was denied.");
153801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#endif
1539b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1540b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1541b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownUnresponsive:
1542120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    // Reset temporary touch state to ensure we release unnecessary references to input channels.
1543120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    mTempTouchState.reset();
1544120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
1545519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    nsecs_t timeSpentWaitingForApplication = getTimeSpentWaitingForApplicationLocked(currentTime);
1546519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    updateDispatchStatisticsLocked(currentTime, entry,
1547519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            injectionResult, timeSpentWaitingForApplication);
1548b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
15495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("findTouchedWindow finished: injectionResult=%d, injectionPermission=%d, "
155001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            "timeSpentWaitingForApplication=%0.1fms",
1551519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            injectionResult, injectionPermission, timeSpentWaitingForApplication / 1000000.0);
1552b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1553b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return injectionResult;
1554b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1555b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
15569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid InputDispatcher::addWindowTargetLocked(const sp<InputWindowHandle>& windowHandle,
1557e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        int32_t targetFlags, BitSet32 pointerIds, Vector<InputTarget>& inputTargets) {
1558e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    inputTargets.push();
1559b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1560cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    const InputWindowInfo* windowInfo = windowHandle->getInfo();
1561e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    InputTarget& target = inputTargets.editTop();
1562cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    target.inputChannel = windowInfo->inputChannel;
1563b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    target.flags = targetFlags;
1564cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    target.xOffset = - windowInfo->frameLeft;
1565cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    target.yOffset = - windowInfo->frameTop;
1566cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    target.scaleFactor = windowInfo->scaleFactor;
156701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    target.pointerIds = pointerIds;
1568b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1569b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1570e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brownvoid InputDispatcher::addMonitoringTargetsLocked(Vector<InputTarget>& inputTargets) {
1571b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
1572e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        inputTargets.push();
1573b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1574e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        InputTarget& target = inputTargets.editTop();
1575b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        target.inputChannel = mMonitoringChannels[i];
1576b6110c2de0cd7950360aeb2c248a44e4ea5f33f5Jeff Brown        target.flags = InputTarget::FLAG_DISPATCH_AS_IS;
1577b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        target.xOffset = 0;
1578b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        target.yOffset = 0;
1579b6110c2de0cd7950360aeb2c248a44e4ea5f33f5Jeff Brown        target.pointerIds.clear();
1580e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        target.scaleFactor = 1.0f;
1581b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1582b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1583b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
15849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownbool InputDispatcher::checkInjectionPermission(const sp<InputWindowHandle>& windowHandle,
158501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        const InjectionState* injectionState) {
158601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState
1587cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            && (windowHandle == NULL
1588cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    || windowHandle->getInfo()->ownerUid != injectionState->injectorUid)
1589b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            && !hasInjectionPermission(injectionState->injectorPid, injectionState->injectorUid)) {
15909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (windowHandle != NULL) {
15918564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("Permission denied: injecting event from pid %d uid %d to window %s "
15929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    "owned by uid %d",
1593b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    injectionState->injectorPid, injectionState->injectorUid,
1594cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowHandle->getName().string(),
1595cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowHandle->getInfo()->ownerUid);
1596b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        } else {
15978564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("Permission denied: injecting event from pid %d uid %d",
1598b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    injectionState->injectorPid, injectionState->injectorUid);
1599b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1600b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return false;
1601b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1602b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return true;
1603b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1604b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
160519dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brownbool InputDispatcher::isWindowObscuredAtPointLocked(
16069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle, int32_t x, int32_t y) const {
16079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = mWindowHandles.size();
1608b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    for (size_t i = 0; i < numWindows; i++) {
16099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> otherHandle = mWindowHandles.itemAt(i);
16109302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (otherHandle == windowHandle) {
1611b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            break;
1612b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1613cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
1614cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const InputWindowInfo* otherInfo = otherHandle->getInfo();
1615cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (otherInfo->visible && ! otherInfo->isTrustedOverlay()
1616cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                && otherInfo->frameContainsPoint(x, y)) {
1617b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            return true;
161846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
161946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
1620b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return false;
1621b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1622b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1623d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brownbool InputDispatcher::isWindowReadyForMoreInputLocked(nsecs_t currentTime,
16240952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        const sp<InputWindowHandle>& windowHandle, const EventEntry* eventEntry) {
1625cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    ssize_t connectionIndex = getConnectionIndexLocked(windowHandle->getInputChannel());
1626519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    if (connectionIndex >= 0) {
1627cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
1628d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        if (connection->inputPublisherBlocked) {
1629d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            return false;
1630d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
16310952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        if (eventEntry->type == EventEntry::TYPE_KEY) {
16320952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // If the event is a key event, then we must wait for all previous events to
16330952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // complete before delivering it because previous events may have the
16340952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // side-effect of transferring focus to a different window and we want to
16350952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // ensure that the following keys are sent to the new window.
16360952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            //
16370952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // Suppose the user touches a button in a window then immediately presses "A".
16380952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // If the button causes a pop-up window to appear then we want to ensure that
16390952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // the "A" key is delivered to the new pop-up window.  This is because users
16400952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // often anticipate pending UI changes when typing on a keyboard.
16410952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // To obtain this behavior, we must serialize key events with respect to all
16420952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // prior input events.
1643d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            return connection->outboundQueue.isEmpty()
1644d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    && connection->waitQueue.isEmpty();
1645d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
16460952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // Touch events can always be sent to a window immediately because the user intended
16470952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // to touch whatever was visible at the time.  Even if focus changes or a new
16480952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // window appears moments later, the touch event was meant to be delivered to
16490952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // whatever window happened to be on screen at the time.
16500952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        //
16510952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // Generic motion events, such as trackball or joystick events are a little trickier.
16520952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // Like key events, generic motion events are delivered to the focused window.
16530952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // Unlike key events, generic motion events don't tend to transfer focus to other
16540952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // windows and it is not important for them to be serialized.  So we prefer to deliver
16550952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // generic motion events as soon as possible to improve efficiency and reduce lag
16560952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // through batching.
16570952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        //
16580952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // The one case where we pause input event delivery is when the wait queue is piling
16590952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // up with lots of events because the application is not responding.
16600952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // This condition ensures that ANRs are detected reliably.
1661d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        if (!connection->waitQueue.isEmpty()
1662d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                && currentTime >= connection->waitQueue.head->eventEntry->eventTime
1663d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        + STREAM_AHEAD_EVENT_TIMEOUT) {
1664d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            return false;
1665d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
1666519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    }
1667d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    return true;
1668519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown}
1669519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
16709302c8796fc4dcda08d4bd1e11733848fd4fafafJeff BrownString8 InputDispatcher::getApplicationWindowLabelLocked(
16719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputApplicationHandle>& applicationHandle,
16729302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle) {
16739302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (applicationHandle != NULL) {
16749302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (windowHandle != NULL) {
1675cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            String8 label(applicationHandle->getName());
1676519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            label.append(" - ");
1677cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            label.append(windowHandle->getName());
1678519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            return label;
1679519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        } else {
1680cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            return applicationHandle->getName();
1681519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        }
16829302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    } else if (windowHandle != NULL) {
1683cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return windowHandle->getName();
1684519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    } else {
1685519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        return String8("<unknown application or window>");
1686519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    }
1687519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown}
1688519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
1689e2fe69edc009a0e0348e5351cf83062224e011acJeff Brownvoid InputDispatcher::pokeUserActivityLocked(const EventEntry* eventEntry) {
169056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    int32_t eventType = POWER_MANAGER_OTHER_EVENT;
16914d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    switch (eventEntry->type) {
16924d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    case EventEntry::TYPE_MOTION: {
1693e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown        const MotionEntry* motionEntry = static_cast<const MotionEntry*>(eventEntry);
16944d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        if (motionEntry->action == AMOTION_EVENT_ACTION_CANCEL) {
16954d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            return;
16964d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        }
16974d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown
169856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        if (MotionEvent::isTouchEvent(motionEntry->source, motionEntry->action)) {
16991a542c7b8ed0be049869a12d1e01e2604d052ac2Joe Onorato            eventType = POWER_MANAGER_TOUCH_EVENT;
170001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
17014d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        break;
17024d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    }
17034d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    case EventEntry::TYPE_KEY: {
17044d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        const KeyEntry* keyEntry = static_cast<const KeyEntry*>(eventEntry);
17054d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        if (keyEntry->flags & AKEY_EVENT_FLAG_CANCELED) {
17064d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            return;
17074d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        }
170856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        eventType = POWER_MANAGER_BUTTON_EVENT;
17094d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        break;
17104d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    }
171101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
171201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1713b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    CommandEntry* commandEntry = postCommandLocked(
1714b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            & InputDispatcher::doPokeUserActivityLockedInterruptible);
1715e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown    commandEntry->eventTime = eventEntry->eventTime;
1716b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    commandEntry->userActivityEventType = eventType;
171746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
171846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
17197fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownvoid InputDispatcher::prepareDispatchCycleLocked(nsecs_t currentTime,
17203241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget) {
172146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
17225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ prepareDispatchCycle - flags=0x%08x, "
17239cc695c5796cf93b414fd7627eb049b7b57d15beJeff Brown            "xOffset=%f, yOffset=%f, scaleFactor=%f, "
17243241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            "pointerIds=0x%x",
1725519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            connection->getInputChannelName(), inputTarget->flags,
172646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            inputTarget->xOffset, inputTarget->yOffset,
17273241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            inputTarget->scaleFactor, inputTarget->pointerIds.value);
172846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
172946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
173046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Skip this event if the connection status is not normal.
1731519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    // We don't want to enqueue additional outbound events if the connection is broken.
173246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (connection->status != Connection::STATUS_NORMAL) {
1733b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_DISPATCH_CYCLE
17345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("channel '%s' ~ Dropping event because the channel status is %s",
1735b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                connection->getInputChannelName(), connection->getStatusLabel());
1736b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
173746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return;
173846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
173946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
174001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // Split a motion event if needed.
17413241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    if (inputTarget->flags & InputTarget::FLAG_SPLIT) {
1742ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(eventEntry->type == EventEntry::TYPE_MOTION);
174301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
174401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        MotionEntry* originalMotionEntry = static_cast<MotionEntry*>(eventEntry);
174501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (inputTarget->pointerIds.count() != originalMotionEntry->pointerCount) {
174601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            MotionEntry* splitMotionEntry = splitMotionEvent(
174701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    originalMotionEntry, inputTarget->pointerIds);
174858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown            if (!splitMotionEntry) {
174958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown                return; // split event was dropped
175058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown            }
175101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#if DEBUG_FOCUS
17525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("channel '%s' ~ Split motion event.",
175301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    connection->getInputChannelName());
175401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            logOutboundMotionDetailsLocked("  ", splitMotionEntry);
175501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#endif
1756c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            enqueueDispatchEntriesLocked(currentTime, connection,
17573241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    splitMotionEntry, inputTarget);
1758c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            splitMotionEntry->release();
1759c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            return;
176001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
176101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
176201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1763c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    // Not splitting.  Enqueue dispatch entries for the event as is.
17643241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    enqueueDispatchEntriesLocked(currentTime, connection, eventEntry, inputTarget);
1765c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown}
1766c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown
1767c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brownvoid InputDispatcher::enqueueDispatchEntriesLocked(nsecs_t currentTime,
17683241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget) {
176946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    bool wasEmpty = connection->outboundQueue.isEmpty();
177046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1771a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    // Enqueue dispatch entries for the requested modes.
1772a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
17733241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT);
1774a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
17753241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_OUTSIDE);
1776a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
17773241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER);
1778a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
17793241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_IS);
178098db5fabdad86dca379740d8050697950b9f026cJeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
17813241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT);
178298db5fabdad86dca379740d8050697950b9f026cJeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
17833241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER);
1784a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
1785a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    // If the outbound queue was previously empty, start the dispatch cycle going.
1786b6110c2de0cd7950360aeb2c248a44e4ea5f33f5Jeff Brown    if (wasEmpty && !connection->outboundQueue.isEmpty()) {
1787a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        startDispatchCycleLocked(currentTime, connection);
1788a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    }
1789a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown}
1790a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
1791a032cc008618b83ecbbede537517d1e7998e3264Jeff Brownvoid InputDispatcher::enqueueDispatchEntryLocked(
1792a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget,
17933241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        int32_t dispatchMode) {
1794a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    int32_t inputTargetFlags = inputTarget->flags;
1795a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    if (!(inputTargetFlags & dispatchMode)) {
1796a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        return;
1797a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    }
1798a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    inputTargetFlags = (inputTargetFlags & ~InputTarget::FLAG_DISPATCH_MASK) | dispatchMode;
1799a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
180046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // This is a new event.
180146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Enqueue a new dispatch entry onto the outbound queue for this connection.
1802ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    DispatchEntry* dispatchEntry = new DispatchEntry(eventEntry, // increments ref
1803aa9d84c37e05f696ec158dac98ce38cf41e18314Dianne Hackborn            inputTargetFlags, inputTarget->xOffset, inputTarget->yOffset,
1804e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            inputTarget->scaleFactor);
18056ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
18068134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    // Apply target flags and update the connection's input state.
18078134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    switch (eventEntry->type) {
18088134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case EventEntry::TYPE_KEY: {
18098134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
18108134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        dispatchEntry->resolvedAction = keyEntry->action;
18118134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        dispatchEntry->resolvedFlags = keyEntry->flags;
18128134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
18138134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (!connection->inputState.trackKey(keyEntry,
18148134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags)) {
18158134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_DISPATCH_CYCLE
18165baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent key event",
18178134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    connection->getInputChannelName());
18188134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
1819c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            delete dispatchEntry;
18208134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return; // skip the inconsistent event
18218134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
18228134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        break;
18238134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
18248134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
18258134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case EventEntry::TYPE_MOTION: {
18268134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        MotionEntry* motionEntry = static_cast<MotionEntry*>(eventEntry);
18278134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_OUTSIDE) {
18288134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_OUTSIDE;
18298134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT) {
18308134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_EXIT;
18318134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER) {
18328134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_ENTER;
18338134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT) {
18348134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_CANCEL;
18358134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER) {
18368134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_DOWN;
18378134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else {
18388134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = motionEntry->action;
18398134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
18408134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (dispatchEntry->resolvedAction == AMOTION_EVENT_ACTION_HOVER_MOVE
18418134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && !connection->inputState.isHovering(
18428134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                        motionEntry->deviceId, motionEntry->source)) {
18438134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_DISPATCH_CYCLE
18445baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: filling in missing hover enter event",
18458134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                connection->getInputChannelName());
18468134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
18478134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_ENTER;
18488134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
18498134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
18508134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        dispatchEntry->resolvedFlags = motionEntry->flags;
18518134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (dispatchEntry->targetFlags & InputTarget::FLAG_WINDOW_IS_OBSCURED) {
18528134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedFlags |= AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED;
18538134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
18548134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
18558134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (!connection->inputState.trackMotion(motionEntry,
18568134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags)) {
18578134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_DISPATCH_CYCLE
18585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent motion event",
18598134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    connection->getInputChannelName());
18608134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
1861c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            delete dispatchEntry;
18628134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return; // skip the inconsistent event
18638134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
18648134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        break;
18658134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
18668134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
18678134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
1868c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    // Remember that we are waiting for this dispatch to complete.
1869c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    if (dispatchEntry->hasForegroundTarget()) {
1870c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown        incrementPendingForegroundDispatchesLocked(eventEntry);
1871c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    }
1872c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown
187346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Enqueue the dispatch entry.
187446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    connection->outboundQueue.enqueueAtTail(dispatchEntry);
1875481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceOutboundQueueLengthLocked(connection);
187646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
187746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
18787fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownvoid InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
1879519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        const sp<Connection>& connection) {
188046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
18815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ startDispatchCycle",
188246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            connection->getInputChannelName());
188346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
188446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1885d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    while (connection->status == Connection::STATUS_NORMAL
1886d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            && !connection->outboundQueue.isEmpty()) {
1887d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        DispatchEntry* dispatchEntry = connection->outboundQueue.head;
188846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1889d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Publish the event.
1890d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        status_t status;
1891d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        EventEntry* eventEntry = dispatchEntry->eventEntry;
1892d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        switch (eventEntry->type) {
1893d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        case EventEntry::TYPE_KEY: {
1894d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
1895d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
1896d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            // Publish the key event.
1897072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            status = connection->inputPublisher.publishKeyEvent(dispatchEntry->seq,
1898d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    keyEntry->deviceId, keyEntry->source,
1899d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags,
1900d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    keyEntry->keyCode, keyEntry->scanCode,
1901d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    keyEntry->metaState, keyEntry->repeatCount, keyEntry->downTime,
1902d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    keyEntry->eventTime);
1903d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            break;
190446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
190546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1906d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        case EventEntry::TYPE_MOTION: {
1907d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            MotionEntry* motionEntry = static_cast<MotionEntry*>(eventEntry);
190846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1909d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            PointerCoords scaledCoords[MAX_POINTERS];
1910d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            const PointerCoords* usingCoords = motionEntry->pointerCoords;
1911d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
1912d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            // Set the X and Y offset depending on the input source.
1913d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            float xOffset, yOffset, scaleFactor;
1914d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            if ((motionEntry->source & AINPUT_SOURCE_CLASS_POINTER)
1915d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    && !(dispatchEntry->targetFlags & InputTarget::FLAG_ZERO_COORDS)) {
1916d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                scaleFactor = dispatchEntry->scaleFactor;
1917d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                xOffset = dispatchEntry->xOffset * scaleFactor;
1918d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                yOffset = dispatchEntry->yOffset * scaleFactor;
1919d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                if (scaleFactor != 1.0f) {
1920d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    for (size_t i = 0; i < motionEntry->pointerCount; i++) {
1921d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        scaledCoords[i] = motionEntry->pointerCoords[i];
1922d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        scaledCoords[i].scale(scaleFactor);
1923d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    }
1924d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    usingCoords = scaledCoords;
1925e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                }
1926d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            } else {
1927d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                xOffset = 0.0f;
1928d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                yOffset = 0.0f;
1929d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                scaleFactor = 1.0f;
1930d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
1931d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                // We don't want the dispatch target to know.
1932d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                if (dispatchEntry->targetFlags & InputTarget::FLAG_ZERO_COORDS) {
1933d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    for (size_t i = 0; i < motionEntry->pointerCount; i++) {
1934d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        scaledCoords[i].clear();
1935d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    }
1936d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    usingCoords = scaledCoords;
19377a9db181a64e0e752a447c6408639bbb33c412fcKenny Root                }
19387a9db181a64e0e752a447c6408639bbb33c412fcKenny Root            }
1939d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
1940d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            // Publish the motion event.
1941072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            status = connection->inputPublisher.publishMotionEvent(dispatchEntry->seq,
1942d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->deviceId, motionEntry->source,
1943d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags,
1944d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->edgeFlags, motionEntry->metaState, motionEntry->buttonState,
1945d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    xOffset, yOffset,
1946d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->xPrecision, motionEntry->yPrecision,
1947d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->downTime, motionEntry->eventTime,
1948d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->pointerCount, motionEntry->pointerProperties,
1949d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    usingCoords);
1950d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            break;
1951d3616592fe1b315b589766c4b74ce728fc4968f5Jeff Brown        }
1952d3616592fe1b315b589766c4b74ce728fc4968f5Jeff Brown
1953d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        default:
1954d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            ALOG_ASSERT(false);
1955d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            return;
1956d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
195746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1958d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Check the result.
195946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (status) {
1960d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            if (status == WOULD_BLOCK) {
1961d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                if (connection->waitQueue.isEmpty()) {
1962d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    ALOGE("channel '%s' ~ Could not publish event because the pipe is full. "
1963d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            "This is unexpected because the wait queue is empty, so the pipe "
1964d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            "should be empty and we shouldn't have any problems writing an "
1965d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            "event to it, status=%d", connection->getInputChannelName(), status);
1966d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
1967d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                } else {
1968d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    // Pipe is full and we are waiting for the app to finish process some events
1969d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    // before sending more events to it.
1970d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown#if DEBUG_DISPATCH_CYCLE
1971d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    ALOGD("channel '%s' ~ Could not publish event because the pipe is full, "
1972d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            "waiting for the application to catch up",
1973d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            connection->getInputChannelName());
1974d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown#endif
1975d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    connection->inputPublisherBlocked = true;
1976d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                }
1977d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            } else {
1978d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                ALOGE("channel '%s' ~ Could not publish event due to an unexpected error, "
1979d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        "status=%d", connection->getInputChannelName(), status);
1980d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
1981d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            }
198246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            return;
198346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
198446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1985d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Re-enqueue the event on the wait queue.
1986d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        connection->outboundQueue.dequeue(dispatchEntry);
1987481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        traceOutboundQueueLengthLocked(connection);
1988d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        connection->waitQueue.enqueueAtTail(dispatchEntry);
1989481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        traceWaitQueueLengthLocked(connection);
199046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
199146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
199246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
19937fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownvoid InputDispatcher::finishDispatchCycleLocked(nsecs_t currentTime,
1994072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        const sp<Connection>& connection, uint32_t seq, bool handled) {
199546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
1996072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    ALOGD("channel '%s' ~ finishDispatchCycle - seq=%u, handled=%s",
1997072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            connection->getInputChannelName(), seq, toString(handled));
199846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
199946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2000d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    connection->inputPublisherBlocked = false;
2001d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
20029c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    if (connection->status == Connection::STATUS_BROKEN
20039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            || connection->status == Connection::STATUS_ZOMBIE) {
200446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return;
200546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
200646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20073915bb845b032dc184dba5e60970b803390ca3edJeff Brown    // Notify other system components and prepare to start the next dispatch cycle.
2008072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    onDispatchCycleFinishedLocked(currentTime, connection, seq, handled);
2009b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2010b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2011b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::abortBrokenDispatchCycleLocked(nsecs_t currentTime,
2012cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const sp<Connection>& connection, bool notify) {
201346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
20145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ abortBrokenDispatchCycle - notify=%s",
2015cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            connection->getInputChannelName(), toString(notify));
201646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
201746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2018d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    // Clear the dispatch queues.
2019d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    drainDispatchQueueLocked(&connection->outboundQueue);
2020481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceOutboundQueueLengthLocked(connection);
2021d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    drainDispatchQueueLocked(&connection->waitQueue);
2022481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceWaitQueueLengthLocked(connection);
202346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2024b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    // The connection appears to be unrecoverably broken.
20259c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    // Ignore already broken or zombie connections.
2026b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (connection->status == Connection::STATUS_NORMAL) {
2027b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        connection->status = Connection::STATUS_BROKEN;
202846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2029cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (notify) {
2030cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // Notify other system components.
2031cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            onDispatchCycleBrokenLocked(currentTime, connection);
2032cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        }
203346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
203446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
203546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2036d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brownvoid InputDispatcher::drainDispatchQueueLocked(Queue<DispatchEntry>* queue) {
2037d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    while (!queue->isEmpty()) {
2038d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        DispatchEntry* dispatchEntry = queue->dequeueAtHead();
2039d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        releaseDispatchEntryLocked(dispatchEntry);
2040b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
2041b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2042b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2043d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brownvoid InputDispatcher::releaseDispatchEntryLocked(DispatchEntry* dispatchEntry) {
2044d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    if (dispatchEntry->hasForegroundTarget()) {
2045d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        decrementPendingForegroundDispatchesLocked(dispatchEntry->eventEntry);
2046d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    }
2047d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    delete dispatchEntry;
2048d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown}
2049d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
2050cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brownint InputDispatcher::handleReceiveCallback(int fd, int events, void* data) {
205146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputDispatcher* d = static_cast<InputDispatcher*>(data);
205246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
205346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
205446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        AutoMutex _l(d->mLock);
205546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2056cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        ssize_t connectionIndex = d->mConnectionsByFd.indexOfKey(fd);
205746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (connectionIndex < 0) {
20583762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Received spurious receive callback for unknown input channel.  "
2059cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown                    "fd=%d, events=0x%x", fd, events);
20604fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            return 0; // remove the callback
206146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
206246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2063cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        bool notify;
2064cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        sp<Connection> connection = d->mConnectionsByFd.valueAt(connectionIndex);
2065cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (!(events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP))) {
2066cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (!(events & ALOOPER_EVENT_INPUT)) {
20678564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("channel '%s' ~ Received spurious callback for unhandled poll event.  "
2068cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        "events=0x%x", connection->getInputChannelName(), events);
2069cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                return 1;
2070cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
207146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20721adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            nsecs_t currentTime = now();
20731adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            bool gotOne = false;
20741adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            status_t status;
20751adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            for (;;) {
2076072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown                uint32_t seq;
2077072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown                bool handled;
2078072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown                status = connection->inputPublisher.receiveFinishedSignal(&seq, &handled);
20791adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                if (status) {
20801adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                    break;
20811adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                }
2082072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown                d->finishDispatchCycleLocked(currentTime, connection, seq, handled);
20831adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                gotOne = true;
20841adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            }
20851adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            if (gotOne) {
2086cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                d->runCommandsLockedInterruptible();
20871adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                if (status == WOULD_BLOCK) {
20881adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                    return 1;
20891adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                }
2090cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
209146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20921adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            notify = status != DEAD_OBJECT || !connection->monitor;
20931adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            if (notify) {
20941adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                ALOGE("channel '%s' ~ Failed to receive finished signal.  status=%d",
20951adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                        connection->getInputChannelName(), status);
20961adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            }
2097cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        } else {
2098cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // Monitor channels are never explicitly unregistered.
2099cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // We do it automatically when the remote endpoint is closed so don't warn
2100cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // about them.
2101cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            notify = !connection->monitor;
2102cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (notify) {
21038564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("channel '%s' ~ Consumer closed input channel or an error occurred.  "
2104cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        "events=0x%x", connection->getInputChannelName(), events);
2105cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
210646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
210746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2108cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // Unregister the channel.
2109cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        d->unregisterInputChannelLocked(connection->inputChannel, notify);
2110cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return 0; // remove the callback
211146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
211246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
211346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2114b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::synthesizeCancelationEventsForAllConnectionsLocked(
2115da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const CancelationOptions& options) {
2116cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    for (size_t i = 0; i < mConnectionsByFd.size(); i++) {
2117b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        synthesizeCancelationEventsForConnectionLocked(
2118cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown                mConnectionsByFd.valueAt(i), options);
2119b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2120b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2121b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2122b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::synthesizeCancelationEventsForInputChannelLocked(
2123da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const sp<InputChannel>& channel, const CancelationOptions& options) {
2124b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    ssize_t index = getConnectionIndexLocked(channel);
2125b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (index >= 0) {
2126b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        synthesizeCancelationEventsForConnectionLocked(
2127cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown                mConnectionsByFd.valueAt(index), options);
2128b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2129b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2130b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2131b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::synthesizeCancelationEventsForConnectionLocked(
2132da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const sp<Connection>& connection, const CancelationOptions& options) {
2133c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    if (connection->status == Connection::STATUS_BROKEN) {
2134c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown        return;
2135c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    }
2136c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown
2137b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    nsecs_t currentTime = now();
2138b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
21398b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown    Vector<EventEntry*> cancelationEvents;
2140ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    connection->inputState.synthesizeCancelationEvents(currentTime,
21418b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown            cancelationEvents, options);
2142b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
21438b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown    if (!cancelationEvents.isEmpty()) {
2144b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
21455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("channel '%s' ~ Synthesized %d cancelation events to bring channel back in sync "
2146da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                "with reality: %s, mode=%d.",
21478b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown                connection->getInputChannelName(), cancelationEvents.size(),
2148da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                options.reason, options.mode);
2149b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
21508b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown        for (size_t i = 0; i < cancelationEvents.size(); i++) {
21518b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown            EventEntry* cancelationEventEntry = cancelationEvents.itemAt(i);
2152b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            switch (cancelationEventEntry->type) {
2153b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            case EventEntry::TYPE_KEY:
2154b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                logOutboundKeyDetailsLocked("cancel - ",
2155b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                        static_cast<KeyEntry*>(cancelationEventEntry));
2156b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                break;
2157b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            case EventEntry::TYPE_MOTION:
2158b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                logOutboundMotionDetailsLocked("cancel - ",
2159b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                        static_cast<MotionEntry*>(cancelationEventEntry));
2160b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                break;
2161b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            }
2162b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
21638134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            InputTarget target;
21649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> windowHandle = getWindowHandleLocked(connection->inputChannel);
21659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (windowHandle != NULL) {
2166cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                const InputWindowInfo* windowInfo = windowHandle->getInfo();
2167cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                target.xOffset = -windowInfo->frameLeft;
2168cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                target.yOffset = -windowInfo->frameTop;
2169cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                target.scaleFactor = windowInfo->scaleFactor;
2170b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            } else {
21718134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                target.xOffset = 0;
21728134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                target.yOffset = 0;
21738134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                target.scaleFactor = 1.0f;
2174b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            }
21758134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            target.inputChannel = connection->inputChannel;
21768134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            target.flags = InputTarget::FLAG_DISPATCH_AS_IS;
2177b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
21788134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            enqueueDispatchEntryLocked(connection, cancelationEventEntry, // increments ref
21793241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    &target, InputTarget::FLAG_DISPATCH_AS_IS);
2180b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2181ac386073df2514b79a2ca169f4a89f129733002fJeff Brown            cancelationEventEntry->release();
2182b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
2183b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2184d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        startDispatchCycleLocked(currentTime, connection);
2185b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2186b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2187b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
218801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff BrownInputDispatcher::MotionEntry*
218901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff BrownInputDispatcher::splitMotionEvent(const MotionEntry* originalMotionEntry, BitSet32 pointerIds) {
2190ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block    ALOG_ASSERT(pointerIds.value != 0);
219101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
219201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    uint32_t splitPointerIndexMap[MAX_POINTERS];
2193fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    PointerProperties splitPointerProperties[MAX_POINTERS];
219401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    PointerCoords splitPointerCoords[MAX_POINTERS];
219501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
219601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    uint32_t originalPointerCount = originalMotionEntry->pointerCount;
219701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    uint32_t splitPointerCount = 0;
219801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
219901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (uint32_t originalPointerIndex = 0; originalPointerIndex < originalPointerCount;
220001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalPointerIndex++) {
2201fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        const PointerProperties& pointerProperties =
2202fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                originalMotionEntry->pointerProperties[originalPointerIndex];
2203fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        uint32_t pointerId = uint32_t(pointerProperties.id);
220401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (pointerIds.hasBit(pointerId)) {
220501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            splitPointerIndexMap[splitPointerCount] = originalPointerIndex;
2206fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            splitPointerProperties[splitPointerCount].copyFrom(pointerProperties);
2207ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            splitPointerCoords[splitPointerCount].copyFrom(
22083241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    originalMotionEntry->pointerCoords[originalPointerIndex]);
220901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            splitPointerCount += 1;
221001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
221101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
221258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown
221358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    if (splitPointerCount != pointerIds.count()) {
221458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // This is bad.  We are missing some of the pointers that we expected to deliver.
221558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // Most likely this indicates that we received an ACTION_MOVE events that has
221658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // different pointer ids than we expected based on the previous ACTION_DOWN
221758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // or ACTION_POINTER_DOWN events that caused us to decide to split the pointers
221858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // in this way.
22198564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Dropping split motion event because the pointer count is %d but "
222058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown                "we expected there to be %d pointers.  This probably means we received "
222158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown                "a broken sequence of pointer ids from the input device.",
222258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown                splitPointerCount, pointerIds.count());
222358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        return NULL;
222458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    }
222501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
222601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    int32_t action = originalMotionEntry->action;
222701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
222801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN
222901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            || maskedAction == AMOTION_EVENT_ACTION_POINTER_UP) {
223001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        int32_t originalPointerIndex = getMotionEventActionPointerIndex(action);
2231fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        const PointerProperties& pointerProperties =
2232fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                originalMotionEntry->pointerProperties[originalPointerIndex];
2233fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        uint32_t pointerId = uint32_t(pointerProperties.id);
223401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (pointerIds.hasBit(pointerId)) {
223501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            if (pointerIds.count() == 1) {
223601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                // The first/last pointer went down/up.
223701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                action = maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN
223801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                        ? AMOTION_EVENT_ACTION_DOWN : AMOTION_EVENT_ACTION_UP;
22399a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown            } else {
22409a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                // A secondary pointer went down/up.
22419a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                uint32_t splitPointerIndex = 0;
2242fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                while (pointerId != uint32_t(splitPointerProperties[splitPointerIndex].id)) {
22439a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                    splitPointerIndex += 1;
22449a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                }
22459a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                action = maskedAction | (splitPointerIndex
22469a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                        << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT);
224701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            }
224801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        } else {
224901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // An unrelated pointer changed.
225001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            action = AMOTION_EVENT_ACTION_MOVE;
225101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
225201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
225301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
2254ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    MotionEntry* splitMotionEntry = new MotionEntry(
225501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->eventTime,
225601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->deviceId,
225701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->source,
225801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->policyFlags,
225901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            action,
226001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->flags,
226101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->metaState,
2262fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            originalMotionEntry->buttonState,
226301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->edgeFlags,
226401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->xPrecision,
226501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->yPrecision,
226601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->downTime,
2267fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            splitPointerCount, splitPointerProperties, splitPointerCoords);
226801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
2269a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    if (originalMotionEntry->injectionState) {
2270a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        splitMotionEntry->injectionState = originalMotionEntry->injectionState;
2271a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        splitMotionEntry->injectionState->refCount += 1;
2272a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    }
2273a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
227401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return splitMotionEntry;
227501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
227601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
2277be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid InputDispatcher::notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
227846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
22795baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyConfigurationChanged - eventTime=%lld", args->eventTime);
2280b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
228146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2282b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool needWake;
2283b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    { // acquire lock
2284b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        AutoMutex _l(mLock);
2285b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2286be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ConfigurationChangedEntry* newEntry = new ConfigurationChangedEntry(args->eventTime);
2287b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        needWake = enqueueInboundEventLocked(newEntry);
228846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
2289b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2290b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (needWake) {
22914fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
2292b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
229346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
229446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2295be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid InputDispatcher::notifyKey(const NotifyKeyArgs* args) {
229646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
22975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyKey - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, action=0x%x, "
229846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, downTime=%lld",
2299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->eventTime, args->deviceId, args->source, args->policyFlags,
2300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->action, args->flags, args->keyCode, args->scanCode,
2301be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->metaState, args->downTime);
230246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
2303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (!validateKeyEvent(args->action)) {
230401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return;
230501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
230646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t policyFlags = args->policyFlags;
2308be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t flags = args->flags;
2309be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t metaState = args->metaState;
23101f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    if ((policyFlags & POLICY_FLAG_VIRTUAL) || (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY)) {
23111f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        policyFlags |= POLICY_FLAG_VIRTUAL;
23121f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        flags |= AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY;
23131f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
2314924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_ALT) {
2315924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_ALT_ON | AMETA_ALT_LEFT_ON;
2316924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
2317924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_ALT_GR) {
2318924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_ALT_ON | AMETA_ALT_RIGHT_ON;
2319924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
2320924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_SHIFT) {
2321924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_SHIFT_ON | AMETA_SHIFT_LEFT_ON;
2322924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
2323924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_CAPS_LOCK) {
2324924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_CAPS_LOCK_ON;
2325924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
2326924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_FUNCTION) {
2327924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_FUNCTION_ON;
2328924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
23291f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
2330e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    policyFlags |= POLICY_FLAG_TRUSTED;
23311f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
23321f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    KeyEvent event;
2333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    event.initialize(args->deviceId, args->source, args->action,
2334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            flags, args->keyCode, args->scanCode, metaState, 0,
2335be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->downTime, args->eventTime);
23361f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
23371f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
23381f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
23391f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    if (policyFlags & POLICY_FLAG_WOKE_HERE) {
23401f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        flags |= AKEY_EVENT_FLAG_WOKE_HERE;
23411f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
2342b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2343b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool needWake;
234446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
23450029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mLock.lock();
23460029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
23470029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (mInputFilterEnabled) {
23480029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mLock.unlock();
23490029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
23500029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            policyFlags |= POLICY_FLAG_FILTERED;
23510029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            if (!mPolicy->filterInputEvent(&event, policyFlags)) {
23520029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                return; // event was consumed by the filter
23530029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            }
23540029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
23550029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mLock.lock();
23560029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
235746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
23587fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        int32_t repeatCount = 0;
2359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        KeyEntry* newEntry = new KeyEntry(args->eventTime,
2360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->deviceId, args->source, policyFlags,
2361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->action, flags, args->keyCode, args->scanCode,
2362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                metaState, repeatCount, args->downTime);
236346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2364b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        needWake = enqueueInboundEventLocked(newEntry);
23650029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mLock.unlock();
236646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
236746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2368b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (needWake) {
23694fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
237046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
237146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
237246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
237446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
23755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyMotion - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
2376fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            "action=0x%x, flags=0x%x, metaState=0x%x, buttonState=0x%x, edgeFlags=0x%x, "
237785a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            "xPrecision=%f, yPrecision=%f, downTime=%lld",
2378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->eventTime, args->deviceId, args->source, args->policyFlags,
2379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->action, args->flags, args->metaState, args->buttonState,
2380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime);
2381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    for (uint32_t i = 0; i < args->pointerCount; i++) {
23825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("  Pointer %d: id=%d, toolType=%d, "
2383fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                "x=%f, y=%f, pressure=%f, size=%f, "
238485a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown                "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
23858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                "orientation=%f",
2386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                i, args->pointerProperties[i].id,
2387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerProperties[i].toolType,
2388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X),
2389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y),
2390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE),
2391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE),
2392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR),
2393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR),
2394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR),
2395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR),
2396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
2397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
2398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown#endif
2399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (!validateMotionEvent(args->action, args->pointerCount, args->pointerProperties)) {
240001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return;
240101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
240246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t policyFlags = args->policyFlags;
2404e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    policyFlags |= POLICY_FLAG_TRUSTED;
2405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mPolicy->interceptMotionBeforeQueueing(args->eventTime, /*byref*/ policyFlags);
2406b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2407b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool needWake;
240846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
24090029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mLock.lock();
24100029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24110029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (mInputFilterEnabled) {
24120029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mLock.unlock();
24130029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            MotionEvent event;
2415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            event.initialize(args->deviceId, args->source, args->action, args->flags,
2416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    args->edgeFlags, args->metaState, args->buttonState, 0, 0,
2417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    args->xPrecision, args->yPrecision,
2418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    args->downTime, args->eventTime,
2419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    args->pointerCount, args->pointerProperties, args->pointerCoords);
24200029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24210029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            policyFlags |= POLICY_FLAG_FILTERED;
24220029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            if (!mPolicy->filterInputEvent(&event, policyFlags)) {
24230029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                return; // event was consumed by the filter
24240029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            }
24250029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24260029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mLock.lock();
24270029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
242846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
242946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        // Just enqueue a new motion event.
2430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MotionEntry* newEntry = new MotionEntry(args->eventTime,
2431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->deviceId, args->source, policyFlags,
2432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->action, args->flags, args->metaState, args->buttonState,
2433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime,
2434be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCount, args->pointerProperties, args->pointerCoords);
243546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2436b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        needWake = enqueueInboundEventLocked(newEntry);
24370029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mLock.unlock();
243846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
243946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2440b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (needWake) {
24414fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
244246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
244346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
244446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid InputDispatcher::notifySwitch(const NotifySwitchArgs* args) {
2446b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
24475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifySwitch - eventTime=%lld, policyFlags=0x%x, switchCode=%d, switchValue=%d",
2448be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->eventTime, args->policyFlags,
2449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->switchCode, args->switchValue);
2450b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
2451b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t policyFlags = args->policyFlags;
2453e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    policyFlags |= POLICY_FLAG_TRUSTED;
2454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mPolicy->notifySwitch(args->eventTime,
2455be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->switchCode, args->switchValue, policyFlags);
2456b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2457b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
245865fd251c3913fc921468a3dad190810db19eb9dfJeff Brownvoid InputDispatcher::notifyDeviceReset(const NotifyDeviceResetArgs* args) {
245965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
24605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyDeviceReset - eventTime=%lld, deviceId=%d",
246165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            args->eventTime, args->deviceId);
246265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown#endif
246365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
246465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool needWake;
246565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    { // acquire lock
246665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        AutoMutex _l(mLock);
246765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
246865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        DeviceResetEntry* newEntry = new DeviceResetEntry(args->eventTime, args->deviceId);
246965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        needWake = enqueueInboundEventLocked(newEntry);
247065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    } // release lock
247165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
247265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (needWake) {
247365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mLooper->wake();
247465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
247565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
247665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
24777fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownint32_t InputDispatcher::injectInputEvent(const InputEvent* event,
24780029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        int32_t injectorPid, int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis,
24790029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        uint32_t policyFlags) {
24807fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
24815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("injectInputEvent - eventType=%d, injectorPid=%d, injectorUid=%d, "
24820029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            "syncMode=%d, timeoutMillis=%d, policyFlags=0x%08x",
24830029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            event->getType(), injectorPid, injectorUid, syncMode, timeoutMillis, policyFlags);
24847fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown#endif
24857fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
24867fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    nsecs_t endTime = now() + milliseconds_to_nanoseconds(timeoutMillis);
2487e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
24880029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    policyFlags |= POLICY_FLAG_INJECTED;
2489e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    if (hasInjectionPermission(injectorPid, injectorUid)) {
2490e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        policyFlags |= POLICY_FLAG_TRUSTED;
2491e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    }
24927fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
24933241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    EventEntry* firstInjectedEntry;
24943241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    EventEntry* lastInjectedEntry;
2495b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    switch (event->getType()) {
2496b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case AINPUT_EVENT_TYPE_KEY: {
2497b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        const KeyEvent* keyEvent = static_cast<const KeyEvent*>(event);
2498b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        int32_t action = keyEvent->getAction();
2499b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (! validateKeyEvent(action)) {
2500b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            return INPUT_EVENT_INJECTION_FAILED;
2501b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
2502b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2503b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        int32_t flags = keyEvent->getFlags();
25041f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY) {
25051f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            policyFlags |= POLICY_FLAG_VIRTUAL;
25061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
25071f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
25080029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (!(policyFlags & POLICY_FLAG_FILTERED)) {
25090029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mPolicy->interceptKeyBeforeQueueing(keyEvent, /*byref*/ policyFlags);
25100029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
25111f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
25121f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (policyFlags & POLICY_FLAG_WOKE_HERE) {
25131f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            flags |= AKEY_EVENT_FLAG_WOKE_HERE;
25141f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
25157fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
2516b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        mLock.lock();
25173241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        firstInjectedEntry = new KeyEntry(keyEvent->getEventTime(),
25181f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                keyEvent->getDeviceId(), keyEvent->getSource(),
25191f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                policyFlags, action, flags,
25201f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                keyEvent->getKeyCode(), keyEvent->getScanCode(), keyEvent->getMetaState(),
2521b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                keyEvent->getRepeatCount(), keyEvent->getDownTime());
25223241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        lastInjectedEntry = firstInjectedEntry;
2523b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
2524b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2525b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2526b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case AINPUT_EVENT_TYPE_MOTION: {
2527b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        const MotionEvent* motionEvent = static_cast<const MotionEvent*>(event);
2528b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        int32_t action = motionEvent->getAction();
2529b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        size_t pointerCount = motionEvent->getPointerCount();
2530fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        const PointerProperties* pointerProperties = motionEvent->getPointerProperties();
2531fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        if (! validateMotionEvent(action, pointerCount, pointerProperties)) {
2532b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            return INPUT_EVENT_INJECTION_FAILED;
2533b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
2534b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
25350029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (!(policyFlags & POLICY_FLAG_FILTERED)) {
25360029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            nsecs_t eventTime = motionEvent->getEventTime();
25370029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mPolicy->interceptMotionBeforeQueueing(eventTime, /*byref*/ policyFlags);
25380029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
2539b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2540b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        mLock.lock();
2541b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        const nsecs_t* sampleEventTimes = motionEvent->getSampleEventTimes();
2542b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        const PointerCoords* samplePointerCoords = motionEvent->getSamplePointerCoords();
25433241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        firstInjectedEntry = new MotionEntry(*sampleEventTimes,
2544b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
2545b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                action, motionEvent->getFlags(),
2546fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                motionEvent->getMetaState(), motionEvent->getButtonState(),
2547fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                motionEvent->getEdgeFlags(),
2548b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                motionEvent->getXPrecision(), motionEvent->getYPrecision(),
2549b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                motionEvent->getDownTime(), uint32_t(pointerCount),
2550fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                pointerProperties, samplePointerCoords);
25513241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        lastInjectedEntry = firstInjectedEntry;
2552b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        for (size_t i = motionEvent->getHistorySize(); i > 0; i--) {
2553b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            sampleEventTimes += 1;
2554b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            samplePointerCoords += pointerCount;
25553241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            MotionEntry* nextInjectedEntry = new MotionEntry(*sampleEventTimes,
25563241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
25573241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    action, motionEvent->getFlags(),
25583241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getMetaState(), motionEvent->getButtonState(),
25593241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getEdgeFlags(),
25603241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getXPrecision(), motionEvent->getYPrecision(),
25613241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getDownTime(), uint32_t(pointerCount),
25623241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    pointerProperties, samplePointerCoords);
25633241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            lastInjectedEntry->next = nextInjectedEntry;
25643241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            lastInjectedEntry = nextInjectedEntry;
25656ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        }
2566b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
2567b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
25686ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
2569b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    default:
25708564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Cannot inject event of type %d", event->getType());
2571b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return INPUT_EVENT_INJECTION_FAILED;
2572b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
257301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
2574ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    InjectionState* injectionState = new InjectionState(injectorPid, injectorUid);
2575b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (syncMode == INPUT_EVENT_INJECTION_SYNC_NONE) {
2576b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        injectionState->injectionIsAsync = true;
2577b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2578b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2579b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    injectionState->refCount += 1;
25803241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    lastInjectedEntry->injectionState = injectionState;
25813241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown
25823241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    bool needWake = false;
25833241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    for (EventEntry* entry = firstInjectedEntry; entry != NULL; ) {
25843241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        EventEntry* nextEntry = entry->next;
25853241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        needWake |= enqueueInboundEventLocked(entry);
25863241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        entry = nextEntry;
25873241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    }
2588b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2589b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    mLock.unlock();
25907fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
2591b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (needWake) {
25924fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
25937fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
25947fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
25957fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    int32_t injectionResult;
25967fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    { // acquire lock
25977fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        AutoMutex _l(mLock);
25987fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
25996ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        if (syncMode == INPUT_EVENT_INJECTION_SYNC_NONE) {
26006ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
26016ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        } else {
26026ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            for (;;) {
260301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                injectionResult = injectionState->injectionResult;
26046ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                if (injectionResult != INPUT_EVENT_INJECTION_PENDING) {
26056ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    break;
26066ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                }
26077fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
26087fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                nsecs_t remainingTimeout = endTime - now();
26097fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                if (remainingTimeout <= 0) {
26106ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#if DEBUG_INJECTION
26115baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("injectInputEvent - Timed out waiting for injection result "
26126ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                            "to become available.");
26136ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#endif
26147fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                    injectionResult = INPUT_EVENT_INJECTION_TIMED_OUT;
26157fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                    break;
26167fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                }
26177fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
26186ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                mInjectionResultAvailableCondition.waitRelative(mLock, remainingTimeout);
26196ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            }
26206ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
26216ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            if (injectionResult == INPUT_EVENT_INJECTION_SUCCEEDED
26226ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    && syncMode == INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISHED) {
262301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                while (injectionState->pendingForegroundDispatches != 0) {
26246ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#if DEBUG_INJECTION
26255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("injectInputEvent - Waiting for %d pending foreground dispatches.",
262601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                            injectionState->pendingForegroundDispatches);
26276ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#endif
26286ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    nsecs_t remainingTimeout = endTime - now();
26296ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    if (remainingTimeout <= 0) {
26306ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#if DEBUG_INJECTION
26315baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("injectInputEvent - Timed out waiting for pending foreground "
26326ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                            "dispatches to finish.");
26336ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#endif
26346ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                        injectionResult = INPUT_EVENT_INJECTION_TIMED_OUT;
26356ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                        break;
26366ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    }
26376ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
26386ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    mInjectionSyncFinishedCondition.waitRelative(mLock, remainingTimeout);
26396ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                }
26407fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown            }
26417fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        }
26427fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
2643ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionState->release();
26447fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    } // release lock
26457fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
26466ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#if DEBUG_INJECTION
26475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("injectInputEvent - Finished with result %d.  "
26486ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            "injectorPid=%d, injectorUid=%d",
26496ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            injectionResult, injectorPid, injectorUid);
26506ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#endif
26516ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
26527fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    return injectionResult;
26537fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
26547fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
2655b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownbool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
2656b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    return injectorUid == 0
2657b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
2658b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2659b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
26607fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownvoid InputDispatcher::setInjectionResultLocked(EventEntry* entry, int32_t injectionResult) {
266101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionState* injectionState = entry->injectionState;
266201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState) {
26637fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown#if DEBUG_INJECTION
26645baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Setting input event injection result to %d.  "
26657fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                "injectorPid=%d, injectorUid=%d",
266601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                 injectionResult, injectionState->injectorPid, injectionState->injectorUid);
26677fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown#endif
26687fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
26690029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (injectionState->injectionIsAsync
26700029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                && !(entry->policyFlags & POLICY_FLAG_FILTERED)) {
26716ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            // Log the outcome since the injector did not wait for the injection result.
26726ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            switch (injectionResult) {
26736ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            case INPUT_EVENT_INJECTION_SUCCEEDED:
267471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block                ALOGV("Asynchronous input event injection succeeded.");
26756ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                break;
26766ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            case INPUT_EVENT_INJECTION_FAILED:
26778564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("Asynchronous input event injection failed.");
26786ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                break;
26796ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            case INPUT_EVENT_INJECTION_PERMISSION_DENIED:
26808564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("Asynchronous input event injection permission denied.");
26816ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                break;
26826ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            case INPUT_EVENT_INJECTION_TIMED_OUT:
26838564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("Asynchronous input event injection timed out.");
26846ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                break;
26856ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            }
26866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        }
26876ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
268801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        injectionState->injectionResult = injectionResult;
26897fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        mInjectionResultAvailableCondition.broadcast();
26907fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
26917fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
26927fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
269301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid InputDispatcher::incrementPendingForegroundDispatchesLocked(EventEntry* entry) {
269401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionState* injectionState = entry->injectionState;
269501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState) {
269601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        injectionState->pendingForegroundDispatches += 1;
26976ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    }
26987fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
26997fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
270001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid InputDispatcher::decrementPendingForegroundDispatchesLocked(EventEntry* entry) {
270101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionState* injectionState = entry->injectionState;
270201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState) {
270301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        injectionState->pendingForegroundDispatches -= 1;
2704b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
270501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (injectionState->pendingForegroundDispatches == 0) {
270601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            mInjectionSyncFinishedCondition.broadcast();
270701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
2708b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
2709b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2710b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
27119302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownsp<InputWindowHandle> InputDispatcher::getWindowHandleLocked(
27129302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputChannel>& inputChannel) const {
27139302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = mWindowHandles.size();
27149302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    for (size_t i = 0; i < numWindows; i++) {
27159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
2716cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (windowHandle->getInputChannel() == inputChannel) {
27179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            return windowHandle;
271801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
271901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
272001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return NULL;
272101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
272201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
27239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownbool InputDispatcher::hasWindowHandleLocked(
27249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle) const {
27259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = mWindowHandles.size();
27269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    for (size_t i = 0; i < numWindows; i++) {
27279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mWindowHandles.itemAt(i) == windowHandle) {
27289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            return true;
27299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
27309302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
27319302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    return false;
27329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown}
27339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
27349302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid InputDispatcher::setInputWindows(const Vector<sp<InputWindowHandle> >& inputWindowHandles) {
2735b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
27365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("setInputWindows");
2737b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
2738b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    { // acquire lock
2739b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        AutoMutex _l(mLock);
2740b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2741cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        Vector<sp<InputWindowHandle> > oldWindowHandles = mWindowHandles;
27429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        mWindowHandles = inputWindowHandles;
2743b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
27449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> newFocusedWindowHandle;
27459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        bool foundHoveredWindow = false;
27469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        for (size_t i = 0; i < mWindowHandles.size(); i++) {
27479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
2748cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (!windowHandle->updateInfo() || windowHandle->getInputChannel() == NULL) {
27499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mWindowHandles.removeAt(i--);
27509302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                continue;
2751b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
2752cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (windowHandle->getInfo()->hasFocus) {
27539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                newFocusedWindowHandle = windowHandle;
27549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
27559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (windowHandle == mLastHoverWindowHandle) {
27569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                foundHoveredWindow = true;
27579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
27589302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
27599302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
27609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (!foundHoveredWindow) {
27619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mLastHoverWindowHandle = NULL;
276201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
2763b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
27649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mFocusedWindowHandle != newFocusedWindowHandle) {
27659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (mFocusedWindowHandle != NULL) {
2766b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
27675baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Focus left window: %s",
2768cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        mFocusedWindowHandle->getName().string());
2769b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
2770cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                sp<InputChannel> focusedInputChannel = mFocusedWindowHandle->getInputChannel();
2771cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (focusedInputChannel != NULL) {
2772d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                    CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS,
2773d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                            "focus left window");
2774d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                    synthesizeCancelationEventsForInputChannelLocked(
2775cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                            focusedInputChannel, options);
2776d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                }
2777b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            }
27789302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (newFocusedWindowHandle != NULL) {
2779b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
27805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Focus entered window: %s",
2781cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        newFocusedWindowHandle->getName().string());
2782b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
27839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
27849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mFocusedWindowHandle = newFocusedWindowHandle;
2785b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
2786b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
27879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
278801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            TouchedWindow& touchedWindow = mTouchState.windows.editItemAt(i);
27899302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (!hasWindowHandleLocked(touchedWindow.windowHandle)) {
2790b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
27915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Touched window was removed: %s",
2792cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        touchedWindow.windowHandle->getName().string());
2793b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
2794cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                sp<InputChannel> touchedInputChannel =
2795cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        touchedWindow.windowHandle->getInputChannel();
2796cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (touchedInputChannel != NULL) {
2797d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                    CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
2798d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                            "touched window was removed");
2799d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                    synthesizeCancelationEventsForInputChannelLocked(
2800cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                            touchedInputChannel, options);
2801d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                }
28029302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTouchState.windows.removeAt(i--);
2803b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
2804b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
2805cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
2806cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // Release information for windows that are no longer present.
2807cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // This ensures that unused input channels are released promptly.
2808cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // Otherwise, they might stick around until the window handle is destroyed
2809cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // which might not happen until the next GC.
2810cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        for (size_t i = 0; i < oldWindowHandles.size(); i++) {
2811cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            const sp<InputWindowHandle>& oldWindowHandle = oldWindowHandles.itemAt(i);
2812cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (!hasWindowHandleLocked(oldWindowHandle)) {
2813cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown#if DEBUG_FOCUS
28145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Window went away: %s", oldWindowHandle->getName().string());
2815cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown#endif
2816cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                oldWindowHandle->releaseInfo();
2817cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
2818cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        }
2819b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } // release lock
2820b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2821b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Wake up poll loop since it may need to make new input dispatching choices.
28224fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->wake();
2823b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2824b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
28259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid InputDispatcher::setFocusedApplication(
28269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputApplicationHandle>& inputApplicationHandle) {
2827b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
28285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("setFocusedApplication");
2829b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
2830b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    { // acquire lock
2831b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        AutoMutex _l(mLock);
2832b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2833cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (inputApplicationHandle != NULL && inputApplicationHandle->updateInfo()) {
28345ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown            if (mFocusedApplicationHandle != inputApplicationHandle) {
28355ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown                if (mFocusedApplicationHandle != NULL) {
2836e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown                    resetANRTimeoutsLocked();
2837cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    mFocusedApplicationHandle->releaseInfo();
28385ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown                }
28395ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown                mFocusedApplicationHandle = inputApplicationHandle;
28405ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown            }
28415ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown        } else if (mFocusedApplicationHandle != NULL) {
2842e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            resetANRTimeoutsLocked();
2843cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mFocusedApplicationHandle->releaseInfo();
28449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mFocusedApplicationHandle.clear();
2845b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
2846b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2847b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
2848b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        //logDispatchStateLocked();
2849b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
2850b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } // release lock
2851b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2852b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Wake up poll loop since it may need to make new input dispatching choices.
28534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->wake();
2854b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2855b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2856b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::setInputDispatchMode(bool enabled, bool frozen) {
2857b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
28585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("setInputDispatchMode: enabled=%d, frozen=%d", enabled, frozen);
2859349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#endif
2860349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
2861b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool changed;
2862349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    { // acquire lock
2863349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        AutoMutex _l(mLock);
2864349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
2865b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mDispatchEnabled != enabled || mDispatchFrozen != frozen) {
2866120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown            if (mDispatchFrozen && !frozen) {
2867b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetANRTimeoutsLocked();
2868349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            }
2869b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2870120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown            if (mDispatchEnabled && !enabled) {
2871120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown                resetAndDropEverythingLocked("dispatcher is being disabled");
2872120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown            }
2873120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
2874b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mDispatchEnabled = enabled;
2875b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mDispatchFrozen = frozen;
2876b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            changed = true;
2877b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        } else {
2878b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            changed = false;
2879349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
2880b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2881b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
2882b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        //logDispatchStateLocked();
2883b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
2884b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } // release lock
2885b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2886b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (changed) {
2887b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Wake up poll loop since it may need to make new input dispatching choices.
28884fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
2889b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
2890b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2891b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
28920029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brownvoid InputDispatcher::setInputFilterEnabled(bool enabled) {
28930029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown#if DEBUG_FOCUS
28945baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("setInputFilterEnabled: enabled=%d", enabled);
28950029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown#endif
28960029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
28970029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    { // acquire lock
28980029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        AutoMutex _l(mLock);
28990029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
29000029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (mInputFilterEnabled == enabled) {
29010029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            return;
29020029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
29030029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
29040029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mInputFilterEnabled = enabled;
29050029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        resetAndDropEverythingLocked("input filter is being enabled or disabled");
29060029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    } // release lock
29070029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
29080029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    // Wake up poll loop since there might be work to do to drop everything.
29090029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    mLooper->wake();
29100029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown}
29110029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
2912e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brownbool InputDispatcher::transferTouchFocus(const sp<InputChannel>& fromChannel,
2913e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        const sp<InputChannel>& toChannel) {
2914e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
29155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("transferTouchFocus: fromChannel=%s, toChannel=%s",
2916e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            fromChannel->getName().string(), toChannel->getName().string());
2917e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
2918e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    { // acquire lock
2919e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        AutoMutex _l(mLock);
2920e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
29219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> fromWindowHandle = getWindowHandleLocked(fromChannel);
29229302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> toWindowHandle = getWindowHandleLocked(toChannel);
29239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (fromWindowHandle == NULL || toWindowHandle == NULL) {
2924e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
29255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Cannot transfer focus because from or to window not found.");
2926e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
2927e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            return false;
2928e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        }
29299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (fromWindowHandle == toWindowHandle) {
2930e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
29315baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Trivial transfer to same window.");
2932e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
2933e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            return true;
2934e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        }
2935e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
2936e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        bool found = false;
2937e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
2938e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            const TouchedWindow& touchedWindow = mTouchState.windows[i];
29399302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (touchedWindow.windowHandle == fromWindowHandle) {
2940e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                int32_t oldTargetFlags = touchedWindow.targetFlags;
2941e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                BitSet32 pointerIds = touchedWindow.pointerIds;
2942e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
2943e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                mTouchState.windows.removeAt(i);
2944e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
294546e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown                int32_t newTargetFlags = oldTargetFlags
2946a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                        & (InputTarget::FLAG_FOREGROUND
2947a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                                | InputTarget::FLAG_SPLIT | InputTarget::FLAG_DISPATCH_AS_IS);
29489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTouchState.addOrUpdateWindow(toWindowHandle, newTargetFlags, pointerIds);
2949e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
2950e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                found = true;
2951e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                break;
2952e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            }
2953e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        }
2954e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
2955e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        if (! found) {
2956e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
29575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Focus transfer failed because from window did not have focus.");
2958e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
2959e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            return false;
2960e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        }
2961e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
29629c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        ssize_t fromConnectionIndex = getConnectionIndexLocked(fromChannel);
29639c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        ssize_t toConnectionIndex = getConnectionIndexLocked(toChannel);
29649c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        if (fromConnectionIndex >= 0 && toConnectionIndex >= 0) {
2965cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            sp<Connection> fromConnection = mConnectionsByFd.valueAt(fromConnectionIndex);
2966cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            sp<Connection> toConnection = mConnectionsByFd.valueAt(toConnectionIndex);
29679c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown
29689c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown            fromConnection->inputState.copyPointerStateTo(toConnection->inputState);
2969da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
29709c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                    "transferring touch focus from this window to another window");
2971da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            synthesizeCancelationEventsForConnectionLocked(fromConnection, options);
29729c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        }
29739c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown
2974e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
2975e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        logDispatchStateLocked();
2976e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
2977e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    } // release lock
2978e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
2979e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    // Wake up poll loop since it may need to make new input dispatching choices.
2980e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    mLooper->wake();
2981e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    return true;
2982e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown}
2983e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
2984120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brownvoid InputDispatcher::resetAndDropEverythingLocked(const char* reason) {
2985120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown#if DEBUG_FOCUS
29865baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("Resetting and dropping all events (%s).", reason);
2987120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown#endif
2988120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
2989da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS, reason);
2990da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    synthesizeCancelationEventsForAllConnectionsLocked(options);
2991120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
2992120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    resetKeyRepeatLocked();
2993120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    releasePendingEventLocked();
2994120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    drainInboundQueueLocked();
2995e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    resetANRTimeoutsLocked();
2996120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
2997120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    mTouchState.reset();
29989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    mLastHoverWindowHandle.clear();
2999120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown}
3000120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
3001b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::logDispatchStateLocked() {
3002b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    String8 dump;
3003b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    dumpDispatchStateLocked(dump);
30042a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown
30052a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown    char* text = dump.lockBuffer(dump.size());
30062a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown    char* start = text;
30072a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown    while (*start != '\0') {
30082a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown        char* end = strchr(start, '\n');
30092a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown        if (*end == '\n') {
30102a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown            *(end++) = '\0';
30112a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown        }
30125baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("%s", start);
30132a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown        start = end;
30142a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown    }
3015b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3016b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3017b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::dumpDispatchStateLocked(String8& dump) {
3018f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "DispatchEnabled: %d\n", mDispatchEnabled);
3019f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "DispatchFrozen: %d\n", mDispatchFrozen);
3020b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
30219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (mFocusedApplicationHandle != NULL) {
3022f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.appendFormat(INDENT "FocusedApplication: name='%s', dispatchingTimeout=%0.3fms\n",
3023cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                mFocusedApplicationHandle->getName().string(),
3024cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                mFocusedApplicationHandle->getDispatchingTimeout(
3025cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        DEFAULT_INPUT_DISPATCHING_TIMEOUT) / 1000000.0);
3026b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
3027f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "FocusedApplication: <null>\n");
3028b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3029f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "FocusedWindow: name='%s'\n",
3030cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mFocusedWindowHandle != NULL ? mFocusedWindowHandle->getName().string() : "<null>");
3031f2f487183052865d50c004a835360be1728b5a52Jeff Brown
3032f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "TouchDown: %s\n", toString(mTouchState.down));
3033f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "TouchSplit: %s\n", toString(mTouchState.split));
303495712850665492af670824abdba77f0944d984d1Jeff Brown    dump.appendFormat(INDENT "TouchDeviceId: %d\n", mTouchState.deviceId);
303558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    dump.appendFormat(INDENT "TouchSource: 0x%08x\n", mTouchState.source);
3036f2f487183052865d50c004a835360be1728b5a52Jeff Brown    if (!mTouchState.windows.isEmpty()) {
3037f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "TouchedWindows:\n");
3038f2f487183052865d50c004a835360be1728b5a52Jeff Brown        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
3039f2f487183052865d50c004a835360be1728b5a52Jeff Brown            const TouchedWindow& touchedWindow = mTouchState.windows[i];
3040f2f487183052865d50c004a835360be1728b5a52Jeff Brown            dump.appendFormat(INDENT2 "%d: name='%s', pointerIds=0x%0x, targetFlags=0x%x\n",
3041cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    i, touchedWindow.windowHandle->getName().string(),
3042cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    touchedWindow.pointerIds.value,
3043f2f487183052865d50c004a835360be1728b5a52Jeff Brown                    touchedWindow.targetFlags);
3044f2f487183052865d50c004a835360be1728b5a52Jeff Brown        }
3045f2f487183052865d50c004a835360be1728b5a52Jeff Brown    } else {
3046f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "TouchedWindows: <none>\n");
3047f2f487183052865d50c004a835360be1728b5a52Jeff Brown    }
3048f2f487183052865d50c004a835360be1728b5a52Jeff Brown
30499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (!mWindowHandles.isEmpty()) {
3050f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "Windows:\n");
30519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        for (size_t i = 0; i < mWindowHandles.size(); i++) {
30529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
3053cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            const InputWindowInfo* windowInfo = windowHandle->getInfo();
3054cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
3055f2f487183052865d50c004a835360be1728b5a52Jeff Brown            dump.appendFormat(INDENT2 "%d: name='%s', paused=%s, hasFocus=%s, hasWallpaper=%s, "
3056f2f487183052865d50c004a835360be1728b5a52Jeff Brown                    "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, "
3057e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    "frame=[%d,%d][%d,%d], scale=%f, "
3058fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    "touchableRegion=",
3059cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    i, windowInfo->name.string(),
3060cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->paused),
3061cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->hasFocus),
3062cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->hasWallpaper),
3063cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->visible),
3064cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->canReceiveKeys),
3065cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->layoutParamsFlags, windowInfo->layoutParamsType,
3066cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->layer,
3067cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->frameLeft, windowInfo->frameTop,
3068cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->frameRight, windowInfo->frameBottom,
3069cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->scaleFactor);
3070cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            dumpRegion(dump, windowInfo->touchableRegion);
3071cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            dump.appendFormat(", inputFeatures=0x%08x", windowInfo->inputFeatures);
3072fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            dump.appendFormat(", ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n",
3073cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->ownerPid, windowInfo->ownerUid,
3074cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->dispatchingTimeout / 1000000.0);
3075f2f487183052865d50c004a835360be1728b5a52Jeff Brown        }
3076f2f487183052865d50c004a835360be1728b5a52Jeff Brown    } else {
3077f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "Windows: <none>\n");
3078b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3079b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3080f2f487183052865d50c004a835360be1728b5a52Jeff Brown    if (!mMonitoringChannels.isEmpty()) {
3081f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "MonitoringChannels:\n");
3082f2f487183052865d50c004a835360be1728b5a52Jeff Brown        for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
3083f2f487183052865d50c004a835360be1728b5a52Jeff Brown            const sp<InputChannel>& channel = mMonitoringChannels[i];
3084f2f487183052865d50c004a835360be1728b5a52Jeff Brown            dump.appendFormat(INDENT2 "%d: '%s'\n", i, channel->getName().string());
3085f2f487183052865d50c004a835360be1728b5a52Jeff Brown        }
3086f2f487183052865d50c004a835360be1728b5a52Jeff Brown    } else {
3087f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "MonitoringChannels: <none>\n");
3088b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3089b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3090f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "InboundQueue: length=%u\n", mInboundQueue.count());
3091519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3092b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (isAppSwitchPendingLocked()) {
3093f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.appendFormat(INDENT "AppSwitch: pending, due in %01.1fms\n",
3094b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                (mAppSwitchDueTime - now()) / 1000000.0);
3095b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
3096f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "AppSwitch: not pending\n");
3097b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3098b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3099b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3100928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatus_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChannel,
3101928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputWindowHandle>& inputWindowHandle, bool monitor) {
31029c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_REGISTRATION
31035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ registerInputChannel - monitor=%s", inputChannel->getName().string(),
3104b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            toString(monitor));
31059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif
31069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
310746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
310846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        AutoMutex _l(mLock);
310946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3110519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        if (getConnectionIndexLocked(inputChannel) >= 0) {
31118564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("Attempted to register already registered input channel '%s'",
311246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    inputChannel->getName().string());
311346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            return BAD_VALUE;
311446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
311546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3116cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        sp<Connection> connection = new Connection(inputChannel, inputWindowHandle, monitor);
311746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
311891e328984c0d1e0f95b3d37f779d9d4fa9bfe8f8Jeff Brown        int fd = inputChannel->getFd();
3119cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        mConnectionsByFd.add(fd, connection);
31209c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3121b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (monitor) {
3122b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mMonitoringChannels.push(inputChannel);
3123b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
3124b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3125cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        mLooper->addFd(fd, 0, ALOOPER_EVENT_INPUT, handleReceiveCallback, this);
31262cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown
31279c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        runCommandsLockedInterruptible();
312846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
312946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return OK;
313046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
313146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
313246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatus_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputChannel) {
31339c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_REGISTRATION
31345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ unregisterInputChannel", inputChannel->getName().string());
31359c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif
31369c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
313746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
313846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        AutoMutex _l(mLock);
313946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3140cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        status_t status = unregisterInputChannelLocked(inputChannel, false /*notify*/);
3141cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (status) {
3142cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            return status;
314346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
3144cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    } // release lock
314546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3146cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    // Wake the poll loop because removing the connection may have changed the current
3147cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    // synchronization state.
3148cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mLooper->wake();
3149cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    return OK;
3150cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown}
315146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3152cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brownstatus_t InputDispatcher::unregisterInputChannelLocked(const sp<InputChannel>& inputChannel,
3153cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        bool notify) {
3154cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
3155cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (connectionIndex < 0) {
31568564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Attempted to unregister already unregistered input channel '%s'",
3157cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                inputChannel->getName().string());
3158cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return BAD_VALUE;
3159cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
316046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3161cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
3162cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    mConnectionsByFd.removeItemsAt(connectionIndex);
3163b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3164cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (connection->monitor) {
3165cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        removeMonitorChannelLocked(inputChannel);
3166cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
31672cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown
3168cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    mLooper->removeFd(inputChannel->getFd());
31699c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3170cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    nsecs_t currentTime = now();
3171cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    abortBrokenDispatchCycleLocked(currentTime, connection, notify);
317246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3173cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    runCommandsLockedInterruptible();
3174cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
3175cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    connection->status = Connection::STATUS_ZOMBIE;
317646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return OK;
317746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
317846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3179cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brownvoid InputDispatcher::removeMonitorChannelLocked(const sp<InputChannel>& inputChannel) {
3180cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
3181cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown         if (mMonitoringChannels[i] == inputChannel) {
3182cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown             mMonitoringChannels.removeAt(i);
3183cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown             break;
3184cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown         }
3185cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
3186cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown}
3187cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
3188519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownssize_t InputDispatcher::getConnectionIndexLocked(const sp<InputChannel>& inputChannel) {
3189cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    ssize_t connectionIndex = mConnectionsByFd.indexOfKey(inputChannel->getFd());
31902cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown    if (connectionIndex >= 0) {
3191cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
31922cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown        if (connection->inputChannel.get() == inputChannel.get()) {
31932cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown            return connectionIndex;
31942cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown        }
31952cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown    }
31962cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown
31972cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown    return -1;
31982cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown}
31992cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown
32009c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid InputDispatcher::onDispatchCycleFinishedLocked(
3201072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        nsecs_t currentTime, const sp<Connection>& connection, uint32_t seq, bool handled) {
32023915bb845b032dc184dba5e60970b803390ca3edJeff Brown    CommandEntry* commandEntry = postCommandLocked(
32033915bb845b032dc184dba5e60970b803390ca3edJeff Brown            & InputDispatcher::doDispatchCycleFinishedLockedInterruptible);
32043915bb845b032dc184dba5e60970b803390ca3edJeff Brown    commandEntry->connection = connection;
3205072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    commandEntry->seq = seq;
32063915bb845b032dc184dba5e60970b803390ca3edJeff Brown    commandEntry->handled = handled;
320746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
320846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
32099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid InputDispatcher::onDispatchCycleBrokenLocked(
32107fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        nsecs_t currentTime, const sp<Connection>& connection) {
32113762c311729fe9f3af085c14c5c1fb471d994c03Steve Block    ALOGE("channel '%s' ~ Channel is unrecoverably broken and will be disposed!",
321246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            connection->getInputChannelName());
321346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
32149c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    CommandEntry* commandEntry = postCommandLocked(
32159c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            & InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible);
32167fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    commandEntry->connection = connection;
321746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
321846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3219519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownvoid InputDispatcher::onANRLocked(
32209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        nsecs_t currentTime, const sp<InputApplicationHandle>& applicationHandle,
32219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle,
3222519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        nsecs_t eventTime, nsecs_t waitStartTime) {
32236215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    ALOGI("Application is not responding: %s.  "
3224519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            "%01.1fms since event, %01.1fms since wait started",
32259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            getApplicationWindowLabelLocked(applicationHandle, windowHandle).string(),
3226519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            (currentTime - eventTime) / 1000000.0,
3227519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            (currentTime - waitStartTime) / 1000000.0);
3228519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3229519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    CommandEntry* commandEntry = postCommandLocked(
3230519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            & InputDispatcher::doNotifyANRLockedInterruptible);
32319302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    commandEntry->inputApplicationHandle = applicationHandle;
32329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    commandEntry->inputWindowHandle = windowHandle;
3233519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown}
3234519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3235b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::doNotifyConfigurationChangedInterruptible(
3236b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        CommandEntry* commandEntry) {
3237b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.unlock();
3238b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3239b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mPolicy->notifyConfigurationChanged(commandEntry->eventTime);
3240b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3241b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.lock();
3242b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3243b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
32449c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible(
32459c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        CommandEntry* commandEntry) {
32467fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    sp<Connection> connection = commandEntry->connection;
32479c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
32487fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    if (connection->status != Connection::STATUS_ZOMBIE) {
32497fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        mLock.unlock();
32509c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3251928e054931d357326613c78e62f4d850b7c442ffJeff Brown        mPolicy->notifyInputChannelBroken(connection->inputWindowHandle);
32527fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
32537fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        mLock.lock();
32547fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
32559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
32569c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3257519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownvoid InputDispatcher::doNotifyANRLockedInterruptible(
32589c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        CommandEntry* commandEntry) {
3259519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    mLock.unlock();
32609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3261519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    nsecs_t newTimeout = mPolicy->notifyANR(
3262928e054931d357326613c78e62f4d850b7c442ffJeff Brown            commandEntry->inputApplicationHandle, commandEntry->inputWindowHandle);
32639c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3264519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    mLock.lock();
32657fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
32669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    resumeAfterTargetsNotReadyTimeoutLocked(newTimeout,
32679302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            commandEntry->inputWindowHandle != NULL
3268cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    ? commandEntry->inputWindowHandle->getInputChannel() : NULL);
32699c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
32709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3271b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible(
3272b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        CommandEntry* commandEntry) {
3273b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    KeyEntry* entry = commandEntry->keyEntry;
32741f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
32751f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    KeyEvent event;
32761f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    initializeKeyEvent(&event, entry);
3277b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3278b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.unlock();
3279b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3280905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    nsecs_t delay = mPolicy->interceptKeyBeforeDispatching(commandEntry->inputWindowHandle,
32811f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            &event, entry->policyFlags);
3282b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3283b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.lock();
3284b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3285905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    if (delay < 0) {
3286905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_SKIP;
3287905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    } else if (!delay) {
3288905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_CONTINUE;
3289905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    } else {
3290905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER;
3291905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyWakeupTime = now() + delay;
3292905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    }
3293ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    entry->release();
3294b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3295b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
32963915bb845b032dc184dba5e60970b803390ca3edJeff Brownvoid InputDispatcher::doDispatchCycleFinishedLockedInterruptible(
32973915bb845b032dc184dba5e60970b803390ca3edJeff Brown        CommandEntry* commandEntry) {
32983915bb845b032dc184dba5e60970b803390ca3edJeff Brown    sp<Connection> connection = commandEntry->connection;
3299072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    uint32_t seq = commandEntry->seq;
33003915bb845b032dc184dba5e60970b803390ca3edJeff Brown    bool handled = commandEntry->handled;
33013915bb845b032dc184dba5e60970b803390ca3edJeff Brown
3302072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    // Handle post-event policy actions.
3303072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    DispatchEntry* dispatchEntry = connection->findWaitQueueEntry(seq);
3304072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    if (dispatchEntry) {
3305d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        bool restartEvent;
3306d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        if (dispatchEntry->eventEntry->type == EventEntry::TYPE_KEY) {
3307d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            KeyEntry* keyEntry = static_cast<KeyEntry*>(dispatchEntry->eventEntry);
3308d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            restartEvent = afterKeyEventLockedInterruptible(connection,
3309d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    dispatchEntry, keyEntry, handled);
3310d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        } else if (dispatchEntry->eventEntry->type == EventEntry::TYPE_MOTION) {
3311d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            MotionEntry* motionEntry = static_cast<MotionEntry*>(dispatchEntry->eventEntry);
3312d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            restartEvent = afterMotionEventLockedInterruptible(connection,
3313d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    dispatchEntry, motionEntry, handled);
3314d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        } else {
3315d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            restartEvent = false;
3316d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
3317d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
3318d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Dequeue the event and start the next cycle.
3319d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Note that because the lock might have been released, it is possible that the
3320d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // contents of the wait queue to have been drained, so we need to double-check
3321d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // a few things.
3322072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        if (dispatchEntry == connection->findWaitQueueEntry(seq)) {
3323072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            connection->waitQueue.dequeue(dispatchEntry);
3324481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            traceWaitQueueLengthLocked(connection);
3325d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            if (restartEvent && connection->status == Connection::STATUS_NORMAL) {
3326d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                connection->outboundQueue.enqueueAtHead(dispatchEntry);
3327481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                traceOutboundQueueLengthLocked(connection);
3328d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            } else {
3329d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                releaseDispatchEntryLocked(dispatchEntry);
3330fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3331fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        }
3332da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3333d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Start the next dispatch cycle for this connection.
3334d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        startDispatchCycleLocked(now(), connection);
3335fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    }
3336fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown}
3337fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
3338fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brownbool InputDispatcher::afterKeyEventLockedInterruptible(const sp<Connection>& connection,
3339fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        DispatchEntry* dispatchEntry, KeyEntry* keyEntry, bool handled) {
3340fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    if (!(keyEntry->flags & AKEY_EVENT_FLAG_FALLBACK)) {
3341fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        // Get the fallback key state.
3342fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        // Clear it out after dispatching the UP.
3343fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        int32_t originalKeyCode = keyEntry->keyCode;
3344fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        int32_t fallbackKeyCode = connection->inputState.getFallbackKey(originalKeyCode);
3345fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        if (keyEntry->action == AKEY_EVENT_ACTION_UP) {
3346fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            connection->inputState.removeFallbackKey(originalKeyCode);
3347fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        }
3348fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
3349fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        if (handled || !dispatchEntry->hasForegroundTarget()) {
3350fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // If the application handles the original key for which we previously
3351fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // generated a fallback or if the window is not a foreground window,
3352fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // then cancel the associated fallback key, if any.
3353fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (fallbackKeyCode != -1) {
3354fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                if (fallbackKeyCode != AKEYCODE_UNKNOWN) {
3355fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    CancelationOptions options(CancelationOptions::CANCEL_FALLBACK_EVENTS,
3356fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "application handled the original non-fallback key "
3357fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "or is no longer a foreground target, "
3358fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "canceling previously dispatched fallback key");
3359fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    options.keyCode = fallbackKeyCode;
3360fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    synthesizeCancelationEventsForConnectionLocked(connection, options);
3361fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
3362fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                connection->inputState.removeFallbackKey(originalKeyCode);
3363fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3364fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        } else {
3365fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // If the application did not handle a non-fallback key, first check
3366fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // that we are in a good state to perform unhandled key event processing
3367fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // Then ask the policy what to do with it.
3368fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            bool initialDown = keyEntry->action == AKEY_EVENT_ACTION_DOWN
3369fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    && keyEntry->repeatCount == 0;
3370fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (fallbackKeyCode == -1 && !initialDown) {
3371bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
33725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Unhandled key event: Skipping unhandled key event processing "
3373fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        "since this is not an initial down.  "
3374fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        "keyCode=%d, action=%d, repeatCount=%d",
3375fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        originalKeyCode, keyEntry->action, keyEntry->repeatCount);
3376bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#endif
3377fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                return false;
3378fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3379bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown
3380fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // Dispatch the unhandled key to the policy.
3381bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
33825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Unhandled key event: Asking policy to perform fallback action.  "
3383fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    "keyCode=%d, action=%d, repeatCount=%d",
3384fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    keyEntry->keyCode, keyEntry->action, keyEntry->repeatCount);
3385bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#endif
3386fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            KeyEvent event;
3387fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            initializeKeyEvent(&event, keyEntry);
338849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3389fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            mLock.unlock();
339049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3391fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            bool fallback = mPolicy->dispatchUnhandledKey(connection->inputWindowHandle,
3392fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    &event, keyEntry->policyFlags, &event);
339349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3394fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            mLock.lock();
339549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3396fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (connection->status != Connection::STATUS_NORMAL) {
3397fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                connection->inputState.removeFallbackKey(originalKeyCode);
3398d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                return false;
3399fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
340000045a7e6fbed88f3325d2bbb048dc96a082078cJeff Brown
3401fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // Latch the fallback keycode for this key on an initial down.
3402fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // The fallback keycode cannot change at any other point in the lifecycle.
3403fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (initialDown) {
3404fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                if (fallback) {
3405fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    fallbackKeyCode = event.getKeyCode();
3406fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                } else {
3407fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    fallbackKeyCode = AKEYCODE_UNKNOWN;
3408fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
3409fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                connection->inputState.setFallbackKey(originalKeyCode, fallbackKeyCode);
3410fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3411da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3412ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block            ALOG_ASSERT(fallbackKeyCode != -1);
3413da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3414fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // Cancel the fallback key if the policy decides not to send it anymore.
3415fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // We will continue to dispatch the key to the policy but we will no
3416fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // longer dispatch a fallback key to the application.
3417fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (fallbackKeyCode != AKEYCODE_UNKNOWN
3418fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    && (!fallback || fallbackKeyCode != event.getKeyCode())) {
3419da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
3420fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                if (fallback) {
34215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("Unhandled key event: Policy requested to send key %d"
3422fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "as a fallback for %d, but on the DOWN it had requested "
3423fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "to send %d instead.  Fallback canceled.",
3424fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            event.getKeyCode(), originalKeyCode, fallbackKeyCode);
3425fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                } else {
34265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("Unhandled key event: Policy did not request fallback for %d,"
3427fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "but on the DOWN it had requested to send %d.  "
3428fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "Fallback canceled.",
3429fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            originalKeyCode, fallbackKeyCode);
3430fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
3431da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#endif
3432da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3433fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                CancelationOptions options(CancelationOptions::CANCEL_FALLBACK_EVENTS,
3434fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        "canceling fallback, policy no longer desires it");
3435fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                options.keyCode = fallbackKeyCode;
3436fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                synthesizeCancelationEventsForConnectionLocked(connection, options);
3437da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3438fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                fallback = false;
3439fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                fallbackKeyCode = AKEYCODE_UNKNOWN;
3440fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                if (keyEntry->action != AKEY_EVENT_ACTION_UP) {
3441fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    connection->inputState.setFallbackKey(originalKeyCode,
3442fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            fallbackKeyCode);
3443fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
3444fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3445da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3446da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
3447fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            {
3448fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                String8 msg;
3449fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                const KeyedVector<int32_t, int32_t>& fallbackKeys =
3450fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        connection->inputState.getFallbackKeys();
3451fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                for (size_t i = 0; i < fallbackKeys.size(); i++) {
3452fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    msg.appendFormat(", %d->%d", fallbackKeys.keyAt(i),
3453fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            fallbackKeys.valueAt(i));
3454fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
34555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Unhandled key event: %d currently tracked fallback keys%s.",
3456fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        fallbackKeys.size(), msg.string());
3457fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3458da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#endif
3459da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3460fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (fallback) {
3461fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                // Restart the dispatch cycle using the fallback key.
3462fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->eventTime = event.getEventTime();
3463fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->deviceId = event.getDeviceId();
3464fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->source = event.getSource();
3465fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->flags = event.getFlags() | AKEY_EVENT_FLAG_FALLBACK;
3466fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->keyCode = fallbackKeyCode;
3467fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->scanCode = event.getScanCode();
3468fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->metaState = event.getMetaState();
3469fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->repeatCount = event.getRepeatCount();
3470fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->downTime = event.getDownTime();
3471fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->syntheticRepeat = false;
347249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3473bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
34745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Unhandled key event: Dispatching fallback key.  "
3475fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        "originalKeyCode=%d, fallbackKeyCode=%d, fallbackMetaState=%08x",
3476fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        originalKeyCode, fallbackKeyCode, keyEntry->metaState);
3477bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#endif
3478d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                return true; // restart the event
3479fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            } else {
3480da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
34815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Unhandled key event: No fallback key.");
3482da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#endif
348349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            }
34843915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
34853915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
3486fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    return false;
3487fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown}
34883915bb845b032dc184dba5e60970b803390ca3edJeff Brown
3489fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brownbool InputDispatcher::afterMotionEventLockedInterruptible(const sp<Connection>& connection,
3490fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        DispatchEntry* dispatchEntry, MotionEntry* motionEntry, bool handled) {
3491fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    return false;
34923915bb845b032dc184dba5e60970b803390ca3edJeff Brown}
34933915bb845b032dc184dba5e60970b803390ca3edJeff Brown
3494b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::doPokeUserActivityLockedInterruptible(CommandEntry* commandEntry) {
3495b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.unlock();
3496b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
349701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    mPolicy->pokeUserActivity(commandEntry->eventTime, commandEntry->userActivityEventType);
3498b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3499b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.lock();
3500b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3501b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
35023915bb845b032dc184dba5e60970b803390ca3edJeff Brownvoid InputDispatcher::initializeKeyEvent(KeyEvent* event, const KeyEntry* entry) {
35033915bb845b032dc184dba5e60970b803390ca3edJeff Brown    event->initialize(entry->deviceId, entry->source, entry->action, entry->flags,
35043915bb845b032dc184dba5e60970b803390ca3edJeff Brown            entry->keyCode, entry->scanCode, entry->metaState, entry->repeatCount,
35053915bb845b032dc184dba5e60970b803390ca3edJeff Brown            entry->downTime, entry->eventTime);
35063915bb845b032dc184dba5e60970b803390ca3edJeff Brown}
35073915bb845b032dc184dba5e60970b803390ca3edJeff Brown
3508519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownvoid InputDispatcher::updateDispatchStatisticsLocked(nsecs_t currentTime, const EventEntry* entry,
3509519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        int32_t injectionResult, nsecs_t timeSpentWaitingForApplication) {
3510519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    // TODO Write some statistics about how long we spend waiting.
3511b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3512b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3513481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownvoid InputDispatcher::traceInboundQueueLengthLocked() {
3514481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (ATRACE_ENABLED()) {
3515481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        ATRACE_INT("iq", mInboundQueue.count());
3516481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
3517481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown}
3518481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
3519481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownvoid InputDispatcher::traceOutboundQueueLengthLocked(const sp<Connection>& connection) {
3520481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (ATRACE_ENABLED()) {
3521481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        char counterName[40];
3522481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        snprintf(counterName, sizeof(counterName), "oq:%s", connection->getWindowName());
3523481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        ATRACE_INT(counterName, connection->outboundQueue.count());
3524481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
3525481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown}
3526481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
3527481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownvoid InputDispatcher::traceWaitQueueLengthLocked(const sp<Connection>& connection) {
3528481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (ATRACE_ENABLED()) {
3529481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        char counterName[40];
3530481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        snprintf(counterName, sizeof(counterName), "wq:%s", connection->getWindowName());
3531481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        ATRACE_INT(counterName, connection->waitQueue.count());
3532481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
3533481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown}
3534481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
3535b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::dump(String8& dump) {
353689ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    AutoMutex _l(mLock);
353789ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown
3538f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.append("Input Dispatcher State:\n");
3539b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    dumpDispatchStateLocked(dump);
3540214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
3541214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    dump.append(INDENT "Configuration:\n");
3542214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    dump.appendFormat(INDENT2 "KeyRepeatDelay: %0.1fms\n", mConfig.keyRepeatDelay * 0.000001f);
3543214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    dump.appendFormat(INDENT2 "KeyRepeatTimeout: %0.1fms\n", mConfig.keyRepeatTimeout * 0.000001f);
3544b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3545b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
354689ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brownvoid InputDispatcher::monitor() {
354789ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    // Acquire and release the lock to ensure that the dispatcher has not deadlocked.
354889ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    mLock.lock();
3549112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown    mLooper->wake();
3550112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown    mDispatcherIsAliveCondition.wait(mLock);
355189ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    mLock.unlock();
355289ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown}
355389ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown
35549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3555519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown// --- InputDispatcher::Queue ---
3556519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3557519e024d1e682ca458cc2dab743589a12992c0e1Jeff Browntemplate <typename T>
3558519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownuint32_t InputDispatcher::Queue<T>::count() const {
3559519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    uint32_t result = 0;
3560ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    for (const T* entry = head; entry; entry = entry->next) {
3561519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        result += 1;
3562519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    }
3563519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    return result;
3564519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown}
3565519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3566519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3567ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::InjectionState ---
356846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3569ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::InjectionState::InjectionState(int32_t injectorPid, int32_t injectorUid) :
3570ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        refCount(1),
3571ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectorPid(injectorPid), injectorUid(injectorUid),
3572ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionResult(INPUT_EVENT_INJECTION_PENDING), injectionIsAsync(false),
3573ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        pendingForegroundDispatches(0) {
357446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
357546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3576ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::InjectionState::~InjectionState() {
357701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
357801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
3579ac386073df2514b79a2ca169f4a89f129733002fJeff Brownvoid InputDispatcher::InjectionState::release() {
3580ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    refCount -= 1;
3581ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    if (refCount == 0) {
3582ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        delete this;
3583ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    } else {
3584ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(refCount > 0);
358501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
35867fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
35877fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
358846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3589ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::EventEntry ---
359046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3591ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::EventEntry::EventEntry(int32_t type, nsecs_t eventTime, uint32_t policyFlags) :
3592ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        refCount(1), type(type), eventTime(eventTime), policyFlags(policyFlags),
3593ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionState(NULL), dispatchInProgress(false) {
359446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
359546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3596ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::EventEntry::~EventEntry() {
3597ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    releaseInjectionState();
359846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
359946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3600ac386073df2514b79a2ca169f4a89f129733002fJeff Brownvoid InputDispatcher::EventEntry::release() {
3601ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    refCount -= 1;
3602ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    if (refCount == 0) {
3603ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        delete this;
360401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    } else {
3605ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(refCount > 0);
360601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
360701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
360801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
3609ac386073df2514b79a2ca169f4a89f129733002fJeff Brownvoid InputDispatcher::EventEntry::releaseInjectionState() {
3610ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    if (injectionState) {
3611ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionState->release();
3612ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionState = NULL;
361346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
361446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
361546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
361646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3617ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::ConfigurationChangedEntry ---
361846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3619ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::ConfigurationChangedEntry::ConfigurationChangedEntry(nsecs_t eventTime) :
3620ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        EventEntry(TYPE_CONFIGURATION_CHANGED, eventTime, 0) {
362146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
362246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3623ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::ConfigurationChangedEntry::~ConfigurationChangedEntry() {
3624a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown}
3625a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
3626ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
362765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown// --- InputDispatcher::DeviceResetEntry ---
362865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
362965fd251c3913fc921468a3dad190810db19eb9dfJeff BrownInputDispatcher::DeviceResetEntry::DeviceResetEntry(nsecs_t eventTime, int32_t deviceId) :
363065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        EventEntry(TYPE_DEVICE_RESET, eventTime, 0),
363165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        deviceId(deviceId) {
363265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
363365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
363465fd251c3913fc921468a3dad190810db19eb9dfJeff BrownInputDispatcher::DeviceResetEntry::~DeviceResetEntry() {
363565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
363665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
363765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
3638ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::KeyEntry ---
3639ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3640ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::KeyEntry::KeyEntry(nsecs_t eventTime,
3641ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action,
3642ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t flags, int32_t keyCode, int32_t scanCode, int32_t metaState,
3643ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t repeatCount, nsecs_t downTime) :
3644ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        EventEntry(TYPE_KEY, eventTime, policyFlags),
3645ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        deviceId(deviceId), source(source), action(action), flags(flags),
3646ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        keyCode(keyCode), scanCode(scanCode), metaState(metaState),
3647ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        repeatCount(repeatCount), downTime(downTime),
3648905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        syntheticRepeat(false), interceptKeyResult(KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN),
3649905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        interceptKeyWakeupTime(0) {
365046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
365146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3652ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::KeyEntry::~KeyEntry() {
36539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
36549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3655ac386073df2514b79a2ca169f4a89f129733002fJeff Brownvoid InputDispatcher::KeyEntry::recycle() {
3656ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    releaseInjectionState();
365746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3658ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    dispatchInProgress = false;
3659ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    syntheticRepeat = false;
3660ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
3661905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    interceptKeyWakeupTime = 0;
366246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
366346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3664b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3665ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown// --- InputDispatcher::MotionEntry ---
3666ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown
3667ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::MotionEntry::MotionEntry(nsecs_t eventTime,
3668ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action, int32_t flags,
3669ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t metaState, int32_t buttonState,
3670ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t edgeFlags, float xPrecision, float yPrecision,
3671ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        nsecs_t downTime, uint32_t pointerCount,
3672ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        const PointerProperties* pointerProperties, const PointerCoords* pointerCoords) :
3673ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        EventEntry(TYPE_MOTION, eventTime, policyFlags),
36743241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        eventTime(eventTime),
3675ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        deviceId(deviceId), source(source), action(action), flags(flags),
3676ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        metaState(metaState), buttonState(buttonState), edgeFlags(edgeFlags),
3677ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        xPrecision(xPrecision), yPrecision(yPrecision),
36783241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        downTime(downTime), pointerCount(pointerCount) {
3679ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    for (uint32_t i = 0; i < pointerCount; i++) {
3680ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        this->pointerProperties[i].copyFrom(pointerProperties[i]);
36813241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        this->pointerCoords[i].copyFrom(pointerCoords[i]);
3682ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    }
3683ac386073df2514b79a2ca169f4a89f129733002fJeff Brown}
3684ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3685ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::MotionEntry::~MotionEntry() {
3686ac386073df2514b79a2ca169f4a89f129733002fJeff Brown}
3687ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3688ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3689ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::DispatchEntry ---
3690ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3691072ec96a4900d4616574733646ee46311cb5d2cbJeff Brownvolatile int32_t InputDispatcher::DispatchEntry::sNextSeqAtomic;
3692072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
3693ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::DispatchEntry::DispatchEntry(EventEntry* eventEntry,
3694ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t targetFlags, float xOffset, float yOffset, float scaleFactor) :
3695072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        seq(nextSeq()),
3696ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        eventEntry(eventEntry), targetFlags(targetFlags),
3697ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        xOffset(xOffset), yOffset(yOffset), scaleFactor(scaleFactor),
36983241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        resolvedAction(0), resolvedFlags(0) {
3699ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    eventEntry->refCount += 1;
3700ac386073df2514b79a2ca169f4a89f129733002fJeff Brown}
3701ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3702ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::DispatchEntry::~DispatchEntry() {
3703ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    eventEntry->release();
3704ac386073df2514b79a2ca169f4a89f129733002fJeff Brown}
3705ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3706072ec96a4900d4616574733646ee46311cb5d2cbJeff Brownuint32_t InputDispatcher::DispatchEntry::nextSeq() {
3707072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    // Sequence number 0 is reserved and will never be returned.
3708072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    uint32_t seq;
3709072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    do {
3710072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        seq = android_atomic_inc(&sNextSeqAtomic);
3711072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    } while (!seq);
3712072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    return seq;
3713072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown}
3714072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
3715b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3716b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// --- InputDispatcher::InputState ---
3717b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3718b699726018a0049665d8ad6b90dbc5af0e18f135Jeff BrownInputDispatcher::InputState::InputState() {
3719b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3720b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3721b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownInputDispatcher::InputState::~InputState() {
3722b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3723b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3724b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool InputDispatcher::InputState::isNeutral() const {
3725b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return mKeyMementos.isEmpty() && mMotionMementos.isEmpty();
3726b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3727b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
37288134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownbool InputDispatcher::InputState::isHovering(int32_t deviceId, uint32_t source) const {
37298134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mMotionMementos.size(); i++) {
37308134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        const MotionMemento& memento = mMotionMementos.itemAt(i);
37318134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (memento.deviceId == deviceId
37328134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.source == source
37338134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.hovering) {
37348134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
37358134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
3736b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
37378134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    return false;
3738b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3739b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
37408134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownbool InputDispatcher::InputState::trackKey(const KeyEntry* entry,
37418134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        int32_t action, int32_t flags) {
37428134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    switch (action) {
37438134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AKEY_EVENT_ACTION_UP: {
37448134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (entry->flags & AKEY_EVENT_FLAG_FALLBACK) {
37458134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            for (size_t i = 0; i < mFallbackKeys.size(); ) {
37468134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                if (mFallbackKeys.valueAt(i) == entry->keyCode) {
37478134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    mFallbackKeys.removeItemsAt(i);
37488134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                } else {
37498134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    i += 1;
37508134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                }
3751da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            }
3752da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        }
37538134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findKeyMemento(entry);
37548134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
37558134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mKeyMementos.removeAt(index);
37568134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
37578134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
375868b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        /* FIXME: We can't just drop the key up event because that prevents creating
375968b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * popup windows that are automatically shown when a key is held and then
376068b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * dismissed when the key is released.  The problem is that the popup will
376168b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * not have received the original key down, so the key up will be considered
376268b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * to be inconsistent with its observed state.  We could perhaps handle this
376368b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * by synthesizing a key down but that will cause other problems.
376468b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         *
376568b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * So for now, allow inconsistent key up events to be dispatched.
376668b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         *
37678134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
37685baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropping inconsistent key up event: deviceId=%d, source=%08x, "
37698134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "keyCode=%d, scanCode=%d",
37708134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                entry->deviceId, entry->source, entry->keyCode, entry->scanCode);
37718134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
37728134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return false;
377368b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        */
377468b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        return true;
3775da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
3776da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
37778134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AKEY_EVENT_ACTION_DOWN: {
37788134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findKeyMemento(entry);
37798134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
37808134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mKeyMementos.removeAt(index);
3781b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
37828134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        addKeyMemento(entry, flags);
37838134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
3784b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3785b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
37868134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    default:
37878134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
3788b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3789b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3790b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
37918134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownbool InputDispatcher::InputState::trackMotion(const MotionEntry* entry,
37928134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        int32_t action, int32_t flags) {
3793a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    int32_t actionMasked = action & AMOTION_EVENT_ACTION_MASK;
37948134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    switch (actionMasked) {
37958134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_UP:
37968134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_CANCEL: {
37978134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, false /*hovering*/);
37988134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
37998134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mMotionMementos.removeAt(index);
38008134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
38018134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
38028134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
38035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropping inconsistent motion up or cancel event: deviceId=%d, source=%08x, "
38048134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "actionMasked=%d",
38058134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                entry->deviceId, entry->source, actionMasked);
38068134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
38078134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return false;
38088134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
3809b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
38108134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_DOWN: {
38118134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, false /*hovering*/);
38128134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
38138134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mMotionMementos.removeAt(index);
38148134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
38158134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        addMotionMemento(entry, flags, false /*hovering*/);
38168134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
38178134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
3818b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
38198134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_POINTER_UP:
38208134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_POINTER_DOWN:
38218134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_MOVE: {
38228134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, false /*hovering*/);
38238134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
38248134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            MotionMemento& memento = mMotionMementos.editItemAt(index);
38258134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            memento.setPointers(entry);
38268134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
38278134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
38282e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown        if (actionMasked == AMOTION_EVENT_ACTION_MOVE
38292e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown                && (entry->source & (AINPUT_SOURCE_CLASS_JOYSTICK
38302e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown                        | AINPUT_SOURCE_CLASS_NAVIGATION))) {
38312e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown            // Joysticks and trackballs can send MOVE events without corresponding DOWN or UP.
38322e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown            return true;
38332e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown        }
38348134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
38355baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropping inconsistent motion pointer up/down or move event: "
38368134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "deviceId=%d, source=%08x, actionMasked=%d",
38378134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                entry->deviceId, entry->source, actionMasked);
38388134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
38398134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return false;
38408134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
3841b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
38428134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_HOVER_EXIT: {
38438134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, true /*hovering*/);
38448134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
38458134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mMotionMementos.removeAt(index);
38468134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
3847b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
38488134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
38495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropping inconsistent motion hover exit event: deviceId=%d, source=%08x",
38508134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                entry->deviceId, entry->source);
38518134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
38528134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return false;
3853b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3854b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3855a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    case AMOTION_EVENT_ACTION_HOVER_ENTER:
38568134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_HOVER_MOVE: {
38578134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, true /*hovering*/);
38588134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
38598134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mMotionMementos.removeAt(index);
38608134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
38618134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        addMotionMemento(entry, flags, true /*hovering*/);
38628134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
38638134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
38648134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
38658134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    default:
38668134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
38678134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
38688134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown}
38698134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
38708134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownssize_t InputDispatcher::InputState::findKeyMemento(const KeyEntry* entry) const {
38718134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mKeyMementos.size(); i++) {
38728134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        const KeyMemento& memento = mKeyMementos.itemAt(i);
38738134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (memento.deviceId == entry->deviceId
38748134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.source == entry->source
38758134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.keyCode == entry->keyCode
38768134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.scanCode == entry->scanCode) {
38778134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return i;
38788134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
3879b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
38808134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    return -1;
38818134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown}
38828134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
38838134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownssize_t InputDispatcher::InputState::findMotionMemento(const MotionEntry* entry,
38848134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        bool hovering) const {
38858134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mMotionMementos.size(); i++) {
38868134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        const MotionMemento& memento = mMotionMementos.itemAt(i);
38878134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (memento.deviceId == entry->deviceId
38888134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.source == entry->source
38898134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.hovering == hovering) {
38908134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return i;
38918134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
38928134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
38938134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    return -1;
38948134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown}
38958134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
38968134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownvoid InputDispatcher::InputState::addKeyMemento(const KeyEntry* entry, int32_t flags) {
38978134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    mKeyMementos.push();
38988134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    KeyMemento& memento = mKeyMementos.editTop();
38998134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.deviceId = entry->deviceId;
39008134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.source = entry->source;
39018134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.keyCode = entry->keyCode;
39028134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.scanCode = entry->scanCode;
39038134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.flags = flags;
39048134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.downTime = entry->downTime;
39058134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown}
39068134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
39078134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownvoid InputDispatcher::InputState::addMotionMemento(const MotionEntry* entry,
39088134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        int32_t flags, bool hovering) {
39098134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    mMotionMementos.push();
39108134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    MotionMemento& memento = mMotionMementos.editTop();
39118134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.deviceId = entry->deviceId;
39128134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.source = entry->source;
39138134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.flags = flags;
39148134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.xPrecision = entry->xPrecision;
39158134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.yPrecision = entry->yPrecision;
39168134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.downTime = entry->downTime;
39178134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.setPointers(entry);
39188134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.hovering = hovering;
3919b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3920b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3921b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::InputState::MotionMemento::setPointers(const MotionEntry* entry) {
3922b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    pointerCount = entry->pointerCount;
3923b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    for (uint32_t i = 0; i < entry->pointerCount; i++) {
3924fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        pointerProperties[i].copyFrom(entry->pointerProperties[i]);
39253241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        pointerCoords[i].copyFrom(entry->pointerCoords[i]);
3926b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3927b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3928b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3929b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::InputState::synthesizeCancelationEvents(nsecs_t currentTime,
3930ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        Vector<EventEntry*>& outEvents, const CancelationOptions& options) {
39318134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mKeyMementos.size(); i++) {
3932b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        const KeyMemento& memento = mKeyMementos.itemAt(i);
393349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        if (shouldCancelKey(memento, options)) {
3934ac386073df2514b79a2ca169f4a89f129733002fJeff Brown            outEvents.push(new KeyEntry(currentTime,
3935b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    memento.deviceId, memento.source, 0,
393649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                    AKEY_EVENT_ACTION_UP, memento.flags | AKEY_EVENT_FLAG_CANCELED,
3937b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    memento.keyCode, memento.scanCode, 0, 0, memento.downTime));
3938b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
3939b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3940b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
39418134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mMotionMementos.size(); i++) {
3942b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        const MotionMemento& memento = mMotionMementos.itemAt(i);
394349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        if (shouldCancelMotion(memento, options)) {
3944ac386073df2514b79a2ca169f4a89f129733002fJeff Brown            outEvents.push(new MotionEntry(currentTime,
3945b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    memento.deviceId, memento.source, 0,
3946a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                    memento.hovering
3947a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                            ? AMOTION_EVENT_ACTION_HOVER_EXIT
3948a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                            : AMOTION_EVENT_ACTION_CANCEL,
39498134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    memento.flags, 0, 0, 0,
3950b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    memento.xPrecision, memento.yPrecision, memento.downTime,
3951fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    memento.pointerCount, memento.pointerProperties, memento.pointerCoords));
3952b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
3953b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3954b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3955b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3956b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::InputState::clear() {
3957b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mKeyMementos.clear();
3958b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mMotionMementos.clear();
3959da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    mFallbackKeys.clear();
3960b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
3961b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
39629c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brownvoid InputDispatcher::InputState::copyPointerStateTo(InputState& other) const {
39639c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown    for (size_t i = 0; i < mMotionMementos.size(); i++) {
39649c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        const MotionMemento& memento = mMotionMementos.itemAt(i);
39659c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        if (memento.source & AINPUT_SOURCE_CLASS_POINTER) {
39669c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown            for (size_t j = 0; j < other.mMotionMementos.size(); ) {
39679c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                const MotionMemento& otherMemento = other.mMotionMementos.itemAt(j);
39689c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                if (memento.deviceId == otherMemento.deviceId
39699c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                        && memento.source == otherMemento.source) {
39709c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                    other.mMotionMementos.removeAt(j);
39719c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                } else {
39729c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                    j += 1;
39739c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                }
39749c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown            }
39759c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown            other.mMotionMementos.push(memento);
39769c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        }
39779c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown    }
39789c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown}
39799c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown
3980da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brownint32_t InputDispatcher::InputState::getFallbackKey(int32_t originalKeyCode) {
3981da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    ssize_t index = mFallbackKeys.indexOfKey(originalKeyCode);
3982da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    return index >= 0 ? mFallbackKeys.valueAt(index) : -1;
3983da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown}
3984da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3985da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brownvoid InputDispatcher::InputState::setFallbackKey(int32_t originalKeyCode,
3986da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        int32_t fallbackKeyCode) {
3987da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    ssize_t index = mFallbackKeys.indexOfKey(originalKeyCode);
3988da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    if (index >= 0) {
3989da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        mFallbackKeys.replaceValueAt(index, fallbackKeyCode);
3990da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    } else {
3991da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        mFallbackKeys.add(originalKeyCode, fallbackKeyCode);
3992da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
3993da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown}
3994da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3995da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brownvoid InputDispatcher::InputState::removeFallbackKey(int32_t originalKeyCode) {
3996da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    mFallbackKeys.removeItem(originalKeyCode);
3997da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown}
3998da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
399949ed71db425c5054e3ad9526496a7e116c89556bJeff Brownbool InputDispatcher::InputState::shouldCancelKey(const KeyMemento& memento,
4000da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const CancelationOptions& options) {
4001da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    if (options.keyCode != -1 && memento.keyCode != options.keyCode) {
4002da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        return false;
4003da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
4004da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
400565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (options.deviceId != -1 && memento.deviceId != options.deviceId) {
400665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        return false;
400765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
400865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
4009da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    switch (options.mode) {
4010da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_ALL_EVENTS:
4011da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_NON_POINTER_EVENTS:
401249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return true;
4013da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_FALLBACK_EVENTS:
401449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return memento.flags & AKEY_EVENT_FLAG_FALLBACK;
4015b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    default:
401649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return false;
401749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    }
401849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown}
401949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
402049ed71db425c5054e3ad9526496a7e116c89556bJeff Brownbool InputDispatcher::InputState::shouldCancelMotion(const MotionMemento& memento,
4021da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const CancelationOptions& options) {
402265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (options.deviceId != -1 && memento.deviceId != options.deviceId) {
402365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        return false;
402465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
402565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
4026da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    switch (options.mode) {
4027da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_ALL_EVENTS:
4028b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return true;
4029da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_POINTER_EVENTS:
403049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return memento.source & AINPUT_SOURCE_CLASS_POINTER;
4031da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_NON_POINTER_EVENTS:
403249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return !(memento.source & AINPUT_SOURCE_CLASS_POINTER);
403349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    default:
403449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return false;
4035b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
4036b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
4037b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
4038b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
403946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// --- InputDispatcher::Connection ---
404046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4041928e054931d357326613c78e62f4d850b7c442ffJeff BrownInputDispatcher::Connection::Connection(const sp<InputChannel>& inputChannel,
4042cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const sp<InputWindowHandle>& inputWindowHandle, bool monitor) :
4043928e054931d357326613c78e62f4d850b7c442ffJeff Brown        status(STATUS_NORMAL), inputChannel(inputChannel), inputWindowHandle(inputWindowHandle),
4044cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        monitor(monitor),
4045d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        inputPublisher(inputChannel), inputPublisherBlocked(false) {
404646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
404746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
404846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputDispatcher::Connection::~Connection() {
404946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
405046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4051481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownconst char* InputDispatcher::Connection::getWindowName() const {
4052481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (inputWindowHandle != NULL) {
4053481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        return inputWindowHandle->getName().string();
4054481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
4055481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (monitor) {
4056481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        return "monitor";
4057481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
4058481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    return "?";
4059481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown}
4060481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
40619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownconst char* InputDispatcher::Connection::getStatusLabel() const {
40629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    switch (status) {
40639c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    case STATUS_NORMAL:
40649c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return "NORMAL";
40659c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
40669c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    case STATUS_BROKEN:
40679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return "BROKEN";
40689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
40699c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    case STATUS_ZOMBIE:
40709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return "ZOMBIE";
40719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
40729c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    default:
40739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return "UNKNOWN";
40749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
40759c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
40769c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
4077072ec96a4900d4616574733646ee46311cb5d2cbJeff BrownInputDispatcher::DispatchEntry* InputDispatcher::Connection::findWaitQueueEntry(uint32_t seq) {
4078072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    for (DispatchEntry* entry = waitQueue.head; entry != NULL; entry = entry->next) {
4079072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        if (entry->seq == seq) {
4080072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            return entry;
4081072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        }
4082072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    }
4083072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    return NULL;
4084072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown}
4085072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
4086b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
40879c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// --- InputDispatcher::CommandEntry ---
40889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
4089ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::CommandEntry::CommandEntry(Command command) :
4090072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    command(command), eventTime(0), keyEntry(NULL), userActivityEventType(0),
4091072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    seq(0), handled(false) {
40929c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
40939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
40949c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownInputDispatcher::CommandEntry::~CommandEntry() {
40959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
40969c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
409746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
409801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown// --- InputDispatcher::TouchState ---
409901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
410001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff BrownInputDispatcher::TouchState::TouchState() :
410158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    down(false), split(false), deviceId(-1), source(0) {
410201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
410301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
410401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff BrownInputDispatcher::TouchState::~TouchState() {
410501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
410601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
410701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid InputDispatcher::TouchState::reset() {
410801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    down = false;
410901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    split = false;
411095712850665492af670824abdba77f0944d984d1Jeff Brown    deviceId = -1;
411158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    source = 0;
411201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    windows.clear();
411301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
411401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
411501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid InputDispatcher::TouchState::copyFrom(const TouchState& other) {
411601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    down = other.down;
411701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    split = other.split;
411895712850665492af670824abdba77f0944d984d1Jeff Brown    deviceId = other.deviceId;
411958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    source = other.source;
41209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    windows = other.windows;
412101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
412201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
41239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid InputDispatcher::TouchState::addOrUpdateWindow(const sp<InputWindowHandle>& windowHandle,
412401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        int32_t targetFlags, BitSet32 pointerIds) {
412501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (targetFlags & InputTarget::FLAG_SPLIT) {
412601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        split = true;
412701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
412801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
412901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < windows.size(); i++) {
413001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        TouchedWindow& touchedWindow = windows.editItemAt(i);
41319302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (touchedWindow.windowHandle == windowHandle) {
413201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            touchedWindow.targetFlags |= targetFlags;
413398db5fabdad86dca379740d8050697950b9f026cJeff Brown            if (targetFlags & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT) {
413498db5fabdad86dca379740d8050697950b9f026cJeff Brown                touchedWindow.targetFlags &= ~InputTarget::FLAG_DISPATCH_AS_IS;
413598db5fabdad86dca379740d8050697950b9f026cJeff Brown            }
413601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            touchedWindow.pointerIds.value |= pointerIds.value;
413701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            return;
413801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
413901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
414001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
414101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    windows.push();
414201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
414301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    TouchedWindow& touchedWindow = windows.editTop();
41449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    touchedWindow.windowHandle = windowHandle;
414501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    touchedWindow.targetFlags = targetFlags;
414601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    touchedWindow.pointerIds = pointerIds;
414701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
414801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
4149a032cc008618b83ecbbede537517d1e7998e3264Jeff Brownvoid InputDispatcher::TouchState::filterNonAsIsTouchWindows() {
415001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0 ; i < windows.size(); ) {
4151a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        TouchedWindow& window = windows.editItemAt(i);
415298db5fabdad86dca379740d8050697950b9f026cJeff Brown        if (window.targetFlags & (InputTarget::FLAG_DISPATCH_AS_IS
415398db5fabdad86dca379740d8050697950b9f026cJeff Brown                | InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER)) {
4154a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            window.targetFlags &= ~InputTarget::FLAG_DISPATCH_MASK;
4155a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            window.targetFlags |= InputTarget::FLAG_DISPATCH_AS_IS;
415601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            i += 1;
4157a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        } else {
4158a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            windows.removeAt(i);
415901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
416001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
416101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
416201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
41639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownsp<InputWindowHandle> InputDispatcher::TouchState::getFirstForegroundWindowHandle() const {
416401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < windows.size(); i++) {
416598db5fabdad86dca379740d8050697950b9f026cJeff Brown        const TouchedWindow& window = windows.itemAt(i);
416698db5fabdad86dca379740d8050697950b9f026cJeff Brown        if (window.targetFlags & InputTarget::FLAG_FOREGROUND) {
41679302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            return window.windowHandle;
416801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
416901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
417001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return NULL;
417101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
417201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
417398db5fabdad86dca379740d8050697950b9f026cJeff Brownbool InputDispatcher::TouchState::isSlippery() const {
417498db5fabdad86dca379740d8050697950b9f026cJeff Brown    // Must have exactly one foreground window.
417598db5fabdad86dca379740d8050697950b9f026cJeff Brown    bool haveSlipperyForegroundWindow = false;
417698db5fabdad86dca379740d8050697950b9f026cJeff Brown    for (size_t i = 0; i < windows.size(); i++) {
417798db5fabdad86dca379740d8050697950b9f026cJeff Brown        const TouchedWindow& window = windows.itemAt(i);
417898db5fabdad86dca379740d8050697950b9f026cJeff Brown        if (window.targetFlags & InputTarget::FLAG_FOREGROUND) {
4179cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (haveSlipperyForegroundWindow
4180cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    || !(window.windowHandle->getInfo()->layoutParamsFlags
4181cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                            & InputWindowInfo::FLAG_SLIPPERY)) {
418298db5fabdad86dca379740d8050697950b9f026cJeff Brown                return false;
418398db5fabdad86dca379740d8050697950b9f026cJeff Brown            }
418498db5fabdad86dca379740d8050697950b9f026cJeff Brown            haveSlipperyForegroundWindow = true;
418598db5fabdad86dca379740d8050697950b9f026cJeff Brown        }
418698db5fabdad86dca379740d8050697950b9f026cJeff Brown    }
418798db5fabdad86dca379740d8050697950b9f026cJeff Brown    return haveSlipperyForegroundWindow;
418898db5fabdad86dca379740d8050697950b9f026cJeff Brown}
418998db5fabdad86dca379740d8050697950b9f026cJeff Brown
419001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
419146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// --- InputDispatcherThread ---
419246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
419346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputDispatcherThread::InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher) :
419446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        Thread(/*canCallJava*/ true), mDispatcher(dispatcher) {
419546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
419646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
419746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputDispatcherThread::~InputDispatcherThread() {
419846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
419946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
420046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownbool InputDispatcherThread::threadLoop() {
420146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mDispatcher->dispatchOnce();
420246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return true;
420346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
420446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
420546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
4206