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#ifndef _UI_INPUT_DISPATCHER_H 18d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#define _UI_INPUT_DISPATCHER_H 19d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 20d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <input/Input.h> 21d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <input/InputTransport.h> 22d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <utils/KeyedVector.h> 23d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <utils/Vector.h> 24d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <utils/threads.h> 25d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <utils/Timers.h> 26d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <utils/RefBase.h> 27d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <utils/String8.h> 28d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <utils/Looper.h> 29d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <utils/BitSet.h> 30d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <cutils/atomic.h> 31d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 32d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <stddef.h> 33d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <unistd.h> 34d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <limits.h> 35d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 36d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include "InputWindow.h" 37d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include "InputApplication.h" 38d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include "InputListener.h" 39d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 40d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 41d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightnamespace android { 42d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 43d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* 44d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Constants used to report the outcome of input event injection. 45d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 46d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightenum { 47d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* (INTERNAL USE ONLY) Specifies that injection is pending and its outcome is unknown. */ 48d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_EVENT_INJECTION_PENDING = -1, 49d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 50d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Injection succeeded. */ 51d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_EVENT_INJECTION_SUCCEEDED = 0, 52d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 53d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Injection failed because the injector did not have permission to inject 54d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * into the application with input focus. */ 55d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_EVENT_INJECTION_PERMISSION_DENIED = 1, 56d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 57d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Injection failed because there were no available input targets. */ 58d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_EVENT_INJECTION_FAILED = 2, 59d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 60d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Injection failed due to a timeout. */ 61d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_EVENT_INJECTION_TIMED_OUT = 3 62d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 63d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 64d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* 65d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Constants used to determine the input event injection synchronization mode. 66d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 67d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightenum { 68d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Injection is asynchronous and is assumed always to be successful. */ 69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_EVENT_INJECTION_SYNC_NONE = 0, 70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 71d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Waits for previous events to be dispatched so that the input dispatcher can determine 72d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * whether input event injection willbe permitted based on the current input focus. 73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Does not wait for the input event to finish processing. */ 74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT = 1, 75d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 76d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Waits for the input event to be completely processed. */ 77d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISHED = 2, 78d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 79d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* 82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * An input target specifies how an input event is to be dispatched to a particular window 83d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * including the window's input channel, control flags, a timeout, and an X / Y offset to 84d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * be added to input event coordinates to compensate for the absolute position of the 85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * window area. 86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstruct InputTarget { 88d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright enum { 89d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that the event is being delivered to a foreground application. */ 90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_FOREGROUND = 1 << 0, 91d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 92cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright /* This flag indicates that the MotionEvent falls within the area of the target 93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * obscured by another visible window above it. The motion event should be 94d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * delivered with flag AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED. */ 95d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_WINDOW_IS_OBSCURED = 1 << 1, 96d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 97d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that a motion event is being split across multiple windows. */ 98d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_SPLIT = 1 << 2, 99d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that the pointer coordinates dispatched to the application 101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * will be zeroed out to avoid revealing information to an application. This is 102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * used in conjunction with FLAG_DISPATCH_AS_OUTSIDE to prevent apps not sharing 103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * the same UID from watching all touches. */ 104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_ZERO_COORDS = 1 << 3, 105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that the event should be sent as is. 107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Should always be set unless the event is to be transmuted. */ 108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_DISPATCH_AS_IS = 1 << 8, 109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that a MotionEvent with AMOTION_EVENT_ACTION_DOWN falls outside 111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * of the area of this target and so should instead be delivered as an 112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * AMOTION_EVENT_ACTION_OUTSIDE to this target. */ 113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_DISPATCH_AS_OUTSIDE = 1 << 9, 114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that a hover sequence is starting in the given window. 116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The event is transmuted into ACTION_HOVER_ENTER. */ 117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_DISPATCH_AS_HOVER_ENTER = 1 << 10, 118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that a hover event happened outside of a window which handled 120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * previous hover events, signifying the end of the current hover sequence for that 121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * window. 122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The event is transmuted into ACTION_HOVER_ENTER. */ 123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_DISPATCH_AS_HOVER_EXIT = 1 << 11, 124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that the event should be canceled. 126d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * It is used to transmute ACTION_MOVE into ACTION_CANCEL when a touch slips 127d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * outside of a window. */ 128d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_DISPATCH_AS_SLIPPERY_EXIT = 1 << 12, 129d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 130d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* This flag indicates that the event should be dispatched as an initial down. 131d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * It is used to transmute ACTION_MOVE into ACTION_DOWN when a touch slips 132d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * into a new window. */ 133d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_DISPATCH_AS_SLIPPERY_ENTER = 1 << 13, 134d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 135d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Mask for all dispatch modes. */ 136d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FLAG_DISPATCH_MASK = FLAG_DISPATCH_AS_IS 137d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright | FLAG_DISPATCH_AS_OUTSIDE 138d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright | FLAG_DISPATCH_AS_HOVER_ENTER 139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright | FLAG_DISPATCH_AS_HOVER_EXIT 140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright | FLAG_DISPATCH_AS_SLIPPERY_EXIT 141d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright | FLAG_DISPATCH_AS_SLIPPERY_ENTER, 142cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright 143cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright /* This flag indicates that the target of a MotionEvent is partly or wholly 144cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright * obscured by another visible window above it. The motion event should be 145cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright * delivered with flag AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED. */ 146cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright FLAG_WINDOW_IS_PARTIALLY_OBSCURED = 1 << 14, 147cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright 148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The input channel to be targeted. 151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputChannel> inputChannel; 152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 153d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Flags for the input target. 154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t flags; 155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 156d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The x and y offset to add to a MotionEvent as it is delivered. 157d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // (ignored for KeyEvents) 158d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float xOffset, yOffset; 159d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 160d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Scaling factor to apply to MotionEvent as it is delivered. 161d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // (ignored for KeyEvents) 162d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float scaleFactor; 163d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 164d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The subset of pointer ids to include in motion events dispatched to this input target 165d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // if FLAG_SPLIT is set. 166d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright BitSet32 pointerIds; 167d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 168d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 169d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 170d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* 171d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Input dispatcher configuration. 172d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 173d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Specifies various options that modify the behavior of the input dispatcher. 174d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The values provided here are merely defaults. The actual values will come from ViewConfiguration 175d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * and are passed into the dispatcher during initialization. 176d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 177d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstruct InputDispatcherConfiguration { 178d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The key repeat initial timeout. 179d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t keyRepeatTimeout; 180d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 181d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The key repeat inter-key delay. 182d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t keyRepeatDelay; 183d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 184d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputDispatcherConfiguration() : 185d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright keyRepeatTimeout(500 * 1000000LL), 186d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright keyRepeatDelay(50 * 1000000LL) { } 187d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 188d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 189d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 190d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* 191d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Input dispatcher policy interface. 192d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 193d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The input reader policy is used by the input reader to interact with the Window Manager 194d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * and other system components. 195d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 196d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The actual implementation is partially supported by callbacks into the DVM 197d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * via JNI. This interface is also mocked in the unit tests. 198d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 199d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherPolicyInterface : public virtual RefBase { 200d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 201d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputDispatcherPolicyInterface() { } 202d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~InputDispatcherPolicyInterface() { } 203d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 204d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightpublic: 205d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Notifies the system that a configuration change has occurred. */ 206d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyConfigurationChanged(nsecs_t when) = 0; 207d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 208d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Notifies the system that an application is not responding. 209d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Returns a new timeout to continue waiting, or 0 to abort dispatch. */ 210d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 211d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& inputWindowHandle, 212d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const String8& reason) = 0; 213d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 214d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Notifies the system that an input channel is unrecoverably broken. */ 215d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) = 0; 216d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 217d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Gets the input dispatcher configuration. */ 218d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) = 0; 219d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 220d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Filters an input event. 221d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Return true to dispatch the event unmodified, false to consume the event. 222d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * A filter can also transform and inject events later by passing POLICY_FLAG_FILTERED 223d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * to injectInputEvent. 224d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 225d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) = 0; 226d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 227d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Intercepts a key event immediately before queueing it. 228d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The policy can use this method as an opportunity to perform power management functions 229d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * and early event preprocessing such as updating policy flags. 230d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 231d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method is expected to set the POLICY_FLAG_PASS_TO_USER policy flag if the event 232d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * should be dispatched to applications. 233d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 234d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) = 0; 235d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 236d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Intercepts a touch, trackball or other motion event before queueing it. 237d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The policy can use this method as an opportunity to perform power management functions 238d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * and early event preprocessing such as updating policy flags. 239d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 240d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method is expected to set the POLICY_FLAG_PASS_TO_USER policy flag if the event 241d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * should be dispatched to applications. 242d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 243d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) = 0; 244d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 245d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Allows the policy a chance to intercept a key before dispatching. */ 246d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual nsecs_t interceptKeyBeforeDispatching(const sp<InputWindowHandle>& inputWindowHandle, 247d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const KeyEvent* keyEvent, uint32_t policyFlags) = 0; 248d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 249d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Allows the policy a chance to perform default processing for an unhandled key. 250d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Returns an alternate keycode to redispatch as a fallback, or 0 to give up. */ 251d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 252d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) = 0; 253d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 254d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Notifies the policy about switch events. 255d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 256d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifySwitch(nsecs_t when, 257d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t switchValues, uint32_t switchMask, uint32_t policyFlags) = 0; 258d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 259d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Poke user activity for an event dispatched to a window. */ 260d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) = 0; 261d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 262d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Checks whether a given application pid/uid has permission to inject input events 263d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * into other applications. 264d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 265d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method is special in that its implementation promises to be non-reentrant and 266d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * is safe to call while holding other locks. (Most other methods make no such guarantees!) 267d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 268d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool checkInjectEventsPermissionNonReentrant( 269d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectorPid, int32_t injectorUid) = 0; 270d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 271d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 272d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 273d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* Notifies the system about input events generated by the input reader. 274d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The dispatcher is expected to be mostly asynchronous. */ 275d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherInterface : public virtual RefBase, public InputListenerInterface { 276d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 277d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputDispatcherInterface() { } 278d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~InputDispatcherInterface() { } 279d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 280d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightpublic: 281d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Dumps the state of the input dispatcher. 282d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 283d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method may be called on any thread (usually by the input manager). */ 284d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void dump(String8& dump) = 0; 285d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 286d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Called by the heatbeat to ensures that the dispatcher has not deadlocked. */ 287d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void monitor() = 0; 288d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 289d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Runs a single iteration of the dispatch loop. 290d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Nominally processes one queued event, a timeout, or a response from an input consumer. 291d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 292d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method should only be called on the input dispatcher thread. 293d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 294d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void dispatchOnce() = 0; 295d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 296d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Injects an input event and optionally waits for sync. 297d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The synchronization mode determines whether the method blocks while waiting for 298d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * input injection to proceed. 299d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Returns one of the INPUT_EVENT_INJECTION_XXX constants. 300d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 301d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method may be called on any thread (usually by the input manager). 302d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 303f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown virtual int32_t injectInputEvent(const InputEvent* event, int32_t displayId, 304d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectorPid, int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis, 305d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t policyFlags) = 0; 306d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 307d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Sets the list of input windows. 308d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 309d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method may be called on any thread (usually by the input manager). 310d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 311d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void setInputWindows(const Vector<sp<InputWindowHandle> >& inputWindowHandles) = 0; 312d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 313d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Sets the focused application. 314d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 315d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method may be called on any thread (usually by the input manager). 316d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 317d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void setFocusedApplication( 318d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputApplicationHandle>& inputApplicationHandle) = 0; 319d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 320d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Sets the input dispatching mode. 321d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 322d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * This method may be called on any thread (usually by the input manager). 323d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 324d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void setInputDispatchMode(bool enabled, bool frozen) = 0; 325d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 326d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Sets whether input event filtering is enabled. 327d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * When enabled, incoming input events are sent to the policy's filterInputEvent 328d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * method instead of being dispatched. The filter is expected to use 329d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * injectInputEvent to inject the events it would like to have dispatched. 330d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * It should include POLICY_FLAG_FILTERED in the policy flags during injection. 331d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 332d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void setInputFilterEnabled(bool enabled) = 0; 333d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 334d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Transfers touch focus from the window associated with one channel to the 335d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * window associated with the other channel. 336d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 337d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Returns true on success. False if the window did not actually have touch focus. 338d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 339d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool transferTouchFocus(const sp<InputChannel>& fromChannel, 340d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputChannel>& toChannel) = 0; 341d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 342d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Registers or unregister input channels that may be used as targets for input events. 343d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * If monitor is true, the channel will receive a copy of all input events. 344d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 345d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * These methods may be called on any thread (usually by the input manager). 346d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 347d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel, 348d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& inputWindowHandle, bool monitor) = 0; 349d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel) = 0; 350d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 351d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 352d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* Dispatches events to input targets. Some functions of the input dispatcher, such as 353d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * identifying input targets, are controlled by a separate policy object. 354d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 355d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * IMPORTANT INVARIANT: 356d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Because the policy can potentially block or cause re-entrance into the input dispatcher, 357d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * the input dispatcher never calls into the policy while holding its internal locks. 358d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * The implementation is also carefully designed to recover from scenarios such as an 359d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * input channel becoming unregistered while identifying input targets or processing timeouts. 360d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 361d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Methods marked 'Locked' must be called with the lock acquired. 362d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 363d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Methods marked 'LockedInterruptible' must be called with the lock acquired but 364d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * may during the course of their execution release the lock, call into the policy, and 365d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * then reacquire the lock. The caller is responsible for recovering gracefully. 366d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 367d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * A 'LockedInterruptible' method may called a 'Locked' method, but NOT vice-versa. 368d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 369d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcher : public InputDispatcherInterface { 370d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 371d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~InputDispatcher(); 372d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 373d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightpublic: 374d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright explicit InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy); 375d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 376d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void dump(String8& dump); 377d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void monitor(); 378d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 379d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void dispatchOnce(); 380d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 381d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args); 382d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyKey(const NotifyKeyArgs* args); 383d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyMotion(const NotifyMotionArgs* args); 384d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifySwitch(const NotifySwitchArgs* args); 385d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args); 386d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 387f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown virtual int32_t injectInputEvent(const InputEvent* event, int32_t displayId, 388d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectorPid, int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis, 389d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t policyFlags); 390d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 391d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void setInputWindows(const Vector<sp<InputWindowHandle> >& inputWindowHandles); 392d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void setFocusedApplication(const sp<InputApplicationHandle>& inputApplicationHandle); 393d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void setInputDispatchMode(bool enabled, bool frozen); 394d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void setInputFilterEnabled(bool enabled); 395d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 396d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool transferTouchFocus(const sp<InputChannel>& fromChannel, 397d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputChannel>& toChannel); 398d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 399d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel, 400d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& inputWindowHandle, bool monitor); 401d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel); 402d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 403d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprivate: 404d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright template <typename T> 405d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct Link { 406d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright T* next; 407d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright T* prev; 408d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 409d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright protected: 410d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline Link() : next(NULL), prev(NULL) { } 411d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 412d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 413d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct InjectionState { 414d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mutable int32_t refCount; 415d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 416d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectorPid; 417d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectorUid; 418d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectionResult; // initially INPUT_EVENT_INJECTION_PENDING 419d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool injectionIsAsync; // set to true if injection is not waiting for the result 420d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t pendingForegroundDispatches; // the number of foreground dispatches in progress 421d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 422d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InjectionState(int32_t injectorPid, int32_t injectorUid); 423d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void release(); 424d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 425d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright private: 426d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ~InjectionState(); 427d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 428d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 429d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct EventEntry : Link<EventEntry> { 430d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright enum { 431d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright TYPE_CONFIGURATION_CHANGED, 432d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright TYPE_DEVICE_RESET, 433d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright TYPE_KEY, 434d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright TYPE_MOTION 435d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 436d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 437d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mutable int32_t refCount; 438d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t type; 439d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t eventTime; 440d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t policyFlags; 441d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InjectionState* injectionState; 442d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 443d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool dispatchInProgress; // initially false, set to true while dispatching 444d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 445d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline bool isInjected() const { return injectionState != NULL; } 446d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 447d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void release(); 448d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 449d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void appendDescription(String8& msg) const = 0; 450d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 451d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright protected: 452d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright EventEntry(int32_t type, nsecs_t eventTime, uint32_t policyFlags); 453d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~EventEntry(); 454d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void releaseInjectionState(); 455d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 456d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 457d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct ConfigurationChangedEntry : EventEntry { 4586d2ede118add6647d230f090d64a8c7cf49ebf05Chih-Hung Hsieh explicit ConfigurationChangedEntry(nsecs_t eventTime); 459d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void appendDescription(String8& msg) const; 460d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 461d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright protected: 462d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~ConfigurationChangedEntry(); 463d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 464d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 465d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct DeviceResetEntry : EventEntry { 466d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId; 467d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 468d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DeviceResetEntry(nsecs_t eventTime, int32_t deviceId); 469d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void appendDescription(String8& msg) const; 470d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 471d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright protected: 472d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~DeviceResetEntry(); 473d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 474d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 475d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct KeyEntry : EventEntry { 476d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId; 477d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t source; 478d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t action; 479d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t flags; 480d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t keyCode; 481d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t scanCode; 482d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t metaState; 483d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t repeatCount; 484d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t downTime; 485d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 486d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool syntheticRepeat; // set to true for synthetic key repeats 487d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 488d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright enum InterceptKeyResult { 489d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INTERCEPT_KEY_RESULT_UNKNOWN, 490d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INTERCEPT_KEY_RESULT_SKIP, 491d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INTERCEPT_KEY_RESULT_CONTINUE, 492d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER, 493d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 494d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InterceptKeyResult interceptKeyResult; // set based on the interception result 495d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t interceptKeyWakeupTime; // used with INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER 496d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 497d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyEntry(nsecs_t eventTime, 498d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action, 499d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t flags, int32_t keyCode, int32_t scanCode, int32_t metaState, 500d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t repeatCount, nsecs_t downTime); 501d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void appendDescription(String8& msg) const; 502d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void recycle(); 503d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 504d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright protected: 505d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~KeyEntry(); 506d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 507d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 508d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct MotionEntry : EventEntry { 509d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t eventTime; 510d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId; 511d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t source; 512d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t action; 5137b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright int32_t actionButton; 514d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t flags; 515d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t metaState; 516d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t buttonState; 517d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t edgeFlags; 518d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float xPrecision; 519d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float yPrecision; 520d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t downTime; 521d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t displayId; 522d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t pointerCount; 523d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerProperties pointerProperties[MAX_POINTERS]; 524d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerCoords pointerCoords[MAX_POINTERS]; 525d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 526d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright MotionEntry(nsecs_t eventTime, 527d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId, uint32_t source, uint32_t policyFlags, 5287b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright int32_t action, int32_t actionButton, int32_t flags, 529d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t metaState, int32_t buttonState, int32_t edgeFlags, 5307b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright float xPrecision, float yPrecision, nsecs_t downTime, 5317b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright int32_t displayId, uint32_t pointerCount, 532f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown const PointerProperties* pointerProperties, const PointerCoords* pointerCoords, 533f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown float xOffset, float yOffset); 534d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void appendDescription(String8& msg) const; 535d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 536d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright protected: 537d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~MotionEntry(); 538d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 539d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 540d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Tracks the progress of dispatching a particular event to a particular connection. 541d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct DispatchEntry : Link<DispatchEntry> { 542d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const uint32_t seq; // unique sequence number, never 0 543d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 544d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright EventEntry* eventEntry; // the event to dispatch 545d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t targetFlags; 546d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float xOffset; 547d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float yOffset; 548d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float scaleFactor; 549d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t deliveryTime; // time when the event was actually delivered 550d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 551d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Set to the resolved action and flags when the event is enqueued. 552d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t resolvedAction; 553d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t resolvedFlags; 554d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 555d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DispatchEntry(EventEntry* eventEntry, 556d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t targetFlags, float xOffset, float yOffset, float scaleFactor); 557d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ~DispatchEntry(); 558d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 559d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline bool hasForegroundTarget() const { 560d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return targetFlags & InputTarget::FLAG_FOREGROUND; 561d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 562d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 563d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline bool isSplit() const { 564d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return targetFlags & InputTarget::FLAG_SPLIT; 565d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 566d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 567d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright private: 568d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright static volatile int32_t sNextSeqAtomic; 569d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 570d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright static uint32_t nextSeq(); 571d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 572d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 573d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // A command entry captures state and behavior for an action to be performed in the 574d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // dispatch loop after the initial processing has taken place. It is essentially 575d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // a kind of continuation used to postpone sensitive policy interactions to a point 576d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // in the dispatch loop where it is safe to release the lock (generally after finishing 577d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // the critical parts of the dispatch cycle). 578d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // 579d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The special thing about commands is that they can voluntarily release and reacquire 580d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // the dispatcher lock at will. Initially when the command starts running, the 581d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // dispatcher lock is held. However, if the command needs to call into the policy to 582d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // do some work, it can release the lock, do the work, then reacquire the lock again 583d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // before returning. 584d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // 585d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // This mechanism is a bit clunky but it helps to preserve the invariant that the dispatch 586d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // never calls into the policy while holding its lock. 587d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // 588d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Commands are implicitly 'LockedInterruptible'. 589d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct CommandEntry; 590d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright typedef void (InputDispatcher::*Command)(CommandEntry* commandEntry); 591d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 592d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright class Connection; 593d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct CommandEntry : Link<CommandEntry> { 5946d2ede118add6647d230f090d64a8c7cf49ebf05Chih-Hung Hsieh explicit CommandEntry(Command command); 595d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ~CommandEntry(); 596d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 597d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Command command; 598d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 599d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // parameters for the command (usage varies by command) 600d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<Connection> connection; 601d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t eventTime; 602d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyEntry* keyEntry; 603d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputApplicationHandle> inputApplicationHandle; 604d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputWindowHandle> inputWindowHandle; 605d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright String8 reason; 606d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t userActivityEventType; 607d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t seq; 608d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool handled; 609d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 610d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 611d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Generic queue implementation. 612d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright template <typename T> 613d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct Queue { 614d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright T* head; 615d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright T* tail; 61665dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey uint32_t entryCount; 617d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 61865dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey inline Queue() : head(NULL), tail(NULL), entryCount(0) { 619d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 620d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 621d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline bool isEmpty() const { 622d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return !head; 623d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 624d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 625d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline void enqueueAtTail(T* entry) { 62665dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey entryCount++; 627d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright entry->prev = tail; 628d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright if (tail) { 629d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright tail->next = entry; 630d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } else { 631d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright head = entry; 632d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 633d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright entry->next = NULL; 634d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright tail = entry; 635d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 636d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 637d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline void enqueueAtHead(T* entry) { 63865dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey entryCount++; 639d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright entry->next = head; 640d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright if (head) { 641d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright head->prev = entry; 642d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } else { 643d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright tail = entry; 644d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 645d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright entry->prev = NULL; 646d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright head = entry; 647d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 648d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 649d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline void dequeue(T* entry) { 65065dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey entryCount--; 651d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright if (entry->prev) { 652d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright entry->prev->next = entry->next; 653d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } else { 654d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright head = entry->next; 655d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 656d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright if (entry->next) { 657d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright entry->next->prev = entry->prev; 658d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } else { 659d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright tail = entry->prev; 660d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 661d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 662d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 663d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline T* dequeueAtHead() { 66465dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey entryCount--; 665d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright T* entry = head; 666d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright head = entry->next; 667d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright if (head) { 668d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright head->prev = NULL; 669d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } else { 670d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright tail = NULL; 671d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 672d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return entry; 673d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 674d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 67565dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey uint32_t count() const { 67665dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey return entryCount; 67765dbe971b1bcefdaa353662f7bde5ea327544113Jon McCaffrey } 678d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 679d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 680d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Specifies which events are to be canceled and why. */ 681d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct CancelationOptions { 682d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright enum Mode { 683d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright CANCEL_ALL_EVENTS = 0, 684d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright CANCEL_POINTER_EVENTS = 1, 685d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright CANCEL_NON_POINTER_EVENTS = 2, 686d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright CANCEL_FALLBACK_EVENTS = 3, 687d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 688d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 689d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The criterion to use to determine which events should be canceled. 690d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Mode mode; 691d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 692d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Descriptive reason for the cancelation. 693d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const char* reason; 694d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 695d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The specific keycode of the key event to cancel, or -1 to cancel any key event. 696d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t keyCode; 697d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 698d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The specific device id of events to cancel, or -1 to cancel events from any device. 699d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId; 700d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 701d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright CancelationOptions(Mode mode, const char* reason) : 702d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mode(mode), reason(reason), keyCode(-1), deviceId(-1) { } 703d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 704d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 705d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Tracks dispatched key and motion event state so that cancelation events can be 706d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * synthesized when events are dropped. */ 707d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright class InputState { 708d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright public: 709d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputState(); 710d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ~InputState(); 711d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 712d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Returns true if there is no state to be canceled. 713d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool isNeutral() const; 714d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 715d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Returns true if the specified source is known to have received a hover enter 716d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // motion event. 717d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool isHovering(int32_t deviceId, uint32_t source, int32_t displayId) const; 718d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 719d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Records tracking information for a key event that has just been published. 720d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Returns true if the event should be delivered, false if it is inconsistent 721d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // and should be skipped. 722d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool trackKey(const KeyEntry* entry, int32_t action, int32_t flags); 723d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 724d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Records tracking information for a motion event that has just been published. 725d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Returns true if the event should be delivered, false if it is inconsistent 726d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // and should be skipped. 727d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool trackMotion(const MotionEntry* entry, int32_t action, int32_t flags); 728d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 729d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Synthesizes cancelation events for the current state and resets the tracked state. 730d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void synthesizeCancelationEvents(nsecs_t currentTime, 731d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Vector<EventEntry*>& outEvents, const CancelationOptions& options); 732d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 733d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Clears the current state. 734d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void clear(); 735d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 736d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Copies pointer-related parts of the input state to another instance. 737d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void copyPointerStateTo(InputState& other) const; 738d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 739d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Gets the fallback key associated with a keycode. 740d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Returns -1 if none. 741d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Returns AKEYCODE_UNKNOWN if we are only dispatching the unhandled key to the policy. 742d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t getFallbackKey(int32_t originalKeyCode); 743d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 744d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Sets the fallback key for a particular keycode. 745d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void setFallbackKey(int32_t originalKeyCode, int32_t fallbackKeyCode); 746d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 747d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Removes the fallback key for a particular keycode. 748d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void removeFallbackKey(int32_t originalKeyCode); 749d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 750d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline const KeyedVector<int32_t, int32_t>& getFallbackKeys() const { 751d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return mFallbackKeys; 752d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 753d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 754d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright private: 755d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct KeyMemento { 756d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId; 757d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t source; 758d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t keyCode; 759d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t scanCode; 760d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t metaState; 761d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t flags; 762d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t downTime; 763d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t policyFlags; 764d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 765d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 766d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct MotionMemento { 767d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId; 768d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t source; 769d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t flags; 770d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float xPrecision; 771d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright float yPrecision; 772d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t downTime; 773d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t displayId; 774d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t pointerCount; 775d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerProperties pointerProperties[MAX_POINTERS]; 776d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerCoords pointerCoords[MAX_POINTERS]; 777d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool hovering; 778d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t policyFlags; 779d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 780d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void setPointers(const MotionEntry* entry); 781d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 782d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 783d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Vector<KeyMemento> mKeyMementos; 784d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Vector<MotionMemento> mMotionMementos; 785d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyedVector<int32_t, int32_t> mFallbackKeys; 786d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 787d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ssize_t findKeyMemento(const KeyEntry* entry) const; 788d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ssize_t findMotionMemento(const MotionEntry* entry, bool hovering) const; 789d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 790d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void addKeyMemento(const KeyEntry* entry, int32_t flags); 791d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void addMotionMemento(const MotionEntry* entry, int32_t flags, bool hovering); 792d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 793d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright static bool shouldCancelKey(const KeyMemento& memento, 794d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const CancelationOptions& options); 795d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright static bool shouldCancelMotion(const MotionMemento& memento, 796d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const CancelationOptions& options); 797d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 798d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 799d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /* Manages the dispatch state associated with a single input channel. */ 800d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright class Connection : public RefBase { 801d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright protected: 802d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~Connection(); 803d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 804d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright public: 805d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright enum Status { 806d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Everything is peachy. 807d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright STATUS_NORMAL, 808d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // An unrecoverable communication error has occurred. 809d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright STATUS_BROKEN, 810d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // The input channel has been unregistered. 811d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright STATUS_ZOMBIE 812d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 813d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 814d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Status status; 815d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputChannel> inputChannel; // never null 816d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputWindowHandle> inputWindowHandle; // may be null 817d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool monitor; 818d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputPublisher inputPublisher; 819d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputState inputState; 820d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 821d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // True if the socket is full and no further events can be published until 822d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // the application consumes some of the input. 823d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool inputPublisherBlocked; 824d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 825d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Queue of events that need to be published to the connection. 826d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Queue<DispatchEntry> outboundQueue; 827d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 828d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Queue of events that have been published to the connection but that have not 829d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // yet received a "finished" response from the application. 830d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Queue<DispatchEntry> waitQueue; 831d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 832d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright explicit Connection(const sp<InputChannel>& inputChannel, 833d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& inputWindowHandle, bool monitor); 834d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 835d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright inline const char* getInputChannelName() const { return inputChannel->getName().string(); } 836d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 837d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const char* getWindowName() const; 838d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const char* getStatusLabel() const; 839d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 840d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DispatchEntry* findWaitQueueEntry(uint32_t seq); 841d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 842d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 843d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright enum DropReason { 844d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DROP_REASON_NOT_DROPPED = 0, 845d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DROP_REASON_POLICY = 1, 846d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DROP_REASON_APP_SWITCH = 2, 847d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DROP_REASON_DISABLED = 3, 848d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DROP_REASON_BLOCKED = 4, 849d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DROP_REASON_STALE = 5, 850d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 851d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 852d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputDispatcherPolicyInterface> mPolicy; 853d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputDispatcherConfiguration mConfig; 854d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 855d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Mutex mLock; 856d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 857d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Condition mDispatcherIsAliveCondition; 858d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 859d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<Looper> mLooper; 860d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 861d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright EventEntry* mPendingEvent; 862d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Queue<EventEntry> mInboundQueue; 863d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Queue<EventEntry> mRecentQueue; 864d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Queue<CommandEntry> mCommandQueue; 865d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 8663a9817228928a8db68c34afe547c9ba18169af5bMichael Wright DropReason mLastDropReason; 8673a9817228928a8db68c34afe547c9ba18169af5bMichael Wright 868d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void dispatchOnceInnerLocked(nsecs_t* nextWakeupTime); 869d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 870d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Enqueues an inbound event. Returns true if mLooper->wake() should be called. 871d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool enqueueInboundEventLocked(EventEntry* entry); 872d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 873d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Cleans up input state when dropping an inbound event. 874d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void dropInboundEventLocked(EventEntry* entry, DropReason dropReason); 875d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 876d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Adds an event to a queue of recent events for debugging purposes. 877d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void addRecentEventLocked(EventEntry* entry); 878d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 879d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // App switch latency optimization. 880d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool mAppSwitchSawKeyDown; 881d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t mAppSwitchDueTime; 882d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 883d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright static bool isAppSwitchKeyCode(int32_t keyCode); 884d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool isAppSwitchKeyEventLocked(KeyEntry* keyEntry); 885d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool isAppSwitchPendingLocked(); 886d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void resetPendingAppSwitchLocked(bool handled); 887d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 888d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Stale event latency optimization. 889d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright static bool isStaleEventLocked(nsecs_t currentTime, EventEntry* entry); 890d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 891d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Blocked event latency optimization. Drops old events when the user intends 892d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // to transfer focus to a new application. 893d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright EventEntry* mNextUnblockedEvent; 894d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 895d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputWindowHandle> findTouchedWindowAtLocked(int32_t displayId, int32_t x, int32_t y); 896d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 897d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // All registered connections mapped by channel file descriptor. 898d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyedVector<int, sp<Connection> > mConnectionsByFd; 899d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 900d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ssize_t getConnectionIndexLocked(const sp<InputChannel>& inputChannel); 901d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 902d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Input channels that will receive a copy of all input events. 903d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Vector<sp<InputChannel> > mMonitoringChannels; 904d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 905d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Event injection and synchronization. 906d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Condition mInjectionResultAvailableCondition; 907d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool hasInjectionPermission(int32_t injectorPid, int32_t injectorUid); 908d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void setInjectionResultLocked(EventEntry* entry, int32_t injectionResult); 909d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 910d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Condition mInjectionSyncFinishedCondition; 911d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void incrementPendingForegroundDispatchesLocked(EventEntry* entry); 912d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void decrementPendingForegroundDispatchesLocked(EventEntry* entry); 913d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 914d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Key repeat tracking. 915d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct KeyRepeatState { 916d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyEntry* lastKeyEntry; // or null if no repeat 917d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t nextRepeatTime; 918d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } mKeyRepeatState; 919d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 920d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void resetKeyRepeatLocked(); 921d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyEntry* synthesizeKeyRepeatLocked(nsecs_t currentTime); 922d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 92378f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright // Key replacement tracking 92478f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright struct KeyReplacement { 92578f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright int32_t keyCode; 92678f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright int32_t deviceId; 92778f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright bool operator==(const KeyReplacement& rhs) const { 92878f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright return keyCode == rhs.keyCode && deviceId == rhs.deviceId; 92978f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright } 93078f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright bool operator<(const KeyReplacement& rhs) const { 93178f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright return keyCode != rhs.keyCode ? keyCode < rhs.keyCode : deviceId < rhs.deviceId; 93278f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright } 93378f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright }; 93478f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright // Maps the key code replaced, device id tuple to the key code it was replaced with 93578f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright KeyedVector<KeyReplacement, int32_t> mReplacedKeys; 93678f2444aaf09ba05c7b7e79d85f1e7efafa9fa94Michael Wright 937d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Deferred command processing. 938d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool haveCommandsLocked() const; 939d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool runCommandsLockedInterruptible(); 940d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright CommandEntry* postCommandLocked(Command command); 941d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 942d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Input filter processing. 943d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool shouldSendKeyToInputFilterLocked(const NotifyKeyArgs* args); 944d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool shouldSendMotionToInputFilterLocked(const NotifyMotionArgs* args); 945d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 946d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Inbound event processing. 947d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void drainInboundQueueLocked(); 948d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void releasePendingEventLocked(); 949d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void releaseInboundEventLocked(EventEntry* entry); 950d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 951d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Dispatch state. 952d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool mDispatchEnabled; 953d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool mDispatchFrozen; 954d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool mInputFilterEnabled; 955d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 956d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Vector<sp<InputWindowHandle> > mWindowHandles; 957d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 958d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputWindowHandle> getWindowHandleLocked(const sp<InputChannel>& inputChannel) const; 959d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool hasWindowHandleLocked(const sp<InputWindowHandle>& windowHandle) const; 960d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 961d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Focus tracking for keys, trackball, etc. 962d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputWindowHandle> mFocusedWindowHandle; 963d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 964d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Focus tracking for touch. 965d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct TouchedWindow { 966d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputWindowHandle> windowHandle; 967d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t targetFlags; 968d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright BitSet32 pointerIds; // zero unless target flag FLAG_SPLIT is set 969d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 970d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright struct TouchState { 971d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool down; 972d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool split; 973d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t deviceId; // id of the device that is currently down, others are rejected 974d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t source; // source of the device that is current down, others are rejected 975d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t displayId; // id to the display that currently has a touch, others are rejected 976d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Vector<TouchedWindow> windows; 977d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 978d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright TouchState(); 979d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ~TouchState(); 980d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void reset(); 981d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void copyFrom(const TouchState& other); 982d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void addOrUpdateWindow(const sp<InputWindowHandle>& windowHandle, 983d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t targetFlags, BitSet32 pointerIds); 984d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void removeWindow(const sp<InputWindowHandle>& windowHandle); 985d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void filterNonAsIsTouchWindows(); 986d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputWindowHandle> getFirstForegroundWindowHandle() const; 987d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool isSlippery() const; 988d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 989d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 990f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown KeyedVector<int32_t, TouchState> mTouchStatesByDisplay; 991d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright TouchState mTempTouchState; 992d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 993d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Focused application. 994d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputApplicationHandle> mFocusedApplicationHandle; 995d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 996d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Dispatcher state at time of last ANR. 997d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright String8 mLastANRState; 998d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 999d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Dispatch inbound events. 1000d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool dispatchConfigurationChangedLocked( 1001d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t currentTime, ConfigurationChangedEntry* entry); 1002d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool dispatchDeviceResetLocked( 1003d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t currentTime, DeviceResetEntry* entry); 1004d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool dispatchKeyLocked( 1005d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t currentTime, KeyEntry* entry, 1006d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DropReason* dropReason, nsecs_t* nextWakeupTime); 1007d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool dispatchMotionLocked( 1008d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t currentTime, MotionEntry* entry, 1009d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DropReason* dropReason, nsecs_t* nextWakeupTime); 1010d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void dispatchEventLocked(nsecs_t currentTime, EventEntry* entry, 1011d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const Vector<InputTarget>& inputTargets); 1012d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1013d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void logOutboundKeyDetailsLocked(const char* prefix, const KeyEntry* entry); 1014d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void logOutboundMotionDetailsLocked(const char* prefix, const MotionEntry* entry); 1015d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1016d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Keeping track of ANR timeouts. 1017d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright enum InputTargetWaitCause { 1018d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_TARGET_WAIT_CAUSE_NONE, 1019d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_TARGET_WAIT_CAUSE_SYSTEM_NOT_READY, 1020d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY, 1021d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright }; 1022d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1023d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputTargetWaitCause mInputTargetWaitCause; 1024d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t mInputTargetWaitStartTime; 1025d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t mInputTargetWaitTimeoutTime; 1026d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool mInputTargetWaitTimeoutExpired; 1027d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputApplicationHandle> mInputTargetWaitApplicationHandle; 1028d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1029d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Contains the last window which received a hover event. 1030d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputWindowHandle> mLastHoverWindowHandle; 1031d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1032d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Finding targets for input events. 1033d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t handleTargetsNotReadyLocked(nsecs_t currentTime, const EventEntry* entry, 1034d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputApplicationHandle>& applicationHandle, 1035d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& windowHandle, 1036d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t* nextWakeupTime, const char* reason); 1037d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout, 1038d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputChannel>& inputChannel); 1039d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t getTimeSpentWaitingForApplicationLocked(nsecs_t currentTime); 1040d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void resetANRTimeoutsLocked(); 1041d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1042d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t findFocusedWindowTargetsLocked(nsecs_t currentTime, const EventEntry* entry, 1043d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime); 1044d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t findTouchedWindowTargetsLocked(nsecs_t currentTime, const MotionEntry* entry, 1045d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime, 1046d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool* outConflictingPointerActions); 1047d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1048d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void addWindowTargetLocked(const sp<InputWindowHandle>& windowHandle, 1049d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t targetFlags, BitSet32 pointerIds, Vector<InputTarget>& inputTargets); 1050d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void addMonitoringTargetsLocked(Vector<InputTarget>& inputTargets); 1051d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1052d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void pokeUserActivityLocked(const EventEntry* eventEntry); 1053d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool checkInjectionPermission(const sp<InputWindowHandle>& windowHandle, 1054d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const InjectionState* injectionState); 1055d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool isWindowObscuredAtPointLocked(const sp<InputWindowHandle>& windowHandle, 1056d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t x, int32_t y) const; 1057cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright bool isWindowObscuredLocked(const sp<InputWindowHandle>& windowHandle) const; 1058d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright String8 getApplicationWindowLabelLocked(const sp<InputApplicationHandle>& applicationHandle, 1059d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& windowHandle); 1060d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1061ffb497743831ae4857b674629b58ea3c46d01431Jeff Brown String8 checkWindowReadyForMoreInputLocked(nsecs_t currentTime, 1062ffb497743831ae4857b674629b58ea3c46d01431Jeff Brown const sp<InputWindowHandle>& windowHandle, const EventEntry* eventEntry, 1063ffb497743831ae4857b674629b58ea3c46d01431Jeff Brown const char* targetType); 1064ffb497743831ae4857b674629b58ea3c46d01431Jeff Brown 1065d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Manage the dispatch cycle for a single connection. 1066d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // These methods are deliberately not Interruptible because doing all of the work 1067d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // with the mutex held makes it easier to ensure that connection invariants are maintained. 1068d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // If needed, the methods post commands to run later once the critical bits are done. 1069d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void prepareDispatchCycleLocked(nsecs_t currentTime, const sp<Connection>& connection, 1070d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright EventEntry* eventEntry, const InputTarget* inputTarget); 1071d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void enqueueDispatchEntriesLocked(nsecs_t currentTime, const sp<Connection>& connection, 1072d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright EventEntry* eventEntry, const InputTarget* inputTarget); 1073d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void enqueueDispatchEntryLocked(const sp<Connection>& connection, 1074d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright EventEntry* eventEntry, const InputTarget* inputTarget, int32_t dispatchMode); 1075d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void startDispatchCycleLocked(nsecs_t currentTime, const sp<Connection>& connection); 1076d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void finishDispatchCycleLocked(nsecs_t currentTime, const sp<Connection>& connection, 1077d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t seq, bool handled); 1078d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void abortBrokenDispatchCycleLocked(nsecs_t currentTime, const sp<Connection>& connection, 1079d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool notify); 1080d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void drainDispatchQueueLocked(Queue<DispatchEntry>* queue); 1081d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void releaseDispatchEntryLocked(DispatchEntry* dispatchEntry); 1082d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright static int handleReceiveCallback(int fd, int events, void* data); 1083d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1084d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void synthesizeCancelationEventsForAllConnectionsLocked( 1085d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const CancelationOptions& options); 1086fa13dcf39f09534ab8e95aec6f15a61a7f500b4cMichael Wright void synthesizeCancelationEventsForMonitorsLocked(const CancelationOptions& options); 1087d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void synthesizeCancelationEventsForInputChannelLocked(const sp<InputChannel>& channel, 1088d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const CancelationOptions& options); 1089d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void synthesizeCancelationEventsForConnectionLocked(const sp<Connection>& connection, 1090d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const CancelationOptions& options); 1091d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1092d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Splitting motion events across windows. 1093d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright MotionEntry* splitMotionEvent(const MotionEntry* originalMotionEntry, BitSet32 pointerIds); 1094d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1095d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Reset and drop everything the dispatcher is doing. 1096d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void resetAndDropEverythingLocked(const char* reason); 1097d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1098d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Dump state. 1099d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void dumpDispatchStateLocked(String8& dump); 1100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void logDispatchStateLocked(); 1101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Registration. 1103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void removeMonitorChannelLocked(const sp<InputChannel>& inputChannel); 1104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright status_t unregisterInputChannelLocked(const sp<InputChannel>& inputChannel, bool notify); 1105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Add or remove a connection to the mActiveConnections vector. 1107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void activateConnectionLocked(Connection* connection); 1108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void deactivateConnectionLocked(Connection* connection); 1109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Interesting events that we might like to log or tell the framework about. 1111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void onDispatchCycleFinishedLocked( 1112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t currentTime, const sp<Connection>& connection, uint32_t seq, bool handled); 1113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void onDispatchCycleBrokenLocked( 1114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t currentTime, const sp<Connection>& connection); 1115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void onANRLocked( 1116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t currentTime, const sp<InputApplicationHandle>& applicationHandle, 1117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& windowHandle, 1118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright nsecs_t eventTime, nsecs_t waitStartTime, const char* reason); 1119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Outbound policy interactions. 1121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void doNotifyConfigurationChangedInterruptible(CommandEntry* commandEntry); 1122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void doNotifyInputChannelBrokenLockedInterruptible(CommandEntry* commandEntry); 1123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void doNotifyANRLockedInterruptible(CommandEntry* commandEntry); 1124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void doInterceptKeyBeforeDispatchingLockedInterruptible(CommandEntry* commandEntry); 1125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void doDispatchCycleFinishedLockedInterruptible(CommandEntry* commandEntry); 1126d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool afterKeyEventLockedInterruptible(const sp<Connection>& connection, 1127d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DispatchEntry* dispatchEntry, KeyEntry* keyEntry, bool handled); 1128d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright bool afterMotionEventLockedInterruptible(const sp<Connection>& connection, 1129d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright DispatchEntry* dispatchEntry, MotionEntry* motionEntry, bool handled); 1130d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void doPokeUserActivityLockedInterruptible(CommandEntry* commandEntry); 1131d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void initializeKeyEvent(KeyEvent* event, const KeyEntry* entry); 1132d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1133d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Statistics gathering. 1134d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void updateDispatchStatisticsLocked(nsecs_t currentTime, const EventEntry* entry, 1135d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectionResult, nsecs_t timeSpentWaitingForApplication); 1136d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void traceInboundQueueLengthLocked(); 1137d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void traceOutboundQueueLengthLocked(const sp<Connection>& connection); 1138d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright void traceWaitQueueLengthLocked(const sp<Connection>& connection); 1139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 1140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1141d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* Enqueues and dispatches input events, endlessly. */ 1142d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherThread : public Thread { 1143d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightpublic: 1144d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright explicit InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher); 1145d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ~InputDispatcherThread(); 1146d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1147d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprivate: 1148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool threadLoop(); 1149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputDispatcherInterface> mDispatcher; 1151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 1152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1153d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android 1154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 1155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#endif // _UI_INPUT_DISPATCHER_H 1156