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