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