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