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