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