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