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>
5622aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown#include <time.h>
5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
58f2f487183052865d50c004a835360be1728b5a52Jeff Brown#define INDENT "  "
59f2f487183052865d50c004a835360be1728b5a52Jeff Brown#define INDENT2 "    "
60265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown#define INDENT3 "      "
61265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown#define INDENT4 "        "
62f2f487183052865d50c004a835360be1728b5a52Jeff Brown
6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
65b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// Default input dispatching timeout if there is no focused application or paused window
66b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// from which to determine an appropriate dispatching timeout.
67b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownconst nsecs_t DEFAULT_INPUT_DISPATCHING_TIMEOUT = 5000 * 1000000LL; // 5 sec
68b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
69b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// Amount of time to allow for all pending events to be processed when an app switch
70b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// key is on the way.  This is used to preempt input dispatch and drop input events
71b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// when an application takes too long to respond and the user has pressed an app switch key.
72b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownconst nsecs_t APP_SWITCH_TIMEOUT = 500 * 1000000LL; // 0.5sec
73b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
74928e054931d357326613c78e62f4d850b7c442ffJeff Brown// Amount of time to allow for an event to be dispatched (measured since its eventTime)
75928e054931d357326613c78e62f4d850b7c442ffJeff Brown// before considering it stale and dropping it.
76928e054931d357326613c78e62f4d850b7c442ffJeff Brownconst nsecs_t STALE_EVENT_TIMEOUT = 10000 * 1000000LL; // 10sec
77928e054931d357326613c78e62f4d850b7c442ffJeff Brown
78d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown// Amount of time to allow touch events to be streamed out to a connection before requiring
79d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown// that the first event be finished.  This value extends the ANR timeout by the specified
80d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown// amount.  For example, if streaming is allowed to get ahead by one second relative to the
81d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown// queue of waiting unfinished events, then ANRs will similarly be delayed by one second.
82d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brownconst nsecs_t STREAM_AHEAD_EVENT_TIMEOUT = 500 * 1000000LL; // 0.5sec
83d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
84265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown// Log a warning when an event takes longer than this to process, even if an ANR does not occur.
85265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brownconst nsecs_t SLOW_EVENT_PROCESSING_WARNING_TIMEOUT = 2000 * 1000000LL; // 2sec
86265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
887fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownstatic inline nsecs_t now() {
897fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    return systemTime(SYSTEM_TIME_MONOTONIC);
907fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
917fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
92b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownstatic inline const char* toString(bool value) {
93b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return value ? "true" : "false";
94b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
95b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
9601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownstatic inline int32_t getMotionEventActionPointerIndex(int32_t action) {
9701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
9801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
9901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
10001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
10101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownstatic bool isValidKeyAction(int32_t action) {
10201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    switch (action) {
10301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AKEY_EVENT_ACTION_DOWN:
10401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AKEY_EVENT_ACTION_UP:
10501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return true;
10601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    default:
10701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
10801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
10901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
11001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
11101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownstatic bool validateKeyEvent(int32_t action) {
11201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (! isValidKeyAction(action)) {
1133762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Key event has invalid action code 0x%x", action);
11401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
11501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
11601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return true;
11701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
11801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
119b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownstatic bool isValidMotionAction(int32_t action, size_t pointerCount) {
12001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    switch (action & AMOTION_EVENT_ACTION_MASK) {
12101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_DOWN:
12201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_UP:
12301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_CANCEL:
12401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_MOVE:
12501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    case AMOTION_EVENT_ACTION_OUTSIDE:
126a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    case AMOTION_EVENT_ACTION_HOVER_ENTER:
127cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    case AMOTION_EVENT_ACTION_HOVER_MOVE:
128a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    case AMOTION_EVENT_ACTION_HOVER_EXIT:
12933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    case AMOTION_EVENT_ACTION_SCROLL:
13001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return true;
131b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case AMOTION_EVENT_ACTION_POINTER_DOWN:
132b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case AMOTION_EVENT_ACTION_POINTER_UP: {
133b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        int32_t index = getMotionEventActionPointerIndex(action);
134b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return index >= 0 && size_t(index) < pointerCount;
135b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
13601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    default:
13701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
13801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
13901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
14001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
14101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownstatic bool validateMotionEvent(int32_t action, size_t pointerCount,
142fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        const PointerProperties* pointerProperties) {
143b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (! isValidMotionAction(action, pointerCount)) {
1443762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Motion event has invalid action code 0x%x", action);
14501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
14601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
14701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (pointerCount < 1 || pointerCount > MAX_POINTERS) {
1483762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Motion event has invalid pointer count %d; value must be between 1 and %d.",
14901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                pointerCount, MAX_POINTERS);
15001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return false;
15101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    BitSet32 pointerIdBits;
15301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
154fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        int32_t id = pointerProperties[i].id;
155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (id < 0 || id > MAX_POINTER_ID) {
1563762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Motion event has invalid pointer id %d; value must be between 0 and %d",
157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                    id, MAX_POINTER_ID);
15801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            return false;
15901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (pointerIdBits.hasBit(id)) {
1613762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Motion event has duplicate pointer id %d", id);
162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            return false;
163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        pointerIdBits.markBit(id);
16501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
16601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return true;
16701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
16801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
16983d616a9c7b9505153d258511eb5c16b552e268dJeff Brownstatic bool isMainDisplay(int32_t displayId) {
17083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    return displayId == ADISPLAY_ID_DEFAULT || displayId == ADISPLAY_ID_NONE;
17183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown}
17283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
173fbf097732137a32930d151f7ba6816a5b870c32aJeff Brownstatic void dumpRegion(String8& dump, const SkRegion& region) {
174fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    if (region.isEmpty()) {
175fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        dump.append("<empty>");
176fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        return;
177fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    }
178fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
179fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    bool first = true;
180fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    for (SkRegion::Iterator it(region); !it.done(); it.next()) {
181fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        if (first) {
182fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            first = false;
183fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        } else {
184fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            dump.append("|");
185fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        }
186fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        const SkIRect& rect = it.rect();
187fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown        dump.appendFormat("[%d,%d][%d,%d]", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
188fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown    }
189fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown}
190fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
191b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
19246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// --- InputDispatcher ---
19346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1949c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownInputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) :
195b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mPolicy(policy),
196928e054931d357326613c78e62f4d850b7c442ffJeff Brown    mPendingEvent(NULL), mAppSwitchSawKeyDown(false), mAppSwitchDueTime(LONG_LONG_MAX),
197928e054931d357326613c78e62f4d850b7c442ffJeff Brown    mNextUnblockedEvent(NULL),
198c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown    mDispatchEnabled(false), mDispatchFrozen(false), mInputFilterEnabled(false),
1999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    mInputTargetWaitCause(INPUT_TARGET_WAIT_CAUSE_NONE) {
2004fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper = new Looper(false);
20146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mKeyRepeatState.lastKeyEntry = NULL;
2039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
204214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    policy->getDispatcherConfiguration(&mConfig);
20546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
20646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputDispatcher::~InputDispatcher() {
208b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    { // acquire lock
209b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        AutoMutex _l(mLock);
21046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
211b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        resetKeyRepeatLocked();
21254a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        releasePendingEventLocked();
213b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        drainInboundQueueLocked();
21446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
21546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
216cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    while (mConnectionsByFd.size() != 0) {
217cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        unregisterInputChannel(mConnectionsByFd.valueAt(0)->inputChannel);
21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
21946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
22046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid InputDispatcher::dispatchOnce() {
22246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    nsecs_t nextWakeupTime = LONG_LONG_MAX;
22346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
22446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        AutoMutex _l(mLock);
225112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown        mDispatcherIsAliveCondition.broadcast();
226112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown
227074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown        // Run a dispatch loop if there are no pending commands.
228074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown        // The dispatch loop might enqueue commands to run afterwards.
229074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown        if (!haveCommandsLocked()) {
230074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown            dispatchOnceInnerLocked(&nextWakeupTime);
231074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown        }
23246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
233074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown        // Run all pending commands if there are any.
234074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown        // If any commands were run then force the next poll to wake up immediately.
235b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (runCommandsLockedInterruptible()) {
236074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown            nextWakeupTime = LONG_LONG_MIN;
237b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
238b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } // release lock
239b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
240b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Wait for callback or timeout or wake.  (make sure we round up, not down)
241b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    nsecs_t currentTime = now();
242aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    int timeoutMillis = toMillisecondTimeoutDelay(currentTime, nextWakeupTime);
2434fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->pollOnce(timeoutMillis);
244b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
245b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
246214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownvoid InputDispatcher::dispatchOnceInnerLocked(nsecs_t* nextWakeupTime) {
247b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    nsecs_t currentTime = now();
248b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
249b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Reset the key repeat timer whenever we disallow key events, even if the next event
250b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // is not a key.  This is to ensure that we abort a key repeat if the device is just coming
251b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // out of sleep.
252214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    if (!mPolicy->isKeyRepeatEnabled()) {
253b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        resetKeyRepeatLocked();
254b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
255b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
256b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // If dispatching is frozen, do not process timeouts or try to deliver any new events.
257b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mDispatchFrozen) {
258b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
2595baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dispatch frozen.  Waiting some more.");
260b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
261b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return;
262b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
26346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
264b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Optimize latency of app switches.
265b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Essentially we start a short timeout when an app switch key (HOME / ENDCALL) has
266b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // been pressed.  When it expires, we preempt dispatch and drop all other pending events.
267b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool isAppSwitchDue = mAppSwitchDueTime <= currentTime;
268b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mAppSwitchDueTime < *nextWakeupTime) {
269b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        *nextWakeupTime = mAppSwitchDueTime;
270b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
27146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
272b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Ready to start a new event.
273b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // If we don't already have a pending event, go grab one.
274b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (! mPendingEvent) {
275b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mInboundQueue.isEmpty()) {
276b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            if (isAppSwitchDue) {
277b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // The inbound queue is empty so the app switch key we were waiting
278b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // for will never arrive.  Stop waiting for it.
279b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetPendingAppSwitchLocked(false);
280b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                isAppSwitchDue = false;
281b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
282b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
283b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            // Synthesize a key repeat if appropriate.
284b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            if (mKeyRepeatState.lastKeyEntry) {
285b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                if (currentTime >= mKeyRepeatState.nextRepeatTime) {
286214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                    mPendingEvent = synthesizeKeyRepeatLocked(currentTime);
287b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                } else {
288b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    if (mKeyRepeatState.nextRepeatTime < *nextWakeupTime) {
289b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                        *nextWakeupTime = mKeyRepeatState.nextRepeatTime;
29046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    }
29146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
292b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
293cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
294cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // Nothing to do if there is no pending event.
295e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            if (!mPendingEvent) {
296b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                return;
297b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
298b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        } else {
299b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            // Inbound queue has at least one entry.
300e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            mPendingEvent = mInboundQueue.dequeueAtHead();
301481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            traceInboundQueueLengthLocked();
302b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
303e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown
304e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown        // Poke user activity for this event.
305e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown        if (mPendingEvent->policyFlags & POLICY_FLAG_PASS_TO_USER) {
306e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown            pokeUserActivityLocked(mPendingEvent);
307e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown        }
308e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown
309e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        // Get ready to dispatch the event.
310e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        resetANRTimeoutsLocked();
311b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
31246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
313b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Now we have an event to dispatch.
314928e054931d357326613c78e62f4d850b7c442ffJeff Brown    // All events are eventually dequeued and processed this way, even if we intend to drop them.
315ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block    ALOG_ASSERT(mPendingEvent != NULL);
31654a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown    bool done = false;
317b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    DropReason dropReason = DROP_REASON_NOT_DROPPED;
318b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (!(mPendingEvent->policyFlags & POLICY_FLAG_PASS_TO_USER)) {
319b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        dropReason = DROP_REASON_POLICY;
320b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    } else if (!mDispatchEnabled) {
321b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        dropReason = DROP_REASON_DISABLED;
322b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
323928e054931d357326613c78e62f4d850b7c442ffJeff Brown
324928e054931d357326613c78e62f4d850b7c442ffJeff Brown    if (mNextUnblockedEvent == mPendingEvent) {
325928e054931d357326613c78e62f4d850b7c442ffJeff Brown        mNextUnblockedEvent = NULL;
326928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
327928e054931d357326613c78e62f4d850b7c442ffJeff Brown
328b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    switch (mPendingEvent->type) {
329b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    case EventEntry::TYPE_CONFIGURATION_CHANGED: {
330b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        ConfigurationChangedEntry* typedEntry =
331b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                static_cast<ConfigurationChangedEntry*>(mPendingEvent);
33254a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        done = dispatchConfigurationChangedLocked(currentTime, typedEntry);
333b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        dropReason = DROP_REASON_NOT_DROPPED; // configuration changes are never dropped
334b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
335b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
33646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
33765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    case EventEntry::TYPE_DEVICE_RESET: {
33865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        DeviceResetEntry* typedEntry =
33965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                static_cast<DeviceResetEntry*>(mPendingEvent);
34065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        done = dispatchDeviceResetLocked(currentTime, typedEntry);
34165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        dropReason = DROP_REASON_NOT_DROPPED; // device resets are never dropped
34265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        break;
34365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
34465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
345b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    case EventEntry::TYPE_KEY: {
346b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        KeyEntry* typedEntry = static_cast<KeyEntry*>(mPendingEvent);
347b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (isAppSwitchDue) {
348b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            if (isAppSwitchKeyEventLocked(typedEntry)) {
349b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetPendingAppSwitchLocked(true);
350b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                isAppSwitchDue = false;
351b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            } else if (dropReason == DROP_REASON_NOT_DROPPED) {
352b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                dropReason = DROP_REASON_APP_SWITCH;
353b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
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        }
362214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        done = dispatchKeyLocked(currentTime, typedEntry, &dropReason, nextWakeupTime);
363b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
364b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
36546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
366b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    case EventEntry::TYPE_MOTION: {
367b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        MotionEntry* typedEntry = static_cast<MotionEntry*>(mPendingEvent);
368b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (dropReason == DROP_REASON_NOT_DROPPED && isAppSwitchDue) {
369b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            dropReason = DROP_REASON_APP_SWITCH;
370b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
371928e054931d357326613c78e62f4d850b7c442ffJeff Brown        if (dropReason == DROP_REASON_NOT_DROPPED
372928e054931d357326613c78e62f4d850b7c442ffJeff Brown                && isStaleEventLocked(currentTime, typedEntry)) {
373928e054931d357326613c78e62f4d850b7c442ffJeff Brown            dropReason = DROP_REASON_STALE;
374928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
375928e054931d357326613c78e62f4d850b7c442ffJeff Brown        if (dropReason == DROP_REASON_NOT_DROPPED && mNextUnblockedEvent) {
376928e054931d357326613c78e62f4d850b7c442ffJeff Brown            dropReason = DROP_REASON_BLOCKED;
377928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
378b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        done = dispatchMotionLocked(currentTime, typedEntry,
379e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown                &dropReason, nextWakeupTime);
380b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
381b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
383b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    default:
384ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(false);
385b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
386b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
387ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown
38854a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown    if (done) {
389b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (dropReason != DROP_REASON_NOT_DROPPED) {
390b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            dropInboundEventLocked(mPendingEvent, dropReason);
391b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
392b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
39354a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        releasePendingEventLocked();
394b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        *nextWakeupTime = LONG_LONG_MIN;  // force next poll to wake up immediately
395b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
396b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3979c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
398b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool InputDispatcher::enqueueInboundEventLocked(EventEntry* entry) {
399b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool needWake = mInboundQueue.isEmpty();
400b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mInboundQueue.enqueueAtTail(entry);
401481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceInboundQueueLengthLocked();
40246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
403b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    switch (entry->type) {
404b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case EventEntry::TYPE_KEY: {
405928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // Optimize app switch latency.
406928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // If the application takes too long to catch up then we drop all events preceding
407928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // the app switch key.
408b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        KeyEntry* keyEntry = static_cast<KeyEntry*>(entry);
409b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (isAppSwitchKeyEventLocked(keyEntry)) {
410b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            if (keyEntry->action == AKEY_EVENT_ACTION_DOWN) {
411b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                mAppSwitchSawKeyDown = true;
412b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            } else if (keyEntry->action == AKEY_EVENT_ACTION_UP) {
413b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                if (mAppSwitchSawKeyDown) {
414b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_APP_SWITCH
4155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("App switch is pending!");
416b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
417b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    mAppSwitchDueTime = keyEntry->eventTime + APP_SWITCH_TIMEOUT;
418b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    mAppSwitchSawKeyDown = false;
419b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    needWake = true;
420b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                }
421b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            }
422b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
423b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        break;
4249c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
425928e054931d357326613c78e62f4d850b7c442ffJeff Brown
426928e054931d357326613c78e62f4d850b7c442ffJeff Brown    case EventEntry::TYPE_MOTION: {
427928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // Optimize case where the current application is unresponsive and the user
428928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // decides to touch a window in a different application.
429928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // If the application takes too long to catch up then we drop all events preceding
430928e054931d357326613c78e62f4d850b7c442ffJeff Brown        // the touch into the other window.
431928e054931d357326613c78e62f4d850b7c442ffJeff Brown        MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
43233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        if (motionEntry->action == AMOTION_EVENT_ACTION_DOWN
433928e054931d357326613c78e62f4d850b7c442ffJeff Brown                && (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER)
434928e054931d357326613c78e62f4d850b7c442ffJeff Brown                && mInputTargetWaitCause == INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY
4359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                && mInputTargetWaitApplicationHandle != NULL) {
43683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            int32_t displayId = motionEntry->displayId;
4373241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            int32_t x = int32_t(motionEntry->pointerCoords[0].
438ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                    getAxisValue(AMOTION_EVENT_AXIS_X));
4393241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            int32_t y = int32_t(motionEntry->pointerCoords[0].
440ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                    getAxisValue(AMOTION_EVENT_AXIS_Y));
44183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            sp<InputWindowHandle> touchedWindowHandle = findTouchedWindowAtLocked(displayId, x, y);
4429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (touchedWindowHandle != NULL
4439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    && touchedWindowHandle->inputApplicationHandle
4449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                            != mInputTargetWaitApplicationHandle) {
445928e054931d357326613c78e62f4d850b7c442ffJeff Brown                // User touched a different application than the one we are waiting on.
446928e054931d357326613c78e62f4d850b7c442ffJeff Brown                // Flag the event, and start pruning the input queue.
447928e054931d357326613c78e62f4d850b7c442ffJeff Brown                mNextUnblockedEvent = motionEntry;
448928e054931d357326613c78e62f4d850b7c442ffJeff Brown                needWake = true;
449928e054931d357326613c78e62f4d850b7c442ffJeff Brown            }
450928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
451928e054931d357326613c78e62f4d850b7c442ffJeff Brown        break;
452928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
453b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
4549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
455b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return needWake;
456b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
457b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
45883d616a9c7b9505153d258511eb5c16b552e268dJeff Brownsp<InputWindowHandle> InputDispatcher::findTouchedWindowAtLocked(int32_t displayId,
45983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        int32_t x, int32_t y) {
460928e054931d357326613c78e62f4d850b7c442ffJeff Brown    // Traverse windows from front to back to find touched window.
4619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = mWindowHandles.size();
462928e054931d357326613c78e62f4d850b7c442ffJeff Brown    for (size_t i = 0; i < numWindows; i++) {
4639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
464cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const InputWindowInfo* windowInfo = windowHandle->getInfo();
46583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        if (windowInfo->displayId == displayId) {
46683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            int32_t flags = windowInfo->layoutParamsFlags;
46783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
46883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            if (windowInfo->visible) {
46983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                if (!(flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
47083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    bool isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
47183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                            | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
47283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
47383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                        // Found window.
47483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                        return windowHandle;
47583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    }
476928e054931d357326613c78e62f4d850b7c442ffJeff Brown                }
477928e054931d357326613c78e62f4d850b7c442ffJeff Brown            }
478928e054931d357326613c78e62f4d850b7c442ffJeff Brown
47983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
48083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                // Error window is on top but not visible, so touch is dropped.
48183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                return NULL;
48283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            }
483928e054931d357326613c78e62f4d850b7c442ffJeff Brown        }
484928e054931d357326613c78e62f4d850b7c442ffJeff Brown    }
485928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return NULL;
486928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
487928e054931d357326613c78e62f4d850b7c442ffJeff Brown
488b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::dropInboundEventLocked(EventEntry* entry, DropReason dropReason) {
489b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    const char* reason;
490b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    switch (dropReason) {
491b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case DROP_REASON_POLICY:
492e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
4935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropped event because policy consumed it.");
494e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown#endif
4953122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        reason = "inbound event was dropped because the policy consumed it";
496b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
497b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case DROP_REASON_DISABLED:
4986215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropped event because input dispatch is disabled.");
499b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        reason = "inbound event was dropped because input dispatch is disabled";
500b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
501b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case DROP_REASON_APP_SWITCH:
5026215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropped event because of pending overdue app switch.");
503b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        reason = "inbound event was dropped because of pending overdue app switch";
504b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
505928e054931d357326613c78e62f4d850b7c442ffJeff Brown    case DROP_REASON_BLOCKED:
5066215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropped event because the current application is not responding and the user "
5078134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "has started interacting with a different application.");
508928e054931d357326613c78e62f4d850b7c442ffJeff Brown        reason = "inbound event was dropped because the current application is not responding "
5098134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "and the user has started interacting with a different application";
510928e054931d357326613c78e62f4d850b7c442ffJeff Brown        break;
511928e054931d357326613c78e62f4d850b7c442ffJeff Brown    case DROP_REASON_STALE:
5126215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropped event because it is stale.");
513928e054931d357326613c78e62f4d850b7c442ffJeff Brown        reason = "inbound event was dropped because it is stale";
514928e054931d357326613c78e62f4d850b7c442ffJeff Brown        break;
515b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    default:
516ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(false);
517b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return;
518b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
519b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
520b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    switch (entry->type) {
521da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case EventEntry::TYPE_KEY: {
522da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, reason);
523da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        synthesizeCancelationEventsForAllConnectionsLocked(options);
524b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
525da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
526b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case EventEntry::TYPE_MOTION: {
527b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        MotionEntry* motionEntry = static_cast<MotionEntry*>(entry);
528b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER) {
529da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS, reason);
530da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            synthesizeCancelationEventsForAllConnectionsLocked(options);
531b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        } else {
532da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, reason);
533da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            synthesizeCancelationEventsForAllConnectionsLocked(options);
534b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
535b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
536b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
537b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
538b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
539b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
540b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownbool InputDispatcher::isAppSwitchKeyCode(int32_t keyCode) {
541b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return keyCode == AKEYCODE_HOME || keyCode == AKEYCODE_ENDCALL;
542b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
543b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
544b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownbool InputDispatcher::isAppSwitchKeyEventLocked(KeyEntry* keyEntry) {
545b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    return ! (keyEntry->flags & AKEY_EVENT_FLAG_CANCELED)
546b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            && isAppSwitchKeyCode(keyEntry->keyCode)
547e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown            && (keyEntry->policyFlags & POLICY_FLAG_TRUSTED)
548b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            && (keyEntry->policyFlags & POLICY_FLAG_PASS_TO_USER);
549b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
550b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
551b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownbool InputDispatcher::isAppSwitchPendingLocked() {
552b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    return mAppSwitchDueTime != LONG_LONG_MAX;
553b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
554b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
555b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::resetPendingAppSwitchLocked(bool handled) {
556b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mAppSwitchDueTime = LONG_LONG_MAX;
557b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
558b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_APP_SWITCH
559b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (handled) {
5605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("App switch has arrived.");
561b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
5625baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("App switch was abandoned.");
563b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
564b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
56546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
56646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
567928e054931d357326613c78e62f4d850b7c442ffJeff Brownbool InputDispatcher::isStaleEventLocked(nsecs_t currentTime, EventEntry* entry) {
568928e054931d357326613c78e62f4d850b7c442ffJeff Brown    return currentTime - entry->eventTime >= STALE_EVENT_TIMEOUT;
569928e054931d357326613c78e62f4d850b7c442ffJeff Brown}
570928e054931d357326613c78e62f4d850b7c442ffJeff Brown
571074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brownbool InputDispatcher::haveCommandsLocked() const {
572074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown    return !mCommandQueue.isEmpty();
573074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown}
574074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown
5759c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownbool InputDispatcher::runCommandsLockedInterruptible() {
5769c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    if (mCommandQueue.isEmpty()) {
5779c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return false;
5789c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
5799c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5809c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    do {
5819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        CommandEntry* commandEntry = mCommandQueue.dequeueAtHead();
5829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        Command command = commandEntry->command;
5849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        (this->*command)(commandEntry); // commands are implicitly 'LockedInterruptible'
5859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5867fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        commandEntry->connection.clear();
587ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        delete commandEntry;
5889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    } while (! mCommandQueue.isEmpty());
5899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    return true;
5909c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
5919c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
5929c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownInputDispatcher::CommandEntry* InputDispatcher::postCommandLocked(Command command) {
593ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    CommandEntry* commandEntry = new CommandEntry(command);
5949c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    mCommandQueue.enqueueAtTail(commandEntry);
5959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    return commandEntry;
5969c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
5979c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
598b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::drainInboundQueueLocked() {
599b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    while (! mInboundQueue.isEmpty()) {
600b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        EventEntry* entry = mInboundQueue.dequeueAtHead();
60154a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        releaseInboundEventLocked(entry);
602b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
603481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceInboundQueueLengthLocked();
604b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
6059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
60654a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brownvoid InputDispatcher::releasePendingEventLocked() {
607b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mPendingEvent) {
608e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        resetANRTimeoutsLocked();
60954a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        releaseInboundEventLocked(mPendingEvent);
610b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        mPendingEvent = NULL;
611b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
61246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
61346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
61454a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brownvoid InputDispatcher::releaseInboundEventLocked(EventEntry* entry) {
61501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionState* injectionState = entry->injectionState;
61601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState && injectionState->injectionResult == INPUT_EVENT_INJECTION_PENDING) {
617b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_DISPATCH_CYCLE
6185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Injected inbound event was dropped.");
61946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
620b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        setInjectionResultLocked(entry, INPUT_EVENT_INJECTION_FAILED);
62146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
622abb4d446a10b2defd342b1a2fa6462b52b82cdefJeff Brown    if (entry == mNextUnblockedEvent) {
623abb4d446a10b2defd342b1a2fa6462b52b82cdefJeff Brown        mNextUnblockedEvent = NULL;
624abb4d446a10b2defd342b1a2fa6462b52b82cdefJeff Brown    }
625ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    entry->release();
626b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
62746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
628b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::resetKeyRepeatLocked() {
629b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mKeyRepeatState.lastKeyEntry) {
630ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        mKeyRepeatState.lastKeyEntry->release();
631b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        mKeyRepeatState.lastKeyEntry = NULL;
632b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
633b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
634b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
635214eaf48878bba00cbd5831871bcbd82632b6e34Jeff BrownInputDispatcher::KeyEntry* InputDispatcher::synthesizeKeyRepeatLocked(nsecs_t currentTime) {
636349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    KeyEntry* entry = mKeyRepeatState.lastKeyEntry;
637349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
638349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Reuse the repeated key entry if it is otherwise unreferenced.
639e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    uint32_t policyFlags = (entry->policyFlags & POLICY_FLAG_RAW_MASK)
640e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown            | POLICY_FLAG_PASS_TO_USER | POLICY_FLAG_TRUSTED;
64146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (entry->refCount == 1) {
642ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        entry->recycle();
6437fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        entry->eventTime = currentTime;
6447fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        entry->policyFlags = policyFlags;
64546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        entry->repeatCount += 1;
64646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } else {
647ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        KeyEntry* newEntry = new KeyEntry(currentTime,
648c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                entry->deviceId, entry->source, policyFlags,
6497fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                entry->action, entry->flags, entry->keyCode, entry->scanCode,
65000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                entry->metaState, entry->repeatCount + 1, entry->downTime);
65146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
65246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mKeyRepeatState.lastKeyEntry = newEntry;
653ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        entry->release();
65446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
65546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        entry = newEntry;
65646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
657b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    entry->syntheticRepeat = true;
658b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
659b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Increment reference count since we keep a reference to the event in
660b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // mKeyRepeatState.lastKeyEntry in addition to the one we return.
661b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    entry->refCount += 1;
66246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
663214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    mKeyRepeatState.nextRepeatTime = currentTime + mConfig.keyRepeatDelay;
664b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return entry;
665b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
666b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
667b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool InputDispatcher::dispatchConfigurationChangedLocked(
668b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        nsecs_t currentTime, ConfigurationChangedEntry* entry) {
669b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
6705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("dispatchConfigurationChanged - eventTime=%lld", entry->eventTime);
671b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
672b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
673b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Reset key repeating in case a keyboard device was added or removed or something.
674b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    resetKeyRepeatLocked();
675b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
676b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Enqueue a command to run outside the lock to tell the policy that the configuration changed.
677b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    CommandEntry* commandEntry = postCommandLocked(
678b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            & InputDispatcher::doNotifyConfigurationChangedInterruptible);
679b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    commandEntry->eventTime = entry->eventTime;
680b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return true;
681b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
68246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
68365fd251c3913fc921468a3dad190810db19eb9dfJeff Brownbool InputDispatcher::dispatchDeviceResetLocked(
68465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        nsecs_t currentTime, DeviceResetEntry* entry) {
68565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
6865baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("dispatchDeviceReset - eventTime=%lld, deviceId=%d", entry->eventTime, entry->deviceId);
68765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown#endif
68865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
68965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS,
69065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            "device was reset");
69165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    options.deviceId = entry->deviceId;
69265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    synthesizeCancelationEventsForAllConnectionsLocked(options);
69365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    return true;
69465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
69565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
696214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownbool InputDispatcher::dispatchKeyLocked(nsecs_t currentTime, KeyEntry* entry,
697e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        DropReason* dropReason, nsecs_t* nextWakeupTime) {
698b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Preprocessing.
699b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (! entry->dispatchInProgress) {
700b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (entry->repeatCount == 0
701b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                && entry->action == AKEY_EVENT_ACTION_DOWN
702e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown                && (entry->policyFlags & POLICY_FLAG_TRUSTED)
7030029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                && (!(entry->policyFlags & POLICY_FLAG_DISABLE_KEY_REPEAT))) {
704b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            if (mKeyRepeatState.lastKeyEntry
705b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    && mKeyRepeatState.lastKeyEntry->keyCode == entry->keyCode) {
706b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // We have seen two identical key downs in a row which indicates that the device
707b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // driver is automatically generating key repeats itself.  We take note of the
708b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // repeat here, but we disable our own next key repeat timer since it is clear that
709b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // we will not need to synthesize key repeats ourselves.
710b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                entry->repeatCount = mKeyRepeatState.lastKeyEntry->repeatCount + 1;
711b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetKeyRepeatLocked();
712b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                mKeyRepeatState.nextRepeatTime = LONG_LONG_MAX; // don't generate repeats ourselves
713b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            } else {
714b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                // Not a repeat.  Save key down state in case we do see a repeat later.
715b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetKeyRepeatLocked();
716214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown                mKeyRepeatState.nextRepeatTime = entry->eventTime + mConfig.keyRepeatTimeout;
717b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
718b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mKeyRepeatState.lastKeyEntry = entry;
719b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            entry->refCount += 1;
720b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        } else if (! entry->syntheticRepeat) {
721b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            resetKeyRepeatLocked();
722b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
723b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
724e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown        if (entry->repeatCount == 1) {
725e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown            entry->flags |= AKEY_EVENT_FLAG_LONG_PRESS;
726e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown        } else {
727e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown            entry->flags &= ~AKEY_EVENT_FLAG_LONG_PRESS;
728e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown        }
729e2e012683d6f35f5eedfd0c39167ea78e32e2650Jeff Brown
730b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        entry->dispatchInProgress = true;
731e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
732e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        logOutboundKeyDetailsLocked("dispatchKey - ", entry);
733e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    }
734e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
735905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    // Handle case where the policy asked us to try again later last time.
736905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER) {
737905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        if (currentTime < entry->interceptKeyWakeupTime) {
738905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            if (entry->interceptKeyWakeupTime < *nextWakeupTime) {
739905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown                *nextWakeupTime = entry->interceptKeyWakeupTime;
740905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            }
741905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown            return false; // wait until next wakeup
742905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        }
743905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
744905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyWakeupTime = 0;
745905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    }
746905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown
747e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    // Give the policy a chance to intercept the key.
748e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN) {
749e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        if (entry->policyFlags & POLICY_FLAG_PASS_TO_USER) {
750e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            CommandEntry* commandEntry = postCommandLocked(
751e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown                    & InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible);
7529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (mFocusedWindowHandle != NULL) {
7539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                commandEntry->inputWindowHandle = mFocusedWindowHandle;
754e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            }
755e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            commandEntry->keyEntry = entry;
756e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            entry->refCount += 1;
757e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            return false; // wait for the command to run
758e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        } else {
759e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_CONTINUE;
760e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        }
761e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    } else if (entry->interceptKeyResult == KeyEntry::INTERCEPT_KEY_RESULT_SKIP) {
762e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        if (*dropReason == DROP_REASON_NOT_DROPPED) {
763e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            *dropReason = DROP_REASON_POLICY;
764e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        }
765e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    }
766e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
767e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    // Clean up if dropping the event.
768e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    if (*dropReason != DROP_REASON_NOT_DROPPED) {
769e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY
770e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown                ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED);
771e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        return true;
772b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
773b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
774b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Identify targets.
775e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    Vector<InputTarget> inputTargets;
776e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    int32_t injectionResult = findFocusedWindowTargetsLocked(currentTime,
777e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            entry, inputTargets, nextWakeupTime);
778e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (injectionResult == INPUT_EVENT_INJECTION_PENDING) {
779e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        return false;
780e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    }
781b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
782e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    setInjectionResultLocked(entry, injectionResult);
783e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (injectionResult != INPUT_EVENT_INJECTION_SUCCEEDED) {
784e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        return true;
785b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
786b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
787e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    addMonitoringTargetsLocked(inputTargets);
788e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown
789b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Dispatch the key.
790e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    dispatchEventLocked(currentTime, entry, inputTargets);
791b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return true;
792b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
793b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
794b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::logOutboundKeyDetailsLocked(const char* prefix, const KeyEntry* entry) {
79546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
7965baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("%seventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
79746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "action=0x%x, flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, "
798e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            "repeatCount=%d, downTime=%lld",
799b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            prefix,
800c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
80146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            entry->action, entry->flags, entry->keyCode, entry->scanCode, entry->metaState,
802e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown            entry->repeatCount, entry->downTime);
80346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
804b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
805b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
806b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool InputDispatcher::dispatchMotionLocked(
807e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        nsecs_t currentTime, MotionEntry* entry, DropReason* dropReason, nsecs_t* nextWakeupTime) {
808e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    // Preprocessing.
809e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    if (! entry->dispatchInProgress) {
810e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        entry->dispatchInProgress = true;
811e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
812e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown        logOutboundMotionDetailsLocked("dispatchMotion - ", entry);
813e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown    }
814e46a0a4693405eb8bbaa069c4e234a6976b48244Jeff Brown
81554a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown    // Clean up if dropping the event.
816e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    if (*dropReason != DROP_REASON_NOT_DROPPED) {
8173122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown        setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY
8183122e4488aa0749cbec9890ace22c366e35350c3Jeff Brown                ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED);
81954a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown        return true;
82054a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown    }
82154a1825121d006d4a4dcbbadf4eac9910f44ef8cJeff Brown
822b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool isPointerEvent = entry->source & AINPUT_SOURCE_CLASS_POINTER;
823b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
824b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Identify targets.
825e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    Vector<InputTarget> inputTargets;
82646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
827e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    bool conflictingPointerActions = false;
828e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    int32_t injectionResult;
829e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (isPointerEvent) {
830e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        // Pointer event.  (eg. touchscreen)
831e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        injectionResult = findTouchedWindowTargetsLocked(currentTime,
832e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown                entry, inputTargets, nextWakeupTime, &conflictingPointerActions);
833e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    } else {
834e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        // Non touch event.  (eg. trackball)
835e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        injectionResult = findFocusedWindowTargetsLocked(currentTime,
836e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown                entry, inputTargets, nextWakeupTime);
837e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    }
838e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (injectionResult == INPUT_EVENT_INJECTION_PENDING) {
839e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        return false;
840e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    }
841b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
842e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    setInjectionResultLocked(entry, injectionResult);
843e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    if (injectionResult != INPUT_EVENT_INJECTION_SUCCEEDED) {
844e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        return true;
845b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
846b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
84783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // TODO: support sending secondary display events to input monitors
84883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    if (isMainDisplay(entry->displayId)) {
84983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        addMonitoringTargetsLocked(inputTargets);
85083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    }
851e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown
852b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Dispatch the motion.
853cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    if (conflictingPointerActions) {
854da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
855da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                "conflicting pointer actions");
856da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        synthesizeCancelationEventsForAllConnectionsLocked(options);
857cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    }
858e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    dispatchEventLocked(currentTime, entry, inputTargets);
859b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return true;
86046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
86146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
862b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
863b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::logOutboundMotionDetailsLocked(const char* prefix, const MotionEntry* entry) {
86446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
8655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("%seventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
86685a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            "action=0x%x, flags=0x%x, "
867fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            "metaState=0x%x, buttonState=0x%x, "
868fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            "edgeFlags=0x%x, xPrecision=%f, yPrecision=%f, downTime=%lld",
869b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            prefix,
87085a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
87185a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            entry->action, entry->flags,
872fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            entry->metaState, entry->buttonState,
873fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            entry->edgeFlags, entry->xPrecision, entry->yPrecision,
87446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            entry->downTime);
87546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
87646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    for (uint32_t i = 0; i < entry->pointerCount; i++) {
8775baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("  Pointer %d: id=%d, toolType=%d, "
878fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                "x=%f, y=%f, pressure=%f, size=%f, "
87985a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown                "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
8808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                "orientation=%f",
881fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                i, entry->pointerProperties[i].id,
882fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                entry->pointerProperties[i].toolType,
8833241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X),
8843241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y),
8853241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE),
8863241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE),
8873241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR),
8883241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR),
8893241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR),
8903241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR),
8913241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                entry->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
89246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
89346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
89446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
89546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
896e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brownvoid InputDispatcher::dispatchEventLocked(nsecs_t currentTime,
897e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        EventEntry* eventEntry, const Vector<InputTarget>& inputTargets) {
89846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
8993241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    ALOGD("dispatchEventToCurrentInputTargets");
90046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
90146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
902ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block    ALOG_ASSERT(eventEntry->dispatchInProgress); // should already have been set to true
9039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
904e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown    pokeUserActivityLocked(eventEntry);
905e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown
906e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    for (size_t i = 0; i < inputTargets.size(); i++) {
907e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        const InputTarget& inputTarget = inputTargets.itemAt(i);
90846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
909519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        ssize_t connectionIndex = getConnectionIndexLocked(inputTarget.inputChannel);
910b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (connectionIndex >= 0) {
911cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
9123241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            prepareDispatchCycleLocked(currentTime, connection, eventEntry, &inputTarget);
913b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        } else {
914b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
9155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Dropping event delivery to target with channel '%s' because it "
916b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    "is no longer registered with the input dispatcher.",
917b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    inputTarget.inputChannel->getName().string());
918b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
919b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
920b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
921b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
922b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
923b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownint32_t InputDispatcher::handleTargetsNotReadyLocked(nsecs_t currentTime,
9249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const EventEntry* entry,
9259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputApplicationHandle>& applicationHandle,
9269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle,
927265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        nsecs_t* nextWakeupTime, const char* reason) {
9289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (applicationHandle == NULL && windowHandle == NULL) {
929b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY) {
930b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
931265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            ALOGD("Waiting for system to become ready for input.  Reason: %s", reason);
932b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
933b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY;
934b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitStartTime = currentTime;
935b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitTimeoutTime = LONG_LONG_MAX;
936b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitTimeoutExpired = false;
9379302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputTargetWaitApplicationHandle.clear();
938b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
939b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
940b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mInputTargetWaitCause != INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) {
941b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
942265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            ALOGD("Waiting for application to become ready for input: %s.  Reason: %s",
943265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    getApplicationWindowLabelLocked(applicationHandle, windowHandle).string(),
944265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    reason);
945b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
946cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            nsecs_t timeout;
947cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (windowHandle != NULL) {
948cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                timeout = windowHandle->getDispatchingTimeout(DEFAULT_INPUT_DISPATCHING_TIMEOUT);
949cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            } else if (applicationHandle != NULL) {
950cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                timeout = applicationHandle->getDispatchingTimeout(
951cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        DEFAULT_INPUT_DISPATCHING_TIMEOUT);
952cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            } else {
953cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                timeout = DEFAULT_INPUT_DISPATCHING_TIMEOUT;
954cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
955b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
956b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY;
957b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitStartTime = currentTime;
958b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitTimeoutTime = currentTime + timeout;
959b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mInputTargetWaitTimeoutExpired = false;
9609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputTargetWaitApplicationHandle.clear();
961928e054931d357326613c78e62f4d850b7c442ffJeff Brown
9629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (windowHandle != NULL) {
9639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mInputTargetWaitApplicationHandle = windowHandle->inputApplicationHandle;
964928e054931d357326613c78e62f4d850b7c442ffJeff Brown            }
9659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (mInputTargetWaitApplicationHandle == NULL && applicationHandle != NULL) {
9669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mInputTargetWaitApplicationHandle = applicationHandle;
967928e054931d357326613c78e62f4d850b7c442ffJeff Brown            }
968b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
969b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
970b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
971b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mInputTargetWaitTimeoutExpired) {
972b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return INPUT_EVENT_INJECTION_TIMED_OUT;
973b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
974b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
975b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (currentTime >= mInputTargetWaitTimeoutTime) {
9769302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        onANRLocked(currentTime, applicationHandle, windowHandle,
977265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                entry->eventTime, mInputTargetWaitStartTime, reason);
9789c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
979b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Force poll loop to wake up immediately on next iteration once we get the
980b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // ANR response back from the policy.
981b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        *nextWakeupTime = LONG_LONG_MIN;
982b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return INPUT_EVENT_INJECTION_PENDING;
983b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
984b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Force poll loop to wake up when timeout is due.
985b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mInputTargetWaitTimeoutTime < *nextWakeupTime) {
986b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            *nextWakeupTime = mInputTargetWaitTimeoutTime;
987b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
988b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return INPUT_EVENT_INJECTION_PENDING;
989b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
990b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
9917fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
992519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownvoid InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout,
993519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        const sp<InputChannel>& inputChannel) {
994b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (newTimeout > 0) {
995b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Extend the timeout.
996b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        mInputTargetWaitTimeoutTime = now() + newTimeout;
997b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
998b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Give up.
999b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        mInputTargetWaitTimeoutExpired = true;
1000519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
1001519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        // Input state will not be realistic.  Mark it out of sync.
1002dc3e00563ee6400936e3cb82405bb94df0b35078Jeff Brown        if (inputChannel.get()) {
1003dc3e00563ee6400936e3cb82405bb94df0b35078Jeff Brown            ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
1004dc3e00563ee6400936e3cb82405bb94df0b35078Jeff Brown            if (connectionIndex >= 0) {
1005cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown                sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
1006f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown                sp<InputWindowHandle> windowHandle = connection->inputWindowHandle;
1007f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown
1008f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown                if (windowHandle != NULL) {
1009f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown                    mTouchState.removeWindow(windowHandle);
1010f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown                }
1011f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown
101200045a7e6fbed88f3325d2bbb048dc96a082078cJeff Brown                if (connection->status == Connection::STATUS_NORMAL) {
1013da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS,
101400045a7e6fbed88f3325d2bbb048dc96a082078cJeff Brown                            "application not responding");
1015da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                    synthesizeCancelationEventsForConnectionLocked(connection, options);
101600045a7e6fbed88f3325d2bbb048dc96a082078cJeff Brown                }
1017dc3e00563ee6400936e3cb82405bb94df0b35078Jeff Brown            }
1018519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        }
1019349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    }
102046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
102146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1022519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownnsecs_t InputDispatcher::getTimeSpentWaitingForApplicationLocked(
1023b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        nsecs_t currentTime) {
1024b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (mInputTargetWaitCause == INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY) {
1025b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        return currentTime - mInputTargetWaitStartTime;
1026b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1027b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return 0;
1028b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1029b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1030b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::resetANRTimeoutsLocked() {
1031b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
10325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Resetting ANR timeouts.");
103346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
103446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1035b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Reset input target wait timeout.
1036b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mInputTargetWaitCause = INPUT_TARGET_WAIT_CAUSE_NONE;
10375ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown    mInputTargetWaitApplicationHandle.clear();
1038b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
103946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
104001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownint32_t InputDispatcher::findFocusedWindowTargetsLocked(nsecs_t currentTime,
1041e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        const EventEntry* entry, Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime) {
1042b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    int32_t injectionResult;
10439c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
1044b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // If there is no currently focused window and no focused application
1045b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // then drop the event.
10469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (mFocusedWindowHandle == NULL) {
10479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mFocusedApplicationHandle != NULL) {
1048b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1049265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    mFocusedApplicationHandle, NULL, nextWakeupTime,
1050265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    "Waiting because no window has focus but there is a "
1051265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    "focused application that may eventually add a window "
1052265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    "when it finishes starting up.");
1053b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Unresponsive;
1054b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
10557fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
10566215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Dropping event because there is no focused window or focused application.");
1057b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        injectionResult = INPUT_EVENT_INJECTION_FAILED;
1058b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        goto Failed;
1059349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    }
1060b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1061b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Check permissions.
10629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (! checkInjectionPermission(mFocusedWindowHandle, entry->injectionState)) {
1063b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        injectionResult = INPUT_EVENT_INJECTION_PERMISSION_DENIED;
1064b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        goto Failed;
1065b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1066b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1067b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // If the currently focused window is paused then keep waiting.
1068cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (mFocusedWindowHandle->getInfo()->paused) {
1069b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1070265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                mFocusedApplicationHandle, mFocusedWindowHandle, nextWakeupTime,
1071265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                "Waiting because the focused window is paused.");
1072b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        goto Unresponsive;
1073b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1074b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1075519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    // If the currently focused window is still working on previous events then keep waiting.
10760952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown    if (!isWindowReadyForMoreInputLocked(currentTime, mFocusedWindowHandle, entry)) {
1077519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1078265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                mFocusedApplicationHandle, mFocusedWindowHandle, nextWakeupTime,
1079265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                "Waiting because the focused window has not finished "
1080265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                "processing the input events that were previously delivered to it.");
1081519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        goto Unresponsive;
1082519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    }
1083519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
1084b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Success!  Output targets.
1085b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
10869302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    addWindowTargetLocked(mFocusedWindowHandle,
1087e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            InputTarget::FLAG_FOREGROUND | InputTarget::FLAG_DISPATCH_AS_IS, BitSet32(0),
1088e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            inputTargets);
1089b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1090b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Done.
1091b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownFailed:
1092b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownUnresponsive:
1093519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    nsecs_t timeSpentWaitingForApplication = getTimeSpentWaitingForApplicationLocked(currentTime);
1094519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    updateDispatchStatisticsLocked(currentTime, entry,
1095519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            injectionResult, timeSpentWaitingForApplication);
1096b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
10975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("findFocusedWindow finished: injectionResult=%d, "
109822aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown            "timeSpentWaitingForApplication=%0.1fms",
1099519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            injectionResult, timeSpentWaitingForApplication / 1000000.0);
1100b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1101b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return injectionResult;
110246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
110346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
110401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownint32_t InputDispatcher::findTouchedWindowTargetsLocked(nsecs_t currentTime,
1105e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        const MotionEntry* entry, Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime,
1106e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        bool* outConflictingPointerActions) {
1107b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    enum InjectionPermission {
1108b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        INJECTION_PERMISSION_UNKNOWN,
1109b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        INJECTION_PERMISSION_GRANTED,
1110b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        INJECTION_PERMISSION_DENIED
1111b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    };
1112b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1113b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    nsecs_t startTime = now();
1114b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1115b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // For security reasons, we defer updating the touch state until we are sure that
1116b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // event injection will be allowed.
1117b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1118b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // FIXME In the original code, screenWasOff could never be set to true.
1119b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       The reason is that the POLICY_FLAG_WOKE_HERE
1120b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       and POLICY_FLAG_BRIGHT_HERE flags were set only when preprocessing raw
1121b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       EV_KEY, EV_REL and EV_ABS events.  As it happens, the touch event was
1122b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       actually enqueued using the policyFlags that appeared in the final EV_SYN
1123b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       events upon which no preprocessing took place.  So policyFlags was always 0.
1124b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       In the new native input dispatcher we're a bit more careful about event
1125b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       preprocessing so the touches we receive can actually have non-zero policyFlags.
1126b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       Unfortunately we obtain undesirable behavior.
1127b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1128b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       Here's what happens:
1129b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1130b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       When the device dims in anticipation of going to sleep, touches
1131b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       in windows which have FLAG_TOUCHABLE_WHEN_WAKING cause
1132b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       the device to brighten and reset the user activity timer.
1133b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       Touches on other windows (such as the launcher window)
1134b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       are dropped.  Then after a moment, the device goes to sleep.  Oops.
1135b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1136b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       Also notice how screenWasOff was being initialized using POLICY_FLAG_BRIGHT_HERE
1137b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //       instead of POLICY_FLAG_WOKE_HERE...
1138b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    //
1139b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool screenWasOff = false; // original policy: policyFlags & POLICY_FLAG_BRIGHT_HERE;
1140b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
114183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    int32_t displayId = entry->displayId;
1142b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    int32_t action = entry->action;
114301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
1144b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1145b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Update the touch state as needed based on the properties of the touch event.
114601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    int32_t injectionResult = INPUT_EVENT_INJECTION_PENDING;
114701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionPermission injectionPermission = INJECTION_PERMISSION_UNKNOWN;
11489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    sp<InputWindowHandle> newHoverWindowHandle;
1149cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown
1150cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    bool isSplit = mTouchState.split;
115183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    bool switchedDevice = mTouchState.deviceId >= 0 && mTouchState.displayId >= 0
11522717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown            && (mTouchState.deviceId != entry->deviceId
115383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    || mTouchState.source != entry->source
115483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    || mTouchState.displayId != displayId);
1155a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    bool isHoverAction = (maskedAction == AMOTION_EVENT_ACTION_HOVER_MOVE
1156a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            || maskedAction == AMOTION_EVENT_ACTION_HOVER_ENTER
1157a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            || maskedAction == AMOTION_EVENT_ACTION_HOVER_EXIT);
1158a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    bool newGesture = (maskedAction == AMOTION_EVENT_ACTION_DOWN
1159a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            || maskedAction == AMOTION_EVENT_ACTION_SCROLL
1160a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            || isHoverAction);
11618134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    bool wrongDevice = false;
1162a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    if (newGesture) {
1163cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown        bool down = maskedAction == AMOTION_EVENT_ACTION_DOWN;
11648134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (switchedDevice && mTouchState.down && !down) {
11658134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_FOCUS
11665baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Dropping event because a pointer for a different device is already down.");
11678134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
1168cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown            mTempTouchState.copyFrom(mTouchState);
11698134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            injectionResult = INPUT_EVENT_INJECTION_FAILED;
11708134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            switchedDevice = false;
11718134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            wrongDevice = true;
11728134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            goto Failed;
1173cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown        }
11748134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        mTempTouchState.reset();
11758134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        mTempTouchState.down = down;
11768134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        mTempTouchState.deviceId = entry->deviceId;
11778134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        mTempTouchState.source = entry->source;
117883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        mTempTouchState.displayId = displayId;
11798134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        isSplit = false;
118001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    } else {
118101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        mTempTouchState.copyFrom(mTouchState);
1182cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    }
1183b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1184a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    if (newGesture || (isSplit && maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN)) {
118533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        /* Case 1: New splittable pointer going down, or need target for hover or scroll. */
1186b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
118701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        int32_t pointerIndex = getMotionEventActionPointerIndex(action);
11883241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        int32_t x = int32_t(entry->pointerCoords[pointerIndex].
1189ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                getAxisValue(AMOTION_EVENT_AXIS_X));
11903241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        int32_t y = int32_t(entry->pointerCoords[pointerIndex].
1191ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                getAxisValue(AMOTION_EVENT_AXIS_Y));
11929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> newTouchedWindowHandle;
11939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> topErrorWindowHandle;
1194a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        bool isTouchModal = false;
1195b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1196b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Traverse windows from front to back to find touched window and outside targets.
11979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        size_t numWindows = mWindowHandles.size();
1198b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        for (size_t i = 0; i < numWindows; i++) {
11999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
1200cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            const InputWindowInfo* windowInfo = windowHandle->getInfo();
120183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            if (windowInfo->displayId != displayId) {
120283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                continue; // wrong display
120383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            }
1204b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
120583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            int32_t flags = windowInfo->layoutParamsFlags;
1206cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
12079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                if (topErrorWindowHandle == NULL) {
12089302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    topErrorWindowHandle = windowHandle;
1209b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                }
1210b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
1211b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1212cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (windowInfo->visible) {
1213cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (! (flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
1214cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
1215cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                            | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
1216cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
12179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                        if (! screenWasOff
1218cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                                || (flags & InputWindowInfo::FLAG_TOUCHABLE_WHEN_WAKING)) {
12199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                            newTouchedWindowHandle = windowHandle;
1220b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                        }
1221b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                        break; // found touched window, exit window loop
1222b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                    }
1223b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                }
1224b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
122501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                if (maskedAction == AMOTION_EVENT_ACTION_DOWN
1226cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        && (flags & InputWindowInfo::FLAG_WATCH_OUTSIDE_TOUCH)) {
1227a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                    int32_t outsideTargetFlags = InputTarget::FLAG_DISPATCH_AS_OUTSIDE;
12289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    if (isWindowObscuredAtPointLocked(windowHandle, x, y)) {
122919dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown                        outsideTargetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
123019dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown                    }
123119dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown
12329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mTempTouchState.addOrUpdateWindow(
12339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                            windowHandle, outsideTargetFlags, BitSet32(0));
1234b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                }
1235b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
1236b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1237b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1238b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // If there is an error window but it is not taking focus (typically because
1239b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // it is invisible) then wait for it.  Any other focused window may in
1240b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // fact be in ANR state.
12419302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (topErrorWindowHandle != NULL && newTouchedWindowHandle != topErrorWindowHandle) {
1242b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1243265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    NULL, NULL, nextWakeupTime,
1244265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    "Waiting because a system error window is about to be displayed.");
1245b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionPermission = INJECTION_PERMISSION_UNKNOWN;
1246b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Unresponsive;
1247b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
124846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
124901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        // Figure out whether splitting will be allowed for this window.
1250cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (newTouchedWindowHandle != NULL
1251cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                && newTouchedWindowHandle->getInfo()->supportsSplitTouch()) {
125201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // New window supports splitting.
125301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            isSplit = true;
125401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        } else if (isSplit) {
125501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // New window does not support splitting but we have already split events.
12568249fc61837db488191213ac85355287cf8b4fddJeff Brown            // Ignore the new window.
12578249fc61837db488191213ac85355287cf8b4fddJeff Brown            newTouchedWindowHandle = NULL;
125801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
125901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
12608249fc61837db488191213ac85355287cf8b4fddJeff Brown        // Handle the case where we did not find a window.
12619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (newTouchedWindowHandle == NULL) {
12628249fc61837db488191213ac85355287cf8b4fddJeff Brown            // Try to assign the pointer to the first foreground window we find, if there is one.
12638249fc61837db488191213ac85355287cf8b4fddJeff Brown            newTouchedWindowHandle = mTempTouchState.getFirstForegroundWindowHandle();
12648249fc61837db488191213ac85355287cf8b4fddJeff Brown            if (newTouchedWindowHandle == NULL) {
12658249fc61837db488191213ac85355287cf8b4fddJeff Brown                // There is no touched window.  If this is an initial down event
12668249fc61837db488191213ac85355287cf8b4fddJeff Brown                // then wait for a window to appear that will handle the touch.  This is
12678249fc61837db488191213ac85355287cf8b4fddJeff Brown                // to ensure that we report an ANR in the case where an application has started
12688249fc61837db488191213ac85355287cf8b4fddJeff Brown                // but not yet put up a window and the user is starting to get impatient.
12698249fc61837db488191213ac85355287cf8b4fddJeff Brown                if (maskedAction == AMOTION_EVENT_ACTION_DOWN
12708249fc61837db488191213ac85355287cf8b4fddJeff Brown                        && mFocusedApplicationHandle != NULL) {
12718249fc61837db488191213ac85355287cf8b4fddJeff Brown                    injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1272265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            mFocusedApplicationHandle, NULL, nextWakeupTime,
1273265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            "Waiting because there is no touchable window that can "
1274265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            "handle the event but there is focused application that may "
1275265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            "eventually add a new window when it finishes starting up.");
12768249fc61837db488191213ac85355287cf8b4fddJeff Brown                    goto Unresponsive;
12778249fc61837db488191213ac85355287cf8b4fddJeff Brown                }
12789c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
12798249fc61837db488191213ac85355287cf8b4fddJeff Brown                ALOGI("Dropping event because there is no touched window.");
12808249fc61837db488191213ac85355287cf8b4fddJeff Brown                injectionResult = INPUT_EVENT_INJECTION_FAILED;
12818249fc61837db488191213ac85355287cf8b4fddJeff Brown                goto Failed;
12828249fc61837db488191213ac85355287cf8b4fddJeff Brown            }
1283b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1284b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
128519dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown        // Set target flags.
1286a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        int32_t targetFlags = InputTarget::FLAG_FOREGROUND | InputTarget::FLAG_DISPATCH_AS_IS;
128719dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown        if (isSplit) {
128819dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown            targetFlags |= InputTarget::FLAG_SPLIT;
128919dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown        }
12909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (isWindowObscuredAtPointLocked(newTouchedWindowHandle, x, y)) {
129119dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown            targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
129219dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown        }
129319dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brown
1294a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        // Update hover state.
1295a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        if (isHoverAction) {
12969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            newHoverWindowHandle = newTouchedWindowHandle;
1297a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        } else if (maskedAction == AMOTION_EVENT_ACTION_SCROLL) {
12989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            newHoverWindowHandle = mLastHoverWindowHandle;
1299a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        }
1300a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
130101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        // Update the temporary touch state.
130201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        BitSet32 pointerIds;
130301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (isSplit) {
1304fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            uint32_t pointerId = entry->pointerProperties[pointerIndex].id;
130501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            pointerIds.markBit(pointerId);
1306b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
13079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        mTempTouchState.addOrUpdateWindow(newTouchedWindowHandle, targetFlags, pointerIds);
1308b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
130901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        /* Case 2: Pointer move, up, cancel or non-splittable pointer down. */
1310b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1311b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // If the pointer is not currently down, then ignore the event.
131201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (! mTempTouchState.down) {
1313a2cc28d732577dd48a02de637c635e9764400248Jeff Brown#if DEBUG_FOCUS
13145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Dropping event because the pointer is not down or we previously "
131576860e3fe73a791b1b04f33d78b908eb3163b4b2Jeff Brown                    "dropped the pointer down event.");
131676860e3fe73a791b1b04f33d78b908eb3163b4b2Jeff Brown#endif
1317b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = INPUT_EVENT_INJECTION_FAILED;
1318b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Failed;
1319b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
132098db5fabdad86dca379740d8050697950b9f026cJeff Brown
132198db5fabdad86dca379740d8050697950b9f026cJeff Brown        // Check whether touches should slip outside of the current foreground window.
132298db5fabdad86dca379740d8050697950b9f026cJeff Brown        if (maskedAction == AMOTION_EVENT_ACTION_MOVE
132398db5fabdad86dca379740d8050697950b9f026cJeff Brown                && entry->pointerCount == 1
132498db5fabdad86dca379740d8050697950b9f026cJeff Brown                && mTempTouchState.isSlippery()) {
13253241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            int32_t x = int32_t(entry->pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X));
13263241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            int32_t y = int32_t(entry->pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y));
132798db5fabdad86dca379740d8050697950b9f026cJeff Brown
13289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> oldTouchedWindowHandle =
13299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mTempTouchState.getFirstForegroundWindowHandle();
133083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            sp<InputWindowHandle> newTouchedWindowHandle =
133183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    findTouchedWindowAtLocked(displayId, x, y);
13329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (oldTouchedWindowHandle != newTouchedWindowHandle
13339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    && newTouchedWindowHandle != NULL) {
133498db5fabdad86dca379740d8050697950b9f026cJeff Brown#if DEBUG_FOCUS
13355baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Touch is slipping out of window %s into window %s.",
1336cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        oldTouchedWindowHandle->getName().string(),
1337cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        newTouchedWindowHandle->getName().string());
133898db5fabdad86dca379740d8050697950b9f026cJeff Brown#endif
133998db5fabdad86dca379740d8050697950b9f026cJeff Brown                // Make a slippery exit from the old window.
13409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTempTouchState.addOrUpdateWindow(oldTouchedWindowHandle,
134198db5fabdad86dca379740d8050697950b9f026cJeff Brown                        InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT, BitSet32(0));
134298db5fabdad86dca379740d8050697950b9f026cJeff Brown
134398db5fabdad86dca379740d8050697950b9f026cJeff Brown                // Make a slippery entrance into the new window.
1344cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (newTouchedWindowHandle->getInfo()->supportsSplitTouch()) {
134598db5fabdad86dca379740d8050697950b9f026cJeff Brown                    isSplit = true;
134698db5fabdad86dca379740d8050697950b9f026cJeff Brown                }
134798db5fabdad86dca379740d8050697950b9f026cJeff Brown
134898db5fabdad86dca379740d8050697950b9f026cJeff Brown                int32_t targetFlags = InputTarget::FLAG_FOREGROUND
134998db5fabdad86dca379740d8050697950b9f026cJeff Brown                        | InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER;
135098db5fabdad86dca379740d8050697950b9f026cJeff Brown                if (isSplit) {
135198db5fabdad86dca379740d8050697950b9f026cJeff Brown                    targetFlags |= InputTarget::FLAG_SPLIT;
135298db5fabdad86dca379740d8050697950b9f026cJeff Brown                }
13539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                if (isWindowObscuredAtPointLocked(newTouchedWindowHandle, x, y)) {
135498db5fabdad86dca379740d8050697950b9f026cJeff Brown                    targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
135598db5fabdad86dca379740d8050697950b9f026cJeff Brown                }
135698db5fabdad86dca379740d8050697950b9f026cJeff Brown
135798db5fabdad86dca379740d8050697950b9f026cJeff Brown                BitSet32 pointerIds;
135898db5fabdad86dca379740d8050697950b9f026cJeff Brown                if (isSplit) {
135998db5fabdad86dca379740d8050697950b9f026cJeff Brown                    pointerIds.markBit(entry->pointerProperties[0].id);
136098db5fabdad86dca379740d8050697950b9f026cJeff Brown                }
13619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTempTouchState.addOrUpdateWindow(newTouchedWindowHandle, targetFlags, pointerIds);
136298db5fabdad86dca379740d8050697950b9f026cJeff Brown            }
136398db5fabdad86dca379740d8050697950b9f026cJeff Brown        }
136401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
1365b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
13669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (newHoverWindowHandle != mLastHoverWindowHandle) {
1367a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        // Let the previous window know that the hover sequence is over.
13689302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mLastHoverWindowHandle != NULL) {
1369a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#if DEBUG_HOVER
13705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Sending hover exit event to window %s.",
1371cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    mLastHoverWindowHandle->getName().string());
1372a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#endif
13739302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mTempTouchState.addOrUpdateWindow(mLastHoverWindowHandle,
1374a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                    InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT, BitSet32(0));
1375a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        }
1376a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
1377a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        // Let the new window know that the hover sequence is starting.
13789302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (newHoverWindowHandle != NULL) {
1379a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#if DEBUG_HOVER
13805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Sending hover enter event to window %s.",
1381cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    newHoverWindowHandle->getName().string());
1382a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown#endif
13839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mTempTouchState.addOrUpdateWindow(newHoverWindowHandle,
1384a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                    InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER, BitSet32(0));
1385a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        }
1386a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    }
1387a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
138801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // Check permission to inject into all touched foreground windows and ensure there
138901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // is at least one touched foreground window.
139001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    {
139101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        bool haveForegroundWindow = false;
139201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
139301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
139401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
139501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                haveForegroundWindow = true;
13969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                if (! checkInjectionPermission(touchedWindow.windowHandle,
13979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                        entry->injectionState)) {
139801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    injectionResult = INPUT_EVENT_INJECTION_PERMISSION_DENIED;
139901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    injectionPermission = INJECTION_PERMISSION_DENIED;
140001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    goto Failed;
140101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                }
140201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            }
140301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
140401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (! haveForegroundWindow) {
1405a2cc28d732577dd48a02de637c635e9764400248Jeff Brown#if DEBUG_FOCUS
14065baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Dropping event because there is no touched foreground window to receive it.");
1407b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1408b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionResult = INPUT_EVENT_INJECTION_FAILED;
1409b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            goto Failed;
1410b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1411b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
141201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        // Permission granted to injection into all touched foreground windows.
141301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        injectionPermission = INJECTION_PERMISSION_GRANTED;
141401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
141501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
14167a9db181a64e0e752a447c6408639bbb33c412fcKenny Root    // Check whether windows listening for outside touches are owned by the same UID. If it is
14177a9db181a64e0e752a447c6408639bbb33c412fcKenny Root    // set the policy flag that we will not reveal coordinate information to this window.
14187a9db181a64e0e752a447c6408639bbb33c412fcKenny Root    if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
14199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> foregroundWindowHandle =
14209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTempTouchState.getFirstForegroundWindowHandle();
1421cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const int32_t foregroundWindowUid = foregroundWindowHandle->getInfo()->ownerUid;
14227a9db181a64e0e752a447c6408639bbb33c412fcKenny Root        for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
14237a9db181a64e0e752a447c6408639bbb33c412fcKenny Root            const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
14247a9db181a64e0e752a447c6408639bbb33c412fcKenny Root            if (touchedWindow.targetFlags & InputTarget::FLAG_DISPATCH_AS_OUTSIDE) {
14259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                sp<InputWindowHandle> inputWindowHandle = touchedWindow.windowHandle;
1426cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (inputWindowHandle->getInfo()->ownerUid != foregroundWindowUid) {
14279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mTempTouchState.addOrUpdateWindow(inputWindowHandle,
14287a9db181a64e0e752a447c6408639bbb33c412fcKenny Root                            InputTarget::FLAG_ZERO_COORDS, BitSet32(0));
14297a9db181a64e0e752a447c6408639bbb33c412fcKenny Root                }
14307a9db181a64e0e752a447c6408639bbb33c412fcKenny Root            }
14317a9db181a64e0e752a447c6408639bbb33c412fcKenny Root        }
14327a9db181a64e0e752a447c6408639bbb33c412fcKenny Root    }
14337a9db181a64e0e752a447c6408639bbb33c412fcKenny Root
143401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // Ensure all touched foreground windows are ready for new input.
143501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
143601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
143701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
143801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // If the touched window is paused then keep waiting.
1439cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (touchedWindow.windowHandle->getInfo()->paused) {
144001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1441265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        NULL, touchedWindow.windowHandle, nextWakeupTime,
1442265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        "Waiting because the touched window is paused.");
144301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                goto Unresponsive;
144401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            }
1445519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
144601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // If the touched window is still working on previous events then keep waiting.
14470952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            if (!isWindowReadyForMoreInputLocked(currentTime, touchedWindow.windowHandle, entry)) {
144801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
1449265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        NULL, touchedWindow.windowHandle, nextWakeupTime,
1450265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        "Waiting because the touched window has not finished "
1451265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        "processing the input events that were previously delivered to it.");
145201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                goto Unresponsive;
145301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            }
1454519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        }
1455b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1456b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
145701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // If this is the first pointer going down and the touched window has a wallpaper
145801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // then also add the touched wallpaper windows so they are locked in for the duration
145901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // of the touch gesture.
146033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    // We do not collect wallpapers during HOVER_MOVE or SCROLL because the wallpaper
146133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    // engine only supports touch events.  We would need to add a mechanism similar
146233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    // to View.onGenericMotionEvent to enable wallpapers to handle these events.
146333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
14649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> foregroundWindowHandle =
14659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTempTouchState.getFirstForegroundWindowHandle();
1466cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (foregroundWindowHandle->getInfo()->hasWallpaper) {
14679302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            for (size_t i = 0; i < mWindowHandles.size(); i++) {
14689302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
146983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                const InputWindowInfo* info = windowHandle->getInfo();
147083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                if (info->displayId == displayId
147183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                        && windowHandle->getInfo()->layoutParamsType
147283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                                == InputWindowInfo::TYPE_WALLPAPER) {
14739302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mTempTouchState.addOrUpdateWindow(windowHandle,
1474a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                            InputTarget::FLAG_WINDOW_IS_OBSCURED
1475a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                                    | InputTarget::FLAG_DISPATCH_AS_IS,
1476a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                            BitSet32(0));
147701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                }
1478b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
1479b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
148001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
1481b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
148201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // Success!  Output targets.
148301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
148401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
148501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
148601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        const TouchedWindow& touchedWindow = mTempTouchState.windows.itemAt(i);
14879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        addWindowTargetLocked(touchedWindow.windowHandle, touchedWindow.targetFlags,
1488e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown                touchedWindow.pointerIds, inputTargets);
148901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
149001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1491a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    // Drop the outside or hover touch windows since we will not care about them
1492a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    // in the next iteration.
1493a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    mTempTouchState.filterNonAsIsTouchWindows();
149401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1495b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownFailed:
1496b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Check injection permission once and for all.
1497b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (injectionPermission == INJECTION_PERMISSION_UNKNOWN) {
149801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (checkInjectionPermission(NULL, entry->injectionState)) {
1499b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionPermission = INJECTION_PERMISSION_GRANTED;
150046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        } else {
1501b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            injectionPermission = INJECTION_PERMISSION_DENIED;
1502b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1503b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1504b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1505b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Update final pieces of touch state if the injector had permission.
1506b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (injectionPermission == INJECTION_PERMISSION_GRANTED) {
150795712850665492af670824abdba77f0944d984d1Jeff Brown        if (!wrongDevice) {
15088134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            if (switchedDevice) {
15098134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_FOCUS
15105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Conflicting pointer actions: Switched to a different device.");
15118134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
15128134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                *outConflictingPointerActions = true;
15138134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            }
15148134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
15158134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            if (isHoverAction) {
15168134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                // Started hovering, therefore no longer down.
15178134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                if (mTouchState.down) {
15188134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_FOCUS
15195baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("Conflicting pointer actions: Hover received while pointer was down.");
15208134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
15218134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    *outConflictingPointerActions = true;
15228134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                }
15238134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                mTouchState.reset();
15248134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                if (maskedAction == AMOTION_EVENT_ACTION_HOVER_ENTER
15258134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                        || maskedAction == AMOTION_EVENT_ACTION_HOVER_MOVE) {
15268134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    mTouchState.deviceId = entry->deviceId;
15278134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    mTouchState.source = entry->source;
152883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    mTouchState.displayId = displayId;
15298134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                }
15308134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            } else if (maskedAction == AMOTION_EVENT_ACTION_UP
15318134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    || maskedAction == AMOTION_EVENT_ACTION_CANCEL) {
153295712850665492af670824abdba77f0944d984d1Jeff Brown                // All pointers up or canceled.
153333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mTouchState.reset();
153495712850665492af670824abdba77f0944d984d1Jeff Brown            } else if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
153595712850665492af670824abdba77f0944d984d1Jeff Brown                // First pointer went down.
153695712850665492af670824abdba77f0944d984d1Jeff Brown                if (mTouchState.down) {
1537b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
15385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("Conflicting pointer actions: Down received while already down.");
1539b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
15408134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    *outConflictingPointerActions = true;
154195712850665492af670824abdba77f0944d984d1Jeff Brown                }
154233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mTouchState.copyFrom(mTempTouchState);
154395712850665492af670824abdba77f0944d984d1Jeff Brown            } else if (maskedAction == AMOTION_EVENT_ACTION_POINTER_UP) {
154495712850665492af670824abdba77f0944d984d1Jeff Brown                // One pointer went up.
154595712850665492af670824abdba77f0944d984d1Jeff Brown                if (isSplit) {
154695712850665492af670824abdba77f0944d984d1Jeff Brown                    int32_t pointerIndex = getMotionEventActionPointerIndex(action);
1547fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    uint32_t pointerId = entry->pointerProperties[pointerIndex].id;
154895712850665492af670824abdba77f0944d984d1Jeff Brown
154995712850665492af670824abdba77f0944d984d1Jeff Brown                    for (size_t i = 0; i < mTempTouchState.windows.size(); ) {
155095712850665492af670824abdba77f0944d984d1Jeff Brown                        TouchedWindow& touchedWindow = mTempTouchState.windows.editItemAt(i);
155195712850665492af670824abdba77f0944d984d1Jeff Brown                        if (touchedWindow.targetFlags & InputTarget::FLAG_SPLIT) {
155295712850665492af670824abdba77f0944d984d1Jeff Brown                            touchedWindow.pointerIds.clearBit(pointerId);
155395712850665492af670824abdba77f0944d984d1Jeff Brown                            if (touchedWindow.pointerIds.isEmpty()) {
155495712850665492af670824abdba77f0944d984d1Jeff Brown                                mTempTouchState.windows.removeAt(i);
155595712850665492af670824abdba77f0944d984d1Jeff Brown                                continue;
155695712850665492af670824abdba77f0944d984d1Jeff Brown                            }
155701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                        }
155895712850665492af670824abdba77f0944d984d1Jeff Brown                        i += 1;
155901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    }
156001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                }
156133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mTouchState.copyFrom(mTempTouchState);
156233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            } else if (maskedAction == AMOTION_EVENT_ACTION_SCROLL) {
156333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                // Discard temporary touch state since it was only valid for this action.
156433bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            } else {
156533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                // Save changes to touch state as-is for all other actions.
156633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mTouchState.copyFrom(mTempTouchState);
1567b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
1568a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
1569a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            // Update hover state.
15709302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mLastHoverWindowHandle = newHoverWindowHandle;
157195712850665492af670824abdba77f0944d984d1Jeff Brown        }
1572b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
157301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#if DEBUG_FOCUS
15745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Not updating touch focus because injection was denied.");
157501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#endif
1576b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1577b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1578b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownUnresponsive:
1579120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    // Reset temporary touch state to ensure we release unnecessary references to input channels.
1580120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    mTempTouchState.reset();
1581120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
1582519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    nsecs_t timeSpentWaitingForApplication = getTimeSpentWaitingForApplicationLocked(currentTime);
1583519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    updateDispatchStatisticsLocked(currentTime, entry,
1584519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            injectionResult, timeSpentWaitingForApplication);
1585b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
15865baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("findTouchedWindow finished: injectionResult=%d, injectionPermission=%d, "
158701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            "timeSpentWaitingForApplication=%0.1fms",
1588519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            injectionResult, injectionPermission, timeSpentWaitingForApplication / 1000000.0);
1589b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
1590b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return injectionResult;
1591b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1592b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
15939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid InputDispatcher::addWindowTargetLocked(const sp<InputWindowHandle>& windowHandle,
1594e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        int32_t targetFlags, BitSet32 pointerIds, Vector<InputTarget>& inputTargets) {
1595e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    inputTargets.push();
1596b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1597cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    const InputWindowInfo* windowInfo = windowHandle->getInfo();
1598e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    InputTarget& target = inputTargets.editTop();
1599cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    target.inputChannel = windowInfo->inputChannel;
1600b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    target.flags = targetFlags;
1601cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    target.xOffset = - windowInfo->frameLeft;
1602cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    target.yOffset = - windowInfo->frameTop;
1603cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    target.scaleFactor = windowInfo->scaleFactor;
160401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    target.pointerIds = pointerIds;
1605b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1606b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1607e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brownvoid InputDispatcher::addMonitoringTargetsLocked(Vector<InputTarget>& inputTargets) {
1608b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
1609e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        inputTargets.push();
1610b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1611e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown        InputTarget& target = inputTargets.editTop();
1612b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        target.inputChannel = mMonitoringChannels[i];
1613b6110c2de0cd7950360aeb2c248a44e4ea5f33f5Jeff Brown        target.flags = InputTarget::FLAG_DISPATCH_AS_IS;
1614b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        target.xOffset = 0;
1615b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        target.yOffset = 0;
1616b6110c2de0cd7950360aeb2c248a44e4ea5f33f5Jeff Brown        target.pointerIds.clear();
1617e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        target.scaleFactor = 1.0f;
1618b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1619b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1620b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
16219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownbool InputDispatcher::checkInjectionPermission(const sp<InputWindowHandle>& windowHandle,
162201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        const InjectionState* injectionState) {
162301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState
1624cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            && (windowHandle == NULL
1625cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    || windowHandle->getInfo()->ownerUid != injectionState->injectorUid)
1626b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            && !hasInjectionPermission(injectionState->injectorPid, injectionState->injectorUid)) {
16279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (windowHandle != NULL) {
16288564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("Permission denied: injecting event from pid %d uid %d to window %s "
16299302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    "owned by uid %d",
1630b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    injectionState->injectorPid, injectionState->injectorUid,
1631cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowHandle->getName().string(),
1632cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowHandle->getInfo()->ownerUid);
1633b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        } else {
16348564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("Permission denied: injecting event from pid %d uid %d",
1635b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    injectionState->injectorPid, injectionState->injectorUid);
1636b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1637b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return false;
1638b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
1639b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return true;
1640b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1641b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
164219dfc83c376d8f5ff3b128ee4c675790cffbc02dJeff Brownbool InputDispatcher::isWindowObscuredAtPointLocked(
16439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle, int32_t x, int32_t y) const {
164483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    int32_t displayId = windowHandle->getInfo()->displayId;
16459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = mWindowHandles.size();
1646b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    for (size_t i = 0; i < numWindows; i++) {
16479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> otherHandle = mWindowHandles.itemAt(i);
16489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (otherHandle == windowHandle) {
1649b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            break;
1650b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
1651cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
1652cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const InputWindowInfo* otherInfo = otherHandle->getInfo();
165383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        if (otherInfo->displayId == displayId
165483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                && otherInfo->visible && !otherInfo->isTrustedOverlay()
1655cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                && otherInfo->frameContainsPoint(x, y)) {
1656b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            return true;
165746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
165846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
1659b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return false;
1660b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
1661b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
1662d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brownbool InputDispatcher::isWindowReadyForMoreInputLocked(nsecs_t currentTime,
16630952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        const sp<InputWindowHandle>& windowHandle, const EventEntry* eventEntry) {
1664cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    ssize_t connectionIndex = getConnectionIndexLocked(windowHandle->getInputChannel());
1665519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    if (connectionIndex >= 0) {
1666cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
1667d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        if (connection->inputPublisherBlocked) {
1668d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            return false;
1669d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
16700952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        if (eventEntry->type == EventEntry::TYPE_KEY) {
16710952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // If the event is a key event, then we must wait for all previous events to
16720952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // complete before delivering it because previous events may have the
16730952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // side-effect of transferring focus to a different window and we want to
16740952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // ensure that the following keys are sent to the new window.
16750952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            //
16760952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // Suppose the user touches a button in a window then immediately presses "A".
16770952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // If the button causes a pop-up window to appear then we want to ensure that
16780952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // the "A" key is delivered to the new pop-up window.  This is because users
16790952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // often anticipate pending UI changes when typing on a keyboard.
16800952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // To obtain this behavior, we must serialize key events with respect to all
16810952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown            // prior input events.
1682d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            return connection->outboundQueue.isEmpty()
1683d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    && connection->waitQueue.isEmpty();
1684d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
16850952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // Touch events can always be sent to a window immediately because the user intended
16860952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // to touch whatever was visible at the time.  Even if focus changes or a new
16870952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // window appears moments later, the touch event was meant to be delivered to
16880952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // whatever window happened to be on screen at the time.
16890952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        //
16900952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // Generic motion events, such as trackball or joystick events are a little trickier.
16910952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // Like key events, generic motion events are delivered to the focused window.
16920952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // Unlike key events, generic motion events don't tend to transfer focus to other
16930952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // windows and it is not important for them to be serialized.  So we prefer to deliver
16940952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // generic motion events as soon as possible to improve efficiency and reduce lag
16950952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // through batching.
16960952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        //
16970952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // The one case where we pause input event delivery is when the wait queue is piling
16980952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // up with lots of events because the application is not responding.
16990952c30ac279d5f4cdc032fcbafa372213aa6d86Jeff Brown        // This condition ensures that ANRs are detected reliably.
1700d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        if (!connection->waitQueue.isEmpty()
1701d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                && currentTime >= connection->waitQueue.head->eventEntry->eventTime
1702d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        + STREAM_AHEAD_EVENT_TIMEOUT) {
1703d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            return false;
1704d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
1705519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    }
1706d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    return true;
1707519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown}
1708519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
17099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff BrownString8 InputDispatcher::getApplicationWindowLabelLocked(
17109302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputApplicationHandle>& applicationHandle,
17119302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle) {
17129302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (applicationHandle != NULL) {
17139302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (windowHandle != NULL) {
1714cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            String8 label(applicationHandle->getName());
1715519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            label.append(" - ");
1716cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            label.append(windowHandle->getName());
1717519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            return label;
1718519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        } else {
1719cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            return applicationHandle->getName();
1720519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        }
17219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    } else if (windowHandle != NULL) {
1722cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return windowHandle->getName();
1723519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    } else {
1724519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        return String8("<unknown application or window>");
1725519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    }
1726519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown}
1727519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
1728e2fe69edc009a0e0348e5351cf83062224e011acJeff Brownvoid InputDispatcher::pokeUserActivityLocked(const EventEntry* eventEntry) {
17291e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown    if (mFocusedWindowHandle != NULL) {
17301e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown        const InputWindowInfo* info = mFocusedWindowHandle->getInfo();
17311e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown        if (info->inputFeatures & InputWindowInfo::INPUT_FEATURE_DISABLE_USER_ACTIVITY) {
17321e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown#if DEBUG_DISPATCH_CYCLE
17331e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown            ALOGD("Not poking user activity: disabled by window '%s'.", info->name.string());
17341e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown#endif
17351e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown            return;
17361e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown        }
17371e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown    }
17381e3b98d47df596d0c4eadbdf60143709f8465b28Jeff Brown
1739b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    int32_t eventType = USER_ACTIVITY_EVENT_OTHER;
17404d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    switch (eventEntry->type) {
17414d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    case EventEntry::TYPE_MOTION: {
1742e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown        const MotionEntry* motionEntry = static_cast<const MotionEntry*>(eventEntry);
17434d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        if (motionEntry->action == AMOTION_EVENT_ACTION_CANCEL) {
17444d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            return;
17454d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        }
17464d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown
174756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        if (MotionEvent::isTouchEvent(motionEntry->source, motionEntry->action)) {
1748b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown            eventType = USER_ACTIVITY_EVENT_TOUCH;
174901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
17504d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        break;
17514d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    }
17524d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    case EventEntry::TYPE_KEY: {
17534d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        const KeyEntry* keyEntry = static_cast<const KeyEntry*>(eventEntry);
17544d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        if (keyEntry->flags & AKEY_EVENT_FLAG_CANCELED) {
17554d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown            return;
17564d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        }
1757b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown        eventType = USER_ACTIVITY_EVENT_BUTTON;
17584d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown        break;
17594d396052deb54399cbadbeb8abd873df6f3af342Jeff Brown    }
176001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
176101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1762b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    CommandEntry* commandEntry = postCommandLocked(
1763b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            & InputDispatcher::doPokeUserActivityLockedInterruptible);
1764e2fe69edc009a0e0348e5351cf83062224e011acJeff Brown    commandEntry->eventTime = eventEntry->eventTime;
1765b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    commandEntry->userActivityEventType = eventType;
176646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
176746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
17687fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownvoid InputDispatcher::prepareDispatchCycleLocked(nsecs_t currentTime,
17693241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget) {
177046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
17715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ prepareDispatchCycle - flags=0x%08x, "
17729cc695c5796cf93b414fd7627eb049b7b57d15beJeff Brown            "xOffset=%f, yOffset=%f, scaleFactor=%f, "
17733241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            "pointerIds=0x%x",
1774519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            connection->getInputChannelName(), inputTarget->flags,
177546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            inputTarget->xOffset, inputTarget->yOffset,
17763241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            inputTarget->scaleFactor, inputTarget->pointerIds.value);
177746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
177846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
177946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Skip this event if the connection status is not normal.
1780519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    // We don't want to enqueue additional outbound events if the connection is broken.
178146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (connection->status != Connection::STATUS_NORMAL) {
1782b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_DISPATCH_CYCLE
17835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("channel '%s' ~ Dropping event because the channel status is %s",
1784b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                connection->getInputChannelName(), connection->getStatusLabel());
1785b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
178646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return;
178746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
178846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
178901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    // Split a motion event if needed.
17903241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    if (inputTarget->flags & InputTarget::FLAG_SPLIT) {
1791ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(eventEntry->type == EventEntry::TYPE_MOTION);
179201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
179301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        MotionEntry* originalMotionEntry = static_cast<MotionEntry*>(eventEntry);
179401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (inputTarget->pointerIds.count() != originalMotionEntry->pointerCount) {
179501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            MotionEntry* splitMotionEntry = splitMotionEvent(
179601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    originalMotionEntry, inputTarget->pointerIds);
179758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown            if (!splitMotionEntry) {
179858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown                return; // split event was dropped
179958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown            }
180001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#if DEBUG_FOCUS
18015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("channel '%s' ~ Split motion event.",
180201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                    connection->getInputChannelName());
180301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            logOutboundMotionDetailsLocked("  ", splitMotionEntry);
180401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#endif
1805c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            enqueueDispatchEntriesLocked(currentTime, connection,
18063241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    splitMotionEntry, inputTarget);
1807c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            splitMotionEntry->release();
1808c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            return;
180901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
181001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
181101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
1812c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    // Not splitting.  Enqueue dispatch entries for the event as is.
18133241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    enqueueDispatchEntriesLocked(currentTime, connection, eventEntry, inputTarget);
1814c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown}
1815c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown
1816c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brownvoid InputDispatcher::enqueueDispatchEntriesLocked(nsecs_t currentTime,
18173241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget) {
181846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    bool wasEmpty = connection->outboundQueue.isEmpty();
181946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1820a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    // Enqueue dispatch entries for the requested modes.
1821a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
18223241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT);
1823a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
18243241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_OUTSIDE);
1825a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
18263241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER);
1827a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
18283241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_IS);
182998db5fabdad86dca379740d8050697950b9f026cJeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
18303241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT);
183198db5fabdad86dca379740d8050697950b9f026cJeff Brown    enqueueDispatchEntryLocked(connection, eventEntry, inputTarget,
18323241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER);
1833a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
1834a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    // If the outbound queue was previously empty, start the dispatch cycle going.
1835b6110c2de0cd7950360aeb2c248a44e4ea5f33f5Jeff Brown    if (wasEmpty && !connection->outboundQueue.isEmpty()) {
1836a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        startDispatchCycleLocked(currentTime, connection);
1837a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    }
1838a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown}
1839a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
1840a032cc008618b83ecbbede537517d1e7998e3264Jeff Brownvoid InputDispatcher::enqueueDispatchEntryLocked(
1841a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget,
18423241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        int32_t dispatchMode) {
1843a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    int32_t inputTargetFlags = inputTarget->flags;
1844a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    if (!(inputTargetFlags & dispatchMode)) {
1845a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        return;
1846a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    }
1847a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    inputTargetFlags = (inputTargetFlags & ~InputTarget::FLAG_DISPATCH_MASK) | dispatchMode;
1848a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
184946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // This is a new event.
185046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Enqueue a new dispatch entry onto the outbound queue for this connection.
1851ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    DispatchEntry* dispatchEntry = new DispatchEntry(eventEntry, // increments ref
1852aa9d84c37e05f696ec158dac98ce38cf41e18314Dianne Hackborn            inputTargetFlags, inputTarget->xOffset, inputTarget->yOffset,
1853e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            inputTarget->scaleFactor);
18546ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
18558134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    // Apply target flags and update the connection's input state.
18568134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    switch (eventEntry->type) {
18578134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case EventEntry::TYPE_KEY: {
18588134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
18598134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        dispatchEntry->resolvedAction = keyEntry->action;
18608134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        dispatchEntry->resolvedFlags = keyEntry->flags;
18618134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
18628134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (!connection->inputState.trackKey(keyEntry,
18638134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags)) {
18648134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_DISPATCH_CYCLE
18655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent key event",
18668134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    connection->getInputChannelName());
18678134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
1868c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            delete dispatchEntry;
18698134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return; // skip the inconsistent event
18708134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
18718134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        break;
18728134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
18738134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
18748134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case EventEntry::TYPE_MOTION: {
18758134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        MotionEntry* motionEntry = static_cast<MotionEntry*>(eventEntry);
18768134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_OUTSIDE) {
18778134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_OUTSIDE;
18788134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT) {
18798134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_EXIT;
18808134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER) {
18818134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_ENTER;
18828134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT) {
18838134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_CANCEL;
18848134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else if (dispatchMode & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER) {
18858134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_DOWN;
18868134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        } else {
18878134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = motionEntry->action;
18888134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
18898134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (dispatchEntry->resolvedAction == AMOTION_EVENT_ACTION_HOVER_MOVE
18908134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && !connection->inputState.isHovering(
189183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                        motionEntry->deviceId, motionEntry->source, motionEntry->displayId)) {
18928134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_DISPATCH_CYCLE
18935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: filling in missing hover enter event",
18948134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                connection->getInputChannelName());
18958134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
18968134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedAction = AMOTION_EVENT_ACTION_HOVER_ENTER;
18978134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
18988134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
18998134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        dispatchEntry->resolvedFlags = motionEntry->flags;
19008134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (dispatchEntry->targetFlags & InputTarget::FLAG_WINDOW_IS_OBSCURED) {
19018134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            dispatchEntry->resolvedFlags |= AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED;
19028134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
19038134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
19048134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (!connection->inputState.trackMotion(motionEntry,
19058134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags)) {
19068134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_DISPATCH_CYCLE
19075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent motion event",
19088134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    connection->getInputChannelName());
19098134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
1910c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown            delete dispatchEntry;
19118134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return; // skip the inconsistent event
19128134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
19138134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        break;
19148134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
19158134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
19168134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
1917c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    // Remember that we are waiting for this dispatch to complete.
1918c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    if (dispatchEntry->hasForegroundTarget()) {
1919c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown        incrementPendingForegroundDispatchesLocked(eventEntry);
1920c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    }
1921c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown
192246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Enqueue the dispatch entry.
192346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    connection->outboundQueue.enqueueAtTail(dispatchEntry);
1924481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceOutboundQueueLengthLocked(connection);
192546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
192646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
19277fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownvoid InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
1928519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        const sp<Connection>& connection) {
192946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
19305baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ startDispatchCycle",
193146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            connection->getInputChannelName());
193246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
193346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1934d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    while (connection->status == Connection::STATUS_NORMAL
1935d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            && !connection->outboundQueue.isEmpty()) {
1936d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        DispatchEntry* dispatchEntry = connection->outboundQueue.head;
1937265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        dispatchEntry->deliveryTime = currentTime;
193846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1939d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Publish the event.
1940d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        status_t status;
1941d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        EventEntry* eventEntry = dispatchEntry->eventEntry;
1942d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        switch (eventEntry->type) {
1943d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        case EventEntry::TYPE_KEY: {
1944d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            KeyEntry* keyEntry = static_cast<KeyEntry*>(eventEntry);
1945d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
1946d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            // Publish the key event.
1947072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            status = connection->inputPublisher.publishKeyEvent(dispatchEntry->seq,
1948d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    keyEntry->deviceId, keyEntry->source,
1949d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags,
1950d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    keyEntry->keyCode, keyEntry->scanCode,
1951d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    keyEntry->metaState, keyEntry->repeatCount, keyEntry->downTime,
1952d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    keyEntry->eventTime);
1953d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            break;
195446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
195546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1956d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        case EventEntry::TYPE_MOTION: {
1957d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            MotionEntry* motionEntry = static_cast<MotionEntry*>(eventEntry);
195846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1959d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            PointerCoords scaledCoords[MAX_POINTERS];
1960d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            const PointerCoords* usingCoords = motionEntry->pointerCoords;
1961d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
1962d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            // Set the X and Y offset depending on the input source.
1963d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            float xOffset, yOffset, scaleFactor;
1964d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            if ((motionEntry->source & AINPUT_SOURCE_CLASS_POINTER)
1965d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    && !(dispatchEntry->targetFlags & InputTarget::FLAG_ZERO_COORDS)) {
1966d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                scaleFactor = dispatchEntry->scaleFactor;
1967d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                xOffset = dispatchEntry->xOffset * scaleFactor;
1968d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                yOffset = dispatchEntry->yOffset * scaleFactor;
1969d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                if (scaleFactor != 1.0f) {
1970d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    for (size_t i = 0; i < motionEntry->pointerCount; i++) {
1971d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        scaledCoords[i] = motionEntry->pointerCoords[i];
1972d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        scaledCoords[i].scale(scaleFactor);
1973d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    }
1974d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    usingCoords = scaledCoords;
1975e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                }
1976d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            } else {
1977d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                xOffset = 0.0f;
1978d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                yOffset = 0.0f;
1979d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                scaleFactor = 1.0f;
1980d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
1981d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                // We don't want the dispatch target to know.
1982d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                if (dispatchEntry->targetFlags & InputTarget::FLAG_ZERO_COORDS) {
1983d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    for (size_t i = 0; i < motionEntry->pointerCount; i++) {
1984d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        scaledCoords[i].clear();
1985d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    }
1986d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    usingCoords = scaledCoords;
19877a9db181a64e0e752a447c6408639bbb33c412fcKenny Root                }
19887a9db181a64e0e752a447c6408639bbb33c412fcKenny Root            }
1989d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
1990d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            // Publish the motion event.
1991072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            status = connection->inputPublisher.publishMotionEvent(dispatchEntry->seq,
1992d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->deviceId, motionEntry->source,
1993d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags,
1994d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->edgeFlags, motionEntry->metaState, motionEntry->buttonState,
1995d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    xOffset, yOffset,
1996d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->xPrecision, motionEntry->yPrecision,
1997d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->downTime, motionEntry->eventTime,
1998d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    motionEntry->pointerCount, motionEntry->pointerProperties,
1999d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    usingCoords);
2000d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            break;
2001d3616592fe1b315b589766c4b74ce728fc4968f5Jeff Brown        }
2002d3616592fe1b315b589766c4b74ce728fc4968f5Jeff Brown
2003d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        default:
2004d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            ALOG_ASSERT(false);
2005d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            return;
2006d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
200746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2008d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Check the result.
200946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (status) {
2010d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            if (status == WOULD_BLOCK) {
2011d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                if (connection->waitQueue.isEmpty()) {
2012d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    ALOGE("channel '%s' ~ Could not publish event because the pipe is full. "
2013d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            "This is unexpected because the wait queue is empty, so the pipe "
2014d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            "should be empty and we shouldn't have any problems writing an "
2015d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            "event to it, status=%d", connection->getInputChannelName(), status);
2016d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
2017d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                } else {
2018d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    // Pipe is full and we are waiting for the app to finish process some events
2019d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    // before sending more events to it.
2020d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown#if DEBUG_DISPATCH_CYCLE
2021d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    ALOGD("channel '%s' ~ Could not publish event because the pipe is full, "
2022d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            "waiting for the application to catch up",
2023d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                            connection->getInputChannelName());
2024d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown#endif
2025d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    connection->inputPublisherBlocked = true;
2026d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                }
2027d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            } else {
2028d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                ALOGE("channel '%s' ~ Could not publish event due to an unexpected error, "
2029d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                        "status=%d", connection->getInputChannelName(), status);
2030d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                abortBrokenDispatchCycleLocked(currentTime, connection, true /*notify*/);
2031d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            }
203246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            return;
203346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
203446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2035d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Re-enqueue the event on the wait queue.
2036d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        connection->outboundQueue.dequeue(dispatchEntry);
2037481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        traceOutboundQueueLengthLocked(connection);
2038d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        connection->waitQueue.enqueueAtTail(dispatchEntry);
2039481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        traceWaitQueueLengthLocked(connection);
204046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
204146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
204246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20437fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownvoid InputDispatcher::finishDispatchCycleLocked(nsecs_t currentTime,
2044072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        const sp<Connection>& connection, uint32_t seq, bool handled) {
204546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
2046072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    ALOGD("channel '%s' ~ finishDispatchCycle - seq=%u, handled=%s",
2047072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            connection->getInputChannelName(), seq, toString(handled));
204846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
204946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2050d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    connection->inputPublisherBlocked = false;
2051d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
20529c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    if (connection->status == Connection::STATUS_BROKEN
20539c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            || connection->status == Connection::STATUS_ZOMBIE) {
205446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return;
205546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
205646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20573915bb845b032dc184dba5e60970b803390ca3edJeff Brown    // Notify other system components and prepare to start the next dispatch cycle.
2058072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    onDispatchCycleFinishedLocked(currentTime, connection, seq, handled);
2059b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2060b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2061b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::abortBrokenDispatchCycleLocked(nsecs_t currentTime,
2062cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const sp<Connection>& connection, bool notify) {
206346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_DISPATCH_CYCLE
20645baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ abortBrokenDispatchCycle - notify=%s",
2065cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            connection->getInputChannelName(), toString(notify));
206646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
206746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2068d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    // Clear the dispatch queues.
2069d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    drainDispatchQueueLocked(&connection->outboundQueue);
2070481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceOutboundQueueLengthLocked(connection);
2071d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    drainDispatchQueueLocked(&connection->waitQueue);
2072481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    traceWaitQueueLengthLocked(connection);
207346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2074b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    // The connection appears to be unrecoverably broken.
20759c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    // Ignore already broken or zombie connections.
2076b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (connection->status == Connection::STATUS_NORMAL) {
2077b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        connection->status = Connection::STATUS_BROKEN;
207846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2079cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (notify) {
2080cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // Notify other system components.
2081cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            onDispatchCycleBrokenLocked(currentTime, connection);
2082cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        }
208346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
208446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
208546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2086d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brownvoid InputDispatcher::drainDispatchQueueLocked(Queue<DispatchEntry>* queue) {
2087d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    while (!queue->isEmpty()) {
2088d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        DispatchEntry* dispatchEntry = queue->dequeueAtHead();
2089d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        releaseDispatchEntryLocked(dispatchEntry);
2090b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
2091b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2092b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2093d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brownvoid InputDispatcher::releaseDispatchEntryLocked(DispatchEntry* dispatchEntry) {
2094d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    if (dispatchEntry->hasForegroundTarget()) {
2095d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        decrementPendingForegroundDispatchesLocked(dispatchEntry->eventEntry);
2096d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    }
2097d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown    delete dispatchEntry;
2098d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown}
2099d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
2100cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brownint InputDispatcher::handleReceiveCallback(int fd, int events, void* data) {
210146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputDispatcher* d = static_cast<InputDispatcher*>(data);
210246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
210346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
210446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        AutoMutex _l(d->mLock);
210546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2106cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        ssize_t connectionIndex = d->mConnectionsByFd.indexOfKey(fd);
210746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (connectionIndex < 0) {
21083762c311729fe9f3af085c14c5c1fb471d994c03Steve Block            ALOGE("Received spurious receive callback for unknown input channel.  "
2109cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown                    "fd=%d, events=0x%x", fd, events);
21104fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            return 0; // remove the callback
211146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
211246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2113cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        bool notify;
2114cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        sp<Connection> connection = d->mConnectionsByFd.valueAt(connectionIndex);
2115cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (!(events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP))) {
2116cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (!(events & ALOOPER_EVENT_INPUT)) {
21178564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("channel '%s' ~ Received spurious callback for unhandled poll event.  "
2118cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        "events=0x%x", connection->getInputChannelName(), events);
2119cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                return 1;
2120cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
212146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
21221adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            nsecs_t currentTime = now();
21231adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            bool gotOne = false;
21241adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            status_t status;
21251adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            for (;;) {
2126072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown                uint32_t seq;
2127072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown                bool handled;
2128072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown                status = connection->inputPublisher.receiveFinishedSignal(&seq, &handled);
21291adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                if (status) {
21301adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                    break;
21311adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                }
2132072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown                d->finishDispatchCycleLocked(currentTime, connection, seq, handled);
21331adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                gotOne = true;
21341adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            }
21351adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            if (gotOne) {
2136cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                d->runCommandsLockedInterruptible();
21371adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                if (status == WOULD_BLOCK) {
21381adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                    return 1;
21391adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                }
2140cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
214146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
21421adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            notify = status != DEAD_OBJECT || !connection->monitor;
21431adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            if (notify) {
21441adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                ALOGE("channel '%s' ~ Failed to receive finished signal.  status=%d",
21451adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown                        connection->getInputChannelName(), status);
21461adee11b5e644c74a2ed40344f4836de3bd3ac56Jeff Brown            }
2147cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        } else {
2148cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // Monitor channels are never explicitly unregistered.
2149cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // We do it automatically when the remote endpoint is closed so don't warn
2150cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            // about them.
2151cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            notify = !connection->monitor;
2152cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (notify) {
21538564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("channel '%s' ~ Consumer closed input channel or an error occurred.  "
2154cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        "events=0x%x", connection->getInputChannelName(), events);
2155cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
215646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
215746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2158cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // Unregister the channel.
2159cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        d->unregisterInputChannelLocked(connection->inputChannel, notify);
2160cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return 0; // remove the callback
216146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
216246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
216346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2164b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::synthesizeCancelationEventsForAllConnectionsLocked(
2165da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const CancelationOptions& options) {
2166cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    for (size_t i = 0; i < mConnectionsByFd.size(); i++) {
2167b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        synthesizeCancelationEventsForConnectionLocked(
2168cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown                mConnectionsByFd.valueAt(i), options);
2169b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2170b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2171b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2172b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::synthesizeCancelationEventsForInputChannelLocked(
2173da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const sp<InputChannel>& channel, const CancelationOptions& options) {
2174b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    ssize_t index = getConnectionIndexLocked(channel);
2175b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (index >= 0) {
2176b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        synthesizeCancelationEventsForConnectionLocked(
2177cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown                mConnectionsByFd.valueAt(index), options);
2178b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2179b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2180b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2181b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::synthesizeCancelationEventsForConnectionLocked(
2182da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const sp<Connection>& connection, const CancelationOptions& options) {
2183c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    if (connection->status == Connection::STATUS_BROKEN) {
2184c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown        return;
2185c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown    }
2186c0cb3dc2c16883f19bf1caf652b2fcdb55a1a856Jeff Brown
2187b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    nsecs_t currentTime = now();
2188b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
21898b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown    Vector<EventEntry*> cancelationEvents;
2190ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    connection->inputState.synthesizeCancelationEvents(currentTime,
21918b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown            cancelationEvents, options);
2192b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
21938b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown    if (!cancelationEvents.isEmpty()) {
2194b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
21955baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("channel '%s' ~ Synthesized %d cancelation events to bring channel back in sync "
2196da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                "with reality: %s, mode=%d.",
21978b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown                connection->getInputChannelName(), cancelationEvents.size(),
2198da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown                options.reason, options.mode);
2199b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
22008b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown        for (size_t i = 0; i < cancelationEvents.size(); i++) {
22018b4be56030c3b8c93dfa45bccac7365f90f377ceJeff Brown            EventEntry* cancelationEventEntry = cancelationEvents.itemAt(i);
2202b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            switch (cancelationEventEntry->type) {
2203b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            case EventEntry::TYPE_KEY:
2204b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                logOutboundKeyDetailsLocked("cancel - ",
2205b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                        static_cast<KeyEntry*>(cancelationEventEntry));
2206b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                break;
2207b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            case EventEntry::TYPE_MOTION:
2208b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                logOutboundMotionDetailsLocked("cancel - ",
2209b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                        static_cast<MotionEntry*>(cancelationEventEntry));
2210b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                break;
2211b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            }
2212b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
22138134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            InputTarget target;
22149302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            sp<InputWindowHandle> windowHandle = getWindowHandleLocked(connection->inputChannel);
22159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (windowHandle != NULL) {
2216cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                const InputWindowInfo* windowInfo = windowHandle->getInfo();
2217cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                target.xOffset = -windowInfo->frameLeft;
2218cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                target.yOffset = -windowInfo->frameTop;
2219cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                target.scaleFactor = windowInfo->scaleFactor;
2220b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            } else {
22218134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                target.xOffset = 0;
22228134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                target.yOffset = 0;
22238134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                target.scaleFactor = 1.0f;
2224b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            }
22258134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            target.inputChannel = connection->inputChannel;
22268134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            target.flags = InputTarget::FLAG_DISPATCH_AS_IS;
2227b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
22288134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            enqueueDispatchEntryLocked(connection, cancelationEventEntry, // increments ref
22293241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    &target, InputTarget::FLAG_DISPATCH_AS_IS);
2230b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2231ac386073df2514b79a2ca169f4a89f129733002fJeff Brown            cancelationEventEntry->release();
2232b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
2233b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2234d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        startDispatchCycleLocked(currentTime, connection);
2235b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2236b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2237b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
223801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff BrownInputDispatcher::MotionEntry*
223901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff BrownInputDispatcher::splitMotionEvent(const MotionEntry* originalMotionEntry, BitSet32 pointerIds) {
2240ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block    ALOG_ASSERT(pointerIds.value != 0);
224101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
224201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    uint32_t splitPointerIndexMap[MAX_POINTERS];
2243fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    PointerProperties splitPointerProperties[MAX_POINTERS];
224401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    PointerCoords splitPointerCoords[MAX_POINTERS];
224501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
224601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    uint32_t originalPointerCount = originalMotionEntry->pointerCount;
224701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    uint32_t splitPointerCount = 0;
224801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
224901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (uint32_t originalPointerIndex = 0; originalPointerIndex < originalPointerCount;
225001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalPointerIndex++) {
2251fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        const PointerProperties& pointerProperties =
2252fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                originalMotionEntry->pointerProperties[originalPointerIndex];
2253fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        uint32_t pointerId = uint32_t(pointerProperties.id);
225401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (pointerIds.hasBit(pointerId)) {
225501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            splitPointerIndexMap[splitPointerCount] = originalPointerIndex;
2256fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            splitPointerProperties[splitPointerCount].copyFrom(pointerProperties);
2257ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            splitPointerCoords[splitPointerCount].copyFrom(
22583241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    originalMotionEntry->pointerCoords[originalPointerIndex]);
225901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            splitPointerCount += 1;
226001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
226101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
226258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown
226358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    if (splitPointerCount != pointerIds.count()) {
226458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // This is bad.  We are missing some of the pointers that we expected to deliver.
226558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // Most likely this indicates that we received an ACTION_MOVE events that has
226658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // different pointer ids than we expected based on the previous ACTION_DOWN
226758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // or ACTION_POINTER_DOWN events that caused us to decide to split the pointers
226858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        // in this way.
22698564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Dropping split motion event because the pointer count is %d but "
227058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown                "we expected there to be %d pointers.  This probably means we received "
227158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown                "a broken sequence of pointer ids from the input device.",
227258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown                splitPointerCount, pointerIds.count());
227358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown        return NULL;
227458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    }
227501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
227601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    int32_t action = originalMotionEntry->action;
227701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
227801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN
227901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            || maskedAction == AMOTION_EVENT_ACTION_POINTER_UP) {
228001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        int32_t originalPointerIndex = getMotionEventActionPointerIndex(action);
2281fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        const PointerProperties& pointerProperties =
2282fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                originalMotionEntry->pointerProperties[originalPointerIndex];
2283fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        uint32_t pointerId = uint32_t(pointerProperties.id);
228401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (pointerIds.hasBit(pointerId)) {
228501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            if (pointerIds.count() == 1) {
228601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                // The first/last pointer went down/up.
228701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                action = maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN
228801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                        ? AMOTION_EVENT_ACTION_DOWN : AMOTION_EVENT_ACTION_UP;
22899a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown            } else {
22909a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                // A secondary pointer went down/up.
22919a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                uint32_t splitPointerIndex = 0;
2292fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                while (pointerId != uint32_t(splitPointerProperties[splitPointerIndex].id)) {
22939a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                    splitPointerIndex += 1;
22949a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                }
22959a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                action = maskedAction | (splitPointerIndex
22969a01d0519fa56fa75864cb96045c6ee832a39ff4Jeff Brown                        << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT);
229701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            }
229801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        } else {
229901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            // An unrelated pointer changed.
230001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            action = AMOTION_EVENT_ACTION_MOVE;
230101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
230201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
230301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
2304ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    MotionEntry* splitMotionEntry = new MotionEntry(
230501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->eventTime,
230601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->deviceId,
230701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->source,
230801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->policyFlags,
230901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            action,
231001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->flags,
231101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->metaState,
2312fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            originalMotionEntry->buttonState,
231301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->edgeFlags,
231401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->xPrecision,
231501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->yPrecision,
231601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            originalMotionEntry->downTime,
231783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            originalMotionEntry->displayId,
2318fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            splitPointerCount, splitPointerProperties, splitPointerCoords);
231901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
2320a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    if (originalMotionEntry->injectionState) {
2321a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        splitMotionEntry->injectionState = originalMotionEntry->injectionState;
2322a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        splitMotionEntry->injectionState->refCount += 1;
2323a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    }
2324a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
232501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return splitMotionEntry;
232601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
232701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
2328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid InputDispatcher::notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
232946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
23305baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyConfigurationChanged - eventTime=%lld", args->eventTime);
2331b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
233246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2333b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool needWake;
2334b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    { // acquire lock
2335b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        AutoMutex _l(mLock);
2336b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ConfigurationChangedEntry* newEntry = new ConfigurationChangedEntry(args->eventTime);
2338b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        needWake = enqueueInboundEventLocked(newEntry);
233946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
2340b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2341b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (needWake) {
23424fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
2343b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
234446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
234546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid InputDispatcher::notifyKey(const NotifyKeyArgs* args) {
234746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
23485baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyKey - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, action=0x%x, "
234946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            "flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, downTime=%lld",
2350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->eventTime, args->deviceId, args->source, args->policyFlags,
2351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->action, args->flags, args->keyCode, args->scanCode,
2352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->metaState, args->downTime);
235346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif
2354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (!validateKeyEvent(args->action)) {
235501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return;
235601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
235746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t policyFlags = args->policyFlags;
2359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t flags = args->flags;
2360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t metaState = args->metaState;
23611f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    if ((policyFlags & POLICY_FLAG_VIRTUAL) || (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY)) {
23621f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        policyFlags |= POLICY_FLAG_VIRTUAL;
23631f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        flags |= AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY;
23641f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
2365924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_ALT) {
2366924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_ALT_ON | AMETA_ALT_LEFT_ON;
2367924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
2368924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_ALT_GR) {
2369924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_ALT_ON | AMETA_ALT_RIGHT_ON;
2370924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
2371924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_SHIFT) {
2372924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_SHIFT_ON | AMETA_SHIFT_LEFT_ON;
2373924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
2374924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_CAPS_LOCK) {
2375924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_CAPS_LOCK_ON;
2376924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
2377924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    if (policyFlags & POLICY_FLAG_FUNCTION) {
2378924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown        metaState |= AMETA_FUNCTION_ON;
2379924c4d47774fa7d8a5ce659d12291ef7df82ee05Jeff Brown    }
23801f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
2381e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    policyFlags |= POLICY_FLAG_TRUSTED;
23821f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
23831f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    KeyEvent event;
2384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    event.initialize(args->deviceId, args->source, args->action,
2385be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            flags, args->keyCode, args->scanCode, metaState, 0,
2386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->downTime, args->eventTime);
23871f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
23881f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
23891f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
23901f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    if (policyFlags & POLICY_FLAG_WOKE_HERE) {
23911f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        flags |= AKEY_EVENT_FLAG_WOKE_HERE;
23921f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
2393b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2394b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool needWake;
239546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
23960029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mLock.lock();
23970029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
239883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        if (shouldSendKeyToInputFilterLocked(args)) {
23990029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mLock.unlock();
24000029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24010029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            policyFlags |= POLICY_FLAG_FILTERED;
24020029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            if (!mPolicy->filterInputEvent(&event, policyFlags)) {
24030029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                return; // event was consumed by the filter
24040029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            }
24050029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24060029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mLock.lock();
24070029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
240846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
24097fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        int32_t repeatCount = 0;
2410be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        KeyEntry* newEntry = new KeyEntry(args->eventTime,
2411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->deviceId, args->source, policyFlags,
2412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->action, flags, args->keyCode, args->scanCode,
2413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                metaState, repeatCount, args->downTime);
241446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2415b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        needWake = enqueueInboundEventLocked(newEntry);
24160029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mLock.unlock();
241746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
241846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2419b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (needWake) {
24204fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
242146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
242246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
242346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
242483d616a9c7b9505153d258511eb5c16b552e268dJeff Brownbool InputDispatcher::shouldSendKeyToInputFilterLocked(const NotifyKeyArgs* args) {
242583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    return mInputFilterEnabled;
242683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown}
242783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
2428be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
242946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
24305baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyMotion - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
2431fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            "action=0x%x, flags=0x%x, metaState=0x%x, buttonState=0x%x, edgeFlags=0x%x, "
243285a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            "xPrecision=%f, yPrecision=%f, downTime=%lld",
2433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->eventTime, args->deviceId, args->source, args->policyFlags,
2434be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->action, args->flags, args->metaState, args->buttonState,
2435be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime);
2436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    for (uint32_t i = 0; i < args->pointerCount; i++) {
24375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("  Pointer %d: id=%d, toolType=%d, "
2438fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                "x=%f, y=%f, pressure=%f, size=%f, "
243985a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown                "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
24408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                "orientation=%f",
2441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                i, args->pointerProperties[i].id,
2442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerProperties[i].toolType,
2443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X),
2444be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y),
2445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE),
2446be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE),
2447be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR),
2448be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR),
2449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR),
2450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR),
2451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
2452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
2453be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown#endif
2454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (!validateMotionEvent(args->action, args->pointerCount, args->pointerProperties)) {
245501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        return;
245601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
245746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2458be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t policyFlags = args->policyFlags;
2459e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    policyFlags |= POLICY_FLAG_TRUSTED;
2460be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mPolicy->interceptMotionBeforeQueueing(args->eventTime, /*byref*/ policyFlags);
2461b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2462b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool needWake;
246346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
24640029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mLock.lock();
24650029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
246683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        if (shouldSendMotionToInputFilterLocked(args)) {
24670029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mLock.unlock();
24680029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24690029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            MotionEvent event;
2470be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            event.initialize(args->deviceId, args->source, args->action, args->flags,
2471be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    args->edgeFlags, args->metaState, args->buttonState, 0, 0,
2472be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    args->xPrecision, args->yPrecision,
2473be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    args->downTime, args->eventTime,
2474be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    args->pointerCount, args->pointerProperties, args->pointerCoords);
24750029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24760029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            policyFlags |= POLICY_FLAG_FILTERED;
24770029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            if (!mPolicy->filterInputEvent(&event, policyFlags)) {
24780029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                return; // event was consumed by the filter
24790029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            }
24800029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
24810029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mLock.lock();
24820029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
248346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
248446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        // Just enqueue a new motion event.
2485be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MotionEntry* newEntry = new MotionEntry(args->eventTime,
2486be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->deviceId, args->source, policyFlags,
2487be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->action, args->flags, args->metaState, args->buttonState,
2488be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime,
248983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                args->displayId,
2490be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                args->pointerCount, args->pointerProperties, args->pointerCoords);
249146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2492b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        needWake = enqueueInboundEventLocked(newEntry);
24930029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mLock.unlock();
249446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
249546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2496b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (needWake) {
24974fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
249846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
249946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
250046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
250183d616a9c7b9505153d258511eb5c16b552e268dJeff Brownbool InputDispatcher::shouldSendMotionToInputFilterLocked(const NotifyMotionArgs* args) {
250283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // TODO: support sending secondary display events to input filter
250383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    return mInputFilterEnabled && isMainDisplay(args->displayId);
250483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown}
250583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
2506be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid InputDispatcher::notifySwitch(const NotifySwitchArgs* args) {
2507b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
2508bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown    ALOGD("notifySwitch - eventTime=%lld, policyFlags=0x%x, switchValues=0x%08x, switchMask=0x%08x",
2509be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            args->eventTime, args->policyFlags,
2510bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown            args->switchValues, args->switchMask);
2511b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
2512b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2513be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t policyFlags = args->policyFlags;
2514e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    policyFlags |= POLICY_FLAG_TRUSTED;
2515be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mPolicy->notifySwitch(args->eventTime,
2516bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown            args->switchValues, args->switchMask, policyFlags);
2517b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2518b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
251965fd251c3913fc921468a3dad190810db19eb9dfJeff Brownvoid InputDispatcher::notifyDeviceReset(const NotifyDeviceResetArgs* args) {
252065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
25215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("notifyDeviceReset - eventTime=%lld, deviceId=%d",
252265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            args->eventTime, args->deviceId);
252365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown#endif
252465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
252565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool needWake;
252665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    { // acquire lock
252765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        AutoMutex _l(mLock);
252865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
252965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        DeviceResetEntry* newEntry = new DeviceResetEntry(args->eventTime, args->deviceId);
253065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        needWake = enqueueInboundEventLocked(newEntry);
253165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    } // release lock
253265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
253365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (needWake) {
253465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mLooper->wake();
253565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
253665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
253765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
25387fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownint32_t InputDispatcher::injectInputEvent(const InputEvent* event,
25390029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        int32_t injectorPid, int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis,
25400029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        uint32_t policyFlags) {
25417fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown#if DEBUG_INBOUND_EVENT_DETAILS
25425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("injectInputEvent - eventType=%d, injectorPid=%d, injectorUid=%d, "
25430029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            "syncMode=%d, timeoutMillis=%d, policyFlags=0x%08x",
25440029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            event->getType(), injectorPid, injectorUid, syncMode, timeoutMillis, policyFlags);
25457fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown#endif
25467fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
25477fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    nsecs_t endTime = now() + milliseconds_to_nanoseconds(timeoutMillis);
2548e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
25490029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    policyFlags |= POLICY_FLAG_INJECTED;
2550e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    if (hasInjectionPermission(injectorPid, injectorUid)) {
2551e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown        policyFlags |= POLICY_FLAG_TRUSTED;
2552e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    }
25537fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
25543241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    EventEntry* firstInjectedEntry;
25553241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    EventEntry* lastInjectedEntry;
2556b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    switch (event->getType()) {
2557b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case AINPUT_EVENT_TYPE_KEY: {
2558b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        const KeyEvent* keyEvent = static_cast<const KeyEvent*>(event);
2559b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        int32_t action = keyEvent->getAction();
2560b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        if (! validateKeyEvent(action)) {
2561b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            return INPUT_EVENT_INJECTION_FAILED;
2562b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
2563b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2564b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        int32_t flags = keyEvent->getFlags();
25651f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY) {
25661f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            policyFlags |= POLICY_FLAG_VIRTUAL;
25671f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
25681f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
25690029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (!(policyFlags & POLICY_FLAG_FILTERED)) {
25700029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mPolicy->interceptKeyBeforeQueueing(keyEvent, /*byref*/ policyFlags);
25710029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
25721f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
25731f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        if (policyFlags & POLICY_FLAG_WOKE_HERE) {
25741f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            flags |= AKEY_EVENT_FLAG_WOKE_HERE;
25751f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
25767fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
2577b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        mLock.lock();
25783241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        firstInjectedEntry = new KeyEntry(keyEvent->getEventTime(),
25791f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                keyEvent->getDeviceId(), keyEvent->getSource(),
25801f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                policyFlags, action, flags,
25811f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                keyEvent->getKeyCode(), keyEvent->getScanCode(), keyEvent->getMetaState(),
2582b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                keyEvent->getRepeatCount(), keyEvent->getDownTime());
25833241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        lastInjectedEntry = firstInjectedEntry;
2584b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
2585b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2586b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2587b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    case AINPUT_EVENT_TYPE_MOTION: {
2588b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        const MotionEvent* motionEvent = static_cast<const MotionEvent*>(event);
258983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        int32_t displayId = ADISPLAY_ID_DEFAULT;
2590b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        int32_t action = motionEvent->getAction();
2591b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        size_t pointerCount = motionEvent->getPointerCount();
2592fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        const PointerProperties* pointerProperties = motionEvent->getPointerProperties();
2593fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        if (! validateMotionEvent(action, pointerCount, pointerProperties)) {
2594b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            return INPUT_EVENT_INJECTION_FAILED;
2595b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
2596b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
25970029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (!(policyFlags & POLICY_FLAG_FILTERED)) {
25980029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            nsecs_t eventTime = motionEvent->getEventTime();
25990029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            mPolicy->interceptMotionBeforeQueueing(eventTime, /*byref*/ policyFlags);
26000029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
2601b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2602b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        mLock.lock();
2603b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        const nsecs_t* sampleEventTimes = motionEvent->getSampleEventTimes();
2604b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        const PointerCoords* samplePointerCoords = motionEvent->getSamplePointerCoords();
26053241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        firstInjectedEntry = new MotionEntry(*sampleEventTimes,
2606b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
2607b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                action, motionEvent->getFlags(),
2608fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                motionEvent->getMetaState(), motionEvent->getButtonState(),
2609fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                motionEvent->getEdgeFlags(),
2610b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                motionEvent->getXPrecision(), motionEvent->getYPrecision(),
261183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                motionEvent->getDownTime(), displayId,
261283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                uint32_t(pointerCount), pointerProperties, samplePointerCoords);
26133241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        lastInjectedEntry = firstInjectedEntry;
2614b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        for (size_t i = motionEvent->getHistorySize(); i > 0; i--) {
2615b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            sampleEventTimes += 1;
2616b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            samplePointerCoords += pointerCount;
26173241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            MotionEntry* nextInjectedEntry = new MotionEntry(*sampleEventTimes,
26183241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
26193241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    action, motionEvent->getFlags(),
26203241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getMetaState(), motionEvent->getButtonState(),
26213241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getEdgeFlags(),
26223241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown                    motionEvent->getXPrecision(), motionEvent->getYPrecision(),
262383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    motionEvent->getDownTime(), displayId,
262483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    uint32_t(pointerCount), pointerProperties, samplePointerCoords);
26253241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            lastInjectedEntry->next = nextInjectedEntry;
26263241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown            lastInjectedEntry = nextInjectedEntry;
26276ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        }
2628b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        break;
2629b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
26306ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
2631b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    default:
26328564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Cannot inject event of type %d", event->getType());
2633b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return INPUT_EVENT_INJECTION_FAILED;
2634b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
263501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
2636ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    InjectionState* injectionState = new InjectionState(injectorPid, injectorUid);
2637b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    if (syncMode == INPUT_EVENT_INJECTION_SYNC_NONE) {
2638b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        injectionState->injectionIsAsync = true;
2639b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
2640b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2641b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    injectionState->refCount += 1;
26423241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    lastInjectedEntry->injectionState = injectionState;
26433241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown
26443241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    bool needWake = false;
26453241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    for (EventEntry* entry = firstInjectedEntry; entry != NULL; ) {
26463241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        EventEntry* nextEntry = entry->next;
26473241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        needWake |= enqueueInboundEventLocked(entry);
26483241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        entry = nextEntry;
26493241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown    }
2650b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
2651b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    mLock.unlock();
26527fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
2653b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (needWake) {
26544fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
26557fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
26567fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
26577fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    int32_t injectionResult;
26587fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    { // acquire lock
26597fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        AutoMutex _l(mLock);
26607fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
26616ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        if (syncMode == INPUT_EVENT_INJECTION_SYNC_NONE) {
26626ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            injectionResult = INPUT_EVENT_INJECTION_SUCCEEDED;
26636ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        } else {
26646ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            for (;;) {
266501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                injectionResult = injectionState->injectionResult;
26666ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                if (injectionResult != INPUT_EVENT_INJECTION_PENDING) {
26676ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    break;
26686ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                }
26697fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
26707fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                nsecs_t remainingTimeout = endTime - now();
26717fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                if (remainingTimeout <= 0) {
26726ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#if DEBUG_INJECTION
26735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("injectInputEvent - Timed out waiting for injection result "
26746ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                            "to become available.");
26756ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#endif
26767fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                    injectionResult = INPUT_EVENT_INJECTION_TIMED_OUT;
26777fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                    break;
26787fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                }
26797fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
26806ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                mInjectionResultAvailableCondition.waitRelative(mLock, remainingTimeout);
26816ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            }
26826ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
26836ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            if (injectionResult == INPUT_EVENT_INJECTION_SUCCEEDED
26846ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    && syncMode == INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISHED) {
268501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                while (injectionState->pendingForegroundDispatches != 0) {
26866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#if DEBUG_INJECTION
26875baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("injectInputEvent - Waiting for %d pending foreground dispatches.",
268801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                            injectionState->pendingForegroundDispatches);
26896ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#endif
26906ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    nsecs_t remainingTimeout = endTime - now();
26916ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    if (remainingTimeout <= 0) {
26926ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#if DEBUG_INJECTION
26935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("injectInputEvent - Timed out waiting for pending foreground "
26946ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                            "dispatches to finish.");
26956ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#endif
26966ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                        injectionResult = INPUT_EVENT_INJECTION_TIMED_OUT;
26976ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                        break;
26986ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    }
26996ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
27006ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                    mInjectionSyncFinishedCondition.waitRelative(mLock, remainingTimeout);
27016ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                }
27027fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown            }
27037fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        }
27047fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
2705ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionState->release();
27067fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    } // release lock
27077fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
27086ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#if DEBUG_INJECTION
27095baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("injectInputEvent - Finished with result %d.  "
27106ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            "injectorPid=%d, injectorUid=%d",
27116ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            injectionResult, injectorPid, injectorUid);
27126ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown#endif
27136ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
27147fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    return injectionResult;
27157fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
27167fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
2717b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownbool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
2718b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    return injectorUid == 0
2719b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
2720b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
2721b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
27227fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownvoid InputDispatcher::setInjectionResultLocked(EventEntry* entry, int32_t injectionResult) {
272301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionState* injectionState = entry->injectionState;
272401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState) {
27257fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown#if DEBUG_INJECTION
27265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Setting input event injection result to %d.  "
27277fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown                "injectorPid=%d, injectorUid=%d",
272801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown                 injectionResult, injectionState->injectorPid, injectionState->injectorUid);
27297fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown#endif
27307fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
27310029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (injectionState->injectionIsAsync
27320029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown                && !(entry->policyFlags & POLICY_FLAG_FILTERED)) {
27336ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            // Log the outcome since the injector did not wait for the injection result.
27346ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            switch (injectionResult) {
27356ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            case INPUT_EVENT_INJECTION_SUCCEEDED:
273671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block                ALOGV("Asynchronous input event injection succeeded.");
27376ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                break;
27386ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            case INPUT_EVENT_INJECTION_FAILED:
27398564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("Asynchronous input event injection failed.");
27406ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                break;
27416ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            case INPUT_EVENT_INJECTION_PERMISSION_DENIED:
27428564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("Asynchronous input event injection permission denied.");
27436ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                break;
27446ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            case INPUT_EVENT_INJECTION_TIMED_OUT:
27458564c8da817a845353d213acd8636b76f567b234Steve Block                ALOGW("Asynchronous input event injection timed out.");
27466ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown                break;
27476ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            }
27486ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        }
27496ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
275001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        injectionState->injectionResult = injectionResult;
27517fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        mInjectionResultAvailableCondition.broadcast();
27527fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
27537fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
27547fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
275501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid InputDispatcher::incrementPendingForegroundDispatchesLocked(EventEntry* entry) {
275601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionState* injectionState = entry->injectionState;
275701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState) {
275801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        injectionState->pendingForegroundDispatches += 1;
27596ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    }
27607fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
27617fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
276201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid InputDispatcher::decrementPendingForegroundDispatchesLocked(EventEntry* entry) {
276301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    InjectionState* injectionState = entry->injectionState;
276401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (injectionState) {
276501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        injectionState->pendingForegroundDispatches -= 1;
2766b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
276701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        if (injectionState->pendingForegroundDispatches == 0) {
276801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            mInjectionSyncFinishedCondition.broadcast();
276901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
2770b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
2771b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2772b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
27739302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownsp<InputWindowHandle> InputDispatcher::getWindowHandleLocked(
27749302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputChannel>& inputChannel) const {
27759302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = mWindowHandles.size();
27769302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    for (size_t i = 0; i < numWindows; i++) {
27779302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
2778cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (windowHandle->getInputChannel() == inputChannel) {
27799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            return windowHandle;
278001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
278101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
278201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return NULL;
278301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
278401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
27859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownbool InputDispatcher::hasWindowHandleLocked(
27869302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle) const {
27879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    size_t numWindows = mWindowHandles.size();
27889302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    for (size_t i = 0; i < numWindows; i++) {
27899302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mWindowHandles.itemAt(i) == windowHandle) {
27909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            return true;
27919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
27929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
27939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    return false;
27949302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown}
27959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
27969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid InputDispatcher::setInputWindows(const Vector<sp<InputWindowHandle> >& inputWindowHandles) {
2797b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
27985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("setInputWindows");
2799b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
2800b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    { // acquire lock
2801b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        AutoMutex _l(mLock);
2802b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2803cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        Vector<sp<InputWindowHandle> > oldWindowHandles = mWindowHandles;
28049302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        mWindowHandles = inputWindowHandles;
2805b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
28069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> newFocusedWindowHandle;
28079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        bool foundHoveredWindow = false;
28089302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        for (size_t i = 0; i < mWindowHandles.size(); i++) {
28099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
2810cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (!windowHandle->updateInfo() || windowHandle->getInputChannel() == NULL) {
28119302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mWindowHandles.removeAt(i--);
28129302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                continue;
2813b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
2814cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (windowHandle->getInfo()->hasFocus) {
28159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                newFocusedWindowHandle = windowHandle;
28169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
28179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (windowHandle == mLastHoverWindowHandle) {
28189302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                foundHoveredWindow = true;
28199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
28209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
28219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
28229302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (!foundHoveredWindow) {
28239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mLastHoverWindowHandle = NULL;
282401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
2825b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
28269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mFocusedWindowHandle != newFocusedWindowHandle) {
28279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (mFocusedWindowHandle != NULL) {
2828b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
28295baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Focus left window: %s",
2830cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        mFocusedWindowHandle->getName().string());
2831b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
2832cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                sp<InputChannel> focusedInputChannel = mFocusedWindowHandle->getInputChannel();
2833cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (focusedInputChannel != NULL) {
2834d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                    CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS,
2835d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                            "focus left window");
2836d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                    synthesizeCancelationEventsForInputChannelLocked(
2837cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                            focusedInputChannel, options);
2838d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                }
2839b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown            }
28409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (newFocusedWindowHandle != NULL) {
2841b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
28425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Focus entered window: %s",
2843cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        newFocusedWindowHandle->getName().string());
2844b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
28459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
28469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mFocusedWindowHandle = newFocusedWindowHandle;
2847b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
2848b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
28499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
285001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            TouchedWindow& touchedWindow = mTouchState.windows.editItemAt(i);
28519302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (!hasWindowHandleLocked(touchedWindow.windowHandle)) {
2852b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#if DEBUG_FOCUS
28535baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Touched window was removed: %s",
2854cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        touchedWindow.windowHandle->getName().string());
2855b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown#endif
2856cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                sp<InputChannel> touchedInputChannel =
2857cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        touchedWindow.windowHandle->getInputChannel();
2858cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (touchedInputChannel != NULL) {
2859d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                    CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
2860d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                            "touched window was removed");
2861d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                    synthesizeCancelationEventsForInputChannelLocked(
2862cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                            touchedInputChannel, options);
2863d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                }
28649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTouchState.windows.removeAt(i--);
2865b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            }
2866b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
2867cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
2868cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // Release information for windows that are no longer present.
2869cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // This ensures that unused input channels are released promptly.
2870cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // Otherwise, they might stick around until the window handle is destroyed
2871cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        // which might not happen until the next GC.
2872cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        for (size_t i = 0; i < oldWindowHandles.size(); i++) {
2873cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            const sp<InputWindowHandle>& oldWindowHandle = oldWindowHandles.itemAt(i);
2874cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (!hasWindowHandleLocked(oldWindowHandle)) {
2875cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown#if DEBUG_FOCUS
28765baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Window went away: %s", oldWindowHandle->getName().string());
2877cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown#endif
2878cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                oldWindowHandle->releaseInfo();
2879cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
2880cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        }
2881b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } // release lock
2882b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2883b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Wake up poll loop since it may need to make new input dispatching choices.
28844fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->wake();
2885b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2886b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
28879302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid InputDispatcher::setFocusedApplication(
28889302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputApplicationHandle>& inputApplicationHandle) {
2889b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
28905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("setFocusedApplication");
2891b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
2892b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    { // acquire lock
2893b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        AutoMutex _l(mLock);
2894b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2895cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (inputApplicationHandle != NULL && inputApplicationHandle->updateInfo()) {
28965ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown            if (mFocusedApplicationHandle != inputApplicationHandle) {
28975ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown                if (mFocusedApplicationHandle != NULL) {
2898e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown                    resetANRTimeoutsLocked();
2899cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    mFocusedApplicationHandle->releaseInfo();
29005ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown                }
29015ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown                mFocusedApplicationHandle = inputApplicationHandle;
29025ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown            }
29035ea29ab7efa9a9ae22345f15a7cb9be3c5e1bbf5Jeff Brown        } else if (mFocusedApplicationHandle != NULL) {
2904e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown            resetANRTimeoutsLocked();
2905cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mFocusedApplicationHandle->releaseInfo();
29069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mFocusedApplicationHandle.clear();
2907b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
2908b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2909b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
2910b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        //logDispatchStateLocked();
2911b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
2912b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } // release lock
2913b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2914b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    // Wake up poll loop since it may need to make new input dispatching choices.
29154fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->wake();
2916b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2917b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2918b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::setInputDispatchMode(bool enabled, bool frozen) {
2919b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
29205baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("setInputDispatchMode: enabled=%d, frozen=%d", enabled, frozen);
2921349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown#endif
2922349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
2923b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    bool changed;
2924349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    { // acquire lock
2925349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        AutoMutex _l(mLock);
2926349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
2927b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (mDispatchEnabled != enabled || mDispatchFrozen != frozen) {
2928120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown            if (mDispatchFrozen && !frozen) {
2929b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                resetANRTimeoutsLocked();
2930349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            }
2931b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2932120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown            if (mDispatchEnabled && !enabled) {
2933120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown                resetAndDropEverythingLocked("dispatcher is being disabled");
2934120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown            }
2935120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
2936b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mDispatchEnabled = enabled;
2937b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mDispatchFrozen = frozen;
2938b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            changed = true;
2939b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        } else {
2940b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            changed = false;
2941349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
2942b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2943b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#if DEBUG_FOCUS
2944b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        //logDispatchStateLocked();
2945b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown#endif
2946b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } // release lock
2947b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
2948b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (changed) {
2949b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        // Wake up poll loop since it may need to make new input dispatching choices.
29504fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
2951b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
2952b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
2953b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
29540029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brownvoid InputDispatcher::setInputFilterEnabled(bool enabled) {
29550029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown#if DEBUG_FOCUS
29565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("setInputFilterEnabled: enabled=%d", enabled);
29570029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown#endif
29580029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
29590029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    { // acquire lock
29600029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        AutoMutex _l(mLock);
29610029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
29620029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        if (mInputFilterEnabled == enabled) {
29630029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            return;
29640029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        }
29650029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
29660029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mInputFilterEnabled = enabled;
29670029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        resetAndDropEverythingLocked("input filter is being enabled or disabled");
29680029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    } // release lock
29690029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
29700029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    // Wake up poll loop since there might be work to do to drop everything.
29710029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    mLooper->wake();
29720029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown}
29730029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
2974e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brownbool InputDispatcher::transferTouchFocus(const sp<InputChannel>& fromChannel,
2975e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        const sp<InputChannel>& toChannel) {
2976e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
29775baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("transferTouchFocus: fromChannel=%s, toChannel=%s",
2978e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            fromChannel->getName().string(), toChannel->getName().string());
2979e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
2980e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    { // acquire lock
2981e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        AutoMutex _l(mLock);
2982e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
29839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> fromWindowHandle = getWindowHandleLocked(fromChannel);
29849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        sp<InputWindowHandle> toWindowHandle = getWindowHandleLocked(toChannel);
29859302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (fromWindowHandle == NULL || toWindowHandle == NULL) {
2986e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
29875baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Cannot transfer focus because from or to window not found.");
2988e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
2989e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            return false;
2990e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        }
29919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (fromWindowHandle == toWindowHandle) {
2992e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
29935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Trivial transfer to same window.");
2994e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
2995e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            return true;
2996e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        }
299783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        if (fromWindowHandle->getInfo()->displayId != toWindowHandle->getInfo()->displayId) {
299883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown#if DEBUG_FOCUS
299983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            ALOGD("Cannot transfer focus because windows are on different displays.");
300083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown#endif
300183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            return false;
300283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        }
3003e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
3004e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        bool found = false;
3005e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
3006e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            const TouchedWindow& touchedWindow = mTouchState.windows[i];
30079302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (touchedWindow.windowHandle == fromWindowHandle) {
3008e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                int32_t oldTargetFlags = touchedWindow.targetFlags;
3009e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                BitSet32 pointerIds = touchedWindow.pointerIds;
3010e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
3011e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                mTouchState.windows.removeAt(i);
3012e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
301346e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown                int32_t newTargetFlags = oldTargetFlags
3014a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                        & (InputTarget::FLAG_FOREGROUND
3015a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                                | InputTarget::FLAG_SPLIT | InputTarget::FLAG_DISPATCH_AS_IS);
30169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mTouchState.addOrUpdateWindow(toWindowHandle, newTargetFlags, pointerIds);
3017e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
3018e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                found = true;
3019e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown                break;
3020e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            }
3021e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        }
3022e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
3023e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        if (! found) {
3024e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
30255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Focus transfer failed because from window did not have focus.");
3026e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
3027e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown            return false;
3028e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        }
3029e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
30309c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        ssize_t fromConnectionIndex = getConnectionIndexLocked(fromChannel);
30319c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        ssize_t toConnectionIndex = getConnectionIndexLocked(toChannel);
30329c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        if (fromConnectionIndex >= 0 && toConnectionIndex >= 0) {
3033cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            sp<Connection> fromConnection = mConnectionsByFd.valueAt(fromConnectionIndex);
3034cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            sp<Connection> toConnection = mConnectionsByFd.valueAt(toConnectionIndex);
30359c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown
30369c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown            fromConnection->inputState.copyPointerStateTo(toConnection->inputState);
3037da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS,
30389c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                    "transferring touch focus from this window to another window");
3039da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            synthesizeCancelationEventsForConnectionLocked(fromConnection, options);
30409c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        }
30419c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown
3042e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#if DEBUG_FOCUS
3043e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown        logDispatchStateLocked();
3044e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown#endif
3045e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    } // release lock
3046e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
3047e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    // Wake up poll loop since it may need to make new input dispatching choices.
3048e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    mLooper->wake();
3049e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown    return true;
3050e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown}
3051e65041225ec0bbc3d67a3b70cdc6d598a5760043Jeff Brown
3052120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brownvoid InputDispatcher::resetAndDropEverythingLocked(const char* reason) {
3053120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown#if DEBUG_FOCUS
30545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("Resetting and dropping all events (%s).", reason);
3055120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown#endif
3056120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
3057da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS, reason);
3058da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    synthesizeCancelationEventsForAllConnectionsLocked(options);
3059120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
3060120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    resetKeyRepeatLocked();
3061120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    releasePendingEventLocked();
3062120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    drainInboundQueueLocked();
3063e9bb9be9e46523ed901e38cfa83f4630f6496418Jeff Brown    resetANRTimeoutsLocked();
3064120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
3065120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown    mTouchState.reset();
30669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    mLastHoverWindowHandle.clear();
3067120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown}
3068120a4594855951ed5eb185fdfc19bf98efef3ba2Jeff Brown
3069b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::logDispatchStateLocked() {
3070b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    String8 dump;
3071b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    dumpDispatchStateLocked(dump);
30722a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown
30732a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown    char* text = dump.lockBuffer(dump.size());
30742a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown    char* start = text;
30752a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown    while (*start != '\0') {
30762a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown        char* end = strchr(start, '\n');
30772a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown        if (*end == '\n') {
30782a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown            *(end++) = '\0';
30792a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown        }
30805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("%s", start);
30812a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown        start = end;
30822a95c2a9ec703b9d19b750cb854fb4ec4899e205Jeff Brown    }
3083b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3084b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3085b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::dumpDispatchStateLocked(String8& dump) {
3086f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "DispatchEnabled: %d\n", mDispatchEnabled);
3087f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "DispatchFrozen: %d\n", mDispatchFrozen);
3088b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
30899302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (mFocusedApplicationHandle != NULL) {
3090f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.appendFormat(INDENT "FocusedApplication: name='%s', dispatchingTimeout=%0.3fms\n",
3091cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                mFocusedApplicationHandle->getName().string(),
3092cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                mFocusedApplicationHandle->getDispatchingTimeout(
3093cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        DEFAULT_INPUT_DISPATCHING_TIMEOUT) / 1000000.0);
3094b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
3095f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "FocusedApplication: <null>\n");
3096b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3097f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "FocusedWindow: name='%s'\n",
3098cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mFocusedWindowHandle != NULL ? mFocusedWindowHandle->getName().string() : "<null>");
3099f2f487183052865d50c004a835360be1728b5a52Jeff Brown
3100f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "TouchDown: %s\n", toString(mTouchState.down));
3101f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.appendFormat(INDENT "TouchSplit: %s\n", toString(mTouchState.split));
310295712850665492af670824abdba77f0944d984d1Jeff Brown    dump.appendFormat(INDENT "TouchDeviceId: %d\n", mTouchState.deviceId);
310358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    dump.appendFormat(INDENT "TouchSource: 0x%08x\n", mTouchState.source);
310483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    dump.appendFormat(INDENT "TouchDisplayId: %d\n", mTouchState.displayId);
3105f2f487183052865d50c004a835360be1728b5a52Jeff Brown    if (!mTouchState.windows.isEmpty()) {
3106f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "TouchedWindows:\n");
3107f2f487183052865d50c004a835360be1728b5a52Jeff Brown        for (size_t i = 0; i < mTouchState.windows.size(); i++) {
3108f2f487183052865d50c004a835360be1728b5a52Jeff Brown            const TouchedWindow& touchedWindow = mTouchState.windows[i];
3109f2f487183052865d50c004a835360be1728b5a52Jeff Brown            dump.appendFormat(INDENT2 "%d: name='%s', pointerIds=0x%0x, targetFlags=0x%x\n",
3110cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    i, touchedWindow.windowHandle->getName().string(),
3111cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    touchedWindow.pointerIds.value,
3112f2f487183052865d50c004a835360be1728b5a52Jeff Brown                    touchedWindow.targetFlags);
3113f2f487183052865d50c004a835360be1728b5a52Jeff Brown        }
3114f2f487183052865d50c004a835360be1728b5a52Jeff Brown    } else {
3115f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "TouchedWindows: <none>\n");
3116f2f487183052865d50c004a835360be1728b5a52Jeff Brown    }
3117f2f487183052865d50c004a835360be1728b5a52Jeff Brown
31189302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    if (!mWindowHandles.isEmpty()) {
3119f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "Windows:\n");
31209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        for (size_t i = 0; i < mWindowHandles.size(); i++) {
31219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
3122cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            const InputWindowInfo* windowInfo = windowHandle->getInfo();
3123cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
312483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            dump.appendFormat(INDENT2 "%d: name='%s', displayId=%d, "
312583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    "paused=%s, hasFocus=%s, hasWallpaper=%s, "
3126f2f487183052865d50c004a835360be1728b5a52Jeff Brown                    "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, "
3127e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    "frame=[%d,%d][%d,%d], scale=%f, "
3128fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    "touchableRegion=",
312983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    i, windowInfo->name.string(), windowInfo->displayId,
3130cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->paused),
3131cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->hasFocus),
3132cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->hasWallpaper),
3133cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->visible),
3134cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    toString(windowInfo->canReceiveKeys),
3135cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->layoutParamsFlags, windowInfo->layoutParamsType,
3136cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->layer,
3137cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->frameLeft, windowInfo->frameTop,
3138cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->frameRight, windowInfo->frameBottom,
3139cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->scaleFactor);
3140cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            dumpRegion(dump, windowInfo->touchableRegion);
3141cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            dump.appendFormat(", inputFeatures=0x%08x", windowInfo->inputFeatures);
3142fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            dump.appendFormat(", ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n",
3143cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->ownerPid, windowInfo->ownerUid,
3144cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    windowInfo->dispatchingTimeout / 1000000.0);
3145f2f487183052865d50c004a835360be1728b5a52Jeff Brown        }
3146f2f487183052865d50c004a835360be1728b5a52Jeff Brown    } else {
3147f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "Windows: <none>\n");
3148b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3149b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3150f2f487183052865d50c004a835360be1728b5a52Jeff Brown    if (!mMonitoringChannels.isEmpty()) {
3151f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "MonitoringChannels:\n");
3152f2f487183052865d50c004a835360be1728b5a52Jeff Brown        for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
3153f2f487183052865d50c004a835360be1728b5a52Jeff Brown            const sp<InputChannel>& channel = mMonitoringChannels[i];
3154f2f487183052865d50c004a835360be1728b5a52Jeff Brown            dump.appendFormat(INDENT2 "%d: '%s'\n", i, channel->getName().string());
3155f2f487183052865d50c004a835360be1728b5a52Jeff Brown        }
3156f2f487183052865d50c004a835360be1728b5a52Jeff Brown    } else {
3157f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "MonitoringChannels: <none>\n");
3158b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3159b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3160265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    nsecs_t currentTime = now();
3161265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
3162265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    if (!mInboundQueue.isEmpty()) {
3163265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        dump.appendFormat(INDENT "InboundQueue: length=%u\n", mInboundQueue.count());
3164265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        for (EventEntry* entry = mInboundQueue.head; entry; entry = entry->next) {
3165265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            dump.append(INDENT2);
3166265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            entry->appendDescription(dump);
316722aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown            dump.appendFormat(", age=%0.1fms\n",
3168265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    (currentTime - entry->eventTime) * 0.000001f);
3169265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        }
3170265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    } else {
3171265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        dump.append(INDENT "InboundQueue: <empty>\n");
3172265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    }
3173265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
3174265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    if (!mConnectionsByFd.isEmpty()) {
3175265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        dump.append(INDENT "Connections:\n");
3176265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        for (size_t i = 0; i < mConnectionsByFd.size(); i++) {
3177265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            const sp<Connection>& connection = mConnectionsByFd.valueAt(i);
3178265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            dump.appendFormat(INDENT2 "%d: channelName='%s', windowName='%s', "
3179265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    "status=%s, monitor=%s, inputPublisherBlocked=%s\n",
3180265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    i, connection->getInputChannelName(), connection->getWindowName(),
3181265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    connection->getStatusLabel(), toString(connection->monitor),
3182265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    toString(connection->inputPublisherBlocked));
3183265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
3184265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            if (!connection->outboundQueue.isEmpty()) {
3185265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                dump.appendFormat(INDENT3 "OutboundQueue: length=%u\n",
3186265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        connection->outboundQueue.count());
3187265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                for (DispatchEntry* entry = connection->outboundQueue.head; entry;
3188265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        entry = entry->next) {
3189265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    dump.append(INDENT4);
3190265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    entry->eventEntry->appendDescription(dump);
319122aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown                    dump.appendFormat(", targetFlags=0x%08x, resolvedAction=%d, age=%0.1fms\n",
3192265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            entry->targetFlags, entry->resolvedAction,
3193265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            (currentTime - entry->eventEntry->eventTime) * 0.000001f);
3194265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                }
3195265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            } else {
3196265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                dump.append(INDENT3 "OutboundQueue: <empty>\n");
3197265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            }
3198265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
3199265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            if (!connection->waitQueue.isEmpty()) {
3200265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                dump.appendFormat(INDENT3 "WaitQueue: length=%u\n",
3201265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        connection->waitQueue.count());
3202265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                for (DispatchEntry* entry = connection->waitQueue.head; entry;
3203265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                        entry = entry->next) {
3204265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    dump.append(INDENT4);
3205265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    entry->eventEntry->appendDescription(dump);
3206265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    dump.appendFormat(", targetFlags=0x%08x, resolvedAction=%d, "
320722aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown                            "age=%0.1fms, wait=%0.1fms\n",
3208265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            entry->targetFlags, entry->resolvedAction,
3209265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            (currentTime - entry->eventEntry->eventTime) * 0.000001f,
3210265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                            (currentTime - entry->deliveryTime) * 0.000001f);
3211265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                }
3212265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            } else {
3213265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                dump.append(INDENT3 "WaitQueue: <empty>\n");
3214265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            }
3215265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        }
3216265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    } else {
3217265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        dump.append(INDENT "Connections: <none>\n");
3218265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    }
3219519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3220b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    if (isAppSwitchPendingLocked()) {
322122aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown        dump.appendFormat(INDENT "AppSwitch: pending, due in %0.1fms\n",
3222b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown                (mAppSwitchDueTime - now()) / 1000000.0);
3223b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    } else {
3224f2f487183052865d50c004a835360be1728b5a52Jeff Brown        dump.append(INDENT "AppSwitch: not pending\n");
3225b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
322622aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown
322722aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    dump.append(INDENT "Configuration:\n");
322822aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    dump.appendFormat(INDENT2 "KeyRepeatDelay: %0.1fms\n",
322922aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown            mConfig.keyRepeatDelay * 0.000001f);
323022aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    dump.appendFormat(INDENT2 "KeyRepeatTimeout: %0.1fms\n",
323122aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown            mConfig.keyRepeatTimeout * 0.000001f);
3232b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3233b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3234928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatus_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChannel,
3235928e054931d357326613c78e62f4d850b7c442ffJeff Brown        const sp<InputWindowHandle>& inputWindowHandle, bool monitor) {
32369c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_REGISTRATION
32375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ registerInputChannel - monitor=%s", inputChannel->getName().string(),
3238b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            toString(monitor));
32399c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif
32409c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
324146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
324246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        AutoMutex _l(mLock);
324346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3244519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        if (getConnectionIndexLocked(inputChannel) >= 0) {
32458564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("Attempted to register already registered input channel '%s'",
324646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    inputChannel->getName().string());
324746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            return BAD_VALUE;
324846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
324946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3250cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        sp<Connection> connection = new Connection(inputChannel, inputWindowHandle, monitor);
325146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
325291e328984c0d1e0f95b3d37f779d9d4fa9bfe8f8Jeff Brown        int fd = inputChannel->getFd();
3253cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        mConnectionsByFd.add(fd, connection);
32549c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3255b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        if (monitor) {
3256b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown            mMonitoringChannels.push(inputChannel);
3257b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
3258b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3259cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        mLooper->addFd(fd, 0, ALOOPER_EVENT_INPUT, handleReceiveCallback, this);
326046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    } // release lock
3261074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown
3262074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown    // Wake the looper because some connections have changed.
3263074b8b7cf19d128f16e0de12bc2fc58e7438ec37Jeff Brown    mLooper->wake();
326446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return OK;
326546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
326646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
326746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatus_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputChannel) {
32689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#if DEBUG_REGISTRATION
32695baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("channel '%s' ~ unregisterInputChannel", inputChannel->getName().string());
32709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown#endif
32719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
327246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    { // acquire lock
327346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        AutoMutex _l(mLock);
327446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3275cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        status_t status = unregisterInputChannelLocked(inputChannel, false /*notify*/);
3276cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (status) {
3277cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            return status;
327846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
3279cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    } // release lock
328046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3281cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    // Wake the poll loop because removing the connection may have changed the current
3282cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    // synchronization state.
3283cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    mLooper->wake();
3284cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    return OK;
3285cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown}
328646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3287cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brownstatus_t InputDispatcher::unregisterInputChannelLocked(const sp<InputChannel>& inputChannel,
3288cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        bool notify) {
3289cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
3290cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (connectionIndex < 0) {
32918564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Attempted to unregister already unregistered input channel '%s'",
3292cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                inputChannel->getName().string());
3293cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        return BAD_VALUE;
3294cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
329546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3296cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
3297cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    mConnectionsByFd.removeItemsAt(connectionIndex);
3298b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3299cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    if (connection->monitor) {
3300cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        removeMonitorChannelLocked(inputChannel);
3301cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
33022cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown
3303cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    mLooper->removeFd(inputChannel->getFd());
33049c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3305cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    nsecs_t currentTime = now();
3306cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    abortBrokenDispatchCycleLocked(currentTime, connection, notify);
330746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3308cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    connection->status = Connection::STATUS_ZOMBIE;
330946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return OK;
331046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
331146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3312cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brownvoid InputDispatcher::removeMonitorChannelLocked(const sp<InputChannel>& inputChannel) {
3313cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    for (size_t i = 0; i < mMonitoringChannels.size(); i++) {
3314cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown         if (mMonitoringChannels[i] == inputChannel) {
3315cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown             mMonitoringChannels.removeAt(i);
3316cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown             break;
3317cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown         }
3318cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown    }
3319cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown}
3320cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
3321519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownssize_t InputDispatcher::getConnectionIndexLocked(const sp<InputChannel>& inputChannel) {
3322cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    ssize_t connectionIndex = mConnectionsByFd.indexOfKey(inputChannel->getFd());
33232cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown    if (connectionIndex >= 0) {
3324cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown        sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex);
33252cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown        if (connection->inputChannel.get() == inputChannel.get()) {
33262cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown            return connectionIndex;
33272cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown        }
33282cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown    }
33292cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown
33302cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown    return -1;
33312cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown}
33322cbecea4c9627d95377fc3e3b8a319116cee7febJeff Brown
33339c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid InputDispatcher::onDispatchCycleFinishedLocked(
3334072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        nsecs_t currentTime, const sp<Connection>& connection, uint32_t seq, bool handled) {
33353915bb845b032dc184dba5e60970b803390ca3edJeff Brown    CommandEntry* commandEntry = postCommandLocked(
33363915bb845b032dc184dba5e60970b803390ca3edJeff Brown            & InputDispatcher::doDispatchCycleFinishedLockedInterruptible);
33373915bb845b032dc184dba5e60970b803390ca3edJeff Brown    commandEntry->connection = connection;
3338265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    commandEntry->eventTime = currentTime;
3339072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    commandEntry->seq = seq;
33403915bb845b032dc184dba5e60970b803390ca3edJeff Brown    commandEntry->handled = handled;
334146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
334246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
33439c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid InputDispatcher::onDispatchCycleBrokenLocked(
33447fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        nsecs_t currentTime, const sp<Connection>& connection) {
33453762c311729fe9f3af085c14c5c1fb471d994c03Steve Block    ALOGE("channel '%s' ~ Channel is unrecoverably broken and will be disposed!",
334646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            connection->getInputChannelName());
334746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
33489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    CommandEntry* commandEntry = postCommandLocked(
33499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            & InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible);
33507fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    commandEntry->connection = connection;
335146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
335246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3353519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownvoid InputDispatcher::onANRLocked(
33549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        nsecs_t currentTime, const sp<InputApplicationHandle>& applicationHandle,
33559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        const sp<InputWindowHandle>& windowHandle,
3356265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        nsecs_t eventTime, nsecs_t waitStartTime, const char* reason) {
335722aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    float dispatchLatency = (currentTime - eventTime) * 0.000001f;
335822aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    float waitDuration = (currentTime - waitStartTime) * 0.000001f;
33596215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    ALOGI("Application is not responding: %s.  "
336022aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown            "It has been %0.1fms since event, %0.1fms since wait started.  Reason: %s",
33619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            getApplicationWindowLabelLocked(applicationHandle, windowHandle).string(),
336222aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown            dispatchLatency, waitDuration, reason);
336322aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown
336422aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    // Capture a record of the InputDispatcher state at the time of the ANR.
336522aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    time_t t = time(NULL);
336622aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    struct tm tm;
336722aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    localtime_r(&t, &tm);
336822aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    char timestr[64];
336922aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    strftime(timestr, sizeof(timestr), "%F %T", &tm);
337022aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    mLastANRState.clear();
337122aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    mLastANRState.append(INDENT "ANR:\n");
337222aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    mLastANRState.appendFormat(INDENT2 "Time: %s\n", timestr);
337322aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    mLastANRState.appendFormat(INDENT2 "Window: %s\n",
337422aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown            getApplicationWindowLabelLocked(applicationHandle, windowHandle).string());
337522aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    mLastANRState.appendFormat(INDENT2 "DispatchLatency: %0.1fms\n", dispatchLatency);
337622aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    mLastANRState.appendFormat(INDENT2 "WaitDuration: %0.1fms\n", waitDuration);
337722aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    mLastANRState.appendFormat(INDENT2 "Reason: %s\n", reason);
337822aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    dumpDispatchStateLocked(mLastANRState);
3379519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3380519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    CommandEntry* commandEntry = postCommandLocked(
3381519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown            & InputDispatcher::doNotifyANRLockedInterruptible);
33829302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    commandEntry->inputApplicationHandle = applicationHandle;
33839302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    commandEntry->inputWindowHandle = windowHandle;
3384519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown}
3385519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3386b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::doNotifyConfigurationChangedInterruptible(
3387b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        CommandEntry* commandEntry) {
3388b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.unlock();
3389b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3390b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mPolicy->notifyConfigurationChanged(commandEntry->eventTime);
3391b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3392b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.lock();
3393b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3394b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
33959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible(
33969c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        CommandEntry* commandEntry) {
33977fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    sp<Connection> connection = commandEntry->connection;
33989c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
33997fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    if (connection->status != Connection::STATUS_ZOMBIE) {
34007fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        mLock.unlock();
34019c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3402928e054931d357326613c78e62f4d850b7c442ffJeff Brown        mPolicy->notifyInputChannelBroken(connection->inputWindowHandle);
34037fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
34047fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        mLock.lock();
34057fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
34069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
34079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3408519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownvoid InputDispatcher::doNotifyANRLockedInterruptible(
34099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        CommandEntry* commandEntry) {
3410519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    mLock.unlock();
34119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3412519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    nsecs_t newTimeout = mPolicy->notifyANR(
3413928e054931d357326613c78e62f4d850b7c442ffJeff Brown            commandEntry->inputApplicationHandle, commandEntry->inputWindowHandle);
34149c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3415519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    mLock.lock();
34167fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
34179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    resumeAfterTargetsNotReadyTimeoutLocked(newTimeout,
34189302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            commandEntry->inputWindowHandle != NULL
3419cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    ? commandEntry->inputWindowHandle->getInputChannel() : NULL);
34209c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
34219c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3422b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible(
3423b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        CommandEntry* commandEntry) {
3424b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    KeyEntry* entry = commandEntry->keyEntry;
34251f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
34261f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    KeyEvent event;
34271f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    initializeKeyEvent(&event, entry);
3428b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3429b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.unlock();
3430b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3431905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    nsecs_t delay = mPolicy->interceptKeyBeforeDispatching(commandEntry->inputWindowHandle,
34321f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            &event, entry->policyFlags);
3433b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3434b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.lock();
3435b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3436905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    if (delay < 0) {
3437905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_SKIP;
3438905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    } else if (!delay) {
3439905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_CONTINUE;
3440905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    } else {
3441905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER;
3442905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        entry->interceptKeyWakeupTime = now() + delay;
3443905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    }
3444ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    entry->release();
3445b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3446b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
34473915bb845b032dc184dba5e60970b803390ca3edJeff Brownvoid InputDispatcher::doDispatchCycleFinishedLockedInterruptible(
34483915bb845b032dc184dba5e60970b803390ca3edJeff Brown        CommandEntry* commandEntry) {
34493915bb845b032dc184dba5e60970b803390ca3edJeff Brown    sp<Connection> connection = commandEntry->connection;
3450265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    nsecs_t finishTime = commandEntry->eventTime;
3451072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    uint32_t seq = commandEntry->seq;
34523915bb845b032dc184dba5e60970b803390ca3edJeff Brown    bool handled = commandEntry->handled;
34533915bb845b032dc184dba5e60970b803390ca3edJeff Brown
3454072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    // Handle post-event policy actions.
3455072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    DispatchEntry* dispatchEntry = connection->findWaitQueueEntry(seq);
3456072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    if (dispatchEntry) {
3457265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        nsecs_t eventDuration = finishTime - dispatchEntry->deliveryTime;
3458265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        if (eventDuration > SLOW_EVENT_PROCESSING_WARNING_TIMEOUT) {
3459265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            String8 msg;
346022aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown            msg.appendFormat("Window '%s' spent %0.1fms processing the last input event: ",
3461265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown                    connection->getWindowName(), eventDuration * 0.000001f);
3462265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            dispatchEntry->eventEntry->appendDescription(msg);
3463265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            ALOGI("%s", msg.string());
3464265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        }
3465265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
3466d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        bool restartEvent;
3467d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        if (dispatchEntry->eventEntry->type == EventEntry::TYPE_KEY) {
3468d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            KeyEntry* keyEntry = static_cast<KeyEntry*>(dispatchEntry->eventEntry);
3469d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            restartEvent = afterKeyEventLockedInterruptible(connection,
3470d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    dispatchEntry, keyEntry, handled);
3471d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        } else if (dispatchEntry->eventEntry->type == EventEntry::TYPE_MOTION) {
3472d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            MotionEntry* motionEntry = static_cast<MotionEntry*>(dispatchEntry->eventEntry);
3473d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            restartEvent = afterMotionEventLockedInterruptible(connection,
3474d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                    dispatchEntry, motionEntry, handled);
3475d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        } else {
3476d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            restartEvent = false;
3477d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        }
3478d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown
3479d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Dequeue the event and start the next cycle.
3480d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Note that because the lock might have been released, it is possible that the
3481d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // contents of the wait queue to have been drained, so we need to double-check
3482d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // a few things.
3483072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        if (dispatchEntry == connection->findWaitQueueEntry(seq)) {
3484072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            connection->waitQueue.dequeue(dispatchEntry);
3485481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            traceWaitQueueLengthLocked(connection);
3486d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            if (restartEvent && connection->status == Connection::STATUS_NORMAL) {
3487d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                connection->outboundQueue.enqueueAtHead(dispatchEntry);
3488481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                traceOutboundQueueLengthLocked(connection);
3489d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown            } else {
3490d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                releaseDispatchEntryLocked(dispatchEntry);
3491fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3492fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        }
3493da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3494d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        // Start the next dispatch cycle for this connection.
3495d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        startDispatchCycleLocked(now(), connection);
3496fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    }
3497fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown}
3498fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
3499fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brownbool InputDispatcher::afterKeyEventLockedInterruptible(const sp<Connection>& connection,
3500fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        DispatchEntry* dispatchEntry, KeyEntry* keyEntry, bool handled) {
3501fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    if (!(keyEntry->flags & AKEY_EVENT_FLAG_FALLBACK)) {
3502fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        // Get the fallback key state.
3503fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        // Clear it out after dispatching the UP.
3504fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        int32_t originalKeyCode = keyEntry->keyCode;
3505fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        int32_t fallbackKeyCode = connection->inputState.getFallbackKey(originalKeyCode);
3506fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        if (keyEntry->action == AKEY_EVENT_ACTION_UP) {
3507fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            connection->inputState.removeFallbackKey(originalKeyCode);
3508fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        }
3509fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
3510fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        if (handled || !dispatchEntry->hasForegroundTarget()) {
3511fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // If the application handles the original key for which we previously
3512fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // generated a fallback or if the window is not a foreground window,
3513fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // then cancel the associated fallback key, if any.
3514fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (fallbackKeyCode != -1) {
3515fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                // Dispatch the unhandled key to the policy with the cancel flag.
3516fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
3517fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                ALOGD("Unhandled key event: Asking policy to cancel fallback action.  "
3518fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        "keyCode=%d, action=%d, repeatCount=%d, policyFlags=0x%08x",
3519fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        keyEntry->keyCode, keyEntry->action, keyEntry->repeatCount,
3520fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        keyEntry->policyFlags);
3521fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown#endif
3522fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                KeyEvent event;
3523fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                initializeKeyEvent(&event, keyEntry);
3524fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                event.setFlags(event.getFlags() | AKEY_EVENT_FLAG_CANCELED);
3525fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown
3526fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                mLock.unlock();
3527fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown
3528fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                mPolicy->dispatchUnhandledKey(connection->inputWindowHandle,
3529fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        &event, keyEntry->policyFlags, &event);
3530fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown
3531fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                mLock.lock();
3532fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown
3533fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                // Cancel the fallback key.
3534fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                if (fallbackKeyCode != AKEYCODE_UNKNOWN) {
3535fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    CancelationOptions options(CancelationOptions::CANCEL_FALLBACK_EVENTS,
3536fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "application handled the original non-fallback key "
3537fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "or is no longer a foreground target, "
3538fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "canceling previously dispatched fallback key");
3539fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    options.keyCode = fallbackKeyCode;
3540fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    synthesizeCancelationEventsForConnectionLocked(connection, options);
3541fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
3542fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                connection->inputState.removeFallbackKey(originalKeyCode);
3543fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3544fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        } else {
3545fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // If the application did not handle a non-fallback key, first check
3546fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // that we are in a good state to perform unhandled key event processing
3547fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // Then ask the policy what to do with it.
3548fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            bool initialDown = keyEntry->action == AKEY_EVENT_ACTION_DOWN
3549fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    && keyEntry->repeatCount == 0;
3550fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (fallbackKeyCode == -1 && !initialDown) {
3551bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
35525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Unhandled key event: Skipping unhandled key event processing "
3553fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        "since this is not an initial down.  "
3554fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        "keyCode=%d, action=%d, repeatCount=%d, policyFlags=0x%08x",
3555fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        originalKeyCode, keyEntry->action, keyEntry->repeatCount,
3556fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        keyEntry->policyFlags);
3557bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#endif
3558fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                return false;
3559fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3560bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown
3561fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // Dispatch the unhandled key to the policy.
3562bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
35635baa3a62a97544669fba6d65a11c07f252e654ddSteve Block            ALOGD("Unhandled key event: Asking policy to perform fallback action.  "
3564fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                    "keyCode=%d, action=%d, repeatCount=%d, policyFlags=0x%08x",
3565fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                    keyEntry->keyCode, keyEntry->action, keyEntry->repeatCount,
3566fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                    keyEntry->policyFlags);
3567bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#endif
3568fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            KeyEvent event;
3569fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            initializeKeyEvent(&event, keyEntry);
357049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3571fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            mLock.unlock();
357249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3573fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            bool fallback = mPolicy->dispatchUnhandledKey(connection->inputWindowHandle,
3574fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    &event, keyEntry->policyFlags, &event);
357549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3576fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            mLock.lock();
357749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3578fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (connection->status != Connection::STATUS_NORMAL) {
3579fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                connection->inputState.removeFallbackKey(originalKeyCode);
3580d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                return false;
3581fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
358200045a7e6fbed88f3325d2bbb048dc96a082078cJeff Brown
3583fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // Latch the fallback keycode for this key on an initial down.
3584fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // The fallback keycode cannot change at any other point in the lifecycle.
3585fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (initialDown) {
3586fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                if (fallback) {
3587fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    fallbackKeyCode = event.getKeyCode();
3588fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                } else {
3589fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    fallbackKeyCode = AKEYCODE_UNKNOWN;
3590fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
3591fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                connection->inputState.setFallbackKey(originalKeyCode, fallbackKeyCode);
3592fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3593da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3594ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block            ALOG_ASSERT(fallbackKeyCode != -1);
3595da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3596fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // Cancel the fallback key if the policy decides not to send it anymore.
3597fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // We will continue to dispatch the key to the policy but we will no
3598fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            // longer dispatch a fallback key to the application.
3599fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (fallbackKeyCode != AKEYCODE_UNKNOWN
3600fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    && (!fallback || fallbackKeyCode != event.getKeyCode())) {
3601da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
3602fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                if (fallback) {
36035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                    ALOGD("Unhandled key event: Policy requested to send key %d"
3604fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "as a fallback for %d, but on the DOWN it had requested "
3605fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "to send %d instead.  Fallback canceled.",
3606fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            event.getKeyCode(), originalKeyCode, fallbackKeyCode);
3607fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                } else {
3608fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                    ALOGD("Unhandled key event: Policy did not request fallback for %d, "
3609fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "but on the DOWN it had requested to send %d.  "
3610fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            "Fallback canceled.",
3611fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            originalKeyCode, fallbackKeyCode);
3612fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
3613da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#endif
3614da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3615fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                CancelationOptions options(CancelationOptions::CANCEL_FALLBACK_EVENTS,
3616fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        "canceling fallback, policy no longer desires it");
3617fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                options.keyCode = fallbackKeyCode;
3618fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                synthesizeCancelationEventsForConnectionLocked(connection, options);
3619da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3620fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                fallback = false;
3621fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                fallbackKeyCode = AKEYCODE_UNKNOWN;
3622fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                if (keyEntry->action != AKEY_EVENT_ACTION_UP) {
3623fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    connection->inputState.setFallbackKey(originalKeyCode,
3624fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            fallbackKeyCode);
3625fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
3626fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3627da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3628da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
3629fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            {
3630fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                String8 msg;
3631fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                const KeyedVector<int32_t, int32_t>& fallbackKeys =
3632fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        connection->inputState.getFallbackKeys();
3633fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                for (size_t i = 0; i < fallbackKeys.size(); i++) {
3634fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    msg.appendFormat(", %d->%d", fallbackKeys.keyAt(i),
3635fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                            fallbackKeys.valueAt(i));
3636fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                }
36375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Unhandled key event: %d currently tracked fallback keys%s.",
3638fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        fallbackKeys.size(), msg.string());
3639fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            }
3640da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#endif
3641da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
3642fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            if (fallback) {
3643fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                // Restart the dispatch cycle using the fallback key.
3644fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->eventTime = event.getEventTime();
3645fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->deviceId = event.getDeviceId();
3646fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->source = event.getSource();
3647fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->flags = event.getFlags() | AKEY_EVENT_FLAG_FALLBACK;
3648fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->keyCode = fallbackKeyCode;
3649fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->scanCode = event.getScanCode();
3650fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->metaState = event.getMetaState();
3651fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->repeatCount = event.getRepeatCount();
3652fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->downTime = event.getDownTime();
3653fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                keyEntry->syntheticRepeat = false;
365449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
3655bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
36565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Unhandled key event: Dispatching fallback key.  "
3657fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        "originalKeyCode=%d, fallbackKeyCode=%d, fallbackMetaState=%08x",
3658fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                        originalKeyCode, fallbackKeyCode, keyEntry->metaState);
3659bfaf3b91709ef35e0d5901b186edd7c2a9729161Jeff Brown#endif
3660d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown                return true; // restart the event
3661fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            } else {
3662da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
36635baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Unhandled key event: No fallback key.");
3664da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown#endif
366549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            }
36663915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
36673915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
3668fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    return false;
3669fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown}
36703915bb845b032dc184dba5e60970b803390ca3edJeff Brown
3671fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brownbool InputDispatcher::afterMotionEventLockedInterruptible(const sp<Connection>& connection,
3672fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        DispatchEntry* dispatchEntry, MotionEntry* motionEntry, bool handled) {
3673fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    return false;
36743915bb845b032dc184dba5e60970b803390ca3edJeff Brown}
36753915bb845b032dc184dba5e60970b803390ca3edJeff Brown
3676b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::doPokeUserActivityLockedInterruptible(CommandEntry* commandEntry) {
3677b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.unlock();
3678b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
367901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    mPolicy->pokeUserActivity(commandEntry->eventTime, commandEntry->userActivityEventType);
3680b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3681b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mLock.lock();
3682b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3683b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
36843915bb845b032dc184dba5e60970b803390ca3edJeff Brownvoid InputDispatcher::initializeKeyEvent(KeyEvent* event, const KeyEntry* entry) {
36853915bb845b032dc184dba5e60970b803390ca3edJeff Brown    event->initialize(entry->deviceId, entry->source, entry->action, entry->flags,
36863915bb845b032dc184dba5e60970b803390ca3edJeff Brown            entry->keyCode, entry->scanCode, entry->metaState, entry->repeatCount,
36873915bb845b032dc184dba5e60970b803390ca3edJeff Brown            entry->downTime, entry->eventTime);
36883915bb845b032dc184dba5e60970b803390ca3edJeff Brown}
36893915bb845b032dc184dba5e60970b803390ca3edJeff Brown
3690519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownvoid InputDispatcher::updateDispatchStatisticsLocked(nsecs_t currentTime, const EventEntry* entry,
3691519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        int32_t injectionResult, nsecs_t timeSpentWaitingForApplication) {
3692519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    // TODO Write some statistics about how long we spend waiting.
3693b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3694b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3695481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownvoid InputDispatcher::traceInboundQueueLengthLocked() {
3696481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (ATRACE_ENABLED()) {
3697481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        ATRACE_INT("iq", mInboundQueue.count());
3698481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
3699481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown}
3700481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
3701481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownvoid InputDispatcher::traceOutboundQueueLengthLocked(const sp<Connection>& connection) {
3702481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (ATRACE_ENABLED()) {
3703481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        char counterName[40];
3704481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        snprintf(counterName, sizeof(counterName), "oq:%s", connection->getWindowName());
3705481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        ATRACE_INT(counterName, connection->outboundQueue.count());
3706481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
3707481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown}
3708481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
3709481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownvoid InputDispatcher::traceWaitQueueLengthLocked(const sp<Connection>& connection) {
3710481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (ATRACE_ENABLED()) {
3711481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        char counterName[40];
3712481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        snprintf(counterName, sizeof(counterName), "wq:%s", connection->getWindowName());
3713481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        ATRACE_INT(counterName, connection->waitQueue.count());
3714481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
3715481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown}
3716481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
3717b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::dump(String8& dump) {
371889ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    AutoMutex _l(mLock);
371989ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown
3720f2f487183052865d50c004a835360be1728b5a52Jeff Brown    dump.append("Input Dispatcher State:\n");
3721b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    dumpDispatchStateLocked(dump);
3722214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
372322aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    if (!mLastANRState.isEmpty()) {
372422aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown        dump.append("\nInput Dispatcher State at time of last ANR:\n");
372522aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown        dump.append(mLastANRState);
372622aa51202652efbd55094217a046b8e5ecb7afe2Jeff Brown    }
3727b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3728b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
372989ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brownvoid InputDispatcher::monitor() {
373089ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    // Acquire and release the lock to ensure that the dispatcher has not deadlocked.
373189ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    mLock.lock();
3732112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown    mLooper->wake();
3733112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown    mDispatcherIsAliveCondition.wait(mLock);
373489ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    mLock.unlock();
373589ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown}
373689ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown
37379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3738519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown// --- InputDispatcher::Queue ---
3739519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3740519e024d1e682ca458cc2dab743589a12992c0e1Jeff Browntemplate <typename T>
3741519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brownuint32_t InputDispatcher::Queue<T>::count() const {
3742519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    uint32_t result = 0;
3743ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    for (const T* entry = head; entry; entry = entry->next) {
3744519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown        result += 1;
3745519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    }
3746519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown    return result;
3747519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown}
3748519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3749519e024d1e682ca458cc2dab743589a12992c0e1Jeff Brown
3750ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::InjectionState ---
375146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3752ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::InjectionState::InjectionState(int32_t injectorPid, int32_t injectorUid) :
3753ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        refCount(1),
3754ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectorPid(injectorPid), injectorUid(injectorUid),
3755ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionResult(INPUT_EVENT_INJECTION_PENDING), injectionIsAsync(false),
3756ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        pendingForegroundDispatches(0) {
375746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
375846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3759ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::InjectionState::~InjectionState() {
376001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
376101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
3762ac386073df2514b79a2ca169f4a89f129733002fJeff Brownvoid InputDispatcher::InjectionState::release() {
3763ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    refCount -= 1;
3764ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    if (refCount == 0) {
3765ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        delete this;
3766ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    } else {
3767ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(refCount > 0);
376801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
37697fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}
37707fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
377146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3772ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::EventEntry ---
377346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3774ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::EventEntry::EventEntry(int32_t type, nsecs_t eventTime, uint32_t policyFlags) :
3775ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        refCount(1), type(type), eventTime(eventTime), policyFlags(policyFlags),
3776ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionState(NULL), dispatchInProgress(false) {
377746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
377846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3779ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::EventEntry::~EventEntry() {
3780ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    releaseInjectionState();
378146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
378246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3783ac386073df2514b79a2ca169f4a89f129733002fJeff Brownvoid InputDispatcher::EventEntry::release() {
3784ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    refCount -= 1;
3785ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    if (refCount == 0) {
3786ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        delete this;
378701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    } else {
3788ec193dec4d9ca2cfc8295c4becfe950a906a15edSteve Block        ALOG_ASSERT(refCount > 0);
378901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
379001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
379101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
3792ac386073df2514b79a2ca169f4a89f129733002fJeff Brownvoid InputDispatcher::EventEntry::releaseInjectionState() {
3793ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    if (injectionState) {
3794ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionState->release();
3795ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        injectionState = NULL;
379646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
379746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
379846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
379946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3800ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::ConfigurationChangedEntry ---
380146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3802ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::ConfigurationChangedEntry::ConfigurationChangedEntry(nsecs_t eventTime) :
3803ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        EventEntry(TYPE_CONFIGURATION_CHANGED, eventTime, 0) {
380446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
380546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3806ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::ConfigurationChangedEntry::~ConfigurationChangedEntry() {
3807a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown}
3808a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown
3809265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brownvoid InputDispatcher::ConfigurationChangedEntry::appendDescription(String8& msg) const {
3810265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    msg.append("ConfigurationChangedEvent()");
3811265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown}
3812265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
3813ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
381465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown// --- InputDispatcher::DeviceResetEntry ---
381565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
381665fd251c3913fc921468a3dad190810db19eb9dfJeff BrownInputDispatcher::DeviceResetEntry::DeviceResetEntry(nsecs_t eventTime, int32_t deviceId) :
381765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        EventEntry(TYPE_DEVICE_RESET, eventTime, 0),
381865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        deviceId(deviceId) {
381965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
382065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
382165fd251c3913fc921468a3dad190810db19eb9dfJeff BrownInputDispatcher::DeviceResetEntry::~DeviceResetEntry() {
382265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
382365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
3824265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brownvoid InputDispatcher::DeviceResetEntry::appendDescription(String8& msg) const {
3825265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    msg.appendFormat("DeviceResetEvent(deviceId=%d)", deviceId);
3826265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown}
3827265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
382865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
3829ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::KeyEntry ---
3830ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3831ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::KeyEntry::KeyEntry(nsecs_t eventTime,
3832ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action,
3833ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t flags, int32_t keyCode, int32_t scanCode, int32_t metaState,
3834ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t repeatCount, nsecs_t downTime) :
3835ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        EventEntry(TYPE_KEY, eventTime, policyFlags),
3836ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        deviceId(deviceId), source(source), action(action), flags(flags),
3837ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        keyCode(keyCode), scanCode(scanCode), metaState(metaState),
3838ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        repeatCount(repeatCount), downTime(downTime),
3839905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        syntheticRepeat(false), interceptKeyResult(KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN),
3840905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        interceptKeyWakeupTime(0) {
384146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
384246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3843ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::KeyEntry::~KeyEntry() {
38449c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
38459c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3846265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brownvoid InputDispatcher::KeyEntry::appendDescription(String8& msg) const {
3847265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown    msg.appendFormat("KeyEvent(action=%d, deviceId=%d, source=0x%08x)",
3848265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown            action, deviceId, source);
3849265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown}
3850265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
3851ac386073df2514b79a2ca169f4a89f129733002fJeff Brownvoid InputDispatcher::KeyEntry::recycle() {
3852ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    releaseInjectionState();
385346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3854ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    dispatchInProgress = false;
3855ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    syntheticRepeat = false;
3856ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
3857905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    interceptKeyWakeupTime = 0;
385846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
385946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3860b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3861ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown// --- InputDispatcher::MotionEntry ---
3862ae9fc03bdccda709101291bbcd3beaa5b6daebfcJeff Brown
3863ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::MotionEntry::MotionEntry(nsecs_t eventTime,
3864ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action, int32_t flags,
3865ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t metaState, int32_t buttonState,
3866ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t edgeFlags, float xPrecision, float yPrecision,
386783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        nsecs_t downTime, int32_t displayId, uint32_t pointerCount,
3868ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        const PointerProperties* pointerProperties, const PointerCoords* pointerCoords) :
3869ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        EventEntry(TYPE_MOTION, eventTime, policyFlags),
38703241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        eventTime(eventTime),
3871ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        deviceId(deviceId), source(source), action(action), flags(flags),
3872ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        metaState(metaState), buttonState(buttonState), edgeFlags(edgeFlags),
3873ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        xPrecision(xPrecision), yPrecision(yPrecision),
387483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        downTime(downTime), displayId(displayId), pointerCount(pointerCount) {
3875ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    for (uint32_t i = 0; i < pointerCount; i++) {
3876ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        this->pointerProperties[i].copyFrom(pointerProperties[i]);
38773241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        this->pointerCoords[i].copyFrom(pointerCoords[i]);
3878ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    }
3879ac386073df2514b79a2ca169f4a89f129733002fJeff Brown}
3880ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3881ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::MotionEntry::~MotionEntry() {
3882ac386073df2514b79a2ca169f4a89f129733002fJeff Brown}
3883ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3884265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brownvoid InputDispatcher::MotionEntry::appendDescription(String8& msg) const {
388583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    msg.appendFormat("MotionEvent(action=%d, deviceId=%d, source=0x%08x, displayId=%d)",
388683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            action, deviceId, source, displayId);
3887265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown}
3888265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown
3889ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3890ac386073df2514b79a2ca169f4a89f129733002fJeff Brown// --- InputDispatcher::DispatchEntry ---
3891ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3892072ec96a4900d4616574733646ee46311cb5d2cbJeff Brownvolatile int32_t InputDispatcher::DispatchEntry::sNextSeqAtomic;
3893072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
3894ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::DispatchEntry::DispatchEntry(EventEntry* eventEntry,
3895ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        int32_t targetFlags, float xOffset, float yOffset, float scaleFactor) :
3896072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        seq(nextSeq()),
3897ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        eventEntry(eventEntry), targetFlags(targetFlags),
3898ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        xOffset(xOffset), yOffset(yOffset), scaleFactor(scaleFactor),
3899265f1ccc5128319d81eee70ee2d2ae81573efb11Jeff Brown        deliveryTime(0), resolvedAction(0), resolvedFlags(0) {
3900ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    eventEntry->refCount += 1;
3901ac386073df2514b79a2ca169f4a89f129733002fJeff Brown}
3902ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3903ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::DispatchEntry::~DispatchEntry() {
3904ac386073df2514b79a2ca169f4a89f129733002fJeff Brown    eventEntry->release();
3905ac386073df2514b79a2ca169f4a89f129733002fJeff Brown}
3906ac386073df2514b79a2ca169f4a89f129733002fJeff Brown
3907072ec96a4900d4616574733646ee46311cb5d2cbJeff Brownuint32_t InputDispatcher::DispatchEntry::nextSeq() {
3908072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    // Sequence number 0 is reserved and will never be returned.
3909072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    uint32_t seq;
3910072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    do {
3911072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        seq = android_atomic_inc(&sNextSeqAtomic);
3912072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    } while (!seq);
3913072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    return seq;
3914072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown}
3915072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
3916b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3917b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown// --- InputDispatcher::InputState ---
3918b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3919b699726018a0049665d8ad6b90dbc5af0e18f135Jeff BrownInputDispatcher::InputState::InputState() {
3920b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3921b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3922b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff BrownInputDispatcher::InputState::~InputState() {
3923b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3924b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
3925b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownbool InputDispatcher::InputState::isNeutral() const {
3926b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return mKeyMementos.isEmpty() && mMotionMementos.isEmpty();
3927b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3928b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
392983d616a9c7b9505153d258511eb5c16b552e268dJeff Brownbool InputDispatcher::InputState::isHovering(int32_t deviceId, uint32_t source,
393083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        int32_t displayId) const {
39318134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mMotionMementos.size(); i++) {
39328134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        const MotionMemento& memento = mMotionMementos.itemAt(i);
39338134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (memento.deviceId == deviceId
39348134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.source == source
393583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                && memento.displayId == displayId
39368134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.hovering) {
39378134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
39388134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
3939b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
39408134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    return false;
3941b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3942b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
39438134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownbool InputDispatcher::InputState::trackKey(const KeyEntry* entry,
39448134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        int32_t action, int32_t flags) {
39458134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    switch (action) {
39468134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AKEY_EVENT_ACTION_UP: {
39478134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (entry->flags & AKEY_EVENT_FLAG_FALLBACK) {
39488134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            for (size_t i = 0; i < mFallbackKeys.size(); ) {
39498134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                if (mFallbackKeys.valueAt(i) == entry->keyCode) {
39508134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    mFallbackKeys.removeItemsAt(i);
39518134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                } else {
39528134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    i += 1;
39538134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                }
3954da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown            }
3955da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        }
39568134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findKeyMemento(entry);
39578134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
39588134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mKeyMementos.removeAt(index);
39598134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
39608134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
396168b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        /* FIXME: We can't just drop the key up event because that prevents creating
396268b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * popup windows that are automatically shown when a key is held and then
396368b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * dismissed when the key is released.  The problem is that the popup will
396468b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * not have received the original key down, so the key up will be considered
396568b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * to be inconsistent with its observed state.  We could perhaps handle this
396668b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * by synthesizing a key down but that will cause other problems.
396768b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         *
396868b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         * So for now, allow inconsistent key up events to be dispatched.
396968b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown         *
39708134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
39715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropping inconsistent key up event: deviceId=%d, source=%08x, "
39728134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "keyCode=%d, scanCode=%d",
39738134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                entry->deviceId, entry->source, entry->keyCode, entry->scanCode);
39748134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
39758134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return false;
397668b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        */
397768b909d8acd92343fa0b1dff2f77fcd9d9991f9fJeff Brown        return true;
3978da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
3979da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
39808134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AKEY_EVENT_ACTION_DOWN: {
39818134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findKeyMemento(entry);
39828134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
39838134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mKeyMementos.removeAt(index);
3984b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
39858134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        addKeyMemento(entry, flags);
39868134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
3987b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3988b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
39898134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    default:
39908134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
3991b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
3992b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
3993b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
39948134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownbool InputDispatcher::InputState::trackMotion(const MotionEntry* entry,
39958134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        int32_t action, int32_t flags) {
3996a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    int32_t actionMasked = action & AMOTION_EVENT_ACTION_MASK;
39978134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    switch (actionMasked) {
39988134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_UP:
39998134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_CANCEL: {
40008134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, false /*hovering*/);
40018134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
40028134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mMotionMementos.removeAt(index);
40038134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
40048134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
40058134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
40065baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropping inconsistent motion up or cancel event: deviceId=%d, source=%08x, "
40078134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "actionMasked=%d",
40088134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                entry->deviceId, entry->source, actionMasked);
40098134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
40108134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return false;
40118134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
4012b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
40138134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_DOWN: {
40148134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, false /*hovering*/);
40158134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
40168134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mMotionMementos.removeAt(index);
40178134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
40188134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        addMotionMemento(entry, flags, false /*hovering*/);
40198134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
40208134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
4021b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
40228134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_POINTER_UP:
40238134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_POINTER_DOWN:
40248134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_MOVE: {
40258134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, false /*hovering*/);
40268134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
40278134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            MotionMemento& memento = mMotionMementos.editItemAt(index);
40288134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            memento.setPointers(entry);
40298134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
40308134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
40312e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown        if (actionMasked == AMOTION_EVENT_ACTION_MOVE
40322e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown                && (entry->source & (AINPUT_SOURCE_CLASS_JOYSTICK
40332e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown                        | AINPUT_SOURCE_CLASS_NAVIGATION))) {
40342e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown            // Joysticks and trackballs can send MOVE events without corresponding DOWN or UP.
40352e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown            return true;
40362e45fb6f951d0e0c68d4211fe68108d2230814bcJeff Brown        }
40378134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
40385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropping inconsistent motion pointer up/down or move event: "
40398134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                "deviceId=%d, source=%08x, actionMasked=%d",
40408134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                entry->deviceId, entry->source, actionMasked);
40418134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
40428134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return false;
40438134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
4044b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
40458134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_HOVER_EXIT: {
40468134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, true /*hovering*/);
40478134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
40488134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mMotionMementos.removeAt(index);
40498134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return true;
4050b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        }
40518134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#if DEBUG_OUTBOUND_EVENT_DETAILS
40525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Dropping inconsistent motion hover exit event: deviceId=%d, source=%08x",
40538134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                entry->deviceId, entry->source);
40548134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown#endif
40558134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return false;
4056b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
4057b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
4058a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown    case AMOTION_EVENT_ACTION_HOVER_ENTER:
40598134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    case AMOTION_EVENT_ACTION_HOVER_MOVE: {
40608134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        ssize_t index = findMotionMemento(entry, true /*hovering*/);
40618134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (index >= 0) {
40628134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            mMotionMementos.removeAt(index);
40638134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
40648134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        addMotionMemento(entry, flags, true /*hovering*/);
40658134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
40668134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
40678134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
40688134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    default:
40698134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        return true;
40708134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
40718134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown}
40728134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
40738134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownssize_t InputDispatcher::InputState::findKeyMemento(const KeyEntry* entry) const {
40748134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mKeyMementos.size(); i++) {
40758134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        const KeyMemento& memento = mKeyMementos.itemAt(i);
40768134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (memento.deviceId == entry->deviceId
40778134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.source == entry->source
40788134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.keyCode == entry->keyCode
40798134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.scanCode == entry->scanCode) {
40808134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return i;
40818134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
4082b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
40838134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    return -1;
40848134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown}
40858134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
40868134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownssize_t InputDispatcher::InputState::findMotionMemento(const MotionEntry* entry,
40878134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        bool hovering) const {
40888134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mMotionMementos.size(); i++) {
40898134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        const MotionMemento& memento = mMotionMementos.itemAt(i);
40908134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        if (memento.deviceId == entry->deviceId
40918134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.source == entry->source
409283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                && memento.displayId == entry->displayId
40938134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                && memento.hovering == hovering) {
40948134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown            return i;
40958134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        }
40968134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    }
40978134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    return -1;
40988134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown}
40998134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
41008134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownvoid InputDispatcher::InputState::addKeyMemento(const KeyEntry* entry, int32_t flags) {
41018134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    mKeyMementos.push();
41028134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    KeyMemento& memento = mKeyMementos.editTop();
41038134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.deviceId = entry->deviceId;
41048134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.source = entry->source;
41058134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.keyCode = entry->keyCode;
41068134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.scanCode = entry->scanCode;
4107fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown    memento.metaState = entry->metaState;
41088134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.flags = flags;
41098134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.downTime = entry->downTime;
4110fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown    memento.policyFlags = entry->policyFlags;
41118134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown}
41128134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown
41138134681b25dfff814ffeaad8ff70e84316c1869fJeff Brownvoid InputDispatcher::InputState::addMotionMemento(const MotionEntry* entry,
41148134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown        int32_t flags, bool hovering) {
41158134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    mMotionMementos.push();
41168134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    MotionMemento& memento = mMotionMementos.editTop();
41178134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.deviceId = entry->deviceId;
41188134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.source = entry->source;
41198134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.flags = flags;
41208134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.xPrecision = entry->xPrecision;
41218134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.yPrecision = entry->yPrecision;
41228134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.downTime = entry->downTime;
412383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    memento.displayId = entry->displayId;
41248134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.setPointers(entry);
41258134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    memento.hovering = hovering;
4126fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown    memento.policyFlags = entry->policyFlags;
4127b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
4128b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
4129b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::InputState::MotionMemento::setPointers(const MotionEntry* entry) {
4130b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    pointerCount = entry->pointerCount;
4131b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    for (uint32_t i = 0; i < entry->pointerCount; i++) {
4132fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        pointerProperties[i].copyFrom(entry->pointerProperties[i]);
41333241b6b7bd7eff64f0118ba2d636030e505a98f9Jeff Brown        pointerCoords[i].copyFrom(entry->pointerCoords[i]);
4134b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
4135b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
4136b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
4137b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brownvoid InputDispatcher::InputState::synthesizeCancelationEvents(nsecs_t currentTime,
4138ac386073df2514b79a2ca169f4a89f129733002fJeff Brown        Vector<EventEntry*>& outEvents, const CancelationOptions& options) {
41398134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mKeyMementos.size(); i++) {
4140b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        const KeyMemento& memento = mKeyMementos.itemAt(i);
414149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        if (shouldCancelKey(memento, options)) {
4142ac386073df2514b79a2ca169f4a89f129733002fJeff Brown            outEvents.push(new KeyEntry(currentTime,
4143fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                    memento.deviceId, memento.source, memento.policyFlags,
414449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                    AKEY_EVENT_ACTION_UP, memento.flags | AKEY_EVENT_FLAG_CANCELED,
4145fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                    memento.keyCode, memento.scanCode, memento.metaState, 0, memento.downTime));
4146b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
4147b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
4148b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
41498134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown    for (size_t i = 0; i < mMotionMementos.size(); i++) {
4150b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown        const MotionMemento& memento = mMotionMementos.itemAt(i);
415149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        if (shouldCancelMotion(memento, options)) {
4152ac386073df2514b79a2ca169f4a89f129733002fJeff Brown            outEvents.push(new MotionEntry(currentTime,
4153fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                    memento.deviceId, memento.source, memento.policyFlags,
4154a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                    memento.hovering
4155a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                            ? AMOTION_EVENT_ACTION_HOVER_EXIT
4156a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown                            : AMOTION_EVENT_ACTION_CANCEL,
41578134681b25dfff814ffeaad8ff70e84316c1869fJeff Brown                    memento.flags, 0, 0, 0,
4158b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown                    memento.xPrecision, memento.yPrecision, memento.downTime,
415983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    memento.displayId,
4160fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown                    memento.pointerCount, memento.pointerProperties, memento.pointerCoords));
4161b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        }
4162b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    }
4163b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
4164b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
4165b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownvoid InputDispatcher::InputState::clear() {
4166b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mKeyMementos.clear();
4167b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    mMotionMementos.clear();
4168da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    mFallbackKeys.clear();
4169b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown}
4170b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
41719c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brownvoid InputDispatcher::InputState::copyPointerStateTo(InputState& other) const {
41729c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown    for (size_t i = 0; i < mMotionMementos.size(); i++) {
41739c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        const MotionMemento& memento = mMotionMementos.itemAt(i);
41749c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        if (memento.source & AINPUT_SOURCE_CLASS_POINTER) {
41759c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown            for (size_t j = 0; j < other.mMotionMementos.size(); ) {
41769c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                const MotionMemento& otherMemento = other.mMotionMementos.itemAt(j);
41779c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                if (memento.deviceId == otherMemento.deviceId
417883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                        && memento.source == otherMemento.source
417983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                        && memento.displayId == otherMemento.displayId) {
41809c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                    other.mMotionMementos.removeAt(j);
41819c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                } else {
41829c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                    j += 1;
41839c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown                }
41849c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown            }
41859c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown            other.mMotionMementos.push(memento);
41869c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown        }
41879c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown    }
41889c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown}
41899c9f1a3ba1bc19754e4d38cb27a537d4dfedc0feJeff Brown
4190da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brownint32_t InputDispatcher::InputState::getFallbackKey(int32_t originalKeyCode) {
4191da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    ssize_t index = mFallbackKeys.indexOfKey(originalKeyCode);
4192da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    return index >= 0 ? mFallbackKeys.valueAt(index) : -1;
4193da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown}
4194da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
4195da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brownvoid InputDispatcher::InputState::setFallbackKey(int32_t originalKeyCode,
4196da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        int32_t fallbackKeyCode) {
4197da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    ssize_t index = mFallbackKeys.indexOfKey(originalKeyCode);
4198da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    if (index >= 0) {
4199da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        mFallbackKeys.replaceValueAt(index, fallbackKeyCode);
4200da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    } else {
4201da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        mFallbackKeys.add(originalKeyCode, fallbackKeyCode);
4202da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
4203da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown}
4204da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
4205da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brownvoid InputDispatcher::InputState::removeFallbackKey(int32_t originalKeyCode) {
4206da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    mFallbackKeys.removeItem(originalKeyCode);
4207da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown}
4208da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
420949ed71db425c5054e3ad9526496a7e116c89556bJeff Brownbool InputDispatcher::InputState::shouldCancelKey(const KeyMemento& memento,
4210da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const CancelationOptions& options) {
4211da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    if (options.keyCode != -1 && memento.keyCode != options.keyCode) {
4212da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        return false;
4213da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    }
4214da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown
421565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (options.deviceId != -1 && memento.deviceId != options.deviceId) {
421665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        return false;
421765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
421865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
4219da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    switch (options.mode) {
4220da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_ALL_EVENTS:
4221da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_NON_POINTER_EVENTS:
422249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return true;
4223da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_FALLBACK_EVENTS:
422449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return memento.flags & AKEY_EVENT_FLAG_FALLBACK;
4225b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    default:
422649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return false;
422749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    }
422849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown}
422949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
423049ed71db425c5054e3ad9526496a7e116c89556bJeff Brownbool InputDispatcher::InputState::shouldCancelMotion(const MotionMemento& memento,
4231da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown        const CancelationOptions& options) {
423265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (options.deviceId != -1 && memento.deviceId != options.deviceId) {
423365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        return false;
423465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
423565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
4236da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    switch (options.mode) {
4237da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_ALL_EVENTS:
4238b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown        return true;
4239da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_POINTER_EVENTS:
424049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return memento.source & AINPUT_SOURCE_CLASS_POINTER;
4241da3d5a91b6b311ed77f2707d4456c1f18b84d73bJeff Brown    case CancelationOptions::CANCEL_NON_POINTER_EVENTS:
424249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return !(memento.source & AINPUT_SOURCE_CLASS_POINTER);
424349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    default:
424449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        return false;
4245b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    }
4246b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown}
4247b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
4248b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
424946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// --- InputDispatcher::Connection ---
425046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4251928e054931d357326613c78e62f4d850b7c442ffJeff BrownInputDispatcher::Connection::Connection(const sp<InputChannel>& inputChannel,
4252cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        const sp<InputWindowHandle>& inputWindowHandle, bool monitor) :
4253928e054931d357326613c78e62f4d850b7c442ffJeff Brown        status(STATUS_NORMAL), inputChannel(inputChannel), inputWindowHandle(inputWindowHandle),
4254cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        monitor(monitor),
4255d1c48a0525d05021036d4b14e937e221c0ae1318Jeff Brown        inputPublisher(inputChannel), inputPublisherBlocked(false) {
425646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
425746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
425846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputDispatcher::Connection::~Connection() {
425946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
426046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4261481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownconst char* InputDispatcher::Connection::getWindowName() const {
4262481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (inputWindowHandle != NULL) {
4263481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        return inputWindowHandle->getName().string();
4264481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
4265481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    if (monitor) {
4266481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        return "monitor";
4267481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    }
4268481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown    return "?";
4269481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown}
4270481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
42719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownconst char* InputDispatcher::Connection::getStatusLabel() const {
42729c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    switch (status) {
42739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    case STATUS_NORMAL:
42749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return "NORMAL";
42759c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
42769c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    case STATUS_BROKEN:
42779c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return "BROKEN";
42789c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
42799c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    case STATUS_ZOMBIE:
42809c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return "ZOMBIE";
42819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
42829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    default:
42839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        return "UNKNOWN";
42849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    }
42859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
42869c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
4287072ec96a4900d4616574733646ee46311cb5d2cbJeff BrownInputDispatcher::DispatchEntry* InputDispatcher::Connection::findWaitQueueEntry(uint32_t seq) {
4288072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    for (DispatchEntry* entry = waitQueue.head; entry != NULL; entry = entry->next) {
4289072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        if (entry->seq == seq) {
4290072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            return entry;
4291072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        }
4292072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    }
4293072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    return NULL;
4294072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown}
4295072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
4296b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
42979c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown// --- InputDispatcher::CommandEntry ---
42989c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
4299ac386073df2514b79a2ca169f4a89f129733002fJeff BrownInputDispatcher::CommandEntry::CommandEntry(Command command) :
4300072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    command(command), eventTime(0), keyEntry(NULL), userActivityEventType(0),
4301072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    seq(0), handled(false) {
43029c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
43039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
43049c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownInputDispatcher::CommandEntry::~CommandEntry() {
43059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
43069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
430746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
430801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown// --- InputDispatcher::TouchState ---
430901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
431001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff BrownInputDispatcher::TouchState::TouchState() :
431183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    down(false), split(false), deviceId(-1), source(0), displayId(-1) {
431201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
431301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
431401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff BrownInputDispatcher::TouchState::~TouchState() {
431501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
431601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
431701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid InputDispatcher::TouchState::reset() {
431801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    down = false;
431901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    split = false;
432095712850665492af670824abdba77f0944d984d1Jeff Brown    deviceId = -1;
432158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    source = 0;
432283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    displayId = -1;
432301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    windows.clear();
432401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
432501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
432601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brownvoid InputDispatcher::TouchState::copyFrom(const TouchState& other) {
432701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    down = other.down;
432801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    split = other.split;
432995712850665492af670824abdba77f0944d984d1Jeff Brown    deviceId = other.deviceId;
433058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    source = other.source;
433183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    displayId = other.displayId;
43329302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    windows = other.windows;
433301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
433401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
43359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid InputDispatcher::TouchState::addOrUpdateWindow(const sp<InputWindowHandle>& windowHandle,
433601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        int32_t targetFlags, BitSet32 pointerIds) {
433701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    if (targetFlags & InputTarget::FLAG_SPLIT) {
433801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        split = true;
433901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
434001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
434101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < windows.size(); i++) {
434201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        TouchedWindow& touchedWindow = windows.editItemAt(i);
43439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (touchedWindow.windowHandle == windowHandle) {
434401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            touchedWindow.targetFlags |= targetFlags;
434598db5fabdad86dca379740d8050697950b9f026cJeff Brown            if (targetFlags & InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT) {
434698db5fabdad86dca379740d8050697950b9f026cJeff Brown                touchedWindow.targetFlags &= ~InputTarget::FLAG_DISPATCH_AS_IS;
434798db5fabdad86dca379740d8050697950b9f026cJeff Brown            }
434801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            touchedWindow.pointerIds.value |= pointerIds.value;
434901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            return;
435001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
435101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
435201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
435301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    windows.push();
435401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
435501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    TouchedWindow& touchedWindow = windows.editTop();
43569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    touchedWindow.windowHandle = windowHandle;
435701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    touchedWindow.targetFlags = targetFlags;
435801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    touchedWindow.pointerIds = pointerIds;
435901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
436001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
4361f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brownvoid InputDispatcher::TouchState::removeWindow(const sp<InputWindowHandle>& windowHandle) {
4362f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown    for (size_t i = 0; i < windows.size(); i++) {
4363f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown        if (windows.itemAt(i).windowHandle == windowHandle) {
4364f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown            windows.removeAt(i);
4365f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown            return;
4366f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown        }
4367f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown    }
4368f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown}
4369f44e39493c471b5e6a0807778c7a6439ea1b8adcJeff Brown
4370a032cc008618b83ecbbede537517d1e7998e3264Jeff Brownvoid InputDispatcher::TouchState::filterNonAsIsTouchWindows() {
437101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0 ; i < windows.size(); ) {
4372a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        TouchedWindow& window = windows.editItemAt(i);
437398db5fabdad86dca379740d8050697950b9f026cJeff Brown        if (window.targetFlags & (InputTarget::FLAG_DISPATCH_AS_IS
437498db5fabdad86dca379740d8050697950b9f026cJeff Brown                | InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER)) {
4375a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            window.targetFlags &= ~InputTarget::FLAG_DISPATCH_MASK;
4376a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            window.targetFlags |= InputTarget::FLAG_DISPATCH_AS_IS;
437701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown            i += 1;
4378a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown        } else {
4379a032cc008618b83ecbbede537517d1e7998e3264Jeff Brown            windows.removeAt(i);
438001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
438101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
438201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
438301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
43849302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownsp<InputWindowHandle> InputDispatcher::TouchState::getFirstForegroundWindowHandle() const {
438501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    for (size_t i = 0; i < windows.size(); i++) {
438698db5fabdad86dca379740d8050697950b9f026cJeff Brown        const TouchedWindow& window = windows.itemAt(i);
438798db5fabdad86dca379740d8050697950b9f026cJeff Brown        if (window.targetFlags & InputTarget::FLAG_FOREGROUND) {
43889302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            return window.windowHandle;
438901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown        }
439001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    }
439101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown    return NULL;
439201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown}
439301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
439498db5fabdad86dca379740d8050697950b9f026cJeff Brownbool InputDispatcher::TouchState::isSlippery() const {
439598db5fabdad86dca379740d8050697950b9f026cJeff Brown    // Must have exactly one foreground window.
439698db5fabdad86dca379740d8050697950b9f026cJeff Brown    bool haveSlipperyForegroundWindow = false;
439798db5fabdad86dca379740d8050697950b9f026cJeff Brown    for (size_t i = 0; i < windows.size(); i++) {
439898db5fabdad86dca379740d8050697950b9f026cJeff Brown        const TouchedWindow& window = windows.itemAt(i);
439998db5fabdad86dca379740d8050697950b9f026cJeff Brown        if (window.targetFlags & InputTarget::FLAG_FOREGROUND) {
4400cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (haveSlipperyForegroundWindow
4401cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    || !(window.windowHandle->getInfo()->layoutParamsFlags
4402cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                            & InputWindowInfo::FLAG_SLIPPERY)) {
440398db5fabdad86dca379740d8050697950b9f026cJeff Brown                return false;
440498db5fabdad86dca379740d8050697950b9f026cJeff Brown            }
440598db5fabdad86dca379740d8050697950b9f026cJeff Brown            haveSlipperyForegroundWindow = true;
440698db5fabdad86dca379740d8050697950b9f026cJeff Brown        }
440798db5fabdad86dca379740d8050697950b9f026cJeff Brown    }
440898db5fabdad86dca379740d8050697950b9f026cJeff Brown    return haveSlipperyForegroundWindow;
440998db5fabdad86dca379740d8050697950b9f026cJeff Brown}
441098db5fabdad86dca379740d8050697950b9f026cJeff Brown
441101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
441246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// --- InputDispatcherThread ---
441346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
441446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputDispatcherThread::InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher) :
441546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        Thread(/*canCallJava*/ true), mDispatcher(dispatcher) {
441646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
441746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
441846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputDispatcherThread::~InputDispatcherThread() {
441946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
442046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
442146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownbool InputDispatcherThread::threadLoop() {
442246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    mDispatcher->dispatchOnce();
442346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return true;
442446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
442546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
442646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
4427